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

 
     
 

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

nectarin
217
    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(). Какой именно массив инвертировать — зависит от конкретной задачи и ожидаемого числа совпадений или несовпадений. Однако, если один из массивов заведомо небольшого размера, лучше инвертировать другой (больший) массив, чтобы не проходить по нему в цикле.
В любом случае, итоговое решение, как и любое другое оптимизационное решение, нужно тестировать на производительность и искать оптимальный алгоритм.

1
Просмотров: 285
     

Новости inPHP.org Новости inPHP.org
27.05.2010   Технические работы.
По техническим причинам возможны кратковременные перебои в работе сайта проекта в период с 27.05.2010 по 1.06.2010.
02.03.2010   Доступ участников к разработке тестирований.
В тестовом режиме запущен функционал, позволяющий участникам проекта разрабатывать собственные тестирования. Разработанные сообществом тестирования не имеют ограничений официальной аккредитации и в любое время доступны любому участнику.
19.02.2010   Введён общий рейтинг участника.
В рамках программы развития проекта введён параметр общего рейтинга участника. Соответствующие изменения внесены в правила проекта. Рейтинг - один из показателей, которые будут активно использоваться в готовящемся к запуску функционале. Первое из нововведений - доступ участников к системе разработки собственных тестирований и возможность неограниченного использования тестирований, разработанных сообществом, будет запущено в течение марта 2010 года.
 
Содействуют развитию Содействуют развитию
webdev
198
    webdev webdev
Константин
Специализации: 2
Участники проекта Участники проекта
alexkey
100
    alexkey alexkey
Алексей
Специализации: 0
invander
20
    invander invander

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

Специализации: 0
nectarin
217
    nectarin nectarin
Сергей NectarIn Новиков
Специализации: 1
amadeus
120
    amadeus amadeus

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

УровеньПользователи
7481,6%
62157%
51585,2%
41665,4%
32909,5%
2411,3%
12889,4%
отсутствует184360,4%