Skip to content

Jekahome/Algorithms

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

36 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

Algorithms

Π—Π°Ρ‡Π΅ΠΌ ΠΈΠ·ΡƒΡ‡Π°Ρ‚ΡŒ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹?

  • Алгоритмы - это ΠΏΡ€ΠΎ способ ΠΌΡ‹ΡΠ»ΠΈΡ‚ΡŒ ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°Ρ…
  • Π’Ρ‹ смоТСтС ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΠΈ ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΉ ΠΊΠΎΠ΄ - ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ² знания ΠΎ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… структурах Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ°Ρ…, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ, ΠΊΠ°ΠΊΡƒΡŽ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ структуру Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ Π² Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… условиях.
  • Π­Ρ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΠ΅ использованиС Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΈ памяти. Π—Π½Π°Π½ΠΈΠ΅ структур Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ² ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚ Π²Π°ΠΌ ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΊΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ быстрСС ΠΈ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ мСньшСго объСма памяти.
  • Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹, Вомас Π₯. ΠšΠΎΡ€ΠΌΠ΅Π½ - это ΠΎΠ΄Π½Π° ΠΈΠ· Π»ΡƒΡ‡ΡˆΠΈΡ… ΠΊΠ½ΠΈΠ³ ΠΏΠΎ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ°ΠΌ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ рассматриваСтся ΡˆΠΈΡ€ΠΎΠΊΠΈΠΉ спСктр Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ².
  • "Algorithms" Π ΠΎΠ±Π΅Ρ€Ρ‚Π° Π‘Π΅Π΄ΠΆΠ²ΠΈΠΊΠ° - это Π²Π΅Π΄ΡƒΡ‰ΠΈΠΉ ΡƒΡ‡Π΅Π±Π½ΠΈΠΊ ΠΏΠΎ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ°ΠΌ, ΡˆΠΈΡ€ΠΎΠΊΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ Π² ΠΊΠΎΠ»Π»Π΅Π΄ΠΆΠ°Ρ… ΠΈ унивСрситСтах.
  • Π˜ΡΠΊΡƒΡΡΡ‚Π²ΠΎ программирования, Π”ΠΎΠ½Π°Π»ΡŒΠ΄ Π­. ΠšΠ½ΡƒΡ‚ - эта ΠΊΠ½ΠΈΠ³Π° считаСтся Π»ΡƒΡ‡ΡˆΠ΅ΠΉ, Ссли Π²Ρ‹ Π·Π½Π°ΠΊΠΎΠΌΡ‹ с ΠΏΡ€Π΅Π΄ΠΌΠ΅Ρ‚ΠΎΠΌ ΠΈ ΠΈΡ‰Π΅Ρ‚Π΅ Π±ΠΎΠ»Π΅Π΅ Π³Π»ΡƒΠ±ΠΎΠΊΠΎΠ΅ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅.
  • "Introduction to Algorithms" (Вомас ΠšΠΎΡ€ΠΌΠ΅Π½, Π§Π°Ρ€Π»ΡŒΠ· ЛСйзСрсон, Рональд РивСст, ΠšΠ»ΠΈΡ„ΠΎΡ€Π΄ Π¨Ρ‚Π°ΠΉΠ½) Π­Ρ‚Π° ΠΊΠ½ΠΈΠ³Π°, часто называСмая CLRS ΠΏΠΎ фамилиям Π°Π²Ρ‚ΠΎΡ€ΠΎΠ², являСтся ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· самых извСстных ΠΈ популярных ΠΊΠ½ΠΈΠ³ ΠΏΠΎ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ°ΠΌ. Она ΠΎΡ…Π²Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ ΡˆΠΈΡ€ΠΎΠΊΠΈΠΉ спСктр Ρ‚Π΅ΠΌ ΠΈ подходяща ΠΊΠ°ΠΊ для Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰ΠΈΡ…, Ρ‚Π°ΠΊ ΠΈ для ΠΏΡ€ΠΎΠ΄Π²ΠΈΠ½ΡƒΡ‚Ρ‹Ρ… студСнтов.

АлгоритмичСскиС ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π·Π°Π΄Π°Ρ‡:

  • Brute-Force - ΠΏΠ΅Ρ€Π΅Π±ΠΈΡ€Π°ΠΉΡ‚Π΅ всС Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ Π² Π»ΠΎΠ±.

    Π’ Ρ‡Π΅ΠΌ Ρ€Π°Π·Π½ΠΈΡ†Π° ΠΌΠ΅ΠΆΠ΄Ρƒ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠΌ Backtracking Algorithm ΠΈ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠΌ Brute-force?

    Π’ связи с Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ поиска Backtracking ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ для принятия Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ всС Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹, с этой Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния ΠΎΠ½ ΠΏΠΎΠ΄ΠΎΠ±Π΅Π½ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡƒ Brute-force. Π Π°Π·Π½ΠΈΡ†Π° состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΈΠ½ΠΎΠ³Π΄Π° Backtracking ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ»Π½Ρ‹ΠΉ ΠΏΠ΅Ρ€Π΅Π±ΠΎΡ€ Π½Π΅ Π½ΡƒΠΆΠ΅Π½, ΠΈ, ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ Π»ΡƒΡ‡ΡˆΠ΅.

...
  • Divide and Conquer - Ρ€Π°Π·Π±ΠΈΠ²Π°ΠΉΡ‚Π΅ Π·Π°Π΄Π°Ρ‡Ρƒ Π½Π° ΠΏΠΎΠ΄Π·Π°Π΄Π°Ρ‡ΠΈ ΠΈ ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡ€ΡƒΠΉΡ‚Π΅ ΠΈΡ… (ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ Π² Π°Π»Π³ΠΎΡ€ΠΈΠΌΠ°Ρ… Merge sort ΠΈ Binary Search). РаздСляй ΠΈ властвуй β€” это ΠΏΠ°Ρ€Π°Π΄ΠΈΠ³ΠΌΠ° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ°, основанная Π½Π° многовСтвящСйся рСкурсии. Алгоритм Divide and Conquer Ρ€Π°Π·Π±ΠΈΠ²Π°Π΅Ρ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ Π½Π° ΠΏΠΎΠ΄Π·Π°Π΄Π°Ρ‡ΠΈ Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ ΠΈΠ»ΠΈ родствСнного Ρ‚ΠΈΠΏΠ°, ΠΏΠΎΠΊΠ° ΠΎΠ½ΠΈ Π½Π΅ станут достаточно простыми, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΡ… ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ.

    Алгоритмы «раздСляй ΠΈ властвуй» ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ собой ΠΏΠ°Ρ€Π°Π΄ΠΈΠ³ΠΌΡƒ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π·Π°Π΄Π°Ρ‡, Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰ΠΈΡ… нСсколько основных шагов. Π‘Π½Π°Ρ‡Π°Π»Π° ΠΌΡ‹ Π΄Π΅Π»ΠΈΠΌ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ Π½Π° Π±ΠΎΠ»Π΅Π΅ ΠΌΠ΅Π»ΠΊΠΈΠ΅ части ΠΈ Ρ€Π°Π±ΠΎΡ‚Π°Π΅ΠΌ Π½Π°Π΄ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ΠΌ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΈΠ· Π½ΠΈΡ… нСзависимо. ПослС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΌΡ‹ Ρ€Π΅ΡˆΠΈΠ»ΠΈ всС части, ΠΌΡ‹ Π±Π΅Ρ€Π΅ΠΌ всС ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹Π΅ Π±ΠΎΠ»Π΅Π΅ ΠΌΠ΅Π»ΠΊΠΈΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΈ объСдиняСм ΠΈΡ… Π² ΠΎΠ΄Π½ΠΎ ΠΈΠ½Ρ‚Π΅Π³Ρ€ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ΅ комплСксноС Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅.

    Π­Ρ‚ΠΎΡ‚ процСсс ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ рСкурсивно; Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ каТдая Β«ΠΏΠΎΠ΄Π·Π°Π΄Π°Ρ‡Π°Β» сама ΠΏΠΎ сСбС ΠΏΡ€ΠΈ нСобходимости ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Ρ€Π°Π·Π΄Π΅Π»Π΅Π½Π° Π½Π° Π΅Ρ‰Π΅ Π±ΠΎΠ»Π΅Π΅ ΠΌΠ΅Π»ΠΊΠΈΠ΅ части. Π­Ρ‚ΠΎ рСкурсивноС Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π·Π°Π΄Π°Ρ‡ΠΈ выполняСтся Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° каТдая ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Π°Ρ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π½Π΅ станСт достаточно малСнькой, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΅Π΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ стало ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Ρ‚Ρ€ΠΈΠ²ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΌ.

    НСкоторыми распространСнными ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°ΠΌΠΈ Π·Π°Π΄Π°Ρ‡, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ…ΠΎΡ€ΠΎΡˆΠΎ подходят для этого ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π°, ΡΠ²Π»ΡΡŽΡ‚ΡΡ Binary Search, Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹ сортировки (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Merge sort, Quicksort), оптимизация слоТных Π² Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΌ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠΈ матСматичСских ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ (Π²ΠΎΠ·Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² ΡΡ‚Π΅ΠΏΠ΅Π½ΡŒ, Π‘ΠŸΠ€, Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ ШтрассСна) ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅.

    НиТС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Ρ‹ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ стандартныС Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡƒ Divide and Conquer.

    • Quicksort β€” это Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ сортировки. Алгоритм Π²Ρ‹Π±ΠΈΡ€Π°Π΅Ρ‚ ΠΎΠΏΠΎΡ€Π½Ρ‹ΠΉ элСмСнт ΠΈ пСрСупорядочиваСт элСмСнты массива Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ всС элСмСнты, мСньшиС, Ρ‡Π΅ΠΌ Π²Ρ‹Π±Ρ€Π°Π½Π½Ρ‹ΠΉ ΠΎΠΏΠΎΡ€Π½Ρ‹ΠΉ элСмСнт, ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°Π»ΠΈΡΡŒ Π² Π»Π΅Π²ΡƒΡŽ сторону ΠΎΠΏΠΎΡ€Π½ΠΎΠ³ΠΎ элСмСнта, Π° всС элСмСнты большСго Ρ€Π°Π·ΠΌΠ΅Ρ€Π° ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°Π»ΠΈΡΡŒ Π² ΠΏΡ€Π°Π²ΡƒΡŽ сторону. НаконСц, Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ рСкурсивно сортируСт подмассивы слСва ΠΈ справа ΠΎΡ‚ ΠΎΠΏΠΎΡ€Π½ΠΎΠ³ΠΎ элСмСнта.
    • Merge sort Ρ‚Π°ΠΊΠΆΠ΅ являСтся Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠΌ сортировки. Алгоритм Π΄Π΅Π»ΠΈΡ‚ массив Π½Π° Π΄Π²Π΅ ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Ρ‹, рСкурсивно сортируСт ΠΈΡ… ΠΈ, Π½Π°ΠΊΠΎΠ½Π΅Ρ†, ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΡΠ΅Ρ‚ Π΄Π²Π΅ отсортированныС ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Ρ‹.
    • Π‘Π»ΠΈΠΆΠ°ΠΉΡˆΠ°Ρ ΠΏΠ°Ρ€Π° Ρ‚ΠΎΡ‡Π΅ΠΊ. Π—Π°Π΄Π°Ρ‡Π° состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π°ΠΉΡ‚ΠΈ Π±Π»ΠΈΠΆΠ°ΠΉΡˆΡƒΡŽ ΠΏΠ°Ρ€Ρƒ Ρ‚ΠΎΡ‡Π΅ΠΊ Π² Π½Π°Π±ΠΎΡ€Π΅ Ρ‚ΠΎΡ‡Π΅ΠΊ Π² плоскости xy. ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ Π·Π° врСмя O(n^2), вычислив расстояния Π΄ΠΎ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΏΠ°Ρ€Ρ‹ Ρ‚ΠΎΡ‡Π΅ΠΊ ΠΈ сравнив расстояния, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π°ΠΉΡ‚ΠΈ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ. Алгоритм «раздСляй ΠΈ властвуй» Ρ€Π΅ΡˆΠ°Π΅Ρ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ Π·Π° врСмя O(N log N).
    • Алгоритм ШтрассСна β€” это эффСктивный Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ умноТСния Π΄Π²ΡƒΡ… ΠΌΠ°Ρ‚Ρ€ΠΈΡ†. ΠŸΡ€ΠΎΡΡ‚ΠΎΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ умноТСния Π΄Π²ΡƒΡ… ΠΌΠ°Ρ‚Ρ€ΠΈΡ† Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ Ρ‚Ρ€Π΅Ρ… Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Ρ… Ρ†ΠΈΠΊΠ»ΠΎΠ² ΠΈ Ρ€Π°Π²Π΅Π½ O(n^3). Алгоритм ШтрассСна ΡƒΠΌΠ½ΠΎΠΆΠ°Π΅Ρ‚ Π΄Π²Π΅ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ Π·Π° врСмя O(n^2,8974).
    • Алгоритм быстрого прСобразования Π€ΡƒΡ€ΡŒΠ΅ (Π‘ΠŸΠ€) ΠšΡƒΠ»ΠΈ – Вьюки являСтся Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ распространСнным Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠΌ Π‘ΠŸΠ€. Π­Ρ‚ΠΎ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ «раздСляй ΠΈ властвуй», ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π·Π° врСмя O(N log N).
    • Алгоритм ΠšΠ°Ρ€Π°Ρ†ΡƒΠ±Ρ‹ для быстрого умноТСния выполняСт ΡƒΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π΄Π²ΡƒΡ… n - Π·Π½Π°Ρ‡Π½Ρ‹Ρ… чисСл
    DAC(a, i, j) {
        if(small(a, i, j))
            return(Solution(a, i, j))
        else 
            mid = divide(a, i, j)   // f1(n)
            b = DAC(a, i, mid)      // T(n/2)
            c = DAC(a, mid+1, j)    // T(n/2)
            d = combine(b, c)       // f2(n)
        return(d)
    }
    

    geeksforgeeks

  • Dynamic Programming - ΠšΠ΅ΡˆΠΈΡ€ΡƒΠΉΡ‚Π΅ ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½Ρ‹Π΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ для ΠΈΡ… ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠ³ΠΎ использования. DP = Recursion + some memory

    ΠŸΠΎΠ΄Ρ…ΠΎΠ΄ Memoization (Π‘Π²Π΅Ρ€Ρ…Ρƒ Π’Π½ΠΈΠ·) - ΠΊΠ΅ΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡΡŽΡ‰ΠΈΡ…ΡΡ расчСтов Π² Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ ΠΈ ΠΈΡ… использования ΠΏΠΎ ΠΌΠ΅Ρ€Π΅ Ρ…ΠΎΠ΄Π° Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ°.

    ΠŸΠΎΠ΄Ρ…ΠΎΠ΄ Tabulation (Π‘Π½ΠΈΠ·Ρƒ Π’Π²Π΅Ρ€Ρ…) - ΠΊΠ΅ΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ всСх Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² ΠΏΠΎΠ΄Π·Π°Π΄Π°Ρ‡ Π² Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ ΠΈ послС Π² Π½ΡƒΠΆΠ½ΠΎΠΉ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ сбор Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ². ΠŸΡ€ΠΈΠΌΠ΅Ρ€, Π·Π°Π΄Π°Ρ‡Π° ΠΎ максимальной вмСстимости Ρ€ΡŽΠΊΠ·Π°ΠΊΠ°, для ΠΏΠ΅Ρ€Π΅Π±ΠΎΡ€Π° всСх Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ² O(2^N), быстрСС Ρ€Π΅ΡˆΠ°Ρ‚ΡŒ ΠΏΠΎΠ΄Π·Π°Π΄Π°Ρ‡ΠΈ O(N^2).

    ΠŸΠΎΠ΄Ρ…ΠΎΠ΄ Memoization. Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ для запоминания Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΡ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ, Ρ‡Ρ‚ΠΎ позволяСт ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ Π½Π΅Π½ΡƒΠΆΠ½ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹. Вакая оптимизация называСтся ΠΌΠ΅ΠΌΠΎΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ . ΠœΠ΅ΠΌΠΎΠΈΠ·Π°Ρ†ΠΈΡ Π€ΠΈΠ±ΠΎΠ½Π°Ρ‡Ρ‡ΠΈ. Алгоритм вычислСния чисСл Π€ΠΈΠ±ΠΎΠ½Π°Ρ‡Ρ‡ΠΈ. Π•Π³ΠΎ Π΄Π΅Ρ€Π΅Π²ΠΎ рСкурсивных Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ fib(3) вычисляСтся ΠΌΠ½ΠΎΠ³ΠΎΠΊΡ€Π°Ρ‚Π½ΠΎ. ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ это ΠΈΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ, сохраняя Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ ΠΏΠΎ ΠΌΠ΅Ρ€Π΅ ΠΈΡ… вычислСния ΠΈ дСлая Π½ΠΎΠ²Ρ‹Π΅ Π²Ρ‹Π·ΠΎΠ²Ρ‹ fib Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для Ρ‚Π΅Ρ… вычислСний, Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π΅Ρ‰Π΅ Π½Π΅Ρ‚ Π² памяти ΠΌΠ½ΠΎΠ³ΠΎΠΊΡ€Π°Ρ‚Π½ΠΎΠ³ΠΎ использования ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½Ρ‹Ρ… Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² называСтся ΠΌΠ΅ΠΌΠΎΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ.

    Как ΠΊΠ»Π°ΡΡΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ ΠΊΠ°ΠΊ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ динамичСского программирования?

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

    ВсС Π·Π°Π΄Π°Ρ‡ΠΈ динамичСского программирования ΡƒΠ΄ΠΎΠ²Π»Π΅Ρ‚Π²ΠΎΡ€ΡΡŽΡ‚ свойству ΠΏΠ΅Ρ€Π΅ΠΊΡ€Ρ‹Π²Π°ΡŽΡ‰ΠΈΡ…ΡΡ ΠΏΠΎΠ΄Π·Π°Π΄Π°Ρ‡, Π° Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ классичСских Π·Π°Π΄Π°Ρ‡ динамичСского программирования Ρ‚Π°ΠΊΠΆΠ΅ ΡƒΠ΄ΠΎΠ²Π»Π΅Ρ‚Π²ΠΎΡ€ΡΡŽΡ‚ свойству ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½ΠΎΠΉ подструктуры. Как Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΌΡ‹ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠΌ эти свойства Π² Π΄Π°Π½Π½ΠΎΠΉ Π·Π°Π΄Π°Ρ‡Π΅, Π±ΡƒΠ΄ΡŒΡ‚Π΅ ΡƒΠ²Π΅Ρ€Π΅Π½Ρ‹, Ρ‡Ρ‚ΠΎ Π΅Π΅ ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ динамичСского программирования.

    Dynamic Programming topcoder - ΠšΠ΅ΡˆΠΈΡ€ΡƒΠΉΡ‚Π΅ ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½Ρ‹Π΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ для ΠΈΡ… ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠ³ΠΎ использования.

    Dynamic Programming brestprog

    Dynamic Programming brestprog

    Dynamic Programming topcoder

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

  • Greedy Algorithm - ΠΏΡ‹Ρ‚Π°ΠΉΡ‚Π΅ΡΡŒ Π²Π·ΡΡ‚ΡŒ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π²Ρ‹Π³ΠΎΠ΄Π½ΠΎΠ΅ Π² ΠΏΠ΅Ρ€Π²ΡƒΡŽ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ (ΠΆΠ°Π΄Π½Ρ‹ΠΉ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ). Π–Π°Π΄Π½Ρ‹Π΅ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π·Π°Π΄Π°Ρ‡ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ, дСлая локально ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ Π²Ρ‹Π±ΠΎΡ€ Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΌ шагС. Π’ этих Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ°Ρ… Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‚ΡΡ Π½Π° основС ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ, доступной Π² Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚, Π±Π΅Π· ΡƒΡ‡Π΅Ρ‚Π° послСдствий этих Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ Π² Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΌ. Основная идСя состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΌ этапС Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ Π½Π°ΠΈΠ»ΡƒΡ‡ΡˆΠΈΠΉ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚, Π²Π΅Π΄ΡƒΡ‰ΠΈΠΉ ΠΊ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡŽ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π½Π΅ всСгда ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ самым ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌ, Π½ΠΎ часто достаточно Ρ…ΠΎΡ€ΠΎΡˆΠΈΠΌ для ΠΌΠ½ΠΎΠ³ΠΈΡ… ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ.

    НапримСр:

    • ΠšΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π₯Π°Ρ„Ρ„ΠΌΠ°Π½Π° β€” это Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ сТатия Π΄Π°Π½Π½Ρ‹Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ„ΠΎΡ€ΠΌΡƒΠ»ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΎΡΠ½ΠΎΠ²Π½ΡƒΡŽ идСю сТатия Ρ„Π°ΠΉΠ»ΠΎΠ².
    • ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Ρ€Π°Π·ΠΌΠ΅Π½Π° ΠΌΠΎΠ½Π΅Ρ‚. Π–Π°Π΄Π½Ρ‹ΠΉ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для сдачи Π·Π°Π΄Π°Π½Π½ΠΎΠΉ суммы с ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌ количСством ΠΌΠΎΠ½Π΅Ρ‚, всСгда выбирая ΠΌΠΎΠ½Π΅Ρ‚Ρƒ с наибольшСй ΡΡ‚ΠΎΠΈΠΌΠΎΡΡ‚ΡŒΡŽ, которая мСньшС ΠΎΡΡ‚Π°Π²ΡˆΠ΅ΠΉΡΡ суммы, ΠΏΠΎΠ΄Π»Π΅ΠΆΠ°Ρ‰Π΅ΠΉ ΠΎΠ±ΠΌΠ΅Π½Ρƒ.

    Greedy Algorithm

    Introduction to Greedy Algorithm

    Greedy Algorithm

  • Blacktracking - (поиск с Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ΠΎΠΌ) оптимизация Brute-Force отмСняя ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ Π·Π°Ρ‚Ρ€Π°Ρ‚Π½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π΅Ρ‰Π΅ Π΄ΠΎ Π½Π°Ρ‡Π°Π»Π° ΠΈΡ… выполнСния. Π’.Π΅. ΠΎΡ‚Π±Ρ€ΠΎΡΠΈΡ‚ΡŒ Π·Π°Π²Π΅Π΄ΠΎΠΌΠΎ Π½Π΅Π²Π΅Ρ€Π½Ρ‹ΠΉ ΠΏΡƒΡ‚ΡŒ, нСдопустив Π·Π°Ρ‚Ρ€Π°Ρ‚ Π½Π° Π΅Π³ΠΎ расчСт Π΅Ρ‰Π΅ Π΄ΠΎ Π½Π°Ρ‡Π°Π»Π° самого расчСта. Π­Ρ‚ΠΎ ΠΎΠ±Ρ‰ΠΈΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ нахоТдСния Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ Π·Π°Π΄Π°Ρ‡ΠΈ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ трСбуСтся ΠΏΠΎΠ»Π½Ρ‹ΠΉ ΠΏΠ΅Ρ€Π΅Π±ΠΎΡ€ всСх Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ² Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ мноТСствС М. Π­Ρ‚ΠΎ сама ΠΏΠΎ сСбС рСкурсия, Π½ΠΎ здСсь Π΅ΡΡ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ условия, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄Π΅Π»Π°ΡŽΡ‚ Π΅Π΅ Π±ΠΎΠ»Π΅Π΅ эффСктивной.

    ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Ρ€Π΅ΡˆΠ°ΡŽΡ‚ΡΡ с использованиСм ΠΌΠ΅Ρ‚ΠΎΠ΄Π° ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠ³ΠΎ отслСТивания, ΠΈΠΌΠ΅ΡŽΡ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ ΠΎΠ±Ρ‰Π΅Π΅ свойство. Π­Ρ‚ΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠ΅Ρ€Π΅ΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Π² всС Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ, ΠΏΡ€ΠΈΡ‡Π΅ΠΌ каТдая конфигурация провСряСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·. НаивноС Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ этих ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ β€” ΠΏΠΎΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Ρ‚ΡŒ всС ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΈ вывСсти ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΡƒΡŽ Π·Π°Π΄Π°Π½Π½Ρ‹ΠΌ ограничСниям Π·Π°Π΄Π°Ρ‡ΠΈ. ΠžΠ±Ρ€Π°Ρ‚Π½ΠΎΠ΅ отслСТиваниС Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ постСпСнно ΠΈ прСдставляСт собой ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ΠΌ Naive, ΠΏΡ€ΠΈ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΡŽΡ‚ΡΡ ΠΈ ΠΎΠΏΡ€ΠΎΠ±ΡƒΡŽΡ‚ΡΡ всС Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ.

    Как ΡƒΠΏΠΎΠΌΠΈΠ½Π°Π»ΠΎΡΡŒ Ρ€Π°Π½Π΅Π΅, Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ Blacktracking являСтся ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹ΠΌ ΠΎΡ‚ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° рСкурсии ΠΈ ΠΈΠΌΠ΅Π΅Ρ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒΡΡ Π² исходноС состояниС Π² случаС сбоя рСкурсивного Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ, Ρ‚. Π΅. Π² случаС сбоя Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° возвращаСтся ΠΊ ΠΌΠΎΠΌΠ΅Π½Ρ‚Ρƒ, ΠΊΠΎΠ³Π΄Π° ΠΎΠ½ΠΎ ΠΏΠΎΡ‚Π΅Ρ€ΠΏΠ΅Π»ΠΎ Π½Π΅ΡƒΠ΄Π°Ρ‡Ρƒ, ΠΈ основываСтся Π½Π° Π΄Ρ€ΡƒΠ³ΠΎΠΌ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΈ. По сути, ΠΎΠ½ ΠΏΡ€ΠΎΠ±ΡƒΠ΅Ρ‚ всС Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΈ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ΅.

    ΠžΠ±Ρ…ΠΎΠ΄ с Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ΠΎΠΌ β€” это алгоритмичСский ΠΌΠ΅Ρ‚ΠΎΠ΄ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ рСкурсивно, ΠΏΡ‹Ρ‚Π°ΡΡΡŒ ΠΏΠΎΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ постСпСнно, ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΌΡƒ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Ρƒ Π·Π° Ρ€Π°Π·, удаляя Ρ‚Π΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ ΡƒΠ΄ΠΎΠ²Π»Π΅Ρ‚Π²ΠΎΡ€ΡΡŽΡ‚ ограничСниям ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ Π² любой ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ (ΠΏΠΎΠ΄ Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ здСсь подразумСваСтся врСмя, ΠΏΡ€ΠΎΡˆΠ΅Π΄ΡˆΠ΅Π΅ Π΄ΠΎ достиТСния любого уровня Π΄Π΅Ρ€Π΅Π²Π° поиска).

    НСкоторыС стандартныС ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹:

    • Π—Π°Π΄Π°Ρ‡Π° Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ судоку
    • ΠšΡ€Ρ‹ΡΠ° Π² Π»Π°Π±ΠΈΡ€ΠΈΠ½Ρ‚Π΅
    • Π‘ΡƒΠΌΠΌΠ° ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ, Π‘ΡƒΠΌΠΌΠ° ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ II, Π‘ΡƒΠΌΠΌΠ° ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ III
    • ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° с ΠΊΠΎΡ€ΠΎΠ»Π΅Π²ΠΎΠΉ N
    • ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° N-Ρ„Π΅Ρ€Π·Π΅ΠΉ
  • Local Search - ΠΏΡ‹Ρ‚Π°ΠΉΡ‚Π΅ΡΡŒ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π½Π΅ Ρ…ΡƒΠΆΠ΅ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π³ΠΎ (Π³Ρ€Π°Π΄ΠΈΠ΅Π½Ρ‚Π½Ρ‹ΠΉ спуск/подьСм).

    ΠŸΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠΌ локального поиска являСтся Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ «ВосхоТдСниС Π½Π° Ρ…ΠΎΠ»ΠΌΒ». Он начинаСтся с ΠΏΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΈ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎ вносит нСбольшиС измСнСния для ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΡ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ с Ρ†Π΅Π»ΡŒΡŽ Π½Π°ΠΉΡ‚ΠΈ локально ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½ΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Π² ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½ΠΎΠΉ части пространства Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ.

  • Transform and Conquer - ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ… для Π»ΡƒΡ‡ΡˆΠ΅Π³ΠΎ ΠΈΡ… использования ΠΈΠ»ΠΈ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ самой Π·Π°Π΄Π°Ρ‡ΠΈ (индСкс Π² Π±Π°Π·Π°Ρ… Π΄Π°Π½Π½Ρ‹Ρ…, Ρ€Π°Π·ΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ особым способом для быстрого поиска. Π˜Π½Π²Π΅Ρ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ индСкс ΠΈ Column-oriented DB MS).

    Бпособы примСнСния:

    1. Π£ΠΏΡ€ΠΎΡ‰Π΅Π½ΠΈΠ΅ экзСмпляра: Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ, ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΠ² Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹, Ρ€Π°Π·Π±ΠΈΠ² Π΅Π΅ Π½Π° Π±ΠΎΠ»Π΅Π΅ ΠΌΠ΅Π»ΠΊΠΈΠ΅ части ΠΈΠ»ΠΈ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ² структуру ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹. Π­Ρ‚ΠΎΡ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для упрощСния Π·Π°Π΄Π°Ρ‡, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ слишком Π²Π΅Π»ΠΈΠΊΠΈ для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½Ρ‹ΠΌΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠΈ.

    2. УмСньшСниС ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹: ИдСя сокращСния ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€Π΅Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Π΄Π°Π½Π½ΡƒΡŽ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ Π² Π΄Ρ€ΡƒΠ³ΡƒΡŽ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π»Π΅Π³Ρ‡Π΅ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ, ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π² ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ Π² Π΄Ρ€ΡƒΠ³ΡƒΡŽ Ρ„ΠΎΡ€ΠΌΡƒ ΠΈΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ эвристику для поиска Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ.

    3. ИзмСнСниС прСдставлСния: Основная идСя этого ΠΌΠ΅Ρ‚ΠΎΠ΄Π° β€” ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ прСдставлСниС Π΄Π°Π½Π½Ρ‹Ρ…, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΡ… ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ ΡƒΠΏΡ€ΠΎΡΡ‚ΠΈΡ‚ΡŒ. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΏΡƒΡ‚Π΅ΠΌ измСнСния Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ»ΠΈ Π²Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ….

  • Randomized algorithm - (Ρ€Π°Π½Π΄ΠΎΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ) ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ ΡΠ»ΡƒΡ‡Π°ΠΉΠ½ΠΎΡΡ‚ΡŒ для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Ρ€Π΅ΡˆΠ΅Π½Ρ‹ дСтСрминистичСски, ΠΈΠ»ΠΈ для ΠΏΠΎΠ²Ρ‹ΡˆΠ΅Π½ΠΈΡ срСднСй слоТности Π·Π°Π΄Π°Ρ‡ΠΈ. Рандомизированная быстрая сортировка: Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° быстрой сортировки, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Ρ‚ΠΎΡ‡ΠΊΠ° ΠΎΠΏΠΎΡ€Ρ‹ выбираСтся случайным ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ.

    Randomized algorithm

Sorting Algorithms

Π‘ΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²ΠΊΠ° являСтся Ρ„ΡƒΠ½Π΄Π°ΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½ΠΎΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠ΅ΠΉ Π² ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π½Ρ‹Ρ… Π½Π°ΡƒΠΊΠ°Ρ…, ΠΈ для Π½Π΅Ρ‘ сущСствуСт нСсколько эффСктивных Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ², Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ Quicksort, Merge sort ΠΈ Heapsort.

Radix Sort β€” сортировка ΠΏΠΎ основанию систСмы счислСния.

Π“Π»Π°Π²Π½ΠΎΠ΅ ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΎ: Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ поразрядной сортировки Π³Π΅Π½ΠΈΠ°Π»Π΅Π½ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ сортируСт Π½Π΅ числа Ρ†Π΅Π»ΠΈΠΊΠΎΠΌ, Π° значСния разрядов. ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ΡΡ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ ΠΊΠ°ΠΊ Π±Ρ‹ разбираСтся с числами Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ Π΅Π΄ΠΈΠ½ΠΈΡ†, дСсятков, сотСн ΠΈ Ρ‚. Π΄. ΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎΡ‚ΠΎΠΌ ΠΎΠ½ Π΄Π΅Π»Π°Π΅Ρ‚ ΠΎΠ±Ρ‰ΡƒΡŽ сортировку. Π­Ρ‚ΠΎ позволяСт Π΅ΠΌΡƒ Π½Π΅ Π±Π΅Π³Π°Ρ‚ΡŒ ΠΏΠΎ всСм сравниваСмым числам ΠΈ Π½Π΅ Π΄Π΅Π»Π°Ρ‚ΡŒ ΠΌΠΈΠ»Π»ΠΈΠΎΠ½ сравнСний. ΠžΡ‚ΡΡŽΠ΄Π° ΠΈ экономия Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ.

ВрСмСнная ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Radix Sort O(d * (n + b)) , Π³Π΄Π΅ d β€” количСство Ρ†ΠΈΡ„Ρ€, n β€” количСство элСмСнтов, Π° b β€” основа ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠΉ систСмы счислСния.

Π’ практичСских рСализациях поразрядная сортировка Radix Sort часто Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ быстрСС, Ρ‡Π΅ΠΌ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹ сортировки Π½Π° основС сравнСния, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ Quicksort ΠΈΠ»ΠΈ Merge sort, для Π±ΠΎΠ»ΡŒΡˆΠΈΡ… Π½Π°Π±ΠΎΡ€ΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ…, особСнно ΠΊΠΎΠ³Π΄Π° ΠΊΠ»ΡŽΡ‡ΠΈ содСрТат ΠΌΠ½ΠΎΠ³ΠΎ Ρ†ΠΈΡ„Ρ€. Однако Π΅Π³ΠΎ врСмСнная ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ растСт Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎ с ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠ΅ΠΌ количСства Ρ†ΠΈΡ„Ρ€, поэтому ΠΎΠ½ Π½Π΅ Ρ‚Π°ΠΊ эффСктивСн для Π½Π΅Π±ΠΎΠ»ΡŒΡˆΠΈΡ… Π½Π°Π±ΠΎΡ€ΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ….

Π’ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ пространство Radix Sort O(n + b), Π³Π΄Π΅ n β€” количСство элСмСнтов, Π° b β€” основаниС систСмы счислСния.

Sorting Algorithms

Counting sort

Sort algorithms.

Searching Algorithms

Поиск элСмСнта Π² большом Π½Π°Π±ΠΎΡ€Π΅ Π΄Π°Π½Π½Ρ‹Ρ… β€” распространСнная Π·Π°Π΄Π°Ρ‡Π°, ΠΈ для Π½Π΅Ρ‘ сущСствуСт нСсколько эффСктивных Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ², Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ Π±ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΉ поиск ΠΈ Ρ…Π΅Ρˆ-Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹.

...

НаиболСС распространСнныС Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹ поиска:

  • Linear Search (Π›ΠΈΠ½Π΅ΠΉΠ½Ρ‹ΠΉ поиск) O(n) - провСряСм элСмСнт ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎ ΠΎΡ‚ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ½Ρ†Π° ΠΊ Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ.
  • Binary Search (Π”Π²ΠΎΠΈΡ‡Π½Ρ‹ΠΉ поиск) O(log n) - Ρ€Π°Π·Π±ΠΈΠ²Π°Π΅ΠΌ структуру Π΄Π°Π½Π½Ρ‹Ρ… Π½Π° Π΄Π²Π΅ Ρ€Π°Π²Π½Ρ‹Π΅ части ΠΈ пытаСмся Ρ€Π΅ΡˆΠΈΡ‚ΡŒ, Π² ΠΊΠ°ΠΊΠΎΠΉ ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Π΅ Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ элСмСнт.
  • Ternary Search (Π’Π΅Ρ€Π½Π°Ρ€Π½Ρ‹ΠΉ поиск) O(2 * log3n) - массив дСлится Π½Π° Ρ‚Ρ€ΠΈ части, ΠΈ Π½Π° основС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π² позициях раздСлСния ΠΌΡ‹ опрСдСляСм сСгмСнт, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ Π½ΡƒΠΆΠ½Ρ‹ΠΉ элСмСнт.
  • Jump Search ΠΌΠ΅ΠΆΠ΄Ρƒ O(n) ΠΈ Π΄Π²ΠΎΠΈΡ‡Π½Ρ‹ΠΌ поиском O(Log n) - это Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ поиска Π² отсортированных массивах. Основная идСя состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ мСньшС элСмСнтов (ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с Π»ΠΈΠ½Π΅ΠΉΠ½Ρ‹ΠΌ поиском ), пСрСходя Π²ΠΏΠ΅Ρ€Π΅Π΄ Π½Π° фиксированныС шаги ΠΈΠ»ΠΈ пропуская Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ элСмСнты вмСсто поиска ΠΏΠΎ всСм элСмСнтам. Если ΠΌΡ‹ сравним Π΅Π³ΠΎ с Π»ΠΈΠ½Π΅ΠΉΠ½Ρ‹ΠΌ ΠΈ Π±ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΌ поиском, Ρ‚ΠΎ окаТСтся, Ρ‡Ρ‚ΠΎ ΠΎΠ½ Π»ΡƒΡ‡ΡˆΠ΅, Ρ‡Π΅ΠΌ Π»ΠΈΠ½Π΅ΠΉΠ½Ρ‹ΠΉ поиск, Π½ΠΎ Π½Π΅ Π»ΡƒΡ‡ΡˆΠ΅, Ρ‡Π΅ΠΌ Π±ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΉ поиск.
  • Interpolation Search O(log 2 (log 2 n)) для срСднСго случая ΠΈ O(n) для Π½Π°ΠΈΡ…ΡƒΠ΄ΡˆΠ΅Π³ΠΎ случая - это ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΠ΅ ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с Π΄Π²ΠΎΠΈΡ‡Π½Ρ‹ΠΌ поиском для случаСв, ΠΊΠΎΠ³Π΄Π° значСния Π² отсортированном массивС распрСдСлСны Ρ€Π°Π²Π½ΠΎΠΌΠ΅Ρ€Π½ΠΎ. Π˜Π½Ρ‚Π΅Ρ€ΠΏΠΎΠ»ΡΡ†ΠΈΡ создаСт Π½ΠΎΠ²Ρ‹Π΅ Ρ‚ΠΎΡ‡ΠΊΠΈ Π΄Π°Π½Π½Ρ‹Ρ… Π² Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π΅ дискрСтного Π½Π°Π±ΠΎΡ€Π° извСстных Ρ‚ΠΎΡ‡Π΅ΠΊ Π΄Π°Π½Π½Ρ‹Ρ…. Π”Π²ΠΎΠΈΡ‡Π½Ρ‹ΠΉ поиск всСгда обращаСтся ΠΊ срСднСму элСмСнту для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ. Π‘ Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны, интСрполяционный поиск ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²Π»ΡΡ‚ΡŒΡΡ Π² Ρ€Π°Π·Π½Ρ‹Ρ… мСстах Π² зависимости ΠΎΡ‚ значСния искомого ΠΊΠ»ΡŽΡ‡Π°. НапримСр, Ссли Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π° Π±Π»ΠΈΠΆΠ΅ ΠΊ послСднСму элСмСнту, интСрполяционный поиск, скорСС всСго, Π½Π°Ρ‡Π½Π΅Ρ‚ поиск Π² Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠΈ ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΉ стороны.
  • Exponential Search O(log n) - Он Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π»ΡƒΡ‡ΡˆΠ΅, Ρ‡Π΅ΠΌ Π΄Π²ΠΎΠΈΡ‡Π½Ρ‹ΠΉ поиск, для ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½Ρ‹Ρ… массивов, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΊΠΎΠ³Π΄Π° искомый элСмСнт находится Π±Π»ΠΈΠΆΠ΅ ΠΊ ΠΏΠ΅Ρ€Π²ΠΎΠΌΡƒ элСмСнту.

Binary Search ΠΈ Exponential Search это Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹ поиска значСния Π² отсортированном (ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²Π»Π΅Π½Π½ΠΎΠΌ) Π½Π°Π±ΠΎΡ€Π΅ Π΄Π°Π½Π½Ρ‹Ρ…, Π½ΠΎ Ссли Ρ…Π°Ρ€Π°ΠΊΡ‚Π΅Ρ€ использования ΠΏΠΎΠ΄Ρ€Π°Π·ΡƒΠΌΠ΅Π²Π°Π΅Ρ‚ постоянноС ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π½Π°Π±ΠΎΡ€Π° Π΄Π°Π½Π½Ρ‹Ρ…, Ρ‚ΠΎ эти Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹ Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΌΠ΅Π½ΡŒΡˆΡƒΡŽ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Ρ‡Π΅ΠΌ Red Black Tree

Searching Algorithms.

geeksforgeeks

Π€ΠΈΠ»ΡŒΡ‚Ρ€ Π‘Π»ΡƒΠΌΠ° ΠΈ HyperLogLog

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

Π›ΠΈΠ½Π΅ΠΉΠ½ΠΎΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅

Π›ΠΈΠ½Π΅ΠΉΠ½ΠΎΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для максимизации Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ характСристики ΠΏΡ€ΠΈ Π·Π°Π΄Π°Π½Π½Ρ‹Ρ… ограничСниях. ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, ваша компания выпускаСт Π΄Π²Π° ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Π°: Ρ€ΡƒΠ±Π°ΡˆΠΊΠΈ ΠΈ сумки. На Ρ€ΡƒΠ±Π°ΡˆΠΊΡƒ трСбуСтся 1 ΠΌ 5 ΠΏΡƒΠ³ΠΎΠ²ΠΈΡ†. На ΠΈΠ·Π³ΠΎΡ‚ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ сумки Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ 2 ΠΌ Ρ‚ΠΊΠ°Π½ΠΈ ΠΈ 2 ΠΏΡƒΠ³ΠΎΠ²ΠΈΡ†Ρ‹. Π£ вас Π΅ΡΡ‚ΡŒ 11 ΠΌ Ρ‚ΠΊΠ°Π½ΠΈ ΠΈ 20 ΠΏΡƒΠ³ΠΎΠ²ΠΈΡ†. Π ΡƒΠ±Π°ΡˆΠΊΠ° приносит ΠΏΡ€ΠΈΠ±Ρ‹Π»ΡŒ $2, Π° сумка - $3. Бколько Ρ€ΡƒΠ±Π°ΡˆΠ΅ΠΊ ΠΈ сумок слСдуСт ΠΈΠ·Π³ΠΎΡ‚ΠΎΠ²ΠΈΡ‚ΡŒ для получСния Ρ‚ΠΊΠ°Π½ΠΈ ΠΈ максимальной ΠΏΡ€ΠΈΠ±Ρ‹Π»ΠΈ?

Bit Manipulation / Bit Masking:

Π§Ρ‚ΠΎΠ±Ρ‹ Π΄Π²Π΅ Ρ†ΠΈΡ„Ρ€Ρ‹ ΠΎΡ‚ 0-9 ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π·Π°ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π² ΠΎΠ΄Π½ΠΎΠΌ Π±Π°ΠΉΡ‚Π΅

AND (&)
OR (|)
XOR (^)
NOT (~)
Left Shift (<<)
Right Shift(>>)

Data Compression: Bit-Packing 101

ΠšΠΎΠΌΠ±ΠΈΠ½Π°Ρ‚ΠΎΜΡ€ΠΈΠΊΠ° β€” Ρ€Π°Π·Π΄Π΅Π» ΠΌΠ°Ρ‚Π΅ΠΌΠ°Ρ‚ΠΈΠΊΠΈ, посвящённый Ρ€Π΅ΡˆΠ΅Π½ΠΈΡŽ Π·Π°Π΄Π°Ρ‡, связанных с Π²Ρ‹Π±ΠΎΡ€ΠΎΠΌ ΠΈ располоТСниСм элСмСнтов Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ (Ρ‡Π°Ρ‰Π΅ всСго ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠ³ΠΎ) мноТСства Π² соотвСтствии с Π·Π°Π΄Π°Π½Π½Ρ‹ΠΌΠΈ ΠΏΡ€Π°Π²ΠΈΠ»Π°ΠΌΠΈ.

Π—Π°Π΄Π°Ρ‡Π° NP-полная (NP-complete problem)

Π’ΠΈΠΏ Π·Π°Π΄Π°Ρ‡, ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°Ρ‰ΠΈΡ… классу NP (non-deterministic polynomial – Β«Π½Π΅Π΄Π΅Ρ‚Π΅Ρ€ΠΌΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ с ΠΏΠΎΠ»ΠΈΠ½ΠΎΠΌΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΌ Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌΒ» O(N^2), O(N^3)), для ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΎΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‚ быстрыС Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ. ВрСмя Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ² Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Ρ‚Π°ΠΊΠΈΡ… Π·Π°Π΄Π°Ρ‡ сущСствСнно (ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ, ΡΠΊΡΠΏΠΎΠ½Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ) возрастаСт с ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠ΅ΠΌ объСма Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ….

Π‘ΡƒΠΊΠ²Π° P Π² Π½Π°Π·Π²Π°Π½ΠΈΠΈ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ΠΏΠΎΠ»ΠΈΠ½ΠΎΠΌΠΈΠ°Π»ΡŒΠ½ΡƒΡŽ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° A_0X^n + ... + A_n Π‘ΡƒΠΊΠ²Π° N - ΠΎΡ†Π΅Π½ΠΊΠ° слоТности соотвСтствуСт Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΡŽ Π½Π° Π½Π΅Π΄Π΅Ρ‚Π΅Ρ€ΠΌΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΉ машинС Π’ΡŒΡŽΡ€ΠΈΠ½Π³Π°, ΠΈΠ½Π°Ρ‡Π΅ β€” ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΉ.

Однако, Ссли ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡƒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ свСдСния, Ρ‚ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Π·Π°Ρ‚Ρ€Π°Ρ‚Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ сущСствСнно сниТСны. ΠŸΡ€ΠΈ этом, Ссли Π±ΡƒΠ΄Π΅Ρ‚ Π½Π°ΠΉΠ΄Π΅Π½ быстрый Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ для ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ ΠΈΠ· NP-ΠΏΠΎΠ»Π½Ρ‹Ρ… Π·Π°Π΄Π°Ρ‡, Ρ‚ΠΎ для любой Π΄Ρ€ΡƒΠ³ΠΎΠΉ Π·Π°Π΄Π°Ρ‡ΠΈ ΠΈΠ· класса NP ΠΌΠΎΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Π½Π°ΠΉΡ‚ΠΈ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅.

К классу NP-ΠΏΠΎΠ»Π½Ρ‹Ρ… относятся Π·Π°Π΄Π°Ρ‡Π° ΠΎ коммивояТСрС, ΠΎ Π²Π΅Ρ€ΡˆΠΈΠ½Π½ΠΎΠΌ ΠΏΠΎΠΊΡ€Ρ‹Ρ‚ΠΈΠΈ ΠΈ ΠΏΠΎΠΊΡ€Ρ‹Ρ‚ΠΈΠΈ мноТСств, восстановлСниС ΠΏΠΎΠ²Ρ€Π΅ΠΆΠ΄Π΅Π½Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ², оптимизация ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΎΠ², слоТныС вычислСния Π² Π±ΠΈΠΎΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΠΊΠ΅.

ΠšΡ€ΠΈΠΏΡ‚ΠΎΠ³Ρ€Π°Ρ„ΠΈΡ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹Ρ… ΠΊΠ»ΡŽΡ‡Π΅ΠΉ основываСтся Π½Π° ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ, Ρ‡Ρ‚ΠΎ NP β‰  P. Если найдСтся способ Ρ€Π΅ΡˆΠ°Ρ‚ΡŒ Π·Π°Π΄Π°Ρ‡ΠΈ этого класса Π·Π° полиномиальноС врСмя, Ρ‚ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ Π·Π°Ρ‰ΠΈΡ‚Ρ‹ большС Π½Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ смысла.

Двумя Ρ„ΡƒΠ½Π΄Π°ΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½Ρ‹ΠΌΠΈ понятиями Π² этой области ΡΠ²Π»ΡΡŽΡ‚ΡΡ врСмСнная ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΈ пространствСнная ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ

Big O - описываСт Π½Π°ΠΈΡ…ΡƒΠ΄ΡˆΠΈΠΉ сцСнарий Ρ‚ΠΎΠ³ΠΎ, сколько Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ потрСбуСтся Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡƒ для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ ΠΏΠΎ ΠΌΠ΅Ρ€Π΅ роста Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…. Он ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ Π½Π° вопрос: "Π§Ρ‚ΠΎ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ‚, Ссли ΠΌΡ‹ ΠΏΠΎΠ΄Π°Π΄ΠΈΠΌ Π½Π° Π²Ρ…ΠΎΠ΄ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡƒ ΠΎΠ³Ρ€ΠΎΠΌΠ½Ρ‹ΠΉ, гипотСтичСски бСсконСчный объСм Π΄Π°Π½Π½Ρ‹Ρ…?". Π­Ρ‚ΠΎ ΠΈ Π΅ΡΡ‚ΡŒ асимптотичСский Π°Π½Π°Π»ΠΈΠ· β€” Π°Π½Π°Π»ΠΈΠ· повСдСния Π½Π° бСсконСчности.

Big O Space - сколько памяти (пространства для хранСния) трСбуСтся Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡƒ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π²Ρ…ΠΎΠ΄Π½Ρ‹ΠΌΠΈ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ.

Π‘ΡƒΠΊΠ²Π° О прСдставляСт собой сокращСниС ΠΎΡ‚ слова order ("порядок"). ΠžΡΠ½ΠΎΠ²Π½Ρ‹ΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ O-ΠΎΡ†Π΅Π½ΠΊΠΈ являСтся n, Ρ‚.Π΅. Ρ€Π°Π·ΠΌΠ΅Ρ€ исслСдуСмой Π·Π°Π΄Π°Ρ‡ΠΈ, ΠΏΡ€ΠΈΡ‡Π΅ΠΌ врСмя выполнСния Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° ΠΈΠ»ΠΈ Π΅Π³ΠΎ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ прСдставляСтся Π² Π²ΠΈΠ΄Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ n.

Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° - это Ρ‚ΠΎ, ΠΊΠ°ΠΊ Π±ΡƒΠ΄Π΅Ρ‚ расти ΠΏΠΎΡ‚Ρ€Π΅Π±Π»Π΅Π½ΠΈΠ΅ рСсурсов с ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠ΅ΠΌ N количСства Π΅Π»Π΅ΠΌΠ΅Π½Ρ‚ΠΎΠ² Π΄ΠΎ бСсконСчности. Наивная рСализация Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ°/Π·Π°Π΄Π°Ρ‡ΠΈ которая ΠΏΡ€Π΅Π²Ρ‹ΡˆΠ°Π΅Ρ‚ Π·Π°Π΄Π°Π½Π½Ρ‹ΠΉ Π»ΠΈΠΌΠΈΡ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ с ΡƒΡ‡Π΅Ρ‚ΠΎΠΌ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ количСства ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ ΠΈ Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… рСсурсов. Если вашС Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Π½Π΅ укладываСтся Π² ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎ памяти, ΠΎΠ½ΠΎ скорСС всСго Π½Π΅ улоТится ΠΈ Π² ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ.

На ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‚ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ отличия Π² дСталях асимптотичСских ΠΎΡ†Π΅Π½ΠΎΠΊ. НапримСр, Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ порядка O(n2) с нСбольшим коэффициСнтом ΠΏΡ€ΠΎΠΏΠΎΡ€Ρ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ быстрСС, Ρ‡Π΅ΠΌ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ порядка O(n log n) с высоким коэффициСнтом для ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΌΠ°Π»Ρ‹Ρ… n, Π½ΠΎ ΠΏΠΎ ΠΌΠ΅Ρ€Π΅ роста n прСимущСство Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡΡ‚Π°Π²Π°Ρ‚ΡŒΡΡ Π·Π° Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠΌ с ΠΌΠ΅Π΄Π»Π΅Π½Π½Π΅Π΅ растущСй Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ Π² O-ΠΎΡ†Π΅Π½ΠΊΠ΅. Π‘Π»Π΅Π΄ΡƒΠ΅Ρ‚ Ρ‚Π°ΠΊΠΆΠ΅ Ρ€Π°Π·Π»ΠΈΡ‡Π°Ρ‚ΡŒ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ² Π² Π½Π°ΠΈΡ…ΡƒΠ΄ΡˆΠ΅ΠΌ ΠΈ срСднСстатистичСском случаях. НапримСр, для Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° быстрой сортировки Π½Π°ΠΈΡ…ΡƒΠ΄ΡˆΠΈΠΉ случай соотвСтствуСт количСству ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ порядка O(n2), Π° Π΅Π³ΠΎ срСднСС быстродСйствиС характСризуСтся ΠΎΡ†Π΅Π½ΠΊΠΎΠΉ O(n log n). Всякий Ρ€Π°Π· Ρ‚Ρ‰Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ выбирая ΠΎΠΏΠΎΡ€Π½Ρ‹ΠΉ элСмСнт, ΠΌΠΎΠΆΠ½ΠΎ свСсти Π²Π΅Ρ€ΠΎΡΡ‚Π½ΠΎΡΡ‚ΡŒ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ΠΈΡ‡Π½ΠΎΠ³ΠΎ, Ρ‚.Π΅. O(n2), объСма ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ практичСски ΠΊ Π½ΡƒΠ»ΡŽ.

ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ для n = 10_000 Π΅Π»Π΅ΠΌΠ΅Π½Ρ‚ΠΎΠ²:

ΠžΡ†Π΅Π½ΠΊΠ° Π₯Π°Ρ€Π°ΠΊΡ‚Π΅Ρ€ зависимости ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ
O(1) ΠšΠΎΠ½ΡΡ‚Π°Π½Ρ‚Π½Π°Ρ β€” 1 опСрация ΠžΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΏΠΎ индСксу
O(log n) ЛогарифмичСская (ΠΊΠ°ΠΊ Π² Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠΌ поискС) β€” ~13 ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ Π‘ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΉ поиск
O(√n) ΠšΠΎΡ€Π½Π΅Π²Π°Ρ √10 000 = 100 ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° простоты ΠΏΠ΅Ρ€Π΅Π±ΠΎΡ€ΠΎΠΌ Π΄Π΅Π»ΠΈΡ‚Π΅Π»Π΅ΠΉ Π΄ΠΎ √n
O(n) ЛинСйная β€” 10 000 ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ (β‰ˆ 10 мкс ΠΏΡ€ΠΈ 1 нс/ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ) ΠŸΠΎΠ»Π½Ρ‹ΠΉ ΠΏΠ΅Ρ€Π΅Π±ΠΎΡ€ массива. Π‘Ρ€Π°Π²Π½Π΅Π½ΠΈΠ΅ строк
O(n log n) ΠŸΡ€ΠΎΠΏΠΎΡ€Ρ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Π°Ρ/Π›ΠΈΠ½Π΅ΠΉΠ½ΠΎ-логарифмичСская (quicksort) β€” 10 000 Γ— 13 β‰ˆ 130 000 (β‰ˆ 130 мкс ΠΏΡ€ΠΈ 1 нс/ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ) Быстрая сортировка
O(nΒ²) ΠšΠ²Π°Π΄Ρ€Π°Ρ‚ΠΈΡ‡Π½Π°Ρ β€” 100 000 000 ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ (β‰ˆ 0.1 с ΠΏΡ€ΠΈ 1 нс/ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ) Π‘ΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²ΠΊΠ° вставками
O(nΒ³) ΠšΡƒΠ±ΠΈΡ‡Π΅ΡΠΊΠ°Ρ (Ρ‚Ρ€ΠΎΠΉΠ½ΠΎΠΉ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΉ Ρ†ΠΈΠΊΠ») β€” 1 000 000 000 000 ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ (β‰ˆ 17 ΠΌΠΈΠ½ ΠΏΡ€ΠΈ 1 нс/ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ) Π£ΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†
O(2^n) Π­ΠΊΡΠΏΠΎΠ½Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½Π°Ρ β€” 2^10 000 β‰ˆ 10^3010 (нСдостиТимо) РСшСниС Π·Π°Π΄Π°Ρ‡ΠΈ коммивояТёра ΠΏΠΎΠ»Π½Ρ‹ΠΌ ΠΏΠ΅Ρ€Π΅Π±ΠΎΡ€ΠΎΠΌ
O(n!) Π€Π°ΠΊΡ‚ΠΎΡ€ΠΈΠ°Π»ΡŒΠ½Π°Ρ β€” 10 000 000 000 000 000 000 000 000 ... ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ ΠŸΠ΅Ρ€Π΅Π±ΠΎΡ€ всСх пСрСстановок

Comparison of algorithms.

АсимптотичСская ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Ρ„-Ρ†ΠΈΠΉ Π² Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ Big-O:

Cronis Academy. ΠžΡ†Π΅Π½ΠΊΠ° слоТности Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ°. Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ². Big O, Π‘ΠΎΠ»ΡŒΡˆΠΎΠ΅ О

  1. константная O(1)
  2. логарифмичСская O(log N), O(log^2 N)
  3. ΠΊΠΎΡ€Π΅Π½ΡŒ ΠΈΠ· N O(sqrt N)
  4. линСйная O(N)
  5. линСйная O(N+M)
  6. линСарифмичСская/linearithmic O(N*log N), O(N*log^2 N) ΠΈΠ»ΠΈ O(N*M),O(N*sqrt M)
  7. полиномиальная квадратичная O(N^2),O(N^2*log N) ΠΈΠ»ΠΈ кубичСская O(N^3)
  8. ΡΠΊΡΠΏΠΎΠ½Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½Π°Ρ O(2^N)
  9. Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΠ°Π» O(n!)
ΠŸΡ€Π΅Π½Π΅Π±Ρ€Π΅ΠΆΠ΅Π½ΠΈΠ΅ константами:

ΠŸΠΎΡ‡Π΅ΠΌΡƒ ΠΌΡ‹ Π³ΠΎΠ²ΠΎΡ€ΠΈΠΌ, Ρ‡Ρ‚ΠΎ O(2n + 5) β€” это Ρ‚ΠΎ ΠΆΠ΅ самоС, Ρ‡Ρ‚ΠΎ O(n)? ΠŸΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ стрСмлСнии n ΠΊ бСсконСчности константы 2 ΠΈ 5 становятся ΠΏΡ€Π΅Π½Π΅Π±Ρ€Π΅ΠΆΠΈΠΌΠΎ ΠΌΠ°Π»Ρ‹ΠΌΠΈ.

Π‘Ρ€Π°Π²Π½ΠΈΡ‚Π΅: n = 1 000 000. 2n + 5 = 2 000 005. Π­Ρ‚ΠΎ всСго лишь ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Π² 2 Ρ€Π°Π·Π° большС, Ρ‡Π΅ΠΌ n. Рост остаСтся Π»ΠΈΠ½Π΅ΠΉΠ½Ρ‹ΠΌ.

А Π²ΠΎΡ‚ Ρ€Π°Π·Π½ΠΈΡ†Π° ΠΌΠ΅ΠΆΠ΄Ρƒ O(n) ΠΈ O(nΒ²) ΠΏΡ€ΠΈ n = 1 000 000 β€” это ΡƒΠΆΠ΅ Ρ€Π°Π·Π½ΠΈΡ†Π° ΠΌΠ΅ΠΆΠ΄Ρƒ 1 000 000 ΠΈ 1 000 000 000 000. Π­Ρ‚Π° Ρ€Π°Π·Π½ΠΈΡ†Π° Π±ΡƒΠ΄Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ бСсконСчно ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Ρ‚ΡŒΡΡ с ростом n

Π’Π°ΠΊ ΠΆΠ΅:

ΠΏΡ€ΠΈΠΌΠ΅Ρ€ послС расчСта Ρ€Π΅Π°Π»ΡŒΠ½Π°Ρ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π°
O(nΒ² + n) O(nΒ²) nΒ² Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ большС n
O(n + log n) O(n) n Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ большС log n
O(5 * 2^n + 10 * n^100) O(2^n) 2^n Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ большС n^100
O(nΒ² + B) O(nΒ² + B) Ссли ΠΌΡ‹ Π½Π΅ Π·Π½Π°Π΅ΠΌ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ B
Как ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ слоТности:

Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ O(A+B) - ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΠ΅Ρ€Π΅Π±ΠΎΡ€ нСзависимых Π½Π°Π±ΠΎΡ€ΠΎΠ², спСрва Π½Π°Π±ΠΎΡ€Π° Π΄Π°Π½Π½Ρ‹Ρ… A ΠΏΠΎΡ‚ΠΎΠΌ B

for (int a: arrA){
    print(a);
}
for (int b: arrB){
    print(b);
}

Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ O(A*B) - зависимый ΠΏΠ΅Ρ€Π΅Π±ΠΎΡ€ Π΄Π°Π½Π½Ρ‹Ρ…, Π½Π° ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Π΅Π»Π΅ΠΌΠ΅Π½Ρ‚ Π½Π°Π±ΠΎΠ° A выполняСтся ΠΏΠΎΠ»Π½Ρ‹ΠΉ ΠΏΠ΅Ρ€Π΅Π±ΠΎΡ€ Π½Π°Π±ΠΎΡ€Π° B

for (int a: arrA){
    for (int b: arrB){
        print(a, b);
    }
}

Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ O(N+N)=O(N) - ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΠ΅Ρ€Π΅Π±ΠΎΡ€ зависимых Π½Π°Π±ΠΎΡ€ΠΎΠ²

for (int a: arrA){
    print(a);
}
for (int a: arrA){
    print(a);
}

Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ O(nΒ²) - зависимый ΠΏΠ΅Ρ€Π΅Π±ΠΎΡ€ Π΄Π°Π½Π½Ρ‹Ρ…, ΠΊΠΎΠ³Π΄Π° Π½Π° ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Π΅Π»Π΅ΠΌΠ΅Π½Ρ‚ Π½Π°Π±ΠΎΠ° A выполняСтся ΠΏΠΎΠ»Π½Ρ‹ΠΉ ΠΏΠ΅Ρ€Π΅Π±ΠΎΡ€ Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ Π½Π°Π±ΠΎΡ€Π° A

for (int a: arrA){
    for (int b: arrA){
        print(a, b);
    }
}

Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ O(√n) - ΠΊΠΎΠ³Π΄Π° ΠΏΠ΅Ρ€Π΅Π±ΠΎΡ€ ΠΈΠ΄Π΅Ρ‚ Π΄ΠΎ корня ΠΈΠ· n. ВмСсто ΠΏΠ΅Ρ€Π΅Π±ΠΎΡ€Π° всСх n элСмСнтов, ΠΌΡ‹ ΠΏΠ΅Ρ€Π΅Π±ΠΈΡ€Π°Π΅ΠΌ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ √n элСмСнтов.

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ ΠΊΠΎΡ€Π΅Π½ΡŒ:

√n = число, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΡƒΠΌΠ½ΠΎΠΆΠΈΠ»ΠΈ БАМО НА Π‘Π•Π‘Π― ΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ n

√25 = 5, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ 5 Γ— 5 = 25

O(√n) Π³ΠΎΡ€Π°Π·Π΄ΠΎ Π»ΡƒΡ‡ΡˆΠ΅ Ρ‡Π΅ΠΌ O(n), Π½ΠΎ Ρ…ΡƒΠΆΠ΅ Ρ‡Π΅ΠΌ O(log n):

// ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠ΅ΠΌ, являСтся Π»ΠΈ число n простым
bool isPrime(int n) {
    if (n < 2) return false;
    
    // ΠŸΠ΅Ρ€Π΅Π±ΠΈΡ€Π°Π΅ΠΌ Π΄Π΅Π»ΠΈΡ‚Π΅Π»ΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π΄ΠΎ sqrt(n)
    for (int i = 2; i * i <= n; i++) {
        if (n % i == 0) {
            return false;  // Нашли Π΄Π΅Π»ΠΈΡ‚Π΅Π»ΡŒ - число Π½Π΅ простоС
        }
    }
    return true;  // Π”Π΅Π»ΠΈΡ‚Π΅Π»Π΅ΠΉ Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½ΠΎ - число простоС
}

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

int n = 100;
while (n > 1) {
    n = n / 2;  // На каТдом шагС дСлим пополам
    printf("%d\n", n);
}

Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ O(2^n) - ΠΊΠΎΠ³Π΄Π° Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΌ элСмСнтС вСтвимся Π½Π° 2 Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π°, это ΠΎΡ‡Π΅Π½ΡŒ ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ. Π£ΠΆΠ΅ ΠΏΡ€ΠΈ n=60, 2ⁿ большС Ρ‡Π΅ΠΌ число Π°Ρ‚ΠΎΠΌΠΎΠ² Π² наблюдаСмой всСлСнной!

Π‘Π°ΠΌΡ‹ΠΉ простой ΠΏΡ€ΠΈΠΌΠ΅Ρ€: ВсС Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ подмноТСства мноТСства:

// n = 3 элСмСнта: {A, B, C}
// ВсС Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ подмноТСства:
{}
{A}
{B}
{C}
{A, B}
{A, C}
{B, C}
{A, B, C}
void generateSubsets(int[] arr, int n) {
    // 2^n Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… подмноТСств
    for (int i = 0; i < (1 << n); i++) {
        printf("{ ");
        for (int j = 0; j < n; j++) {
            // ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠ΅ΠΌ j-ΠΉ Π±ΠΈΡ‚
            if (i & (1 << j)) {
                printf("%d ", arr[j]);
            }
        }
        printf("}\n");
    }
}

Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ O(n!) - ΠΊΠΎΠ³Π΄Π° ΠΏΠ΅Ρ€Π΅Π±ΠΈΡ€Π°Π΅ΠΌ всС Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ пСрСстановки, это катастрофичСски ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ. Π£ΠΆΠ΅ ΠΏΡ€ΠΈ n=20 ΠΏΠ΅Ρ€Π΅Π±ΠΈΡ€Π°Ρ‚ΡŒ всС Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ β€” ΠΈΡ… большС Ρ‡Π΅ΠΌ Π°Ρ‚ΠΎΠΌΠΎΠ² Π²ΠΎ ВсСлСнной!

n = 10 β†’ 10! = 3_628_800 пСрСстановок

Π“Π΄Π΅ встрСчаСтся O(n!):

  • Π—Π°Π΄Π°Ρ‡Π° коммивояТСра (ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ Ρ‡Π΅Ρ€Π΅Π· N Π³ΠΎΡ€ΠΎΠ΄ΠΎΠ²)
  • Расстановка N Ρ„Π΅Ρ€Π·Π΅ΠΉ Π½Π° ΡˆΠ°Ρ…ΠΌΠ°Ρ‚Π½ΠΎΠΉ доскС
  • ВсС Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ Π°Π½Π°Π³Ρ€Π°ΠΌΠΌΡ‹ слова
  • Π›ΡŽΠ±Π°Ρ Π·Π°Π΄Π°Ρ‡Π° "ΠΏΠ΅Ρ€Π΅Π±Ρ€Π°Ρ‚ΡŒ всС Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ порядка"
ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹:
/* 
ВрСмСнная ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° - константная O(1)
Π­Ρ‚ΠΎ Π»ΡƒΡ‡ΡˆΠ΅Π΅. 
Алгоритм всСгда Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎΠ΅ количСство Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, нСзависимо ΠΎΡ‚ объСма Π΄Π°Π½Π½Ρ‹Ρ…. 
ΠŸΡ€ΠΈΠΌΠ΅Ρ€: поиск элСмСнта массива ΠΏΠΎ Π΅Π³ΠΎ индСксу.
*/
fn algo_1(v: &[i32], index: usize) -> Option<i32>{
    if index < v.len(){
        return Some(v[index]);
    }
    None    
} 
// ΠΈΠ»ΠΈ
let x = &[1, 2, 4];
unsafe {
    assert_eq!(x.get_unchecked(1), &2);
}

// ΠΈΠ»ΠΈ
vec.push(), vec.pop()
/* 
ВрСмСнная ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° - логарифмичСская O(log N)
(`log N` это `log _2 N` Π² ΠΊΠ°ΠΊΠΎΠΉ стСпСни Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ Π΄Π²ΠΎΠΉΠΊΠ° Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΎΡΡŒ N, 
это ΠΈ Π±ΡƒΠ΄Π΅Ρ‚ количСство ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ)
каТдая итСрация сокращаСт Π²Π΄Π²ΠΎΠ΅ количСство элСмСнтов/Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ
ΠŸΠ΅Ρ€Π΅Π²ΠΎΠ΄ числа Π² Π΄Π²ΠΎΠΈΡ‡Π½ΠΎΠ΅ прСдставлСниС
TODO: Π›ΠΎΠ³Π°Ρ€ΠΈΡ„ΠΌ ΠΏΠΎ основанию `a` ΠΎΡ‚ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° `x` β€” это ΡΡ‚Π΅ΠΏΠ΅Π½ΡŒ, 
Π² ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π½Π°Π΄ΠΎ возвСсти число `a`, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ число `x`

log_2 64 = 6 Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ 2^6=64

Π”ΠΎΠ²ΠΎΠ»ΡŒΠ½ΠΎ Π·Π΄ΠΎΡ€ΠΎΠ²ΠΎ. ΠŸΠΎΠ΄ΠΎΠ±Π½Ρ‹Π΅ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹ ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°ΡŽΡ‚ Π²Π΄Π²ΠΎΠ΅ объСм Π΄Π°Π½Π½Ρ‹Ρ… Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΈ. 
Если Ρƒ вас 100 элСмСнтов, Ρ‚ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π°ΠΉΡ‚ΠΈ ΠΎΡ‚Π²Π΅Ρ‚, потрСбуСтся ΠΎΠΊΠΎΠ»ΠΎ 7 шагов. 
ΠŸΡ€ΠΈ Π½Π°Π»ΠΈΡ‡ΠΈΠΈ 1000 элСмСнтов трСбуСтся 10 шагов. 
А для 1 000 000 элСмСнтов трСбуСтся всСго 20 шагов. 
Π­Ρ‚ΠΎ ΠΎΡ‡Π΅Π½ΡŒ быстро Π΄Π°ΠΆΠ΅ для Π±ΠΎΠ»ΡŒΡˆΠΈΡ… объСмов Π΄Π°Π½Π½Ρ‹Ρ…. 
ΠŸΡ€ΠΈΠΌΠ΅Ρ€: Π±ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΉ поиск.
*/
fn algo_2(mut decimal:u8) -> Option<String>{
    if decimal == 0 {return None;}
    let mut binary = String::from(""); 
    while decimal > 0 {
        binary = format!("{}{}",decimal%2,binary);
        decimal = decimal.div_floor(2);
    }
    Some(binary)
}

// ΠΈΠ»ΠΈ
let j = 1
while j < n {
  // do constant time stuff
  j *= 2
}
/* 
ВрСмСнная ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° - ΠΊΠΎΡ€Π΅Π½ΡŒ ΠΈΠ· N (sqrt N)
условиС Π²Ρ‹Ρ…ΠΎΠ΄Π° ΠΈΠ· Ρ†ΠΈΠΊΠ»Π° x^2 ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Ρ†ΠΈΠΊΠ» прСкратится ΠΊΠΎΠ³Π΄Π° x >= sqrt N

TODO: ΠšΠΎΡ€Π΅Π½ΡŒ `n-ΠΉ` стСпСни ΠΈΠ· числа `a` опрСдСляСтся ΠΊΠ°ΠΊ Ρ‚Π°ΠΊΠΎΠ΅ число `b`, Ρ‡Ρ‚ΠΎ `b^n=a` 
Π—Π΄Π΅ΡΡŒ `n` β€” Π½Π°Ρ‚ΡƒΡ€Π°Π»ΡŒΠ½ΠΎΠ΅ число, Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΠΎΠ΅ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΌ корня (ΠΈΠ»ΠΈ ΡΡ‚Π΅ΠΏΠ΅Π½ΡŒΡŽ корня); 
ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, ΠΎΠ½ΠΎ большС ΠΈΠ»ΠΈ Ρ€Π°Π²Π½ΠΎ 2, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ случай `n=1` Π½Π΅ прСдставляСт интСрСса.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€: ΠšΠΎΡ€Π½ΡΠΌΠΈ 2-ΠΉ стСпСни ΠΈΠ· числа 9 ΡΠ²Π»ΡΡŽΡ‚ΡΡ +/-3  Ρ‚.Π΅. `9 sqrt^2=3`  
Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ 3^2=9,Π° `64 sqrt^3=4` Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ 4^3=64
И Π³Ρ€Π°Ρ„ΠΈΠΊ O(sqrt N) Π±ΡƒΠ΄Π΅Ρ‚ расти быстрСС, ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΌΠ΅Π΄Π»Π΅Π½Π½Π΅Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Ρ‡Π΅ΠΌ Π³Ρ€Π°Ρ„ΠΈΠΊ O(log N)
Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ для N=64 => `log_2 64 = 2^6 = 64 => 6` это < `64 sqrt^2 = 8^2 = 64 => 8`
Ρ‚.Π΅. для log ΠΌΡ‹ Π΄Π²ΠΎΠΉΠΊΡƒ Π²ΠΎΠ·Π²ΠΎΠ΄ΠΈΠΌ Π² Π½ΡƒΠΆΠ½ΡƒΡŽ ΡΡ‚Π΅ΠΏΠ΅Π½ΡŒ, 
Π° для sqrt Π½ΡƒΠΆΠ½ΠΎ само число для возвСдСния Π² ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ 
*/
fn algo_sqrt(v:&Vec<i32>){
    let mut x = 0;
    while x*x < v.len() {
        x+=1;
    }
}
/* 
ВрСмСнная ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° - линСйная O(N)
ВрСмя выполнСния увСличиваСтся ΠΏΡ€ΠΎΠΏΠΎΡ€Ρ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρƒ Π·Π°Π΄Π°Ρ‡ΠΈ.

Π₯ΠΎΡ€ΠΎΡˆΠ°Ρ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ. Если Ρƒ вас 100 элСмСнтов, это выполняСт 100 Π΅Π΄ΠΈΠ½ΠΈΡ† Ρ€Π°Π±ΠΎΡ‚Ρ‹. 
ΠŸΡ€ΠΈ ΡƒΠ΄Π²ΠΎΠ΅Π½ΠΈΠΈ количСства элСмСнтов Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Ρ€ΠΎΠ²Π½ΠΎ Π² Π΄Π²Π° Ρ€Π°Π·Π° дольшС (200 Π΅Π΄. Ρ€Π°Π±ΠΎΡ‚Ρ‹). 
ΠŸΡ€ΠΈΠΌΠ΅Ρ€: ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ поиск.
*/
fn algo_3(v:&Vec<i32>,n:i32) -> bool{
    for i in v{
        if i == &n{
            return true;
        }
    }
    false
}
// ВрСмСнная ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° - линСйная O(N + M) 
fn algo_5(n:&Vec<i32>,m:&Vec<i32>,element:&i32) -> Option<i32>{
    let mut value:i32 = 0;
    for i_n in n{
       if i_n > element{
         value = *i_n;
       }
    }
    if value == 0{return None};
    for i_m in m {
        if &value == i_m{
            return Some(*i_m);
        }
    }
    None
}
/*
ВрСмСнная ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° - линСарифмичСская O(N * M) 

Достойная ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ. Π­Ρ‚ΠΎ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ Ρ…ΡƒΠΆΠ΅ Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠ³ΠΎ, Π½ΠΎ Π½Π΅ Ρ‚Π°ΠΊ ΡƒΠΆ ΠΏΠ»ΠΎΡ…ΠΎ. 
ΠŸΡ€ΠΈΠΌΠ΅Ρ€: самыС быстрыС Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹ сортировки ΠΎΠ±Ρ‰Π΅Π³ΠΎ назначСния.
*/
fn algo_6(n:&Vec<i32>,m:&Vec<i32>) -> Option<i32>{
    for i_n in n{
        for i_m in m{
            if i_n == i_m{
                return Some(*i_m);
            }
        }
    }
    None
}
/* 
ВрСмСнная ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° - полиномиальная (квадратичная) ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ O(N^2)
 1 + 2 + 3 + 4 + ... + N => O(N^2)
 N-1 * N-1 = N^2
Часто встрСчаСтся Π² Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ°Ρ… с Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΌΠΈ Ρ†ΠΈΠΊΠ»Π°ΠΌΠΈ. 

Как-Ρ‚ΠΎ ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ. Если Ρƒ вас 100 элСмСнтов, это 100^2 = 10 000 Π΅Π΄ΠΈΠ½ΠΈΡ† Ρ€Π°Π±ΠΎΡ‚Ρ‹. 
Π£Π΄Π²ΠΎΠ΅Π½ΠΈΠ΅ количСства ΠΏΡ€Π΅Π΄ΠΌΠ΅Ρ‚ΠΎΠ² Π΄Π΅Π»Π°Π΅Ρ‚ процСсс ΠΌΠ΅Π΄Π»Π΅Π½Π½Π΅Π΅ Π² Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ Ρ€Π°Π·Π° 
(ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ 2 Π² ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π΅ Ρ€Π°Π²Π½ΠΎ 4). 
ΠŸΡ€ΠΈΠΌΠ΅Ρ€: Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠ΅ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ Ρ†ΠΈΠΊΠ»Ρ‹, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ сортировка вставками.
*/
fn algo_6_bubble_sort(v:&mut Vec<i32>){
    for i in 0..v.len()-1 {
        for j in 0..v.len()-1 {
            if v[j] > v[j+1]{
                let swap = v[j];
                v[j]=v[j+1];
                v[j+1]=swap;
            }
        }
    }
}

// ΠΈΠ»ΠΈ
for i in 0..n {
  for j in 0..n {
    ...
  }
}
/* 
ВрСмСнная ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° - полиномиальная (кубичСская) ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ O(N^3)

Π¨Π°Π³ Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Ρ‹ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ΠΈΡ‡Π½ΠΎΠΉ слоТности. 
По ΠΌΠ΅Ρ€Π΅ увСличСния Ρ€Π°Π·ΠΌΠ΅Ρ€Π° Π·Π°Π΄Π°Ρ‡ΠΈ врСмя выполнСния увСличиваСтся Π΅Ρ‰Π΅ быстрСС. 
Π­Ρ‚ΠΎ происходит Π² Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ°Ρ… с трСмя Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΌΠΈ Ρ†ΠΈΠΊΠ»Π°ΠΌΠΈ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π² Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ°Ρ… 
с Ρ‚Ρ€Π΅Ρ…ΠΌΠ΅Ρ€Π½Ρ‹ΠΌΠΈ массивами.

Низкая ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ. Если Ρƒ вас 100 элСмСнтов, это 100^3 = 1 000 000 Π΅Π΄ΠΈΠ½ΠΈΡ† Ρ€Π°Π±ΠΎΡ‚Ρ‹.
Π£Π΄Π²ΠΎΠ΅Π½ΠΈΠ΅ Π²Ρ…ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° Π΄Π΅Π»Π°Π΅Ρ‚ Π΅Π³ΠΎ Π² восСмь Ρ€Π°Π· ΠΌΠ΅Π΄Π»Π΅Π½Π½Π΅Π΅. ΠŸΡ€ΠΈΠΌΠ΅Ρ€: ΡƒΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹.
*/
for i in 0..n {
  for j in 0..n {
    for k in 0..n {
       ...
    }
  }
}
/* 
ВрСмСнная ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° - ΡΠΊΡΠΏΠΎΠ½Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½Π°Ρ O(2^N)
 2^0 + 2^1 + 2^3 + ... + 2^N => O(2^N)

ΠžΡ‡Π΅Π½ΡŒ плохая ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ. 
Π’Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Ρ… Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ², Π½ΠΎ ΠΈΠ½ΠΎΠ³Π΄Π° Ρƒ вас Π½Π΅Ρ‚ Π²Ρ‹Π±ΠΎΡ€Π°. 
Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ всСго лишь ΠΎΠ΄Π½ΠΎΠ³ΠΎ Π±ΠΈΡ‚Π° ΠΊ Π²Ρ…ΠΎΠ΄Π½Ρ‹ΠΌ Π΄Π°Π½Π½Ρ‹ΠΌ ΡƒΠ΄Π²Π°ΠΈΠ²Π°Π΅Ρ‚ врСмя Ρ€Π°Π±ΠΎΡ‚Ρ‹. 
ΠŸΡ€ΠΈΠΌΠ΅Ρ€: Π·Π°Π΄Π°Ρ‡Π° коммивояТСра.

 cargo +nightly run
*/
fn main() {
    aasert_eq!(Some("11111110"),algo_2(254));

    let mut v = vec![5,7,1,4];
    algo_7_bubble_sort(&mut v);
    assert_eq!(vec![1,4,5,7],v);
}
/* 
ВрСмСнная ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° - Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΠ°Π» O(n!)
Они Π² основном ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π² пСрСстановочных ΠΈ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ‚ΠΎΡ€Π½Ρ‹Ρ… Π·Π°Π΄Π°Ρ‡Π°Ρ….

НСвыносимо ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ. Π‘ΡƒΠΊΠ²Π°Π»ΡŒΠ½ΠΎ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ, ΡƒΡ…ΠΎΠ΄ΠΈΡ‚ ΠΌΠΈΠ»Π»ΠΈΠΎΠ½ Π»Π΅Ρ‚.
Π’ Π·Π°Π΄Π°Ρ‡Π΅ "ΠšΠΎΠΌΠΈΠΈΠ²ΠΎΡΠΆΠΎΡ€Π°" - построСниС всСх Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΎΠ², 
ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² ΠΊΠ°Ρ€Ρ‚Π°Ρ… ΠΈΠ»ΠΈ просто рСкурсия
*/
fn factorial(n: i32) {
    for i in 0..n {
       factorial(n - 1)
    }
}

Top 20 LeetCode Patterns

1. Π”Π²Π° указатСля (Two Pointers)

  • Π—Π°Π΄Π°Ρ‡ΠΈ Π½Π° отсортированныС массивы, подстроки, ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ Π΄ΡƒΠ±Π»ΠΈΠΊΠ°Ρ‚ΠΎΠ².

  • ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹:

    • Remove Duplicates from Sorted Array
    • 3Sum

2. Π‘ΠΊΠΎΠ»ΡŒΠ·ΡΡ‰Π΅Π΅ ΠΎΠΊΠ½ΠΎ (Sliding Window)

  • Поиск ΠΏΠΎΠ΄ΠΎΡ‚Ρ€Π΅Π·ΠΊΠΎΠ² массива/строки с Π½ΡƒΠΆΠ½Ρ‹ΠΌΠΈ свойствами.

  • ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹:

    • Longest Substring Without Repeating Characters
    • Minimum Window Substring

3. Π‘ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΉ поиск (Binary Search)

  • НС Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π° числах, Π½ΠΎ ΠΈ Π½Π° "ΠΎΡ‚Π²Π΅Ρ‚Π΅" (Binary Search on Answer).

  • ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹:

    • Search in Rotated Sorted Array
    • Median of Two Sorted Arrays

4. Π”Π²ΠΎΠΈΡ‡Π½Ρ‹ΠΉ поиск ΠΏΠΎ ΠΎΡ‚Π²Π΅Ρ‚Ρƒ (Binary Search on Answer)

  • Π—Π°Π΄Π°Ρ‡ΠΈ Ρ‚ΠΈΠΏΠ° "ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡ€ΡƒΠΉ/максимизируй условиС".

  • ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹:

    • Koko Eating Bananas
    • Split Array Largest Sum

5. Π‘ΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²ΠΊΠ° + Π–Π°Π΄Π½Ρ‹ΠΉ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ (Sorting + Greedy)

  • Когда порядок Π²Π°ΠΆΠ΅Π½ для ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ.

  • ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹:

    • Meeting Rooms II
    • Non-overlapping Intervals

6. Π₯Сш-Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ / ΠœΠ½ΠΎΠΆΠ΅ΡΡ‚Π²Π° (Hashing)

  • Быстрая ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° принадлСТности, подсчёты.

  • ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹:

    • Two Sum
    • Group Anagrams

7. Π‘Ρ‚Π΅ΠΊ (Stack)

  • Для ΠΏΠ°Ρ€ скобок, ΠΌΠΎΠ½ΠΎΡ‚ΠΎΠ½Π½Ρ‹Ρ… стСков, Next Greater Element.

  • ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹:

    • Valid Parentheses
    • Largest Rectangle in Histogram

8. ΠžΡ‡Π΅Ρ€Π΅Π΄ΡŒ / Π”Π΅ΠΊ (Queue / Deque)

  • ОсобСнно для Sliding Window Maximum.

  • ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹:

    • Sliding Window Maximum
    • Rotting Oranges

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

  • ΠŸΠΎΠ΄Ρ€Π°Π·Π΄Π΅Π»Ρ‹:

    • 1D DP (Fibonacci, House Robber)
    • 2D DP (Unique Paths, Coin Change)
    • DP Π½Π° подстроках (Palindrome Partitioning)

10. РаздСляй ΠΈ властвуй (Divide & Conquer)

  • БыстрыС сортировки, Ρ€Π°Π±ΠΎΡ‚Π° с Π΄Π΅Ρ€Π΅Π²ΡŒΡΠΌΠΈ, ΠΏΠΎΠ΄Π·Π°Π΄Π°Ρ‡ΠΈ.

  • ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹:

    • Merge Sort
    • Maximum Subarray (Kadane / Divide & Conquer вСрсия)

11. DFS (поиск Π² Π³Π»ΡƒΠ±ΠΈΠ½Ρƒ)

  • Π“Ρ€Π°Ρ„Ρ‹, ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹, Π΄Π΅Ρ€Π΅Π²ΡŒΡ.

  • ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹:

    • Number of Islands
    • Path Sum

12. BFS (поиск Π² ΡˆΠΈΡ€ΠΈΠ½Ρƒ)

  • ΠšΡ€Π°Ρ‚Ρ‡Π°ΠΉΡˆΠΈΠ΅ ΠΏΡƒΡ‚ΠΈ, ΡƒΡ€ΠΎΠ²Π½Π΅Π²Ρ‹ΠΉ ΠΎΠ±Ρ…ΠΎΠ΄.

  • ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹:

    • Word Ladder
    • Binary Tree Level Order Traversal

13. Backtracking

  • ΠŸΠ΅Ρ€Π΅ΡΡ‚Π°Π½ΠΎΠ²ΠΊΠΈ, ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ, N-Queens.

  • ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹:

    • Permutations
    • Combination Sum

14. Union-Find (Disjoint Set Union)

  • ΠšΠ»Π°ΡΡΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡ Π³Ρ€Π°Ρ„ΠΎΠ², острова, Kruskal.

  • ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹:

    • Number of Connected Components in Graph
    • Redundant Connection

15. Topological Sort (Kahn / DFS)

  • Π—Π°Π΄Π°Ρ‡ΠΈ Π½Π° зависимости.

  • ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹:

    • Course Schedule
    • Alien Dictionary

16. Π”Π΅Ρ€Π΅Π²ΡŒΡ поиска (BST)

  • Вставки, удалСния, поиск K-th smallest/largest.

  • ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹:

    • Validate BST
    • Lowest Common Ancestor of a BST

17. Heap / ΠŸΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π½Π°Ρ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ

  • k-элСмСнтов, ΠΌΠ΅Π΄ΠΈΠ°Π½Ρ‹, ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π»Ρ‹.

  • ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹:

    • Merge k Sorted Lists
    • Find Median from Data Stream

18. Prefix Sum / Difference Array

  • Для ΠΏΠΎΠ΄ΠΎΡ‚Ρ€Π΅Π·ΠΊΠΎΠ² чисСл ΠΈΠ»ΠΈ строк.

  • ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹:

    • Subarray Sum Equals K
    • Range Sum Query

19. Bit Manipulation

  • ΠŸΠΎΠ±ΠΈΡ‚ΠΎΠ²Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, подмноТСства.

  • ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹:

    • Single Number
    • Subsets II

20. ΠœΠ°Ρ‚Π΅ΠΌΠ°Ρ‚ΠΈΠΊΠ° ΠΈ гСомСтрия

  • Часто Ρ…ΠΈΡ‚Ρ€Ρ‹Π΅ Π·Π°Π΄Π°Ρ‡ΠΈ Ρ€Π΅ΡˆΠ°ΡŽΡ‚ΡΡ Ρ‡Π΅Ρ€Π΅Π· Ρ„ΠΎΡ€ΠΌΡƒΠ»Ρ‹.

  • ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹:

    • Pow(x, n)
    • Rotate Image

p.s. ΡƒΡ‡Π΅Π±Π½Ρ‹ΠΉ Ρ€ΠΎΠ°Π΄ΠΌΠ°ΠΏ с ΠΏΠΎΠ΄Π±ΠΎΡ€ΠΊΠΎΠΉ 1–2 классичСских Π·Π°Π΄Π°Ρ‡ ΠΏΠΎ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½Ρƒ

Links

8 Π»ΡƒΡ‡ΡˆΠΈΡ… Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π·Π½Π°Ρ‚ΡŒ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ программист

AllAlgorithms

geeksforgeeks.org

Algorithmic complexity / Big-O / Asymptotic analysis

ΠšΠΎΠΌΠ±ΠΈΠ½Π°Ρ‚ΠΎΡ€ΠΈΠΊΠ°

TheAlgorithms Rust

Visual algo

Visual Algorithms

Vamonos visual Algorithms

Algorithms e-maxx.ru

Sorting-Algorithms on Rust

Sorting algorithm Wiki

Π“Ρ€ΠΎΠΊΠ°Π΅ΠΌ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹ GitHub

Radix sort

swift-algorithm-club

Coursera Algorithms part 1

Coursera Algorithms part 2

neetcode roadmap

About

Learning Algorithms

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published