Вроде простая задача но никак не могу найти достаточно лаконичного решения
Есть два массива
При переборе первого массива, если его значение совпадает с любым из значений второго массива, выполняется действие
наверное решений много, буду признателен если поделитесь разными способами
PowerShell - Перебор массивов
-
mwz
Re: PowerShell - Перебор массивов
c4uran, в общих чертах — пара алгоритмов, чисто для понимания:
Тупой способ — прочитать первое значение первого массива, а затем сравнивать его со значениями массива методом полного перебора этого второго. Если при каком-то из сравнений совпадение есть — выполнить действие и перейти к следующему элементу первого массива прервав сравнение текущего, если же совпадения нет — по исчерпании второго массива перейти ко следующему элементу первого массива и повторить.
Метод очень нерационален: время исполнения зависит от количества элементов массивов квадратично.
Более интеллектуально (время поиска зависит от количества элементов почти линейно) — из второго массива создать вспомогательный, упорядочив в нем элементы по возрастанию — и далее сравнивать методом половинного деления вспомогательного массива: если элемент первого, соответствующий [примерно] среднему элементу второго, меньше — то на следующем шаге брать середину верхней половины вспомогательного, если больше — середину нижней половины, и т.д., каждый раз отсекая уже проанализированные ненужные половинки. При совпадении же — выполнить действие и перейти к следующему элементу первого массива, прервав сравнение текущего.
Или проиндексировав второй массив — что по времени поиска даст примерно одно и то же.
Ох, сейчас корифеи бить будут...
Тупой способ — прочитать первое значение первого массива, а затем сравнивать его со значениями массива методом полного перебора этого второго. Если при каком-то из сравнений совпадение есть — выполнить действие и перейти к следующему элементу первого массива прервав сравнение текущего, если же совпадения нет — по исчерпании второго массива перейти ко следующему элементу первого массива и повторить.
Метод очень нерационален: время исполнения зависит от количества элементов массивов квадратично.
Более интеллектуально (время поиска зависит от количества элементов почти линейно) — из второго массива создать вспомогательный, упорядочив в нем элементы по возрастанию — и далее сравнивать методом половинного деления вспомогательного массива: если элемент первого, соответствующий [примерно] среднему элементу второго, меньше — то на следующем шаге брать середину верхней половины вспомогательного, если больше — середину нижней половины, и т.д., каждый раз отсекая уже проанализированные ненужные половинки. При совпадении же — выполнить действие и перейти к следующему элементу первого массива, прервав сравнение текущего.
Или проиндексировав второй массив — что по времени поиска даст примерно одно и то же.
Ох, сейчас корифеи бить будут...
-
Kazun
Re: PowerShell - Перебор массивов
Код:
Код: Выделить всё
$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
Re: PowerShell - Перебор массивов
Цитата mwz:
Метод очень нерационален
спорно:
Медленнее по сравнению с копированием массива, сортировкой и последующим поиском он станет на довольно большом количестве элементов, а там может ещё и памяти не хватить.
Метод очень нерационален
PowerShell - Перебор массивов
спорно:
Медленнее по сравнению с копированием массива, сортировкой и последующим поиском он станет на довольно большом количестве элементов, а там может ещё и памяти не хватить.
-
Iska
Re: PowerShell - Перебор массивов
Busla, это всегда так: выбор наиболее эффективного метода зачастую зависит от нашего знания о деталях реализации конкретных сущностей, над которыми мы планируем производить ту или иную операцию.
-
Iska
Re: PowerShell - Перебор массивов
Как я понимаю, это "тупой" способ:
Код:
А можно пример более интеллектуального?
Код:
Код: Выделить всё
$arr1 | % { if ($_ -in $arr2) { $_ } }А можно пример более интеллектуального?