Разделы публикаций

 
     
 

Сравнение больших массивов

nectarin
228
    nectarin nectarin
Сергей NectarIn Новиков
Специализации: 1

Иногда может возникнуть необходимость сравнения больших (свыше 10 — 100 тысяч значений) массивов чисел или строк функциями array_intersect() или array_diff(). Непосредственное использование этих функций с исходными массивами работает непозволительно долго (единицы — десятки секунд).
В этом случае простым и эффективным решением является инвертирование массивов функцией array_flip() и последующее сравнение функциями array_intersect_key() или array_diff_key(). Принцип работы метода прост — поиск по ключам массива производится на порядок быстрее, чем по значениям.
Уже при использовании такого упрощённого метода производительность возрастает в десятки раз (из личной практики — ускорение в 30-40 раз, достаточное, чтобы выполнить сравнение меньше, чем за секунду). Время работы функции array_flip() при этом учитывается. Ещё большего ускорения (50-70 раз) можно добиться, инвертировав только один массив, и пройдя по другому в цикле, используя для поиска конструкцию isset(). Какой именно массив инвертировать — зависит от конкретной задачи и ожидаемого числа совпадений или несовпадений. Однако, если один из массивов заведомо небольшого размера, лучше инвертировать другой (больший) массив, чтобы не проходить по нему в цикле.
В любом случае, итоговое решение, как и любое другое оптимизационное решение, нужно тестировать на производительность и искать оптимальный алгоритм.

3
Просмотров: 1205
     

Новости inPHP.org Новости inPHP.org
30.12.2011   С наступающим Новым Годом!
Команда inPHP.org поздравляет всех посетителей сайта проекта с наступающим Новым Годом! Вероятно, многие участники проекта заметили некоторое затишье в уходящем году. Поверьте, в следующем всё будет несколько иначе!
31.12.2010   С Новым Годом!
Уважаемые коллеги, коллектив проекта inphp.org искренне поздравляет вас с наступающим Новым Годом!
27.05.2010   Технические работы.
По техническим причинам возможны кратковременные перебои в работе сайта проекта в период с 27.05.2010 по 1.06.2010.
02.03.2010   Доступ участников к разработке тестирований.
В тестовом режиме запущен функционал, позволяющий участникам проекта разрабатывать собственные тестирования. Разработанные сообществом тестирования не имеют ограничений официальной аккредитации и в любое время доступны любому участнику.
 
Содействуют развитию Содействуют развитию
Участники проекта Участники проекта
gerasim9hot
120
    gerasim9hot gerasim9hot

Специализации: 0
good
60
    good good
Andrey
Специализации: 0
panandy
40
    panandy panandy

Специализации: 0
cfyzarm
60
    cfyzarm cfyzarm

Специализации: 0
sbmaxx
80
    sbmaxx sbmaxx

Специализации: 0
 
Статистика проекта Статистика проекта
Всего пользователей: 3648
Из них аккредитовано: 1468
Были сегодня: 2

УровеньПользователи
7742%
62376,5%
52075,7%
41945,3%
336510%
2401,1%
13509,6%
отсутствует218059,8%