Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сопоставление записей, поиск в массиве, Помогите с алгоритмом 
:(
    Опции темы
BobiKK
Дата 1.6.2006, 19:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 655
Регистрация: 1.12.2005
Где: Essen, Deutschlan d

Репутация: 4
Всего: 16



В общем, попросили написать скриптик галереи. Причем, поскольку сервер собственный, и папка "www" шарится через самбу, то модерировать галлерею (добавлять фотки, добавлять категории, удалять и всё-такое) лучше не через веб-интрфейс, а так, напрямую.
Когда юзверь добавит новый каталог/каталоги с фотографиями, он запустит скрипт. 
В скрипте есть следующие строки:
Код

$res = mysql_query("SELECT id_catalog, path FROM catalogues");
if ($res) {
while ($result = mysql_fetch_array($res)) {
$paths[] = $result['path'];
}
}

Т.е., формируется массив из всех каталогов, запись о которых имеется в БД.
Далее, читаем сами каталоги:
Код

$d = new dir("catalogues");
while (false !== ($cat_name = $d->read()) {
$key = array_search($cat_name, $paths);
if ($key === false)
{
занести в БД этот каталог, фотки, которые содержатся в нем, сделать превьюшки и т.д.
}
}

Недостаток на лицо: array_search() перебирает всегда с первого по последний элемент массива, т.е. при добавлении новых галерей скорость выполнения скрипта уменьшается практически в геометрической прогрессии.
 
PM MAIL   Вверх
skyboy
Дата 1.6.2006, 21:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 75
Всего: 260



Я мало знаю конструкции php-языка, но наверняка как-то возможно уменьшить длину массива, чтоб в следующий поиск искать уже от позиции последнего найденного элемента.

Добавлено @ 21:36 
array_slice  - возвращает часть массива, задаваемая смещением начального элемента "среза" и длиной "среза" 
PM MAIL   Вверх
ASteel
Дата 2.6.2006, 08:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 24.5.2006
Где: Krasnodar, Russia

Репутация: 1
Всего: 1



Предлагаю не искать по массиву, а искать непосредственно в БД. 
А точнее - сравнить, что будет быстрее при n=30 хотя бы. 
Т.е. в БД объявить path - ключом, и делать 
Код

$res = mysql_query("SELECT id_catalog FROM catalogues WHERE path ='".trim($cat_name)."'");
// и т.д.

 
PM MAIL WWW   Вверх
BobiKK
Дата 2.6.2006, 09:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 655
Регистрация: 1.12.2005
Где: Essen, Deutschlan d

Репутация: 4
Всего: 16



Хм... Это же получается 30 запрос в БД, если я правильно понял мысль. 
PM MAIL   Вверх
ASteel
Дата 2.6.2006, 09:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 24.5.2006
Где: Krasnodar, Russia

Репутация: 1
Всего: 1



Абсолютно правильно. 
Поэтому я и предлагаю, сравнить по времени, что будет быстрее. 

Кстати, вы не могли бы пояснить, что в итоге надо сделать. 
Если я правильно понял, то надо находить каталоги, которые отсутствуют в БД, и добавлять их. Так? 

Кстати, пришла в голову еще 1 идея.
Код

// Вот здесь:
// $paths[] = $result['path'];
// делаем,
$paths[$result['path']] = true;


И далее:
Код

$d = new dir("catalogues");
while (false !== ($cat_name = $d->read()) {
//$key = array_search($cat_name, $paths);
if (!$paths[$cat_name])
{
занести в БД этот каталог, фотки, которые содержатся в нем, сделать превьюшки и т.д.
}
}


Кстати, если мне не изменяет память, то лучше в if-е выполнять то, что делается чаще всего, а в else-e то, что реже ;) 
PM MAIL WWW   Вверх
-=Ustas=-
Дата 2.6.2006, 09:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ustix IT Group
****


Профиль
Группа: Участник Клуба
Сообщений: 2222
Регистрация: 21.1.2005
Где: Краснодар

Репутация: 32
Всего: 69



Ты думаешь что такая кострукция будет выполняться быстрее, чем in_array? Не уверен.... 


--------------------
В искаженном мире все догмы одинаково произвольны, включая догму о произвольности догм.
-----
PM WWW ICQ Skype   Вверх
ASteel
Дата 2.6.2006, 12:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 24.5.2006
Где: Krasnodar, Russia

Репутация: 1
Всего: 1



Был использован вот такой скрипт:
Код

<?
$ar = array();
$k = 17000;
for ($z=0;$z<20000;$z++)
    {
    $t = microtime();
    $ar1[$t]=true;
    $ar2[] = $t;
    if ($z == $k)
        {
        $search_for = $t;
        }
    }

function getmicrotime()
{
  list($usec, $sec) = explode(" ",microtime());
  return ((float)$usec + (float)$sec);
}

$time_start = getmicrotime();

for ($x=0;$x<10000;$x++)
    {
    if (in_array($search_for,$ar2))
        {
        //занести в БД этот каталог, фотки, которые содержатся в нем, сделать превьюшки и т.д.
        }
    }

//Подсчитываем и выводим время работы скрипта
$time_end = getmicrotime();
$time = $time_end - $time_start;
$time=$time*100;
printf ("In_array: %01.2f mseconds \n",$time);

unset($time_start);
unset($time_end);
$time_start = getmicrotime();

for ($x=0;$x<10000;$x++)
    {
    if (!$ar1[$search_for]) 
        {
        //занести в БД этот каталог, фотки, которые содержатся в нем, сделать превьюшки и т.д.
        }
    }

//Подсчитываем и выводим время работы скрипта
$time_end = getmicrotime();
$time = $time_end - $time_start;
$time=$time*100;
printf ("Associative: %01.2f mseconds \n",$time);
?>


Результаты:
Код

In_array: 13220.17 mseconds 
Associative: 33.80 mseconds 

Сам такого не ожидал. 
Если кто скажет, где я дурак, буду благодарен! 
PM MAIL WWW   Вверх
BobiKK
Дата 2.6.2006, 12:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 655
Регистрация: 1.12.2005
Где: Essen, Deutschlan d

Репутация: 4
Всего: 16



По-моему, дейсвительно здорово smile
11732.62 mseconds Associative: 0.58 mseconds 
PM MAIL   Вверх
BobiKK
Дата 2.6.2006, 13:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 655
Регистрация: 1.12.2005
Где: Essen, Deutschlan d

Репутация: 4
Всего: 16



Цитата(-=Ustas=- @ 2.6.2006,  09:57)
Ты думаешь что такая кострукция будет выполняться быстрее, чем in_array? Не уверен....

Дык ведь, логично.
in_array($value, $array) с каждым элементом массива $array делает что-то типа: if ($array[element] == $value); А здесь эта конструкция выполняется всего лишь один раз. 
PM MAIL   Вверх
-=Ustas=-
Дата 2.6.2006, 13:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ustix IT Group
****


Профиль
Группа: Участник Клуба
Сообщений: 2222
Регистрация: 21.1.2005
Где: Краснодар

Репутация: 32
Всего: 69



Увы... признаю, был не прав smile Уже сам понял... 


--------------------
В искаженном мире все догмы одинаково произвольны, включая догму о произвольности догм.
-----
PM WWW ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0934 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.