Git Product home page Git Product logo

algorithms's Introduction

Π“Ρ€ΠΎΠΊΠ°Π΅ΠΌ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹, ΠΠ΄ΠΈΡ‚ΡŒΡ Π‘Ρ…Π°Ρ€Π³Π°Π²Π° (Π·Π°ΠΌΠ΅Ρ‚ΠΊΠΈ) πŸ“š πŸ“

book

Какая польза ΠΎΡ‚ Π΄Π°Π½Π½ΠΎΠ³ΠΎ рСпозитория? πŸͺ„

Π”Π°Π½Π½Ρ‹ΠΉ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ содСрТит ΠΊΡ€Π°Ρ‚ΠΊΠΎΠ΅ ΠΈΠ·Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ произвСдСния (А. Π‘Ρ…Π°Ρ€Π³Π°Π²Π°, "Π“Ρ€ΠΎΠΊΠ°Π΅ΠΌ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹"). Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠΈΠΌΠΎΠ΅ рСпозитория Π½Π΅ содСрТит лишнСй ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ (Π½Π° ΠΌΠΎΠΉ взгляд), Ρ‡Ρ‚ΠΎ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ Π² усвоСнии ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»Π°. Помимо ΠΊΡ€Π°Ρ‚ΠΊΠΎΠ³ΠΎ излоТСния, Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ содСрТит Π°Π½ΠΈΠΌΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ изобраТСния (GIF), ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄ Π½Π° Java/Kotlin. НадСюсь, Ρ‡Ρ‚ΠΎ ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π», прСдставлСнный Π² Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ, Π±ΡƒΠ΄Π΅Ρ‚ Π’Π°ΠΌ ΠΏΠΎΠ»Π΅Π·Π΅Π½!

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄ πŸ’»

# Π—Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹
1 Знакомство с Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ°ΠΌΠΈ Java, Kotlin
2 Π‘ΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²ΠΊΠ° Π²Ρ‹Π±ΠΎΡ€ΠΎΠΌ Java, Kotlin
3 РСкурсия Java, Kotlin
4 Быстрая сортировка Java, Kotlin
5 Π₯Сш-Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ Java, Kotlin
6 Поиск Π² ΡˆΠΈΡ€ΠΈΠ½Ρƒ Java, Kotlin
7 Алгоритм ДСйкстры Java, Kotlin
8 Π–Π°Π΄Π½Ρ‹Π΅ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹ Java, Kotlin
9 ДинамичСскоС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Java, Kotlin

Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΠ΅ πŸ“–

  1. Π‘ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΉ поиск
  2. Π‘ΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²ΠΊΠ° Π²Ρ‹Π±ΠΎΡ€ΠΎΠΌ
  3. РСкурсия
  4. Быстрая сортировка
  5. Π₯Сш-Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹
  6. Поиск Π² ΡˆΠΈΡ€ΠΈΠ½Ρƒ
  7. Алгоритм ДСйкстры
  8. Π–Π°Π΄Π½Ρ‹Π΅ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹
  9. ДинамичСскоС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅

Алгоритмом называСтся Π½Π°Π±ΠΎΡ€ инструкций для выполнСния Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π·Π°Π΄Π°Ρ‡ΠΈ. Π’ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ΅, любой Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° ΠΌΠΎΠΆΠ½ΠΎ Π½Π°Π·Π²Π°Ρ‚ΡŒ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠΌ.

Π‘ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΉ поиск - Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ; Π½Π° Π²Ρ…ΠΎΠ΄Π΅ ΠΎΠ½ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ отсортированный список элСмСнтов. Если элСмСнт, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π½Π°ΠΉΡ‚ΠΈ, присутствуСт Π² спискС, Ρ‚ΠΎ Π±ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΉ поиск Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Ρ‚Ρƒ ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΎΠ½ Π±Ρ‹Π» Π½Π°ΠΉΠ΄Π΅Π½. Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС Π±ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΉ поиск Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ null.

ΠŸΡ€ΠΈ Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠΌ поискС ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· ΠΈΡΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Π° чисСл.

Для списка ΠΈΠ· n элСмСнтов Π±ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΉ поиск выполняСтся Π·Π° log2(n) шагов, Ρ‚ΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ простой поиск Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ Π·Π° n шагов.

НапримСр. Для списка ΠΈΠ· 8 чисСл Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ 3 ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΈ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ 2^3 = 8. Для списка ΠΈΠ· 1024 элСмСнтов потрСбуСтся 10 ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΉ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ 2^10 = 1024.

Π‘ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΉ поиск Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Ρ‚ΠΎΠΌ случаС, Ссли список отсортирован.

РСализация Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° Π½Π° Java: Binary Search

Π”Π²ΠΎΠΈΡ‡Π½Ρ‹ΠΉ поиск (GIF)

Binary Search

Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ информация

Π›ΠΈΠ½Π΅ΠΉΠ½ΠΎΠ΅ врСмя - врСмя, ΠΊΠΎΠ³Π΄Π° максимальноС количСство ΠΏΠΎΠΏΡ‹Ρ‚ΠΎΠΊ совпадаСт с Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ списка.

Π˜Ρ‚Π°ΠΊ, простой поиск выполняСтся Π·Π° врСмя O(n), Π° Π±ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΉ поиск - Π·Π° врСмя O(log n).

ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ "O-большого"

НиТС пСрСчислСны ΠΏΡΡ‚ΡŒ разновидностСй "О-большого", ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ Π²ΡΡ‚Ρ€Π΅Ρ‡Π°Ρ‚ΡŒΡΡ особСнно часто, Π² порядкС убывания скорости выполнСния.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ "O-большого"
  • O(log n), ΠΈΠ»ΠΈ логарифмичСскоС врСмя. ΠŸΡ€ΠΈΠΌΠ΅Ρ€: Π±ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΉ поиск.
  • O(n), ΠΈΠ»ΠΈ Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠ΅ врСмя. ΠŸΡ€ΠΈΠΌΠ΅Ρ€: простой поиск.
  • O(n * log n). ΠŸΡ€ΠΈΠΌΠ΅Ρ€: эффСктивныС Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹ сортировки (быстрая сортировка).
  • O(n^2). ΠŸΡ€ΠΈΠΌΠ΅Ρ€: ΠΌΠ΅Π΄Π»Π΅Π½Π½Ρ‹Π΅ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹ сортировки (сортировка Π²Ρ‹Π±ΠΎΡ€ΠΎΠΌ).
  • O(n!). ΠŸΡ€ΠΈΠΌΠ΅Ρ€: ΠΎΡ‡Π΅Π½ΡŒ ΠΌΠ΅Π΄Π»Π΅Π½Π½Ρ‹Π΅ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹ (Π·Π°Π΄Π°Ρ‡Π° ΠΎ коммивояТСрС).

Π¨ΠΏΠ°Ρ€Π³Π°Π»ΠΊΠ°

  • Π‘ΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ² Π½Π΅ измСряСтся Π² сСкундах.
  • ВрСмя выполнСния Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° описываСтся ростом количСства ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ.
  • ВрСмя выполнСния Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ² выраТаСтся ΠΊΠ°ΠΊ "О-большоС".

Π‘ΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²ΠΊΠ° Π²Ρ‹Π±ΠΎΡ€ΠΎΠΌ

Π‘ΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²ΠΊΠ° Π²Ρ‹Π±ΠΎΡ€ΠΎΠΌ (Π°Π½Π³Π». selection sort) - простой Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ сортировки, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΠΌΠ΅Π΅Ρ‚ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ O(n^2).

Π‘ΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²ΠΊΠ° Π²Ρ‹Π±ΠΎΡ€ΠΎΠΌ (GIF)

Selection Sort

Алгоритм

На ΠΊΠ°ΠΆΠ΄ΠΎΠΌ i-ΠΎΠΌ шагС Π½Π°Ρ…ΠΎΠ΄ΠΈΠΌ i-Ρ‹ΠΉ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ элСмСнт ΠΈ мСняСм Π΅Π³ΠΎ мСстами с i-Ρ‹ΠΌ элСмСнтом Π² массивС. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ массив, отсортированный ΠΏΠΎ Π²ΠΎΠ·Ρ€Π°ΡΡ‚Π°Π½ΠΈΡŽ.

ΠŸΠΎΡ‡Π΅ΠΌΡƒ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° оцСниваСтся ΠΊΠ°ΠΊ O(n^2)?

ΠžΡ‚Π²Π΅Ρ‚ Π½Π° Π΄Π°Π½Π½Ρ‹ΠΉ вопрос связан с Ρ€ΠΎΠ»ΡŒΡŽ констант Π² "О-большом". Π”Π°, Π² Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ список ΠΈΠ· n элСмСнтов. Π‘Π½Π°Ρ‡Π°Π»Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡŽΡ‚ΡΡ n элСмСнтов, ΠΏΠΎΡ‚ΠΎΠΌ n - 1, n - 2 ... 2, 1. Π’ срСднСм провСряСтся список ΠΈΠ· 1/2 * n элСмСнтов. Π•Π³ΠΎ врСмя выполнСния составит O(n * 1/2 * n). Однако константы (Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ 1/2) Π² "O-большом" ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΡƒΡŽΡ‚ΡΡ, поэтому ΠΌΡ‹ просто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ O(n * n), ΠΈΠ»ΠΈ O(n^2).

РСализация Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° Π½Π° Java

SelectionSort.java

РСкурсия

РСкурсия - ΠΌΠ΅Ρ‚ΠΎΠ΄ программирования, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ°Ρ….

РСкурсия Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Ρƒ людСй ΠΏΡ€ΠΎΡ‚ΠΈΠ²ΠΎΡ€Π΅Ρ‡ΠΈΠ²Ρ‹Π΅ чувства. Они Π»ΠΈΠ±ΠΎ ΠΎΠ±ΠΎΠΆΠ°ΡŽΡ‚ Π΅Ρ‘, Π»ΠΈΠ±ΠΎ нСнавидят, Π»ΠΈΠ±ΠΎ нСнавидят, ΠΏΠΎΠΊΠ° Π½Π΅ ΠΏΠΎΠ»ΡŽΠ±ΡΡ‚ Ρ‡Π΅Ρ€Π΅Π· ΠΏΠ°Ρ€Ρƒ-Ρ‚Ρ€ΠΎΠΉΠΊΡƒ Π»Π΅Ρ‚. ΠŸΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ рСкурсии Π½Π΅ ускоряСт Ρ€Π°Π±ΠΎΡ‚Ρƒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹: Π±ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ³ΠΎ, Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ с Ρ†ΠΈΠΊΠ»Π°ΠΌΠΈ ΠΈΠ½ΠΎΠ³Π΄Π° Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ быстрСС.

Π›ΠΈ ΠšΠΎΠ»Π΄ΡƒΡΠ»Π» (с сайта Stack Overflow) сказал:

Π¦ΠΈΠΊΠ»Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ ΡƒΡΠΊΠΎΡ€ΠΈΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρƒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. РСкурсия ΠΌΠΎΠΆΠ΅Ρ‚ ΡƒΡΠΊΠΎΡ€ΠΈΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρƒ программиста. Π’Ρ‹Π±ΠΈΡ€Π°ΠΉΡ‚Π΅, Ρ‡Ρ‚ΠΎ Π²Π°ΠΆΠ½Π΅Π΅ Π² вашСй ситуации!

Π‘Π°Π·ΠΎΠ²Ρ‹ΠΉ случай ΠΈ рСкурсивный случай

КаТдая рСкурсивная функция состоит ΠΈΠ· Π΄Π²ΡƒΡ… частСй: Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ случая ΠΈ рСкурсивного случая. Π’ рСкурсивном случаС функция Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ сама сСбя. Π’ Π±Π°Π·ΠΎΠ²ΠΎΠΌ случаС функция сСбя Π½Π΅ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Π·Π°Ρ†ΠΈΠΊΠ»ΠΈΠ²Π°Π½ΠΈΠ΅.

♦ Рассмотрим ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ Π·Π°Π΄Π°Ρ‡Ρƒ. ΠΠ°ΠΏΠΈΡΠ°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ для Π²Ρ‹Π²ΠΎΠ΄Π° ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠ³ΠΎ отсчСта.

ΠŸΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Π·Π°Π΄Π°Ρ‡ΠΈ

Countdown.java

Π‘Ρ‚Π΅ΠΊ Π²Ρ‹Π·ΠΎΠ²ΠΎΠ²

ВсС это врСмя, работая с рСкурсиСй, ΠΌΡ‹ пользовались стСком Π²Ρ‹Π·ΠΎΠ²ΠΎΠ².

ΠšΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΡ стСка Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² ΠΈΠ³Ρ€Π°Π΅Ρ‚ Π²Π°ΠΆΠ½ΡƒΡŽ Ρ€ΠΎΠ»ΡŒ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ Π²ΠΎΠΎΠ±Ρ‰Π΅; ΠΊΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Π΅Π΅ Π²Π°ΠΆΠ½ΠΎ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ ΠΏΡ€ΠΈ использовании рСкурсии.

РСализация стСка Π²Ρ‹Π·ΠΎΠ²ΠΎΠ²

Greet.java

Call-Stack

Π‘Ρ‚Π΅ΠΊ Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² с рСкурсиСй

РСкурсивныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ‚ΠΎΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ стСк Π²Ρ‹Π·ΠΎΠ²ΠΎΠ²! ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΠΌ, ΠΊΠ°ΠΊ это дСлаСтся, Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ вычислСния Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΠ°Π»Π°.

ВычислСниС Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΠ°Π»Π°

Factorial.java

Π˜Π·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅

Π‘Ρ‚Π΅ΠΊ ΡƒΠ΄ΠΎΠ±Π΅Π½, Π½ΠΎ Ρƒ Π½Π΅Π³ΠΎ Π΅ΡΡ‚ΡŒ своя Ρ†Π΅Π½Π°: сохранСниС ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ Π·Π°Ρ‚Ρ€Π°Ρ‚Π°ΠΌ памяти. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ Π½Π΅ ΠΌΠ½ΠΎΠ³ΠΎ памяти, Π½ΠΎ Ссли стСк станСт слишком высоким, это Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ·Π½Π°Ρ‡Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ваш ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€ сохраняСт ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΏΠΎ ΠΎΡ‡Π΅Π½ΡŒ ΠΌΠ½ΠΎΠ³ΠΈΠΌ Π²Ρ‹Π·ΠΎΠ²Π°ΠΌ. На этой стадии Π΅ΡΡ‚ΡŒ Π΄Π²Π° Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π°:

  • ΠŸΠ΅Ρ€Π΅ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΊΠΎΠ΄ с использованиСм Ρ†ΠΈΠΊΠ»Π°.
  • ΠŸΠΎΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Ρ‚ΡŒ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Ρ‚Π°ΠΊ Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΠΎΠΉ хвостовой рСкурсиСй.

Π¨ΠΏΠ°Ρ€Π³Π°Π»ΠΊΠ°

  • Когда функция Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ саму сСбя, это называСтся рСкурсиСй.
  • Π’ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ рСкурсивной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ Π΄Π²Π° случая: Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ ΠΈ рСкурсивный.
  • Π‘Ρ‚Π΅ΠΊ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Π΄Π²Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ: занСсСниС ΠΈ ΠΈΠ·Π²Π»Π΅Ρ‡Π΅Π½ΠΈΠ΅ элСмСнтов.
  • ВсС Π²Ρ‹Π·ΠΎΠ²Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΡΠΎΡ…Ρ€Π°Π½ΡΡŽΡ‚ΡΡ Π² стСкС Π²Ρ‹Π·ΠΎΠ²ΠΎΠ².
  • Если стСк Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² станСт большим, ΠΎΠ½ Π·Π°ΠΉΠΌΠ΅Ρ‚ слишком ΠΌΠ½ΠΎΠ³ΠΎ памяти.

Быстрая сортировка

Быстрая сортировка - элСгантный Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ сортировки, часто примСняСмый Π½Π° ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅. Алгоритм быстрой сортировки ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΡΡ‚Ρ€Π°Ρ‚Π΅Π³ΠΈΡŽ "раздСляй ΠΈ властвуй".

Алгоритм быстрой сортировки Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ быстрСС сортировки Π²Ρ‹Π±ΠΎΡ€ΠΎΠΌ. Он являСтся Ρ…ΠΎΡ€ΠΎΡˆΠΈΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠΌ элСгантного ΠΊΠΎΠ΄Π°.

"РаздСляй ΠΈ властвуй"

Π˜Ρ‚Π°ΠΊ, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ Π²Ρ‹ Ρ„Π΅Ρ€ΠΌΠ΅Ρ€, Π²Π»Π°Π΄Π΅ΡŽΡ‰ΠΈΠΉ Π·Π΅ΠΌΠ΅Π»ΡŒΠ½Ρ‹ΠΌ участком. Π—Π΅ΠΌΠ΅Π»ΡŒΠ½Ρ‹ΠΉ участок прСдставлСн Π½Π° рисункС Π½ΠΈΠΆΠ΅.

Π—Π΅ΠΌΠ΅Π»ΡŒΠ½Ρ‹ΠΉ участок

Π’Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ Ρ€Π°Π²Π½ΠΎΠΌΠ΅Ρ€Π½ΠΎ Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚ΡŒ зСмлю Π½Π° ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹Π΅ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π½Ρ‹Π΅ участки. Участки Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ Π½Π°ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ большими, насколько это Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ.

Как ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ наибольший Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π° для участка? Π’ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ΡΡŒ стратСгиСй "раздСляй ΠΈ властвуй"! Алгоритмы Π½Π° Π±Π°Π·Π΅ этой стратСгии ΡΠ²Π»ΡΡŽΡ‚ΡΡ рСкурсивными.

РСшСниС Π·Π°Π΄Π°Ρ‡ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ "раздСляй ΠΈ властвуй" состоит ΠΈΠ· Π΄Π²ΡƒΡ… шагов:

  1. Π‘Π½Π°Ρ‡Π°Π»Π° опрСдСляСтся Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ случай. Π­Ρ‚ΠΎ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠΈΠΉ случай ΠΈΠ· всСх Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ….
  2. Π—Π°Π΄Π°Ρ‡Π° дСлится ΠΈΠ»ΠΈ сокращаСтся Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ свСдСна ΠΊ Π±Π°Π·ΠΎΠ²ΠΎΠΌΡƒ ΡΠ»ΡƒΡ‡Π°ΡŽ.

Для Π½Π°Ρ‡Π°Π»Π° Ρ€Π°Π·ΠΌΠ΅Ρ‚ΠΈΠΌ самыС большиС участки, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ.

Π‘ΠΎΠ»ΡŒΡˆΠΈΠ΅ участки

Π˜Ρ‚Π°ΠΊ, Π² исходном Π½Π°Π΄Π΅Π»Π΅ ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°Π·ΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Π΄Π²Π° участка 640 Ρ… 640, ΠΈ Π΅Ρ‰Π΅ останСтся мСсто. Π’ΡƒΡ‚-Ρ‚ΠΎ ΠΈ наступаСт ΠΌΠΎΠΌΠ΅Π½Ρ‚ истины. НСраспрСдСлСнный остаток - это Ρ‚ΠΎΠΆΠ΅ Π½Π°Π΄Π΅Π» Π·Π΅ΠΌΠ»ΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½ΡƒΠΆΠ½ΠΎ Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚ΡŒ. Π’ΠΎ Π΅ΡΡ‚ΡŒ ΠΊ Π½Π΅ΠΌΡƒ (нСраспрСдСлСнному остатку) Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ Ρ‚ΠΎΡ‚ ΠΆΠ΅ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ.

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΌΡ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Ρ‚ΠΎ сократили Π·Π°Π΄Π°Ρ‡Ρƒ с Ρ€Π°Π·ΠΌΠ΅Ρ€Π° 1680 Ρ… 640 Π΄ΠΎ 640 Ρ… 400! ДвигаСмся дальшС!

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π½Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚ΡŒ сСгмСнт 640 Ρ… 400. Π Π°Π·ΠΌΠ΅Ρ€Ρ‹ самого большого ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ, ΡΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ 400 Ρ… 400 ΠΌ (см. рисунок Π½ΠΈΠΆΠ΅).

МСньший участок

ПослС раздСлСния остаСтся мСньший сСгмСнт с Ρ€Π°Π·ΠΌΠ΅Ρ€Π°ΠΌΠΈ 400 Ρ… 240 ΠΌ. Π Π°Π·Π΄Π΅Π»ΠΈΠΌ этот сСгмСнт (см. рисунок Π½ΠΈΠΆΠ΅).

240x160

ΠžΡ‚ΡΠ΅ΠΊΠ°Ρ ΠΏΠΎΠ΄Π΅Π»Π΅Π½Π½ΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ, ΠΌΡ‹ ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΠΌ ΠΊ Π΅Ρ‰Π΅ ΠΌΠ΅Π½ΡŒΡˆΠ΅ΠΌΡƒ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρƒ сСгмСнта, 240 Ρ… 160 ΠΌ.

ПослС ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎΠ³ΠΎ отсСчСния получаСтся Π΅Ρ‰Π΅ мСньший сСгмСнт (см. рисунок Π½ΠΈΠΆΠ΅).

160Ρ…80

Π£Ρ€Π°, ΠΌΡ‹ ΠΏΡ€ΠΈΡˆΠ»ΠΈ ΠΊ Π±Π°Π·ΠΎΠ²ΠΎΠΌΡƒ ΡΠ»ΡƒΡ‡Π°ΡŽ: 160 ΠΊΡ€Π°Ρ‚Π½ΠΎ 80. Если Ρ€Π°Π·Π±ΠΈΡ‚ΡŒ этот сСгмСнт Π½Π° ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Ρ‹, Π½ΠΈΡ‡Π΅Π³ΠΎ лишнСго Π½Π΅ останСтся!

80Ρ…80

Π˜Ρ‚Π°ΠΊ, для исходного Π½Π°Π΄Π΅Π»Π° Π·Π΅ΠΌΠ»ΠΈ самый большой Ρ€Π°Π·ΠΌΠ΅Ρ€ участка Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π²Π΅Π½ 80 Ρ… 80 ΠΌ.

Алгоритм Π•Π²ΠΊΠ»ΠΈΠ΄Π°
"Если Π²Ρ‹ Π½Π°ΠΉΠ΄Π΅Ρ‚Π΅ самый большой участок, подходящий для этого Ρ€Π°Π·ΠΌΠ΅Ρ€Π°, это Π±ΡƒΠ΄Π΅Ρ‚ самый большой участок, подходящий для всСй Ρ„Π΅Ρ€ΠΌΡ‹."

Если Вас интСрСсуСт Π΄ΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒΡΡ‚Π²ΠΎ, ΠΏΠΎΠΈΡ‰ΠΈΡ‚Π΅ "Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ Π•Π²ΠΊΠ»ΠΈΠ΄Π°".

Как Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ стратСгия "раздСляй ΠΈ властвуй":

  1. ΠžΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚Π΅ ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠΈΠΉ случай ΠΊΠ°ΠΊ Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ.
  2. ΠŸΡ€ΠΈΠ΄ΡƒΠΌΠ°ΠΉΡ‚Π΅, ΠΊΠ°ΠΊ свСсти Π·Π°Π΄Π°Ρ‡Ρƒ ΠΊ Π±Π°Π·ΠΎΠ²ΠΎΠΌΡƒ ΡΠ»ΡƒΡ‡Π°ΡŽ.

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΌΡ‹ рассмотрСли ΡΡƒΡ‚ΡŒ стратСгии "раздСляй ΠΈ властвуй".

ΠŸΠ°Ρ€Π° слов ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ

Π’ языках Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ программирования, Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ Haskell, Ρ†ΠΈΠΊΠ»ΠΎΠ² Π½Π΅Ρ‚, поэтому для написания Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ приходится ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ Ρ€Π΅ΠΊΡƒΡ€ΡΠΈΡŽ. Если Π²Ρ‹ Ρ…ΠΎΡ€ΠΎΡˆΠΎ ΠΏΠΎΠ½ΠΈΠΌΠ°Π΅Ρ‚Π΅ Ρ€Π΅ΠΊΡƒΡ€ΡΠΈΡŽ, Π²Π°ΠΌ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΡ‰Π΅ ΠΈΠ·ΡƒΡ‡Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Π΅ языки.

Π‘ΠΎΠ²Π΅Ρ‚

Когда Π²Ρ‹ ΠΏΠΈΡˆΠ΅Ρ‚Π΅ Ρ€Π΅ΠΊΡƒΡ€ΡΠΈΠ²Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ задСйствован массив, Π±Π°Π·ΠΎΠ²Ρ‹ΠΌ случаСм часто оказываСтся пустой массив ΠΈΠ»ΠΈ массив ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ элСмСнта. Если Π²Ρ‹ Π½Π΅ Π·Π½Π°Π΅Ρ‚Π΅, с Ρ‡Π΅Π³ΠΎ Π½Π°Ρ‡Π°Ρ‚ΡŒ, - Π½Π°Ρ‡Π½ΠΈΡ‚Π΅ с этого.

УпраТнСния

  1. Π˜ΠΌΠ΅Π΅Ρ‚ΡΡ массив чисСл. НуТно ΠΏΡ€ΠΎΡΡƒΠΌΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ всС числа ΠΈ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ сумму. Π Π΅ΡˆΠΈΡ‚ΡŒ Π·Π°Π΄Π°Ρ‡Ρƒ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Ρ€Π΅ΠΊΡƒΡ€ΡΠΈΡŽ.

RecursiveSum.java

  1. ΠΠ°ΠΏΠΈΡΠ°Ρ‚ΡŒ Ρ€Π΅ΠΊΡƒΡ€ΡΠΈΠ²Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ для подсчСта элСмСнтов Π² спискС.

RecursiveCount.java

  1. НайдитС наибольшСС число Π² спискС.

RecursiveMax.java

Quick Sort (рСализация Π½Π° Java)

Быстрая сортировка относится ΠΊ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ°ΠΌ сортировки. Она Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ быстрСС сортировки Π²Ρ‹Π±ΠΎΡ€ΠΎΠΌ ΠΈ часто примСняСтся Π² Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°Ρ…. Quick sort основана Π½Π° стратСгии "раздСляй ΠΈ властвуй".

Π’ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡΡ быстрой сортировкой для упорядочСния массива.

Π˜Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠ²Π»ΡΡ‚ΡŒΡΡ Π±Π°Π·ΠΎΠ²Ρ‹ΠΌ случаСм?

ΠŸΡƒΡΡ‚Ρ‹Π΅ массивы ΠΈ массивы, содСрТащиС всСго ΠΎΠ΄ΠΈΠ½ элСмСнт, станут Π±Π°Π·ΠΎΠ²Ρ‹ΠΌ случаСм. Π’Π°ΠΊΠΈΠ΅ массивы ΠΌΠΎΠΆΠ½ΠΎ просто Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ Π² исходном Π²ΠΈΠ΄Π΅ - ΡΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ.

Алгоритм быстрой сортировки Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Ρ‚Π°ΠΊ: сначала Π² массивС выбираСтся элСмСнт, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ называСтся ΠΎΠΏΠΎΡ€Π½Ρ‹ΠΌ.

Π—Π°Ρ‚Π΅ΠΌ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ΡΡ элСмСнты, мСньшиС ΠΎΠΏΠΎΡ€Π½ΠΎΠ³ΠΎ, ΠΈ элСмСнты, большиС ΠΎΠΏΠΎΡ€Π½ΠΎΠ³ΠΎ. Π­Ρ‚ΠΎΡ‚ процСсс называСтся Ρ€Π°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅ΠΌ.

ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Ρ‹ΠΉ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ быстрой сортировки

Алгоритм

GIF-анимация (quick sort)

Quick Sort

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄ быстрой сортировки

QuickSort.java

Об "О-большом"

Алгоритм быстрой сортировки ΡƒΠ½ΠΈΠΊΠ°Π»Π΅Π½ Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Π΅Π³ΠΎ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ зависит ΠΎΡ‚ Π²Ρ‹Π±ΠΎΡ€Π° ΠΎΠΏΠΎΡ€Π½ΠΎΠ³ΠΎ элСмСнта.

Π’ Ρ…ΡƒΠ΄ΡˆΠ΅ΠΌ случаС быстрая сортировка Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π·Π° врСмя O(n^2). ΠΠΈΡ‡ΡƒΡ‚ΡŒ Π½Π΅ Π»ΡƒΡ‡ΡˆΠ΅ сортировки Π²Ρ‹Π±ΠΎΡ€ΠΎΠΌ! Но это Ρ…ΡƒΠ΄ΡˆΠΈΠΉ случай, Π° Π² срСднСм быстрая сортировка выполняСтся Π·Π° врСмя O(n log n).

Вопросы, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‚:

  • Ρ‡Ρ‚ΠΎ Π² Π΄Π°Π½Π½ΠΎΠΌ случаС понимаСтся ΠΏΠΎΠ΄ "Ρ…ΡƒΠ΄ΡˆΠΈΠΌ" ΠΈ "срСдним" случаСм?
  • Ссли быстрая сортировка Π² срСднСм выполняСтся Π·Π° врСмя O(n log n), Π° сортировка слияниСм выполняСтся Π·Π° врСмя O(n log n) всСгда, Ρ‚ΠΎ ΠΏΠΎΡ‡Π΅ΠΌΡƒ Π±Ρ‹ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ сортировку слияниСм? Π Π°Π·Π²Π΅ ΠΎΠ½Π° Π½Π΅ быстрСС?

Π‘ΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²ΠΊΠ° слияниСм ΠΈ быстрая сортировка

ΠŸΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ Π²Ρ‹ΡΡΠ½ΠΈΡ‚ΡŒ, какая сортировка Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ быстрСС: сортировка слияниСм ΠΈΠ»ΠΈ быстрая сортировка.

Допустим, Ρƒ нас имССтся простая функция для Π²Ρ‹Π²ΠΎΠ΄Π° ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ элСмСнта Π² спискС:

def print_items(list):
   for item in list:
      print item

Π­Ρ‚Π° функция ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π±ΠΈΡ€Π°Π΅Ρ‚ всС элСмСнты списка ΠΈ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ ΠΈΡ…. Π’Π°ΠΊ ΠΊΠ°ΠΊ функция ΠΏΠ΅Ρ€Π΅Π±ΠΈΡ€Π°Π΅Ρ‚ вСсь список, ΠΎΠ½Π° выполняСтся Π·Π° врСмя O(n).

ИзмСним Π½Π°ΡˆΡƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ (print_items), Π΄ΠΎΠ±Π°Π²ΠΈΠ² ΡΠ΅ΠΊΡƒΠ½Π΄Π½ΡƒΡŽ ΠΏΠ°ΡƒΠ·Ρƒ ΠΏΠ΅Ρ€Π΅Π΄ Π²Ρ‹Π²ΠΎΠ΄ΠΎΠΌ значСния:

from time import sleep
def print_items2(list):
   for item in list:
      sleep(1)
      print item

Π Π°Π±ΠΎΡ‚Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ продСмонстрирована Π½ΠΈΠΆΠ΅:

# Π˜ΠΌΠ΅Π΅Ρ‚ΡΡ список ΠΈΠ· пяти элСмСнтов: 2|4|6|8|10
print_items: 246810
print_items2: 2 <ΠΏΠ°ΡƒΠ·Π°> 4 <ΠΏΠ°ΡƒΠ·Π°> 6 <ΠΏΠ°ΡƒΠ·Π°> 8 <ΠΏΠ°ΡƒΠ·Π°> 10 <ΠΏΠ°ΡƒΠ·Π°>

ОбС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ проходят ΠΏΠΎ списку ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·, ΠΈ ΠΎΠ±Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ Π·Π° врСмя O(n).

Вопрос. Какая ΠΈΠ· Π½ΠΈΡ… Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ быстрСС?

ΠžΡ‚Π²Π΅Ρ‚. print_items Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ быстрСС, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΎΠ½Π° НЕ Π΄Π΅Π»Π°Π΅Ρ‚ ΠΏΠ°ΡƒΠ·Ρƒ ΠΏΠ΅Ρ€Π΅Π΄ Π²Ρ‹Π²ΠΎΠ΄ΠΎΠΌ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ элСмСнта.

Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, Π΄Π°ΠΆΠ΅ ΠΏΡ€ΠΈ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΠ±Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈΠΌΠ΅ΡŽΡ‚ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΡƒΡŽ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ "О-большоС", Ρ€Π΅Π°Π»ΡŒΠ½ΠΎ print_items Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ быстрСС. Π‘Ρ‚ΠΎΠΈΡ‚ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ "О-большоС" (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, O(n)), Π² Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ это ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅: c * n.

Π—Π΄Π΅ΡΡŒ c - Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ фиксированный ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΠΊ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ для Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ°. Он называСтся константой. НапримСр, врСмя выполнСния ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ 10 миллисСкунд * n для print_items ΠΏΡ€ΠΎΡ‚ΠΈΠ² 1 сСкунды * n для print_items2.

ΠžΠ±Ρ‹Ρ‡Π½ΠΎ константа игнорируСтся, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Ссли Π΄Π²Π° Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° ΠΈΠΌΠ΅ΡŽΡ‚ Ρ€Π°Π·Π½ΠΎΠ΅ врСмя "О-большоС", ΠΎΠ½Π° Ρ€ΠΎΠ»ΠΈ Π½Π΅ ΠΈΠ³Ρ€Π°Π΅Ρ‚.

Для ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° возьмСм Π±ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΉ ΠΈ простой поиск. Допустим, Ρ‡Ρ‚ΠΎ константы ΠΏΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‚ Π² ΠΎΠ±ΠΎΠΈΡ… Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ°Ρ….

   10 мс * n                     1 с * log n
   __________                    ___________         
// ΠŸΡ€ΠΎΡΡ‚ΠΎΠΉ поиск             // Π‘ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΉ поиск

Наша рСакция Π±ΡƒΠ΄Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ: "Ого! Π£ простого поиска константа Ρ€Π°Π²Π½Π° 10 миллисСкундам, Π° Ρƒ Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠ³ΠΎ поиска - 1 сСкунда. ΠŸΡ€ΠΎΡΡ‚ΠΎΠΉ поиск Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ быстрСС!"

Но, Π΄Π°Π²Π°ΠΉΡ‚Π΅ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ поиск вСдСтся ΠΏΠΎ списку ΠΈΠ· 4 ΠΌΠΈΠ»Π»ΠΈΠ°Ρ€Π΄ΠΎΠ² элСмСнтов, Ρ‚ΠΎΠ³Π΄Π° врСмя Π±ΡƒΠ΄Π΅Ρ‚ Ρ‚Π°ΠΊΠΈΠΌ:

ΠŸΡ€ΠΎΡΡ‚ΠΎΠΉ поиск | 10 мс * 4 ΠΌΠΈΠ»Π»ΠΈΠ°Ρ€Π΄Π° = 463 дня (c * n, Π³Π΄Π΅ с = 10 мс).
Π‘ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΉ поиск | 1 с * 32 = 32 сСкунды (с * log n, Π³Π΄Π΅ с = 1 с). 

Как ΠΌΠΎΠΆΠ΅ΠΌ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Π±ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΉ поиск всС Ρ€Π°Π²Π½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ быстрСС. ΠšΠΎΠ½ΡΡ‚Π°Π½Ρ‚Π° Π½ΠΈ Π½Π° Ρ‡Ρ‚ΠΎ Π½Π΅ повлияла.

Однако Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… случаях константа ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. Один ΠΈΠ· ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ² Ρ‚Π°ΠΊΠΎΠ³ΠΎ Ρ€ΠΎΠ΄Π° - быстрая сортировка ΠΈ сортировка слияниСм. Π£ быстрой сортировки константа мСньшС, Ρ‡Π΅ΠΌ Ρƒ сортировки слияниСм, поэтому, нСсмотря Π½Π° Ρ‚ΠΎ Ρ‡Ρ‚ΠΎ ΠΎΠ±Π° Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° Ρ…Π°Ρ€Π°ΠΊΡ‚Π΅Ρ€ΠΈΠ·ΡƒΡŽΡ‚ΡΡ Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ O(n log n), быстрая сортировка Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ быстрСС.

Π¨ΠΏΠ°Ρ€Π³Π°Π»ΠΊΠ°

  • БтратСгия «раздСляй ΠΈ властвуй» основана Π½Π° Ρ€Π°Π·Π±ΠΈΠ΅Π½ΠΈΠΈ Π·Π°Π΄Π°Ρ‡ΠΈ Π½Π° ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°ΡŽΡ‰ΠΈΠ΅ΡΡ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Ρ‹. Если Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ Π΄Π°Π½Π½ΡƒΡŽ ΡΡ‚Ρ€Π°Ρ‚Π΅Π³ΠΈΡŽ со списком, Ρ‚ΠΎ Π±Π°Π·ΠΎΠ²Ρ‹ΠΌ случаСм, скорСС всСго, Π±ΡƒΠ΄Π΅Ρ‚ ΡΠ²Π»ΡΡ‚ΡŒΡΡ пустой массив ΠΈΠ»ΠΈ массив ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ элСмСнта.
  • Если Π²Ρ‹ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚Π΅ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ быстрой сортировки, Ρ‚ΠΎ Π² качСствС ΠΎΠΏΠΎΡ€Π½ΠΎΠ³ΠΎ слСдуСт Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ случайный элСмСнт. Π‘Ρ€Π΅Π΄Π½Π΅Π΅ врСмя выполнСния быстрой сортировки составляСт О(n log n)!
  • ΠšΠΎΠ½ΡΡ‚Π°Π½Ρ‚Ρ‹ Π² «О-большом» ΠΈΠ½ΠΎΠ³Π΄Π° ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. ИмСнно ΠΏΠΎ этой ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π΅ быстрая сортировка быстрСС сортировки слияниСм.

Π₯Сш-Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹

Π₯Сш-Ρ‚Π°Π±Π»ΠΈΡ†Π°

ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ Π²Ρ‹ ΡΠ²Π»ΡΠ΅Ρ‚Π΅ΡΡŒ ΠΏΡ€ΠΎΠ΄Π°Π²Ρ†ΠΎΠΌ Π² малСньком ΠΌΠ°Π³Π°Π·ΠΈΠ½Ρ‡ΠΈΠΊΠ΅. Когда ΠΊΠ»ΠΈΠ΅Π½Ρ‚ ΠΏΠΎΠΊΡƒΠΏΠ°Π΅Ρ‚ Ρ‚ΠΎΠ²Π°Ρ€Ρ‹, Π²Ρ‹ провСряСтС ΠΈΡ… Ρ†Π΅Π½Ρƒ ΠΏΠΎ ΠΊΠ½ΠΈΠ³Π΅. Если записи Π² ΠΊΠ½ΠΈΠ³Π΅ Π½Π΅ упорядочСны ΠΏΠΎ Π°Π»Ρ„Π°Π²ΠΈΡ‚Ρƒ, Ρ‚ΠΎ поиск слова Β«Π°ΠΏΠ΅Π»ΡŒΡΠΈΠ½Ρ‹Β» Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΉ строкС Π·Π°ΠΉΠΌΠ΅Ρ‚ слишком ΠΌΠ½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ. ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, Ссли ΠΆΠ΅ ΠΊΠ½ΠΈΠ³Π° упорядочСна ΠΏΠΎ Π°Π»Ρ„Π°Π²ΠΈΡ‚Ρƒ, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π±ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΌ поиском, врСмя ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ составляСт всСго O(log n).

Но поиск Π΄Π°Π½Π½Ρ‹Ρ… Π² ΠΊΠ½ΠΈΠ³Π΅ - головная боль, Π΄Π°ΠΆΠ΅ Ссли Π΅Π΅ содСрТимоС отсортировано. Пока Π²Ρ‹ листаСтС страницы, ΠΊΠ»ΠΈΠ΅Π½Ρ‚ ΠΏΠΎΡ‚ΠΈΡ…ΠΎΠ½ΡŒΠΊΡƒ Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚ Π²Ρ‹Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΈΠ· сСбя. Π“ΠΎΡ€Π°Π·Π΄ΠΎ ΡƒΠ΄ΠΎΠ±Π½Π΅Π΅ Π±Ρ‹Π»ΠΎ Π±Ρ‹ завСсти ΠΏΠΎΠΌΠΎΡ‰Π½ΠΈΡ†Ρƒ, которая ΠΏΠΎΠΌΠ½ΠΈΡ‚ всС названия Ρ‚ΠΎΠ²Π°Ρ€ΠΎΠ² ΠΈ Ρ†Π΅Π½Ρ‹. Π’ΠΎΠ³Π΄Π° Π½ΠΈΡ‡Π΅Π³ΠΎ ΠΈΡΠΊΠ°Ρ‚ΡŒ Π²ΠΎΠΎΠ±Ρ‰Π΅ Π½Π΅ придСтся: Π²Ρ‹ ΡΠΏΡ€Π°ΡˆΠΈΠ²Π°Π΅Ρ‚Π΅ ΠΏΠΎΠΌΠΎΡ‰Π½ΠΈΡ†Ρƒ, Π° ΠΎΠ½Π° ΠΌΠ³Π½ΠΎΠ²Π΅Π½Π½ΠΎ ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚.

Π’ Π΄Π°Π½Π½ΠΎΠΉ ситуации ΠΎΡ‚Π»ΠΈΡ‡Π½ΠΎ ΠΏΠΎΠ΄ΠΎΠΉΠ΄Π΅Ρ‚ структура Π΄Π°Π½Π½Ρ‹Ρ…, которая называСтся Ρ…Π΅Ρˆ-Ρ‚Π°Π±Π»ΠΈΡ†Π°.

Π₯Сш-функция

Π₯Сш-Ρ‚Π°Π±Π»ΠΈΡ†Π°

Π₯Сш-функция прСдставляСт собой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, которая ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ строку ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ число. Под "строкой" Π² Π΄Π°Π½Π½ΠΎΠΌ случаС слСдуСт ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ Π»ΡŽΠ±Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅.

Π’ Π½Π°ΡƒΡ‡Π½ΠΎΠΉ Ρ‚Π΅Ρ€ΠΌΠΈΠ½ΠΎΠ»ΠΎΠ³ΠΈΠΈ говорят, Ρ‡Ρ‚ΠΎ Ρ…Π΅Ρˆ-функция Β«ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅Ρ‚ строки Π½Π° числа". МоТно ΠΏΠΎΠ΄ΡƒΠΌΠ°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π½Π°ΠΉΡ‚ΠΈ закономСрности получСния чисСл для ΠΏΠΎΠ΄Π°Π²Π°Π΅ΠΌΡ‹Ρ… Π½Π° Π²Ρ…ΠΎΠ΄ строк Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ. Однако Ρ…Π΅Ρˆ-функция Π΄ΠΎΠ»ΠΆΠ½Π° ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ трСбованиям:

  • Она Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠΉ. Допустим, Π²Ρ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Π»ΠΈ Π΅ΠΉ строку "Π°ΠΏΠ΅Π»ΡŒΡΠΈΠ½Ρ‹" ΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ 4. Π­Ρ‚ΠΎ Π·Π½Π°Ρ‡ΠΈΡ‚, Ρ‡Ρ‚ΠΎ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· Π² Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΌ, пСрСдавая Π΅ΠΉ строку Β«Π°ΠΏΠ΅Π»ΡŒΡΠΈΠ½Ρ‹Β», Π²Ρ‹ Π±ΡƒΠ΄Π΅Ρ‚Π΅ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ 4. Π‘Π΅Π· этого Ρ…Π΅Ρˆ-Ρ‚Π°Π±Π»ΠΈΡ†Π° бСсполСзна.
  • Π Π°Π·Π½Ρ‹ΠΌ словам Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π°Π·Π½Ρ‹Π΅ числа. НапримСр, Ρ…Π΅Ρˆ-функция, которая Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ 1 для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΠΎΠ³ΠΎ слова, Π½ΠΈΠΊΡƒΠ΄Π° Π½Π΅ годится. Π’ ΠΈΠ΄Π΅Π°Π»Π΅ ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ Π²Ρ…ΠΎΠ΄Π½ΠΎΠ΅ слово Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Ρ‚ΡŒΡΡ Π½Π° своС число.

ΠžΡ‚ΠΌΠ΅Ρ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎ Ρ…Π΅Ρˆ-Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ быстро Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚! ΠžΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΊ элСмСнту массива происходит ΠΌΠ³Π½ΠΎΠ²Π΅Π½Π½ΠΎ, Π° Ρ…Π΅Ρˆ-Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ массивы для хранСния Π΄Π°Π½Π½Ρ‹Ρ…, поэтому ΠΏΡ€ΠΈ ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠΈ ΠΊ элСмСнтам ΠΎΠ½ΠΈ Π½Π΅ ΡƒΡΡ‚ΡƒΠΏΠ°ΡŽΡ‚ массивам.

Π’ любом ΠΏΡ€ΠΈΠ»ΠΈΡ‡Π½ΠΎΠΌ языкС сущСствуСт рСализация Ρ…Π΅Ρˆ-Ρ‚Π°Π±Π»ΠΈΡ†. Π₯Сш-Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ извСстны ΠΏΠΎΠ΄ Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ названиями: «ассоциативныС массивы» , «словари», «отобраТСния», Β«Ρ…Π΅Ρˆ-ΠΊΠ°Ρ€Ρ‚Ρ‹Β» ΠΈΠ»ΠΈ просто Β«Ρ…Π΅ΡˆΠΈΒ».

Π˜ΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π΄ΡƒΠ±Π»ΠΈΠΊΠ°Ρ‚ΠΎΠ²

Π—Π°Π΄Π°Ρ‡Π°. ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Π²Ρ‹ Ρ€ΡƒΠΊΠΎΠ²ΠΎΠ΄ΠΈΡ‚Π΅ ΠΈΠ·Π±ΠΈΡ€Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ участком. ЕстСствСнно, ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ·Π±ΠΈΡ€Π°Ρ‚Π΅Π»ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΎΠ³ΠΎΠ»ΠΎΡΠΎΠ²Π°Ρ‚ΡŒ всСго ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·. Как ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ голосовал Ρ€Π°Π½Π΅Π΅? Когда Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊ ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΡ‚ Π³ΠΎΠ»ΠΎΡΠΎΠ²Π°Ρ‚ΡŒ, Π²Ρ‹ ΡƒΠ·Π½Π°Π΅Ρ‚Π΅ Π΅Π³ΠΎ ΠΏΠΎΠ»Π½ΠΎΠ΅ имя, Π° Π·Π°Ρ‚Π΅ΠΌ провСряСтС ΠΏΠΎ списку ΡƒΠΆΠ΅ ΠΏΡ€ΠΎΠ³ΠΎΠ»ΠΎΡΠΎΠ²Π°Π²ΡˆΠΈΡ… ΠΈΠ·Π±ΠΈΡ€Π°Ρ‚Π΅Π»Π΅ΠΉ. Если имя Π²Ρ…ΠΎΠ΄ΠΈΡ‚ Π² список, Π·Π½Π°Ρ‡ΠΈΡ‚, этот Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊ ΡƒΠΆΠ΅ проголосовал - Π³ΠΎΠ½ΠΈΡ‚Π΅ Π½Π°Π³Π»Π΅Ρ†Π°! Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС Π²Ρ‹ добавляСтС имя Π² список ΠΈ Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π΅Ρ‚Π΅ Π΅ΠΌΡƒ ΠΏΡ€ΠΎΠ³ΠΎΠ»ΠΎΡΠΎΠ²Π°Ρ‚ΡŒ.

Но... Как Π±Ρ‹Ρ‚ΡŒ, ΠΊΠΎΠ³Π΄Π° список ΠΏΡ€ΠΎΠ³ΠΎΠ»ΠΎΡΠΎΠ²Π°Π²ΡˆΠΈΡ… станСт ΠΎΠ³Ρ€ΠΎΠΌΠ½Ρ‹ΠΌ? НСуТСли Π½ΡƒΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° ΠΊΡ‚ΠΎ-Ρ‚ΠΎ ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΡ‚ Π³ΠΎΠ»ΠΎΡΠΎΠ²Π°Ρ‚ΡŒ,
ΠΏΡ€ΠΎΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ гигантский список ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ, голосовал ΠΎΠ½ ΠΈΠ»ΠΈ Π½Π΅Ρ‚?

БущСствуСт эффСктивноС Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅: Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Ρ…Π΅ΡˆΠ΅ΠΌ!

РСшСниС Π·Π°Π΄Π°Ρ‡ΠΈ Π½Π° Java:

CheckVoter.java

РСшСниС Π·Π°Π΄Π°Ρ‡ΠΈ Π½Π° Kotlin:

Check_voter.kt

Коллизии

Коллизии

ΠœΠΎΠΆΠ΅Ρ‚ ΡΠ»ΡƒΡ‡ΠΈΡ‚ΡŒΡΡ Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎ Ρƒ Π΄Π²ΡƒΡ… Ρ€Π°Π·Π½Ρ‹Ρ… ΠΊΠ»ΡŽΡ‡Π΅ΠΉ окаТСтся ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΉ Ρ…ΡΡˆ. Или Ρ…ΡΡˆ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π·Π½Ρ‹ΠΌ, Π½ΠΎ ΠΏΠΎ Ρ„ΠΎΡ€ΠΌΡƒΠ»Π΅ позиция для ΠΎΠ±ΠΎΠΈΡ… Ρ…ΡΡˆΠ΅ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎΠΉ. Π’ΠΎΠ³Π΄Π° значСния ΠΎΠ±ΠΎΠΈΡ… ΠΊΠ»ΡŽΡ‡Π΅ΠΉ окаТутся записаны Π² ΠΎΠ΄Π½Ρƒ Β«ΠΊΠΎΡ€Π·ΠΈΠ½ΠΊΡƒΒ». Π­Ρ‚ΠΎ ΠΈ Π΅ΡΡ‚ΡŒ коллизия. ИмСнно ΠΈΠ·-Π·Π° ΠΊΠΎΠ»Π»ΠΈΠ·ΠΈΠΉ для хранСния Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ связанный список: Ссли Π±Ρ‹ Π² массивС просто хранился ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, любая коллизия пСрСзаписала Π±Ρ‹ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Π° это опасно. А ΠΏΡ€ΠΈ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ, Π΄Π°ΠΆΠ΅ Ссли случится коллизия, Π½ΠΎΠ²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ просто Π·Π°ΠΏΠΈΡˆΠ΅Ρ‚ΡΡ Π² Π½Π°Ρ‡Π°Π»ΠΎ Ρ‚ΠΎΠΉ ΠΆΠ΅ Β«ΠΊΠΎΡ€Π·ΠΈΠ½ΠΊΠΈΒ», Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ² староС.

Π˜Ρ‚Π°ΠΊ, ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π΄Π²Π° Π²Ρ‹Π²ΠΎΠ΄Π°:

  • Π²Ρ‹Π±ΠΎΡ€ Ρ…Π΅Ρˆ-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π²Π°ΠΆΠ΅Π½. Π₯Сш-функция, ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°ΡŽΡ‰Π°Ρ всС ΠΊΠ»ΡŽΡ‡ΠΈ Π½Π° ΠΎΠ΄ΠΈΠ½ элСмСнт массива, Π½ΠΈΠΊΡƒΠ΄Π° Π½Π΅ годится. Π’ ΠΈΠ΄Π΅Π°Π»Π΅ Ρ…Π΅Ρˆ-функция Π΄ΠΎΠ»ΠΆΠ½Π° Ρ€Π°ΡΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ ΠΊΠ»ΡŽΡ‡ΠΈ Ρ€Π°Π²Π½ΠΎΠΌΠ΅Ρ€Π½ΠΎ ΠΏΠΎ всСму Ρ…Π΅ΡˆΡƒ;
  • Ссли связанныС списки становятся слишком Π΄Π»ΠΈΠ½Π½Ρ‹ΠΌΠΈ, Ρ€Π°Π±ΠΎΡ‚Π° с Ρ…Π΅Ρˆ-Ρ‚Π°Π±Π»ΠΈΡ†Π΅ΠΉ сильно замСдляСтся. Но ΠΎΠ½ΠΈ Π½Π΅ станут слишком Π΄Π»ΠΈΠ½Π½Ρ‹ΠΌΠΈ ΠΏΡ€ΠΈ использовании Ρ…ΠΎΡ€ΠΎΡˆΠ΅ΠΉ Ρ…Π΅Ρˆ-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ!

ΠšΠΎΡΡ„Ρ„ΠΈΡ†ΠΈΠ΅Π½Ρ‚ заполнСния

ΠšΠΎΡΡ„Ρ„ΠΈΡ†ΠΈΠ΅Π½Ρ‚ заполнСния Ρ…Π΅Ρˆ-Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ вычисляСтся ΠΏΠΎ простой Ρ„ΠΎΡ€ΠΌΡƒΠ»Π΅: количСство элСмСнтов Π² Ρ…Π΅Ρˆ-Ρ‚Π°Π±Π»ΠΈΡ†Π΅ / ΠΎΠ±Ρ‰Π΅Π΅ количСство элСмСнтов. НапримСр, Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ Ρ…Π΅Ρˆ-Ρ‚Π°Π±Π»ΠΈΡ†Π΅ коэффициСнт заполнСния Ρ€Π°Π²Π΅Π½ 3/4.

ΠšΠΎΡΡ„Ρ„ΠΈΡ†ΠΈΠ΅Π½Ρ‚ заполнСния

Π‘ мСньшим коэффициСнтом Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ число ΠΊΠΎΠ»Π»ΠΈΠ·ΠΈΠΉ ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π΅Ρ‚ΡΡ, ΠΈ ваша Ρ‚Π°Π±Π»ΠΈΡ†Π° Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ эффСктивно. Π₯ΠΎΡ€ΠΎΡˆΠ΅Π΅ ΠΏΡ€ΠΈΠ±Π»ΠΈΠΆΠ΅Π½Π½ΠΎΠ΅ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ: измСняйтС Ρ€Π°Π·ΠΌΠ΅Ρ€ Ρ…Π΅Ρˆ-Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹, ΠΊΠΎΠ³Π΄Π° коэффициСнт заполнСния ΠΏΡ€Π΅Π²Ρ‹ΡˆΠ°Π΅Ρ‚ 0,7. Но вСдь Π½Π° ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠ² ΡƒΡ…ΠΎΠ΄ΠΈΡ‚ ΠΌΠ½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, скаТСтС Π²Ρ‹, ΠΈ Π±ΡƒΠ΄Π΅Ρ‚Π΅ Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎ ΠΏΡ€Π°Π²Ρ‹! Π”Π°, ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠ² Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Π·Π°Ρ‚Ρ€Π°Ρ‚ рСсурсов, поэтому ΠΎΠ½ΠΎ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠΈΡΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ слишком часто. Π’ срСднСм Ρ…Π΅Ρˆ-Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ Π·Π° врСмя 0(1) Π΄Π°ΠΆΠ΅ с ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠ².

Π¨ΠΏΠ°Ρ€Π³Π°Π»ΠΊΠ°

Π₯Сш-Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ Ρ‡Ρ€Π΅Π·Π²Ρ‹Ρ‡Π°ΠΉΠ½ΠΎ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‚ Π²Ρ‹ΡΠΎΠΊΡƒΡŽ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΠΏΠΎ-Ρ€Π°Π·Π½ΠΎΠΌΡƒ ΠΌΠΎΠ΄Π΅Π»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅.

  • Π₯Сш-Ρ‚Π°Π±Π»ΠΈΡ†Π° создаСтся объСдинСниСм Ρ…Π΅Ρˆ-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ с массивом.
  • Коллизии Π½Π΅ΠΆΠ΅Π»Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹. Π₯Сш-функция Π΄ΠΎΠ»ΠΆΠ½Π° свСсти количСство ΠΊΠΎΠ»Π»ΠΈΠ·ΠΈΠΉ ΠΊ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌΡƒ.
  • Π₯Сш-Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‚ ΠΎΡ‡Π΅Π½ΡŒ быстроС Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ поиска, вставки ΠΈ удалСния.
  • Π₯Сш-Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ Ρ…ΠΎΡ€ΠΎΡˆΠΎ подходят для модСлирования ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠΉ ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ.
  • Как Ρ‚ΠΎΠ»ΡŒΠΊΠΎ коэффициСнт заполнСния ΠΏΡ€Π΅Π²Ρ‹ΡˆΠ°Π΅Ρ‚ 0,7, ΠΏΠΎΡ€Π° ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€ Ρ…Π΅Ρˆ-Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹.
  • Π₯Сш-Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ для ΠΊΡΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ Π΄Π°Π½Π½Ρ‹Ρ… (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π½Π° Π²Π΅Π±-сСрвСрах).
  • Π₯Сш-Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ Ρ…ΠΎΡ€ΠΎΡˆΠΎ подходят для обнаруТСния Π΄ΡƒΠ±Π»ΠΈΠΊΠ°Ρ‚ΠΎΠ².

Поиск Π² ΡˆΠΈΡ€ΠΈΠ½Ρƒ

Поиск Π² ΡˆΠΈΡ€ΠΈΠ½Ρƒ позволяСт Π½Π°ΠΉΡ‚ΠΈ ΠΊΡ€Π°Ρ‚Ρ‡Π°ΠΉΡˆΠ΅Π΅ расстояниС ΠΌΠ΅ΠΆΠ΄Ρƒ двумя ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ. Однако сам Ρ‚Π΅Ρ€ΠΌΠΈΠ½ Β«ΠΊΡ€Π°Ρ‚Ρ‡Π°ΠΉΡˆΠ΅Π΅ расстояниС» ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎ Ρ€Π°Π·Π½Ρ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ! НапримСр, с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ поиска Π² ΡˆΠΈΡ€ΠΈΠ½Ρƒ ΠΌΠΎΠΆΠ½ΠΎ:

  • Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ для ΠΈΠ³Ρ€Ρ‹ Π² шашки, которая вычисляСт ΠΊΡ€Π°Ρ‚Ρ‡Π°ΠΉΡˆΠΈΠΉ ΠΏΡƒΡ‚ΡŒ ΠΊ ΠΏΠΎΠ±Π΅Π΄Π΅;
  • Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ правописания (минимальноС количСство ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ, ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΡŽΡ‰ΠΈΡ… ΠΎΡˆΠΈΠ±ΠΎΡ‡Π½ΠΎ написанноС слово Π² ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ΅, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΠ›Π“ΠžΠ Π˜Π€Πœ -> ΠΠ›Π“ΠžΠ Π˜Π’Πœ - ΠΎΠ΄Π½ΠΎ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅);
  • Π½Π°ΠΉΡ‚ΠΈ блиТайшСго ΠΊ Π²Π°ΠΌ Π²Ρ€Π°Ρ‡Π°.

Алгоритм поиска Π² ΡˆΠΈΡ€ΠΈΠ½Ρƒ (Π°Π½Π³Π». breadth-first search, BFS) позволяСт Π½Π°ΠΉΡ‚ΠΈ ΠΊΡ€Π°Ρ‚Ρ‡Π°ΠΉΡˆΠΈΠ΅ ΠΏΡƒΡ‚ΠΈ ΠΈΠ· ΠΎΠ΄Π½ΠΎΠΉ Π²Π΅Ρ€ΡˆΠΈΠ½Ρ‹ нСвзвСшСнного (ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΠΈΠ»ΠΈ Π½Π΅ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ) Π³Ρ€Π°Ρ„Π° Π΄ΠΎ всСх ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Ρ… Π²Π΅Ρ€ΡˆΠΈΠ½. Под ΠΊΡ€Π°Ρ‚Ρ‡Π°ΠΉΡˆΠΈΠΌ ΠΏΡƒΡ‚Π΅ΠΌ подразумСваСтся ΠΏΡƒΡ‚ΡŒ, содСрТащий наимСньшСС число Ρ€Π΅Π±Π΅Ρ€.

Поиск Π² ΡˆΠΈΡ€ΠΈΠ½Ρƒ

РСализация Π³Ρ€Π°Ρ„Π°

Π—Π°Π΄Π°Π½ΠΈΠ΅. Π Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π³Ρ€Π°Ρ„ (Π½Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠΌ ΡƒΡ€ΠΎΠ²Π½Π΅), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ прСдставлСн Π½Π° рисункС Π½ΠΈΠΆΠ΅.

Π“Ρ€Π°Ρ„

Π“Ρ€Π°Ρ„ состоит ΠΈΠ· Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΡƒΠ·Π»ΠΎΠ². И ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΡƒΠ·Π΅Π» соСдиняСтся с сосСдними ΡƒΠ·Π»Π°ΠΌΠΈ. Π’ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ вопрос: ΠΊΠ°ΠΊΡƒΡŽ структуру Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡ?

Π‘ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ…Π΅Ρˆ-Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ!

Код Π½Π° языкС Java выглядит Ρ‚Π°ΠΊ:

   private static Map<String, List<String>> graph = new HashMap<>();

   graph.put("you", Arrays.asList("alice", "bob", "claire"));
   graph.put("bob", Arrays.asList("anuj", "peggy"));
   graph.put("alice", Arrays.asList("peggy"));
   graph.put("claire", Arrays.asList("thom", "jonny"));

   // Π£ АнудТа, ПСгги, Π’ΠΎΠΌΠ° ΠΈ Π”ΠΆΠΎΠ½Π½ΠΈ сосСдСй Π½Π΅Ρ‚.
   graph.put("anuj", Collections.emptyList());
   graph.put("peggy", Collections.emptyList());
   graph.put("thom", Collections.emptyList());
   graph.put("jonny", Collections.emptyList());

Π’ Ρ…Π΅Ρˆ-Ρ‚Π°Π±Π»ΠΈΡ†Π°Ρ… элСмСнты Π½Π΅ упорядочСны, поэтому Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ ΠΏΠ°Ρ€Ρ‹ "ΠΊΠ»ΡŽΡ‡-Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅" ΠΌΠΎΠΆΠ½ΠΎ Π² любом порядкС.

АнудТ являСтся сосСдом Π‘ΠΎΠ±Π°, Π½ΠΎ Π‘ΠΎΠ± Π½Π΅ являСтся сосСдом АнудТа. Π’Π°ΠΊΠΎΠΉ Π³Ρ€Π°Ρ„ называСтся Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½Π½Ρ‹ΠΌ - ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡ Π΄Π΅ΠΉΡΡ‚Π²ΡƒΡŽΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² ΠΎΠ΄Π½Ρƒ сторону.

РСализация Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ°

РСализация Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ°

РСализация Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° Π½Π° Java находится Π² BreadthFirstSearch.java

ВрСмя выполнСния

Если поиск ΠΏΡ€ΠΎΠ΄Π°Π²Ρ†Π° ΠΌΠ°Π½Π³ΠΎ Π±Ρ‹Π» Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ ΠΏΠΎ всСй сСти, Π·Π½Π°Ρ‡ΠΈΡ‚, Π²Ρ‹ ΠΏΡ€ΠΎΡˆΠ»ΠΈ ΠΏΠΎ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ Ρ€Π΅Π±Ρ€Ρƒ (напомню: Ρ€Π΅Π±Ρ€ΠΎΠΌ называСтся ΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ линия ΠΈΠ»ΠΈ линия со стрСлкой, вСдущая ΠΎΡ‚ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊΠ° ΠΊ Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ). Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, врСмя выполнСния составляСт ΠΊΠ°ΠΊ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ О(количСство Ρ€Π΅Π±Π΅Ρ€).

Π’Π°ΠΊΠΆΠ΅ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ Π΄ΠΎΠ»ΠΆΠ½Π° Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒΡΡ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ поиска. Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊΠ° Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ выполняСтся Π·Π° постоянноС врСмя: О(1). Π’Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊΠ° ΠΏΠΎΡ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ суммарного Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ О(количСство людСй). Поиск Π² ΡˆΠΈΡ€ΠΈΠ½Ρƒ выполняСтся Π·Π° врСмя О(количСство людСй + количСство Ρ€Π΅Π±Π΅Ρ€), Ρ‡Ρ‚ΠΎ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ записываСтся Π² Ρ„ΠΎΡ€ΠΌΠ΅ O(V+E) (V - количСство Π²Π΅Ρ€ΡˆΠΈΠ½, Π• - количСство Ρ€Π΅Π±Π΅Ρ€).

Алгоритм ДСйкстры

Алгоритм ДСйкстры

Алгоритм ДСйкстры ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для поиска ΠΏΡƒΡ‚ΠΈ ΠΎΡ‚ Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠΈ ΠΊ ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΉ Π·Π° ΠΊΡ€Π°Ρ‚Ρ‡Π°ΠΉΡˆΠ΅Π΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΠ΅ врСмя.

Алгоритм ДСйкстры состоит ΠΈΠ· Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅Ρ… шагов:

  1. Найти ΡƒΠ·Π΅Π» с наимСньшСй ΡΡ‚ΠΎΠΈΠΌΠΎΡΡ‚ΡŒΡŽ (Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ ΡƒΠ·Π΅Π», Π΄ΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ Π·Π° минимальноС врСмя).
  2. ΠžΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ стоимости сосСдСй этого ΡƒΠ·Π»Π°.
  3. ΠŸΠΎΠ²Ρ‚ΠΎΡ€ΡΡ‚ΡŒ, ΠΏΠΎΠΊΠ° это Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ сдСлано для всСх ΡƒΠ·Π»ΠΎΠ² Π³Ρ€Π°Ρ„Π°.
  4. Π’Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ ΠΈΡ‚ΠΎΠ³ΠΎΠ²Ρ‹ΠΉ ΠΏΡƒΡ‚ΡŒ.

ВСрминология

Когда Π²Ρ‹ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚Π΅ с Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠΌ ДСйкстры, с ΠΊΠ°ΠΆΠ΄Ρ‹ΠΌ Ρ€Π΅Π±Ρ€ΠΎΠΌ Π³Ρ€Π°Ρ„Π° связываСтся число, Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΠΎΠ΅ вСсом. Π“Ρ€Π°Ρ„ с вСсами называСтся Π²Π·Π²Π΅ΡˆΠ΅Π½Π½Ρ‹ΠΌ Π³Ρ€Π°Ρ„ΠΎΠΌ. Π“Ρ€Π°Ρ„ Π±Π΅Π· вСсов называСтся Π½Π΅Π²Π·Π²Π΅ΡˆΠ΅Π½Π½Ρ‹ΠΌ Π³Ρ€Π°Ρ„ΠΎΠΌ.

Π’ Π½Π΅Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½Π½ΠΎΠΌ Π³Ρ€Π°Ρ„Π΅ ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ Π½ΠΎΠ²ΠΎΠ΅ Ρ€Π΅Π±Ρ€ΠΎ добавляСт Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ Ρ†ΠΈΠΊΠ». Алгоритм ДСйкстры Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ с Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½Π½Ρ‹ΠΌΠΈ ацикличСскими Π³Ρ€Π°Ρ„Π°ΠΌΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅Ρ€Π΅Π΄ΠΊΠΎ ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°ΡŽΡ‚ΡΡ сокращСниСм DAG (Directed Acyclic Graph).

Π₯очСтся ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ ДСйкстры Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΏΡ€ΠΈ Π½Π°Π»ΠΈΡ‡ΠΈΠΈ Ρ€Π΅Π±Π΅Ρ€, ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΡ… ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ вСс. Π’Π°ΠΊΠΈΠ΅ Ρ€Π΅Π±Ρ€Π° Π½Π°Ρ€ΡƒΡˆΠ°ΡŽΡ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ°.

РСализация

ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΠΌ, ΠΊΠ°ΠΊ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ ДСйкстры рСализуСтся Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠΌ ΠΊΠΎΠ΄Π΅. НиТС ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ Π³Ρ€Π°Ρ„, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π² этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅.

Π“Ρ€Π°Ρ„

РСализация Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° Π½Π° языкС Java прСдставлСна Π² DijkstraAlgorithm.java

УпраТнСния

Каков вСс ΠΊΡ€Π°Ρ‚Ρ‡Π°ΠΉΡˆΠ΅Π³ΠΎ ΠΏΡƒΡ‚ΠΈ ΠΎΡ‚ Π½Π°Ρ‡Π°Π»Π° Π΄ΠΎ ΠΊΠΎΠ½Ρ†Π° Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΈΠ· ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… Π³Ρ€Π°Ρ„ΠΎΠ²?

Exercises.png

ΠžΡ‚Π²Π΅Ρ‚Ρ‹ А - 8; Π’ - 60; Π‘ - ΠΊΠ°Π²Π΅Ρ€Π·Π½Ρ‹ΠΉ вопрос (ΠΊΡ€Π°Ρ‚Ρ‡Π°ΠΉΡˆΠΈΠΉ ΠΏΡƒΡ‚ΡŒ Π½Π΅ сущСствуСт ΠΈΠ·-Π·Π° наличия Ρ†ΠΈΠΊΠ»Π° с ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ вСсом).

Π–Π°Π΄Π½Ρ‹Π΅ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹

Π—Π°Π΄Π°Ρ‡Π° составлСния расписания

Допустим, имССтся ΡƒΡ‡Π΅Π±Π½Ρ‹ΠΉ класс, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π½ΡƒΠΆΠ½ΠΎ провСсти ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ большС ΡƒΡ€ΠΎΠΊΠΎΠ². Π’Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚Π΅ список ΡƒΡ€ΠΎΠΊΠΎΠ² (см. рисунок Π½ΠΈΠΆΠ΅).

Бписок ΡƒΡ€ΠΎΠΊΠΎΠ²

ΠŸΡ€ΠΎΠ²Π΅ΡΡ‚ΠΈ Π² классС всС ΡƒΡ€ΠΎΠΊΠΈ Π½Π΅ получится, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠ· Π½ΠΈΡ… ΠΏΠ΅Ρ€Π΅ΠΊΡ€Ρ‹Π²Π°ΡŽΡ‚ΡΡ ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ.

Π’Ρ€ΠΎΠ΄Π΅ Π±Ρ‹ слоТная Π·Π°Π΄Π°Ρ‡Π°, Π²Π΅Ρ€Π½ΠΎ? На самом Π΄Π΅Π»Π΅ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ оказываСтся Π½Π° ΡƒΠ΄ΠΈΠ²Π»Π΅Π½ΠΈΠ΅ простым. Π’ΠΎΡ‚ ΠΊΠ°ΠΊ ΠΎΠ½ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚:

  1. Π’Ρ‹Π±Ρ€Π°Ρ‚ΡŒ ΡƒΡ€ΠΎΠΊ, Π·Π°Π²Π΅Ρ€ΡˆΠ°ΡŽΡ‰ΠΈΠΉΡΡ Ρ€Π°Π½ΡŒΡˆΠ΅ всСх. Π­Ρ‚ΠΎ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ ΡƒΡ€ΠΎΠΊ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠ²Π΅Π΄Π΅Π½ Π² классС.
  2. Π—Π°Ρ‚Π΅ΠΌ выбираСтся ΡƒΡ€ΠΎΠΊ, Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰ΠΈΠΉΡΡ послС Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ ΡƒΡ€ΠΎΠΊΠ°. И снова слСдуСт Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ ΡƒΡ€ΠΎΠΊ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ Ρ€Π°Π½ΡŒΡˆΠ΅ всСх ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Ρ…. Он становится Π²Ρ‚ΠΎΡ€Ρ‹ΠΌ ΡƒΡ€ΠΎΠΊΠΎΠΌ Π² расписании.

ΠŸΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°ΠΉΡ‚Π΅ Π΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎ Ρ‚ΠΎΠΌΡƒ ΠΆΠ΅ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡƒ - ΠΈ Π²Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ ΠΎΡ‚Π²Π΅Ρ‚!

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΡˆΠΊΠΎΠ»ΡŒΠ½Ρ‹Π΅ ΡƒΡ€ΠΎΠΊΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΡ€ΠΎΠ²ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ Π² классС, ΠΎΡ‚ΠΌΠ΅Ρ‡Π΅Π½Ρ‹ Π³Π°Π»ΠΎΡ‡ΠΊΠΎΠΉ.

Бписок ΡƒΡ€ΠΎΠΊΠΎΠ²

Π–Π°Π΄Π½Ρ‹ΠΉ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ прост: Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΌ шагС ΠΎΠ½ Π²Ρ‹Π±ΠΈΡ€Π°Π΅Ρ‚ ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚. Π’ нашСм ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΏΡ€ΠΈ Π²Ρ‹Π±ΠΎΡ€Π΅ ΡƒΡ€ΠΎΠΊΠ° выбираСтся Ρ‚ΠΎΡ‚ ΡƒΡ€ΠΎΠΊ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ Ρ€Π°Π½ΡŒΡˆΠ΅ Π΄Ρ€ΡƒΠ³ΠΈΡ….

Π’ тСхничСской Ρ‚Π΅Ρ€ΠΌΠΈΠ½ΠΎΠ»ΠΎΠ³ΠΈΠΈ: Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΌ шагС выбираСтся локально-ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½ΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅, Π° Π² ΠΈΡ‚ΠΎΠ³Π΅ Π²Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚Π΅ глобально-ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½ΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅. Π₯ΠΎΡ‚ΠΈΡ‚Π΅ Π²Π΅Ρ€ΡŒΡ‚Π΅, Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ Π½Π΅Ρ‚, Π½ΠΎ этот простой Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½ΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Π·Π°Π΄Π°Ρ‡ΠΈ составлСния расписания!

Π—Π°Π΄Π°Ρ‡Π° ΠΎ ΠΏΠΎΠΊΡ€Ρ‹Ρ‚ΠΈΠΈ мноТСства

Π’Ρ‹ ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚Π΅ ΡΠΎΠ±ΡΡ‚Π²Π΅Π½Π½ΡƒΡŽ Π°Π²Ρ‚ΠΎΡ€ΡΠΊΡƒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Π½Π° Ρ€Π°Π΄ΠΈΠΎ ΠΈ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ вас ΡΠ»ΡƒΡˆΠ°Π»ΠΈ Π²ΠΎ всСх 50 ΡˆΡ‚Π°Ρ‚Π°Ρ…. НуТно Ρ€Π΅ΡˆΠΈΡ‚ΡŒ, Π½Π° ΠΊΠ°ΠΊΠΈΡ… радиостанциях Π΄ΠΎΠ»ΠΆΠ½Π° Ρ‚Ρ€Π°Π½ΡΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ ваша ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π°. КаТдая станция стоит Π΄Π΅Π½Π΅Π³, поэтому количСство станций Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ свСсти ΠΊ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌΡƒ. Π˜ΠΌΠ΅Π΅Ρ‚ΡΡ список станций. КаТдая станция ΠΏΠΎΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ Π½Π°Π±ΠΎΡ€ ΡˆΡ‚Π°Ρ‚ΠΎΠ², эти Π½Π°Π±ΠΎΡ€Ρ‹ ΠΏΠ΅Ρ€Π΅ΠΊΡ€Ρ‹Π²Π°ΡŽΡ‚ΡΡ.

Как Π½Π°ΠΉΡ‚ΠΈ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ Π½Π°Π±ΠΎΡ€ станций, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±Ρ‹ ΠΏΠΎΠΊΡ€Ρ‹Π²Π°Π» всС 50 ΡˆΡ‚Π°Ρ‚ΠΎΠ²?

Π’ΠΎΡ‚ ΠΊΠ°ΠΊ выглядит ΠΆΠ°Π΄Π½Ρ‹ΠΉ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹Π΄Π°Π΅Ρ‚ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚, достаточно Π±Π»ΠΈΠ·ΠΊΠΈΠΉ ΠΊ ΠΎΠΏΡ‚ΠΈΠΌΡƒΠΌΡƒ:

  1. Π’Ρ‹Π±Ρ€Π°Ρ‚ΡŒ ΡΡ‚Π°Π½Ρ†ΠΈΡŽ, ΠΏΠΎΠΊΡ€Ρ‹Π²Π°ΡŽΡ‰ΡƒΡŽ наибольшСС количСство ΡˆΡ‚Π°Ρ‚ΠΎΠ², Π΅Ρ‰Π΅ Π½Π΅ входящих Π² ΠΏΠΎΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅. Если станция Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠΊΡ€Ρ‹Π²Π°Ρ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡˆΡ‚Π°Ρ‚Ρ‹, ΡƒΠΆΠ΅ входящиС Π² ΠΏΠΎΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅, это Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ.
  2. ΠŸΠΎΠ²Ρ‚ΠΎΡ€ΡΡ‚ΡŒ, ΠΏΠΎΠΊΠ° ΠΎΡΡ‚Π°ΡŽΡ‚ΡΡ ΡˆΡ‚Π°Ρ‚Ρ‹, Π½Π΅ входящиС Π² ΠΏΠΎΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅.

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄ располагаСтся Π² Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ greedy_algorithms.

ДинамичСскоС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅

ДинамичСскоС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ - ΠΌΠ΅Ρ‚ΠΎΠ΄ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ слоТных Π·Π°Π΄Π°Ρ‡, Ρ€Π°Π·Π±ΠΈΠ²Π°Π΅ΠΌΡ‹Ρ… Π½Π° ΠΏΠΎΠ΄Π·Π°Π΄Π°Ρ‡ΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ€Π΅ΡˆΠ°ΡŽΡ‚ΡΡ Π² ΠΏΠ΅Ρ€Π²ΡƒΡŽ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ.

Π—Π°Π΄Π°Ρ‡Π° ΠΎ Ρ€ΡŽΠΊΠ·Π°ΠΊΠ΅

ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΠΌ, Ρ‡Ρ‚ΠΎ Ρƒ нас Π΅ΡΡ‚ΡŒ Ρ€ΡŽΠΊΠ·Π°ΠΊ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΌΠΎΠΆΠ½ΠΎ унСсти Ρ‚ΠΎΠ²Π°Ρ€Ρ‹ ΠΎΠ±Ρ‰ΠΈΠΌ вСсом Π΄ΠΎ 4 Ρ„ΡƒΠ½Ρ‚ΠΎΠ².

Π•ΡΡ‚ΡŒ Ρ‚Ρ€ΠΈ ΠΏΡ€Π΅Π΄ΠΌΠ΅Ρ‚Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ»ΠΎΠΆΠΈΡ‚ΡŒ Π² Ρ€ΡŽΠΊΠ·Π°ΠΊ.

  • Ноутбук, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ вСсит 3 Ρ„ΡƒΠ½Ρ‚Π° ΠΈ стоит 2000$;
  • ΠœΠ°Π³Π½ΠΈΡ‚ΠΎΡ„ΠΎΠ½ β€” 4 Ρ„ΡƒΠ½Ρ‚Π° ΠΌΠΎΡ‰ΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ обойдутся Π² 3000$;
  • Π“ΠΈΡ‚Π°Ρ€Π° β€” вСсит 1 Ρ„ΡƒΠ½Ρ‚, Π° стоит 1500$.

КакиС ΠΏΡ€Π΅Π΄ΠΌΠ΅Ρ‚Ρ‹ слСдуСт ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚ΡŒ Π² Ρ€ΡŽΠΊΠ·Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΡ‚ΠΎΠΈΠΌΠΎΡΡ‚ΡŒ Π΄ΠΎΠ±Ρ‹Ρ‡ΠΈ Π±Ρ‹Π»Π° максимальной?

Π§Ρ‚ΠΎΠ±Ρ‹ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ Π·Π°Π΄Π°Ρ‡Ρƒ, Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡΡ ΠΏΡ€ΠΈΡ‘ΠΌΠ°ΠΌΠΈ динамичСского программирования.

Π Π°Π·ΠΎΠ±ΡŒΡ‘ΠΌ Π·Π°Π΄Π°Ρ‡Ρƒ Π½Π° ΠΏΠΎΠ΄Π·Π°Π΄Π°Ρ‡ΠΈ ΠΈ Π±ΡƒΠ΄Π΅ΠΌ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΈΡ… Ρ€Π΅ΡˆΠ°Ρ‚ΡŒ. ΠŸΡ€ΠΈ этом Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ шагС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π³ΠΎ.

РСшСниС Π·Π°Π΄Π°Ρ‡ΠΈ Π½Π° Java: Π·Π°Π΄Π°Ρ‡Π° ΠΎ Ρ€ΡŽΠΊΠ·Π°ΠΊΠ΅

Бамая длинная общая подстрока

Рассмотрим Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ ΠΏΡ€ΠΈΠΌΠ΅Ρ€.

Допустим, Π²Ρ‹ ΠΎΡ‚ΠΊΡ€Ρ‹Π»ΠΈ сайт dictionary.com. ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π²Π²ΠΎΠ΄ΠΈΡ‚ слово, Π° сайт Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅. Но Ссли ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π²Π²Π΅Π» Π½Π΅ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ слово, Π½ΡƒΠΆΠ½ΠΎ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚ΡŒ, ΠΊΠ°ΠΊΠΎΠ΅ слово имСлось Π² Π²ΠΈΠ΄Ρƒ.

АлСкс ΠΈΡ‰Π΅Ρ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ "fish", Π½ΠΎ ΠΎΠ½ случайно Π²Π²Π΅Π» "hish". Π’Π°ΠΊΠΎΠ³ΠΎ слова Π² словарС Π½Π΅Ρ‚, Π½ΠΎ Π·Π°Ρ‚ΠΎ Ρƒ вас Π΅ΡΡ‚ΡŒ список ΠΏΠΎΡ…ΠΎΠΆΠΈΡ… слов.

Π‘Π›ΠžΠ’Π, ПОΠ₯ΠžΠ–Π˜Π• НА "НISН":

  • FISH
  • VISTA

Π˜Ρ‚Π°ΠΊ, АлСкс Π²Π²Π΅Π» строку hish. КакоС слово ΠΎΠ½ Ρ…ΠΎΡ‚Π΅Π» ввСсти Π½Π° самом Π΄Π΅Π»Π΅: fish ΠΈΠ»ΠΈ vista?

РСшСниС Π·Π°Π΄Π°Ρ‡ΠΈ прСдставлСно Π² Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ longest_common_subsequence

algorithms's People

Contributors

magistr-bit avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar

Watchers

 avatar

Forkers

gemansipator

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    πŸ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. πŸ“ŠπŸ“ˆπŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❀️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.