Показать полную графическую версию : Перебор массивов
Вроде простая задача но никак не могу найти достаточно лаконичного решения
Есть два массива
При переборе первого массива, если его значение совпадает с любым из значений второго массива, выполняется действие
наверное решений много, буду признателен если поделитесь разными способами
c4uran, в общих чертах — пара алгоритмов, чисто для понимания:
Тупой способ — прочитать первое значение первого массива, а затем сравнивать его со значениями массива методом полного перебора этого второго. Если при каком-то из сравнений совпадение есть — выполнить действие и перейти к следующему элементу первого массива прервав сравнение текущего, если же совпадения нет — по исчерпании второго массива перейти ко следующему элементу первого массива и повторить.
Метод очень нерационален: время исполнения зависит от количества элементов массивов квадратично.
Более интеллектуально (время поиска зависит от количества элементов почти линейно) — из второго массива создать вспомогательный, упорядочив в нем элементы по возрастанию — и далее сравнивать методом половинного деления вспомогательного массива: если элемент первого, соответствующий [примерно] среднему элементу второго, меньше — то на следующем шаге брать середину верхней половины вспомогательного, если больше — середину нижней половины, и т.д., каждый раз отсекая уже проанализированные ненужные половинки. При совпадении же — выполнить действие и перейти к следующему элементу первого массива, прервав сравнение текущего.
Или проиндексировав второй массив — что по времени поиска даст примерно одно и то же.
Ох, сейчас корифеи бить будут...
$a = 1,2,3
$b = 3,4,5
Compare-Object $a $b -IncludeEqual -ExcludeDifferent
InputObject SideIndicator
----------- -------------
3 ==
$r = Compare-Object $a $b -IncludeEqual -ExcludeDifferent
if($r) {
"Код"
}
Метод очень нерационален »
спорно:
Медленнее по сравнению с копированием массива, сортировкой и последующим поиском он станет на довольно большом количестве элементов, а там может ещё и памяти не хватить.
Busla, это всегда так: выбор наиболее эффективного метода зачастую зависит от нашего знания о деталях реализации конкретных сущностей, над которыми мы планируем производить ту или иную операцию.
Как я понимаю, это "тупой" способ:
$arr1 | % { if ($_ -in $arr2) { $_ } }
А можно пример более интеллектуального?
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.