πŸ‘£ Алгоритмы поиска Π² Go



Рассмотрим здСсь 2 извСстных Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° поиска: Π»ΠΈΠ½Π΅ΠΉΠ½Ρ‹ΠΉ ΠΈ Π±ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΉ.



πŸŸ‘Π›ΠΈΠ½Π΅ΠΉΠ½Ρ‹ΠΉ поиск (Linear Search) β€” это простой Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ поиска элСмСнта Π² ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΈ. Он Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΏΡƒΡ‚Π΅ΠΌ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΏΠ΅Ρ€Π΅Π±ΠΎΡ€Π° всСх элСмСнтов Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π½Π°ΠΉΠ΄Π΅Π½ искомый элСмСнт ΠΈΠ»ΠΈ Π½Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΡ€ΠΎΠ²Π΅Ρ€Π΅Π½Ρ‹ всС элСмСнты.



Алгоритм:

1. НачнитС с ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ элСмСнта списка.

2. Π‘Ρ€Π°Π²Π½ΠΈΡ‚Π΅ Π΅Π³ΠΎ с искомым элСмСнтом.

3. Если элСмСнт совпадаСт с искомым, Π²Π΅Ρ€Π½ΠΈΡ‚Π΅ Π΅Π³ΠΎ индСкс

4. Если элСмСнт Π½Π΅ совпадаСт с искомым, ΠΏΠ΅Ρ€Π΅ΠΉΠ΄ΠΈΡ‚Π΅ ΠΊ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌΡƒ элСмСнту Π² спискС.

5. ΠŸΠΎΠ²Ρ‚ΠΎΡ€ΡΠΉΡ‚Π΅ шаги 2-4 Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° Π½Π΅ Π½Π°ΠΉΠ΄Π΅Ρ‚Π΅ искомый элСмСнт ΠΈΠ»ΠΈ Π½Π΅ ΠΏΡ€ΠΎΠΉΠ΄Π΅Ρ‚Π΅ вСсь список.



Π›ΠΈΠ½Π΅ΠΉΠ½Ρ‹ΠΉ поиск ΠΈΠΌΠ΅Π΅Ρ‚ Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ O(n), Π³Π΄Π΅ n β€” это количСство элСмСнтов Π² спискС.





πŸŸ‘Π‘ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΉ поиск (Binary Search) β€” это эффСктивный Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ поиска элСмСнта Π² отсортированном спискС, массивС ΠΈ Ρ‚.Π΄. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΡΡ‚Ρ€Π°Ρ‚Π΅Π³ΠΈΡŽ "раздСляй ΠΈ властвуй", Ρ‡Ρ‚ΠΎ позволяСт быстро Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ искомый элСмСнт.



Алгоритм:

1. НачнитС с опрСдСлСния Π³Ρ€Π°Π½ΠΈΡ† поиска. УстановитС Π½Π°Ρ‡Π°Π»ΡŒΠ½ΡƒΡŽ Π³Ρ€Π°Π½ΠΈΡ†Ρƒ (left) Π² Π½Π°Ρ‡Π°Π»ΠΎ списка ΠΈ ΠΊΠΎΠ½Π΅Ρ‡Π½ΡƒΡŽ Π³Ρ€Π°Π½ΠΈΡ†Ρƒ (right) Π² Π΅Π³ΠΎ ΠΊΠΎΠ½Π΅Ρ†.

2. НайдитС срСдний элСмСнт ΠΌΠ΅ΠΆΠ΄Ρƒ Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠΉ ΠΈ ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΉ Π³Ρ€Π°Π½ΠΈΡ†Π΅ΠΉ.

3. Π‘Ρ€Π°Π²Π½ΠΈΡ‚Π΅ срСдний элСмСнт с искомым Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ.

4. Если срСдний элСмСнт совпадаСт с искомым Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ Π΅Π³ΠΎ индСкс

5. Если срСдний элСмСнт большС искомого значСния, ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚Π΅ ΠΊΠΎΠ½Π΅Ρ‡Π½ΡƒΡŽ Π³Ρ€Π°Π½ΠΈΡ†Ρƒ (right) Π½Π° ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ ΠΏΠ΅Ρ€Π΅Π΄ срСдним элСмСнтом ΠΈ ΠΏΠ΅Ρ€Π΅ΠΉΠ΄ΠΈΡ‚Π΅ ΠΊ ΡˆΠ°Π³Ρƒ 2.

6. Если срСдний элСмСнт мСньшС искомого значСния, ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚Π΅ Π½Π°Ρ‡Π°Π»ΡŒΠ½ΡƒΡŽ Π³Ρ€Π°Π½ΠΈΡ†Ρƒ (left) Π½Π° ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ послС срСднСго элСмСнта ΠΈ ΠΏΠ΅Ρ€Π΅ΠΉΠ΄ΠΈΡ‚Π΅ ΠΊ ΡˆΠ°Π³Ρƒ 2.

7. ΠŸΠΎΠ²Ρ‚ΠΎΡ€ΡΠΉΡ‚Π΅ шаги 2-6 Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π½Π°ΠΉΠ΄Π΅Π½ искомый элСмСнт ΠΈΠ»ΠΈ ΠΏΠΎΠΊΠ° Π½Π°Ρ‡Π°Π»ΡŒΠ½Π°Ρ Π³Ρ€Π°Π½ΠΈΡ†Π° (left) Π½Π΅ станСт большС ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΉ Π³Ρ€Π°Π½ΠΈΡ†Ρ‹ (right).



Π‘ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΉ поиск ΠΈΠΌΠ΅Π΅Ρ‚ Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ O(log n), Π³Π΄Π΅ n - это количСство элСмСнтов Π² спискС. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π² Ρ…ΡƒΠ΄ΡˆΠ΅ΠΌ случаС Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π·Π° логарифмичСскоС врСмя, Ρ‡Ρ‚ΠΎ являСтся Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π±ΠΎΠ»Π΅Π΅ эффСктивным, Ρ‡Π΅ΠΌ Π»ΠΈΠ½Π΅ΠΉΠ½Ρ‹ΠΉ поиск.



@golang_interview