- Поисковые системы
- Практика оптимизации
- Трафик для сайтов
- Монетизация сайтов
- Сайтостроение
- Социальный Маркетинг
- Общение профессионалов
- Биржа и продажа
- Финансовые объявления
- Работа на постоянной основе
- Сайты - покупка, продажа
- Соцсети: страницы, группы, приложения
- Сайты без доменов
- Трафик, тизерная и баннерная реклама
- Продажа, оценка, регистрация доменов
- Ссылки - обмен, покупка, продажа
- Программы и скрипты
- Размещение статей
- Инфопродукты
- Прочие цифровые товары
- Работа и услуги для вебмастера
- Оптимизация, продвижение и аудит
- Ведение рекламных кампаний
- Услуги в области SMM
- Программирование
- Администрирование серверов и сайтов
- Прокси, ВПН, анонимайзеры, IP
- Платное обучение, вебинары
- Регистрация в каталогах
- Копирайтинг, переводы
- Дизайн
- Usability: консультации и аудит
- Изготовление сайтов
- Наполнение сайтов
- Прочие услуги
- Не про работу
VK приобрела 70% в структуре компании-разработчика red_mad_robot
Которая участвовала в создании RuStore
Оксана Мамчуева
Как снизить ДРР до 4,38% и повысить продажи с помощью VK Рекламы
Для интернет-магазина инженерных систем
Мария Лосева
Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий
Собственно, задача: пересечь 2 массива наиболее быстрым способом.
По науке:
1) сортируем массивы, 0(N*logN) - быстрая сортировка
2) пересекаем их за 0(N).
Время выполнения получается логарифмичным :(
Написал свой алгоритм пересекающий массивы за 0(N). Идея взята с "индексной" сортировки.
Полдня думал :) Сделал и решил поделиться с народом :) Может кому пригодится :)
p.s. предполагается, что значения массивов уникальны.
Так лучше не делать: for ($i=0; $i<count($a); $i++)
т.к. при каждом шаге будет вычисляться размер массива, если массивы большие, то скажется на производительности, лучше сделать так:
$count_a = count($a);
for ($i=0; $i<$count_a; $i++)
памяти на лишней переменной съест немного, зато отразится на производительности
Так лучше не делать: for ($i=0; $i<count($a); $i++)
т.к. при каждом шаге будет вычисляться размер массива, если массивы большие, то скажется на производительности, лучше сделать так:
:) RTFM :) Каждый раз не считается количество элементов :)
:) RTFM :) Каждый раз не считается количество элементов :)
;) не уверен в PHP интерпретаторе, в си точно вычисляется каждый раз, касперский даже как-то статью на эту тему писал, об узких местах в коде.
;) не уверен в PHP интерпретаторе, в си точно вычисляется каждый раз, касперский даже как-то статью на эту тему писал, об узких местах в коде.
сейчас проверим.
похоже я прав: http://www.php.net/manual/ru/function.count.php
//size of $arr ~ 2000 elements
//wrong variant (Time exec ~ 19 sec)
for($i=0;$i<count($arr);$i++)
{
...
}
//right variant(Time exec ~ 0.2 sec)
$arr_size=count($arr);
for($i=0;$i<$arr_size;$i++)
{
...
}
it was discovered experimentally.
видно нужно учитывать то свойство, что при обходе массива в цикле - размер может изменится, если размер не поменяется, то лучше использовать временную переменную, если в цикле размер меняется, то вычислять размер массива при каждом проходе. В вашем случае размер массива $a неизменный, значит лучше использовать временную переменную.
maximkuk, ага. Сейчас проверил у себя. Черт, а кто-то же говорил, что у пыха кэширование включено :) Обманули :)
кеширование здесь ни причём, см. /ru/forum/comment/2051170
maximkuk, да и пофигу :) зато работает в 5-6 раз быстрее стандартной array_intersect.
RTFM2: count не пересчитывает, а всего лишь читает внутреннюю переменную объекта типа Array. Но то, что читает ОЧЕНЬ ДОЛГО - это факт!
Можете проверить на маленьком и большом массиве - время будет одинаковое.
А чтобы с каунтом не заморачиваться, лучше использовать foreach.
ТС: а чем array_intersect не угодил?