Vivaldy
Новичок
Задача сравнить между собой два массива. В каждом массиве 50-100 тыс элементов.
Массивы такого плана:
$array1 = array(13, 21, 45, 984, 1289, 2390, 45689, 123983, 765432)
$array2 = array(13, 21, 984, 1289, 2390, 45689, 123983, 534234, 645342, 765432)
На выходе необходимы два массива:
- массив удаленных значений: $new_records = array(45)
- массив добавленных значений: $del_records = array(534234, 645342)
Значения в массивах упорядочены по возрастанию.
Изначально получился такой код:
Однако время исполнения такого кода оказалось просто невероятно огромно!
Стал думать над оптимизацией, предположил что поиск вхождения элемента в массив будет работать дольше чем поиск подстроки в строке. Как результат - пришел к следующему решению:
Выигрыш в скорости обработки получился, в среднем, в 8-9 раз. Однако это все равно слишком медленно.
Сейчас сижу думаю над идеей как то последовательно двигаться по обоим массивам разыскивая и накапливая отличия, но пока не смог придумать реализацию.
Может кто-то может подсказать как ускорить это решение.
Массивы такого плана:
$array1 = array(13, 21, 45, 984, 1289, 2390, 45689, 123983, 765432)
$array2 = array(13, 21, 984, 1289, 2390, 45689, 123983, 534234, 645342, 765432)
На выходе необходимы два массива:
- массив удаленных значений: $new_records = array(45)
- массив добавленных значений: $del_records = array(534234, 645342)
Значения в массивах упорядочены по возрастанию.
Изначально получился такой код:
Код:
if (is_array($array2))
foreach ($array2 as $elem)
if (!is_array($array1) || !in_array($elem, $array1))
$new_records[] = $elem;
if (is_array($array1))
foreach ($array1 as $elem)
if (!is_array($array2) || !in_array($elem, $array2))
$del_records[] = $elem;
Стал думать над оптимизацией, предположил что поиск вхождения элемента в массив будет работать дольше чем поиск подстроки в строке. Как результат - пришел к следующему решению:
Код:
$str1 = '*'.implode('*', $array1).'*';
if (is_array($array2))
foreach ($array2 as $elem)
if (strpos($str1, '*'.$elem.'*') === false)
$new_records[] = $elem;
$str2 = '*'.implode('*', $array2).'*';
if (is_array($array1))
foreach ($array1 as $elem)
if (strpos($str2, '*'.$elem.'*') === false)
$del_records[] = $elem;
Сейчас сижу думаю над идеей как то последовательно двигаться по обоим массивам разыскивая и накапливая отличия, но пока не смог придумать реализацию.
Может кто-то может подсказать как ускорить это решение.