Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Перебор массивов (http://forum.oszone.net/showthread.php?t=337045)

c4uran 06-10-2018 09:58 2834657

Перебор массивов
 
Вроде простая задача но никак не могу найти достаточно лаконичного решения

Есть два массива

При переборе первого массива, если его значение совпадает с любым из значений второго массива, выполняется действие

наверное решений много, буду признателен если поделитесь разными способами

mwz 06-10-2018 11:09 2834667

c4uran, в общих чертах — пара алгоритмов, чисто для понимания:

Тупой способ — прочитать первое значение первого массива, а затем сравнивать его со значениями массива методом полного перебора этого второго. Если при каком-то из сравнений совпадение есть — выполнить действие и перейти к следующему элементу первого массива прервав сравнение текущего, если же совпадения нет — по исчерпании второго массива перейти ко следующему элементу первого массива и повторить.

Метод очень нерационален: время исполнения зависит от количества элементов массивов квадратично.

Более интеллектуально (время поиска зависит от количества элементов почти линейно) — из второго массива создать вспомогательный, упорядочив в нем элементы по возрастанию — и далее сравнивать методом половинного деления вспомогательного массива: если элемент первого, соответствующий [примерно] среднему элементу второго, меньше — то на следующем шаге брать середину верхней половины вспомогательного, если больше — середину нижней половины, и т.д., каждый раз отсекая уже проанализированные ненужные половинки. При совпадении же — выполнить действие и перейти к следующему элементу первого массива, прервав сравнение текущего.

Или проиндексировав второй массив — что по времени поиска даст примерно одно и то же.

Ох, сейчас корифеи бить будут...

Kazun 06-10-2018 11:21 2834671

Код:

$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 06-10-2018 11:52 2834678

Цитата:

Цитата mwz
Метод очень нерационален »

спорно:
Медленнее по сравнению с копированием массива, сортировкой и последующим поиском он станет на довольно большом количестве элементов, а там может ещё и памяти не хватить.

Iska 06-10-2018 12:34 2834684

Busla, это всегда так: выбор наиболее эффективного метода зачастую зависит от нашего знания о деталях реализации конкретных сущностей, над которыми мы планируем производить ту или иную операцию.

c4uran 06-10-2018 18:45 2834742

Как я понимаю, это "тупой" способ:

Код:

$arr1 | % { if ($_ -in $arr2) { $_ } }
А можно пример более интеллектуального?


Время: 23:12.

Время: 23:12.
© OSzone.net 2001-