2013-04-23 4 views
0

Мне нравится сравнивать два массива без использования in_array, так как оба этих массива чрезвычайно велики (50 000 плюс). Мне нравится генерировать новый массив всех тех, которые отсутствуют в первом массиве.Эффективное решение для сравнения двух больших массивов

Что было бы самым эффективным решением, которое я бы использовал?

Первый массив
многомерный массив генерируется из SQL Query

Array (
    [0] => Array (
    [id] => 17228219 
    [name] => ... 
) 
    [1] => Array (
    [id] => 17228220 
    [name] => ... 
) 
    [2] => Array (
    [id] => 17228221 
    [name] => ... 
) 
    [3] => Array (
    [id] => 17228222 
    [name] => ... 
) 
    [4] => Array (
    [id] => 17228223 
    [name] => ... 
) 
    [5] => Array (
    [id] => 17228224 
    [name] => ... 
) 
) 

Второй массив
Сформирован из простого XML

Array (
    [0] => SimpleXMLElement Object (
    [0] => 17228219 
) 
    [1] => SimpleXMLElement Object (
    [0] => 17228221 
) 
    [2] => SimpleXMLElement Object (
    [0] => 17228222 
) 
    [3] => SimpleXMLElement Object (
    [0] => 17228224 
) 
) 

Новый массив
Создание массива с отсутствующими идентификаторов

Array (
    [0] => Array (
    [id] => 17228220 
    [name] => ... 
) 
    [1] => Array (
    [id] => 17228223 
    [name] => ... 
) 
) 
+1

сделал попробовал 'array_diff'? –

+1

первый из db, используйте запрос, чтобы сравнить со вторым, а не читать все это в памяти. – 2013-04-23 21:07:26

+0

Предполагая, что эти поля id уникальны в каждом массиве, я бы предложил создать новый массив с ключом 'id => name'. то простой массив_дифф будет выполнять весь тяжелый подъем. –

ответ

2

вы можете сделать это немного быстрее, реализуя AVL дерево, например, то он будет делать это в O (N * Log (N)), вы можете найти many implementations of trees in php

, который будет немного быстрее, чем двойной «для» (N^2), , также вы можете сортировать массивы и перемещать каждую итерацию на один шаг на обоих массивах, таким образом вы можете найти разницу, но это также O (N * Log (N)), его трудно поверить, что это может быть быстрее, чем это.

p.s. , если он уже отсортирован (например, в коде, который вы опубликовали), то вы можете сделать это в O (N) со вторым способом

+0

Чтение прямо сейчас и да, это структура. Спасибо – Tim

1

С точки зрения алгоритма самый быстрый из них будет по-разному (слияние) сравнивать и дополнять обнаружение одним проходом с двумя отсортированными массивами ... с временной сложностью O (N logN) + O (MlogM) + O (M + N) ~ O (N log N) ...

AVL Дерево является излишним ...

+0

avl дерево почти такое же, как и сортировка .... но, как я уже сказал, если он уже отсортирован, то это можно сделать в линейном времени – Dima

+0

Я не уверен, есть ли поддержка AVL-деревьев, но сортировка конечно. –

0

Использование «id» в качестве ключа массива для обоих наборов сделает для гораздо более быстрого PHP-алгоритма, как предлагает VX.

Однако наиболее эффективным решением является оставить ваш набор ссылок в базе данных и добавить к нему записи XML, обнаружив коллизии/неконфликты либо на вставке, либо на последующем SELECT с соединением, особенно если набор ссылок больше, чем набор сравнения.

Вы не говорите, что вы собираетесь делать с несогласованными данными, что имеет некоторое отношение к подходу.

+0

Мне нужно удалить записи базы данных, а также файлы на самом сервере. – Tim

Смежные вопросы