Skip to content

comerc/go-secrets

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

79 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

go-secrets

ΠŸΠΎΡ‡Π΅ΠΌΡƒ Go?

Π­Ρ‚ΠΎ ΠΌΠ°Ρ‚Π΅Ρ€Π½Ρ‹ΠΉ язык Π² ΠΌΠΈΡ€Π΅ языков программирования, Π³Π΄Π΅ простыми Π²Ρ‹Ρ€Π°Π·ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ срСдствами ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ большС, Ρ‡Π΅ΠΌ Π½Π° Ρ€ΠΎΠ΄Π½ΠΎΠΌ языкС. Плюс gofmt снимаСт ограничСния с Π²Ρ‹Π±ΠΎΡ€ΠΎΠΌ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€Π°.

Code Style

Channel Axioms

  • ΠžΡ‚ΠΏΡ€Π°Π²ΠΊΠ° Π½Π° nil-ΠΊΠ°Π½Π°Π» блокируСтся навсСгда (fatal error "deadlock" Π±Π΅Π· recover)
  • ΠŸΡ€ΠΈΡ‘ΠΌ ΠΎΡ‚ nil-ΠΊΠ°Π½Π°Π»Π° блокируСтся навсСгда (fatal error "deadlock" Π±Π΅Π· recover)
  • ΠžΡ‚ΠΏΡ€Π°Π²ΠΊΠ° Π² Π·Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΉ ΠΊΠ°Π½Π°Π» ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ ΠΏΠ°Π½ΠΈΠΊΠ΅ (ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ recover)
  • ΠŸΡ€ΠΈΡ‘ΠΌ ΠΈΠ· Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΎΠ³ΠΎ ΠΊΠ°Π½Π°Π»Π° Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π½ΡƒΠ»Π΅Π²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ (ΡˆΠΈΡ€ΠΎΠΊΠΎΠΏΠΎΠ»ΠΎΡΠ½ΠΎ, Ρ‚.Π΅. всСм ΡΠ»ΡƒΡˆΠ°Ρ‚Π΅Π»ΡΠΌ ΠΊΠ°Π½Π°Π»Π°)

Go Proverbs

Π’ ΠΌΠΈΡ€Π΅ Go ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ нСсколько извСстных "пословиц" ΠΈΠ»ΠΈ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΡ‚Ρ€Π°ΠΆΠ°ΡŽΡ‚ Ρ„ΠΈΠ»ΠΎΡΠΎΡ„ΠΈΡŽ языка ΠΈ Π΅Π³ΠΎ Π»ΡƒΡ‡ΡˆΠΈΠ΅ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠΈ. Π’ΠΎΡ‚ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠ· Π½ΠΈΡ…:

ΠŸΡ€Π°Π²ΠΈΠ»ΠΎ компиляции: "ΠšΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅Ρ‚ΡΡ всё". Go стрСмится Π±Ρ‹Ρ‚ΡŒ языком с Ρ…ΠΎΡ€ΠΎΡˆΠ΅ΠΉ статичСской Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ ΠΈ строгим компилятором, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ Π²Ρ‹ΡΠ²Π»ΡΡ‚ΡŒ ошибки Π½Π° этапС компиляции.

ΠŸΡ€Π°Π²ΠΈΠ»ΠΎ эффСктивности: "ΠšΠ°Π½Π°Π»Ρ‹, Π° Π½Π΅ раздСляСмая ΠΏΠ°ΠΌΡΡ‚ΡŒ, для общСния ΠΌΠ΅ΠΆΠ΄Ρƒ Π³ΠΎΡ€ΡƒΡ‚ΠΈΠ½Π°ΠΌΠΈ". Go поощряСт использованиС ΠΊΠ°Π½Π°Π»ΠΎΠ² для ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ†ΠΈΠΈ ΠΈ ΠΎΠ±ΠΌΠ΅Π½Π° Π΄Π°Π½Π½Ρ‹ΠΌΠΈ ΠΌΠ΅ΠΆΠ΄Ρƒ Π³ΠΎΡ€ΡƒΡ‚ΠΈΠ½Π°ΠΌΠΈ, Π° Π½Π΅ ΠΎΠ±Ρ‰ΡƒΡŽ ΠΏΠ°ΠΌΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ состояния Π³ΠΎΠ½ΠΊΠΈ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ синхронизации.

ΠŸΡ€Π°Π²ΠΈΠ»ΠΎ читаСмости: "Код Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ понятСн для людСй, Π° Π½Π΅ для машин". Go ставит Π°ΠΊΡ†Π΅Π½Ρ‚ Π½Π° Ρ‡ΠΈΡ‚Π°Π΅ΠΌΠΎΡΡ‚ΡŒ ΠΊΠΎΠ΄Π° ΠΈ ΠΏΡ€ΠΈΠ·Ρ‹Π²Π°Π΅Ρ‚ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² ΠΏΠΈΡΠ°Ρ‚ΡŒ чистый, понятный ΠΈ простой ΠΊΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π»Π΅Π³ΠΊΠΎ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ ΠΈ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ.

ΠŸΡ€Π°Π²ΠΈΠ»ΠΎ простоты: "ΠŸΡ€ΠΎΡΡ‚ΠΎΡ‚Π° Π»ΡƒΡ‡ΡˆΠ΅ слоТности". Go стрСмится ΠΊ простотС Π² Π΄ΠΈΠ·Π°ΠΉΠ½Π΅ языка ΠΈ стандартной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ программистам Π±Ρ‹Π»ΠΎ Π»Π΅Π³Ρ‡Π΅ ΠΏΠΈΡΠ°Ρ‚ΡŒ, Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠ΄.

ΠŸΡ€Π°Π²ΠΈΠ»ΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ ошибок: "ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° ошибок ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Π° ΠΈ Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ явной". Go ΠΏΡ€ΠΈΠ·Ρ‹Π²Π°Π΅Ρ‚ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² явно ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ ошибки ΠΈ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ ΠΈΡ…, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ ΠΈ ΡƒΠ»ΡƒΡ‡ΡˆΠΈΡ‚ΡŒ Π½Π°Π΄Π΅ΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ.

ΠŸΡ€Π°Π²ΠΈΠ»ΠΎ однозначности: "Π§Ρ‘Ρ‚ΠΊΠΎ Π²Ρ‹Ρ€Π°ΠΆΠ°ΠΉΡ‚Π΅ свои намСрСния". Go ставит Π°ΠΊΡ†Π΅Π½Ρ‚ Π½Π° ясноС ΠΈ ΠΎΠ΄Π½ΠΎΠ·Π½Π°Ρ‡Π½ΠΎΠ΅ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π½Π°ΠΌΠ΅Ρ€Π΅Π½ΠΈΠΉ Π² ΠΊΠΎΠ΄Π΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ двусмыслСнности ΠΈ ΡƒΠ»ΡƒΡ‡ΡˆΠΈΡ‚ΡŒ Π΅Π³ΠΎ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅.

ΠŸΡ€Π°Π²ΠΈΠ»ΠΎ соблюдСния стандартов: "ВсСгда слСдуйтС соглашСниям ΠΎ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ ΠΊΠΎΠ΄Π°". Go ΠΈΠΌΠ΅Π΅Ρ‚ строгиС соглашСния ΠΎ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ ΠΊΠΎΠ΄Π°, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ Π² стандартной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅, ΠΈ ΠΏΡ€ΠΈΠ·Ρ‹Π²Π°Π΅Ρ‚ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΠΌ для ΠΏΠΎΠ²Ρ‹ΡˆΠ΅Π½ΠΈΡ согласованности ΠΈ читаСмости ΠΊΠΎΠ΄Π°.

Π­Ρ‚ΠΈ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡ‹ ΠΎΡ‚Ρ€Π°ΠΆΠ°ΡŽΡ‚ Ρ„ΠΈΠ»ΠΎΡΠΎΡ„ΠΈΡŽ Go ΠΈ ΠΏΠΎΠΌΠΎΠ³Π°ΡŽΡ‚ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°ΠΌ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ бСзопасныС, эффСктивныС ΠΈ понятныС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

Π•Ρ‰Ρ‘ ΠŸΠΎΡΡ‚ΡƒΠ»Π°Ρ‚Ρ‹ Go

Dependency Injection

Inversion of Control (IoC) ΠΈ Dependency Injection (DI) - это Π΄Π²Π° взаимосвязанных ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ°, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ Π² Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ обСспСчСния для ΡƒΠΌΠ΅Π½ΡŒΡˆΠ΅Π½ΠΈΡ связанности ΠΈ ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΡ ΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΊΠΎΠ΄Π°.

IoC - это ΠΎΠ±Ρ‰ΠΈΠΉ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ ΠΊΠΎΠ΄ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ выполнСния. ВмСсто этого ΠΏΠΎΡ‚ΠΎΠΊ управлСния обрабатываСтся Ρ†Π΅Π½Ρ‚Ρ€Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ ΠΈΠ»ΠΈ внСшним сСрвисом. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Π½Π΅ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ½ΠΈ ΠΏΠΎΠ»Π°Π³Π°ΡŽΡ‚ΡΡ для Ρ€Π°Π±ΠΎΡ‚Ρ‹. ВмСсто этого ΠΎΠ½ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠΌ Π½ΡƒΠΆΠ½Ρ‹, ΠΎΡ‚ внСшнСго источника.

DI - это конкрСтная Ρ„ΠΎΡ€ΠΌΠ° IoC, Π³Π΄Π΅ зависимости ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ΡΡ внСшним сСрвисом. DI позволяСт Π½Π°ΠΌ Ρ€Π°Π·Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ слабо связанныС ΠΌΠΎΠ΄ΡƒΠ»ΠΈ. Π’Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ зависимостСй осущСствляСтся ΠΏΡƒΡ‚Π΅ΠΌ прСдоставлСния зависимости ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ (ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρƒ), Π° Π½Π΅ ΠΏΡƒΡ‚Π΅ΠΌ создания зависимости Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°.

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ DI - это способ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ IoC. Они ΠΎΠ±Π° Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ вмСстС для достиТСния слабой связанности ΠΈ Π»ΡƒΡ‡ΡˆΠ΅ΠΉ ΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½ΠΎΡΡ‚ΠΈ Π² ΠΊΠΎΠ΄Π΅.

НС ΠΏΡƒΡ‚Π°Ρ‚ΡŒ с Dependency Inversion Principle - это ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ SOLID Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚ΡŒ ΡΠ²ΡΠ·Π°Π½Π½ΠΎΡΡ‚ΡŒ Π² ΠΊΠΎΠ΄Π΅. Он гласит: "ΠœΠΎΠ΄ΡƒΠ»ΠΈ Π²Π΅Ρ€Ρ…Π½Π΅Π³ΠΎ уровня Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π·Π°Π²ΠΈΡΠ΅Ρ‚ΡŒ ΠΎΡ‚ ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ Π½ΠΈΠΆΠ½Π΅Π³ΠΎ уровня. Оба Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π·Π°Π²ΠΈΡΠ΅Ρ‚ΡŒ ΠΎΡ‚ абстракций. Абстракции Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π·Π°Π²ΠΈΡΠ΅Ρ‚ΡŒ ΠΎΡ‚ Π΄Π΅Ρ‚Π°Π»Π΅ΠΉ. Π”Π΅Ρ‚Π°Π»ΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π·Π°Π²ΠΈΡΠ΅Ρ‚ΡŒ ΠΎΡ‚ абстракций".

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ Π½Π° "Communicating sequential processes (CSP)" / "Actor Model"

"Don't communicate by sharing memory, share memory by communicating"

Π—Π°Π΄Π°Ρ‡Π°: Π Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ структуру-счСтчик, которая Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π² ΠΊΠΎΠ½ΠΊΡƒΡ€Π΅Π½Ρ‚Π½ΠΎΠΉ срСдС. По Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π΄ΠΎΠ»ΠΆΠ½Π° Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΈΡ‚ΠΎΠ³ΠΎΠ²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ счСтчика.

УсловиС: Π‘Π΅Π· примСнСния ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²ΠΎΠ² ΠΈΠ· ΠΏΠ°ΠΊΠ΅Ρ‚Π° sync, ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΊΠ°Π½Π°Π» для обСспСчСния потокобСзопасной ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ/ΠΏΡ€ΠΈΡ‘ΠΌΠ° Π΄Π°Π½Π½Ρ‹Ρ….

РСшСниС

package main

import (
	"context"
	"fmt"
	"os"
	"os/signal"
	"sync"
)

type Counter chan int

func NewCounter(ctx context.Context) Counter {
	counter := make(Counter)
	go func() {
		var count int
		for {
			select {
			case v := <-counter:
				count += v
			case counter <- count:
			case <-ctx.Done():
				return
			}
		}
	}()
	return counter
}

func main() {
	ctx, cancel := signal.NotifyContext(context.Background(), os.Interrupt)
	defer cancel()
	counter := NewCounter(ctx)
	var wg sync.WaitGroup
	const total = 1_000_000
	wg.Add(total)
	for i := 0; i < total; i++ {
		go func() {
			counter <- 1
			wg.Done()
		}()
	}
	wg.Wait()
	fmt.Println(<-counter)
}

Π‘ΡƒΡ„Π΅Ρ€ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ-Π½Π΅Π±ΡƒΡ„Π΅Ρ€ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΠΊΠ°Π½Π°Π»

  • ch := make(chan string) - Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚Ρ‡ΠΈΠΊ, ΠΏΠΎΠΊΠ° Π½Π΅ Π³ΠΎΡ‚ΠΎΠ² ΠΏΡ€ΠΈΡ‘ΠΌΠ½ΠΈΠΊ
  • bufferedCh := make(chan string, 1) - Π½Π΅Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚Ρ‡ΠΈΠΊ, ΠΏΠΎΠΊΠ° Π½Π΅ Π³ΠΎΡ‚ΠΎΠ² ΠΏΡ€ΠΈΡ‘ΠΌΠ½ΠΈΠΊ
package main

import "fmt"

func main() {
	ch := make(chan string, 0) // ΠŸΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π½Π° Π±ΡƒΡ„Π΅Ρ€ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΠΊΠ°Π½Π°Π» ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅
	go func() {
		msg := <-ch
		fmt.Println("ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΎ сообщСниС:", msg)
	}()
	ch <- "ΠŸΡ€ΠΈΠ²Π΅Ρ‚, ΠΌΠΈΡ€!" // Π­Ρ‚Π° строка блокируСтся Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° Π³ΠΎΡ€ΡƒΡ‚ΠΈΠ½Π° Π½Π΅ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈΠ· ΠΊΠ°Π½Π°Π»Π°
	fmt.Println("Главная Π³ΠΎΡ€ΡƒΡ‚ΠΈΠ½Π° Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½Π°")
}

ΠšΠ°Π½Π°Π»Ρ‹: more writers - one reader

package main

import (
	"fmt"
	"time"
)

func main() {
	ch := make(chan int)
	done := make(chan bool)

	go func() {
		for i := range ch {
			if i == 20 {
				done <- true
				return
			}
			fmt.Printf("%d\n", i)
		}
	}()

	go func() {
		for i := 0; i < 10; i++ {
			select {
			case ch <- i:
				time.Sleep(1 * time.Second)
			case <-done:
				return
			}
		}
	}()

	go func() {
		for i := 10; i <= 20; i++ {
			select {
			case ch <- i:
				time.Sleep(1 * time.Second)
			case <-done:
				return
			}
		}
	}()

	<-done

}

ΠšΠ°Π½Π°Π»Ρ‹: one writer - more readers

package main

import (
	"fmt"
	"time"
)

func main() {
	ch := make(chan int)
	done := make(chan bool)

	go func() {
		for i := range ch {
			fmt.Printf("reader1: %d\n", i)
		}
		done <- true
	}()

	go func() {
		for i := range ch {
			fmt.Printf("reader2: %d\n", i)
		}
		done <- true
	}()

	go func() {
		for i := range ch {
			fmt.Printf("reader3: %d\n", i)
		}
		done <- true
	}()

	for i := 0; i <= 300; i++ {
		if i == 300 {
			close(ch)
			return
		}
		time.Sleep(1 * time.Second)
		ch <- i
	}

	<-done
}

Practice

ООП

Π’ GoLang Π½Π΅ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ особСнности ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ программирования, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ наслСдованиС классов ΠΈ конструкторы. Однако, Go ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΡ‹ для достиТСния Ρ‚Π΅Ρ… ΠΆΠ΅ Ρ†Π΅Π»Π΅ΠΉ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, встраиваниС структур ΠΈ интСрфСйсы.

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

ΠŸΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„ΠΈΠ·ΠΌ достигаСтся Ρ‡Π΅Ρ€Π΅Π· интСрфСйсы. Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡΡ‹ Π² Go ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΎΠ±Ρ‰ΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ Π΄Π°Π½Π½Ρ‹Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹ Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΌΠΈ Ρ‚ΠΈΠΏΠ°ΠΌΠΈ. Π­Ρ‚ΠΎ позволяСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ эти Ρ‚ΠΈΠΏΡ‹ Π΄Π°Π½Π½Ρ‹Ρ… Π² ΠΎΠ±Ρ‰Π΅ΠΌ контСкстС ΠΈ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΈΡ… ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ Π±Π΅Π· нСобходимости Π·Π½Π°Ρ‚ΡŒ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΡƒΡŽ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π² GoLang ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΡΡ‚ΠΈΡ‡ΡŒ ΠΏΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„ΠΈΠ·ΠΌΠ°, хотя это Π½Π΅ основной Π°ΠΊΡ†Π΅Π½Ρ‚ Π΄Π°Π½Π½ΠΎΠ³ΠΎ языка.

Π•ΡΡ‚ΡŒ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° абстракции Ρ‡Π΅Ρ€Π΅Π· интСрфСйсы. Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡΡ‹ Π² Go ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Π½Π°Π±ΠΎΡ€ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹ для Ρ‚ΠΈΠΏΠ° Π΄Π°Π½Π½Ρ‹Ρ…. Π­Ρ‚ΠΎ позволяСт ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ абстрактныС Ρ‚ΠΈΠΏΡ‹ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с Π½ΠΈΠΌΠΈ, Π½Π΅ завися ΠΎΡ‚ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΉ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ.

ОбъявлСниС ΠΈΠ»ΠΈ привязка структуры ΠΊ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρƒ называСтся "ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ-ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚Π΅Π»Π΅ΠΌ" (method receiver). ΠŸΡ€ΠΈ объявлСнии ΠΌΠ΅Ρ‚ΠΎΠ΄Π° для структуры, указываСтся ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚Π΅Π»ΡŒ - Ρ‚ΠΈΠΏ структуры, ΠΊ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ привязываСтся ΠΌΠ΅Ρ‚ΠΎΠ΄. Π­Ρ‚ΠΎ позволяСт Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ Π½Π° экзСмплярах этой структуры.

А-ля статичСский ΠΌΠ΅Ρ‚ΠΎΠ΄

Π’Ρ‹Π·ΠΎΠ² ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Π½Π° nil ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ - валидная опСрация. А Π²ΠΎΡ‚ Ссли ΠΌΠ΅Ρ‚ΠΎΠ΄ попытаСтся ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒΡΡ ΠΊ Π΄Π°Π½Π½Ρ‹ΠΌ (Π½Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌ) ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, Ρ‚ΠΎ Π²ΠΎΡ‚ Ρ‚ΡƒΡ‚ ΠΈ Π±ΡƒΠ΄Π΅Ρ‚ "nil dereference".

package main

import "fmt"

type MyStruct struct {
	data string
}

func (m *MyStruct) PrintData() {
	if m != nil {
		fmt.Println(m.data)
	} else {
		fmt.Println("nil dereference")
	}
}

func main() {
	var ptr *MyStruct = nil
	ptr.PrintData() // Π²Ρ‹Π·ΠΎΠ² ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Π½Π° nil ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅
}

Π’Π΅Ρ€ΠΌΠΈΠ½Ρ‹

  • [0-15) ΠΏΠΎΠ»ΡƒΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π» Π½Π° Ρ‡ΠΈΡΠ»ΠΎΠ²ΡƒΡŽ ΠΏΡ€ΡΠΌΡƒΡŽ
  • ΠΊΠΎΠΌΠΏΠΎΡ€Π°Ρ‚ΠΎΡ€ - функция, которая Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ -1 || 0 || 1
  • рСсивСр – это объявлСниС Ρ‚ΠΈΠΏΠ°, для ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄.

Π£ΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ

  • * - Ρ€Π°Π·Ρ‹ΠΌΠ΅Π½ΠΎΠ²Π°Π½ΠΈΠ΅ указатСля (ΠΏΡ€ΠΈΠΌΠ΅Ρ€: a := *b), Π½ΠΎ для Π°Ρ€ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ - Ρ‚ΠΈΠΏ указатСля

  • & - взятиС адрСса (ΠΏΡ€ΠΈΠΌΠ΅Ρ€: a := &b - ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚ΡŒ Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅)

  • Π² GΠΎ Π½Π΅Ρ‚ ссылок, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ (ссылки Π΅ΡΡ‚ΡŒ Π² c/c++).

  • Ρƒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½ΠΎΠΉ Π΅ΡΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, адрСс ссылки это адрСс значСния, Π° ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈΠΌΠ΅Π΅Ρ‚ свой собствСнный адрСс (​это ΠΎΡ‡Π΅Π½ΡŒ Π³Ρ€ΡƒΠ±ΠΎΠ΅ объяснСниС).

  • прСдставим Π΄ΠΎΠΌ, стоящий Π½Π° пСрСсСчСнии ΡƒΠ»ΠΈΡ† Π›Π΅Π½ΠΈΠ½Π° 43 ΠΈ МСндСлССва 77, Ρ‚ΠΎΠ³Π΄Π° ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π·Π°ΠΊΠ°Π·Π°Ρ‚ΡŒ такси Π½Π° любой ΠΈΠ· этих адрСсов ΠΈ ΠΎΠ½ΠΎ ΠΏΡ€ΠΈΠ΅Π΄Π΅Ρ‚ Π² ΠΎΠ΄Π½ΠΎ ΠΈ Ρ‚ΠΎ ΠΆΠ΅ мСсто. это адрСс. ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ Ρ‡Ρ‚ΠΎ адрСс это Π²Ρ‚ΠΎΡ€ΠΎΠ΅ имя ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, Π° ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ это ΠΊΠΎΡ€ΠΎΠ±ΠΊΠ° ΠΏΡ€ΠΈ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΈΠΈ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π½Π°ΠΌ скаТут ΠΏΠΎ ΠΊΠ°ΠΊΠΎΠΌΡƒ адрСсу Π»Π΅ΠΆΠΈΡ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½ΡƒΠΆΠ½ΠΎ Ρ€Π°Π·Ρ‹ΠΌΠ΅Π½ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ. адрСс Π½Π΅Ρ‚.

Π—Π°Ρ‡Π΅ΠΌ Π² Go ампСрсанд ΠΈ Π·Π²Ρ‘Π·Π΄ΠΎΡ‡ΠΊΠ° (& ΠΈ *)?

interface{}

  • алиас any
  • x.(MyType) - это "ΡƒΡ‚Π²Π΅Ρ€ΠΆΠ΄Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ°" / "type assertion" (Π° Π½Π΅ "ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ°", ΠΊΠ°ΠΊ Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€: float64 ΠΊ int)
  • x.(type) - это "ΠΈΠ·Π²Π»Π΅Ρ‡Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ°" / "type extraction", Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для switch, ΠΈΠ½Π°Ρ‡Π΅ Ρ‚Π°ΠΊ ΠΈ называСтся "Π²Ρ‹Π±ΠΎΡ€ Ρ‚ΠΈΠΏΠ°" / "type switch"

ΠœΠ½ΠΎΠΆΠ΅ΡΡ‚Π²Π° (sets)

Π’ языкС Go мноТСства (sets) Π½Π΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ встроСнной Ρ‡Π°ΡΡ‚ΡŒΡŽ языка, Π² ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π΄Ρ€ΡƒΠ³ΠΈΡ… языков программирования, Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ Python. Однако, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄ΠΎΡΡ‚ΠΈΡ‡ΡŒ ΠΏΠΎΡ…ΠΎΠΆΠ΅Π³ΠΎ повСдСния с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠ°Ρ€Ρ‚Ρ‹.

type Set[V comparable] map[V]struct{}

func NewSet[V comparable](capacity int) Set[V] {
	return make(Set[V], capacity)
}

// or

func NewSetWithValue[V comparable](value ...V) Set[V] {
	set := make(Set[V], len(value))

	for _, v := range value {
		set[v] = struct{}{}
	}

	return set
}

ΠšΠΎΡ€Ρ‚Π΅ΠΆΠΈ (tuples)

Π’ языкС Go ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠΈ (tuples) Π½Π΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ встроСнной Ρ‡Π°ΡΡ‚ΡŒΡŽ языка, Π² ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π΄Ρ€ΡƒΠ³ΠΈΡ… языков программирования, Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ Python. Однако, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄ΠΎΡΡ‚ΠΈΡ‡ΡŒ ΠΏΠΎΡ…ΠΎΠΆΠ΅Π³ΠΎ повСдСния с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ структур ΠΈΠ»ΠΈ слайсов.

Π‘ использованиСм структур, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ‚ΠΈΠΏ Π΄Π°Π½Π½Ρ‹Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ содСрТит нСсколько ΠΏΠΎΠ»Π΅ΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Ρ€Π°Π·Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°. НапримСр:

type Tuple struct {
    Field1 int
    Field2 string
    Field3 float64
}

func main() {
    tuple := Tuple{Field1: 1, Field2: "Hello", Field3: 3.14}
    fmt.Println(tuple.Field1, tuple.Field2, tuple.Field3)
}

Π’Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ слайсы (slices) для создания ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π±Π΅Π· явного опрСдСлСния структуры. НапримСр:

func main() {
    tuple := []interface{}{1, "Hello", 3.14}
    fmt.Println(tuple[0], tuple[1], tuple[2])
}

Однако, использованиС структур ΠΈΠ»ΠΈ слайсов вмСсто ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ΅ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΌΠ΅Π½Π΅Π΅ ΡƒΠ΄ΠΎΠ±Π½Ρ‹ΠΌ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π²Π°ΠΌ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΎΠ±Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ ΠΊ элСмСнтам ΠΏΠΎ индСксам ΠΈΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Ρ‚ΠΈΠΏΠΎΠ².

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ-Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹

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

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

Π’ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ простой Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Π° Π² Go с использованиСм Π³ΠΎΡ€ΡƒΡ‚ΠΈΠ½ ΠΈ ΠΊΠ°Π½Π°Π»ΠΎΠ²:

func generator() <-chan int {
	ch := make(chan int)
	go func() {
		defer close(ch)
		for i := 0; i < 10; i++ {
			ch <- i
		}
	}()
	return ch
}

func main() {
	gen := generator()
	for value := range gen {
		fmt.Println(value)
	}
}

Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ функция generator создаСт ΠΊΠ°Π½Π°Π» ΠΈ запускаСт Π³ΠΎΡ€ΡƒΡ‚ΠΈΠ½Ρƒ, которая Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ значСния ΠΈ отправляСт ΠΈΡ… Π² ΠΊΠ°Π½Π°Π». Ѐункция Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΊΠ°Π½Π°Π», ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡ‚Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ значСния.

Π—Π°Ρ‚Π΅ΠΌ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ main ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ ΠΊΠ°Π½Π°Π» ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Π° ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Ρ†ΠΈΠΊΠ» for range для получСния Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΈΠ· ΠΊΠ°Π½Π°Π»Π° ΠΈ Π²Ρ‹Π²ΠΎΠ΄Π° ΠΈΡ… Π½Π° экран.

Π­Ρ‚ΠΎ простой ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΈ рСализация Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ-Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ слоТной Π² зависимости ΠΎΡ‚ Π²Π°ΡˆΠΈΡ… Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠΉ. Однако с использованиСм Π³ΠΎΡ€ΡƒΡ‚ΠΈΠ½ ΠΈ ΠΊΠ°Π½Π°Π»ΠΎΠ² Π² Go Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄ΠΎΡΡ‚ΠΈΡ‡ΡŒ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ³ΠΎ повСдСния.

Π£ΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹ Π΄Π°Π½Π½Ρ‹Ρ…

Π£ΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹ Π΄Π°Π½Π½Ρ‹Ρ… Π² GoLang - это Ρ‚ΠΈΠΏΡ‹ Π΄Π°Π½Π½Ρ‹Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ хранятся Π² систСмной ΠΊΡƒΡ‡Π΅ (heap) ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ΡΡ ΠΏΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŽ, Π° Π½Π΅ ΠΏΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° Π΄Π°Π½Π½Ρ‹Ρ… Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, функция Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ с ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½Ρ‹ΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ, Π° Π½Π΅ с Π΅Π³ΠΎ ΠΊΠΎΠΏΠΈΠ΅ΠΉ. НСкоторыС ΠΈΠ· ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ… Π² GoLang:

  • Π‘Ρ€Π΅Π·Ρ‹ (slices) - это динамичСскиС массивы, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ собой ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ элСмСнтов ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°.
  • ΠšΠ°Ρ€Ρ‚Ρ‹ (maps) - это ассоциативныС массивы, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ собой ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Π½Π°Π±ΠΎΡ€ ΠΏΠ°Ρ€ ΠΊΠ»ΡŽΡ‡-Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅.
  • ΠšΠ°Π½Π°Π»Ρ‹ (channels) - это ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ для ΠΎΠ±ΠΌΠ΅Π½Π° Π΄Π°Π½Π½Ρ‹ΠΌΠΈ ΠΌΠ΅ΠΆΠ΄Ρƒ Π³ΠΎΡ€ΡƒΡ‚ΠΈΠ½Π°ΠΌΠΈ (goroutines) Π² ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅.
  • Π£ΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ (pointers) - это ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ хранят адрСс Π² памяти Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ.
  • ?? Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Ρ‹ (structs) - это ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ Π΄Π°Π½Π½Ρ‹Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ поля Ρ€Π°Π·Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ².
  • Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡΡ‹ (interfaces) - это Ρ‚ΠΈΠΏΡ‹ Π΄Π°Π½Π½Ρ‹Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ Π½Π°Π±ΠΎΡ€ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹ для Ρ‚ΠΈΠΏΠ° Π΄Π°Π½Π½Ρ‹Ρ…, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ удовлСтворял интСрфСйсу.
  • Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ (functions) - это Ρ‚ΠΈΠΏΡ‹ Π΄Π°Π½Π½Ρ‹Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Ρ‹ Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² Π΄Ρ€ΡƒΠ³ΠΈΠΌ функциям ΠΈΠ»ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½Ρ‹ ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ.

ВсС эти Ρ‚ΠΈΠΏΡ‹ Π΄Π°Π½Π½Ρ‹Ρ… ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ Π² GoLang ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ΡΡ ΠΏΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŽ, Π° Π½Π΅ ΠΏΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ.

Π‘Ρ‚Ρ€ΠΎΠΊΠΈ ΡΠ²Π»ΡΡŽΡ‚ΡΡ нСизмСняСмыми, Ρ‡Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π²Ρ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ строку Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ, измСняя Π±Π°ΠΉΡ‚Ρ‹, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ строка. Π₯отя строки содСрТат ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ Π²Π½ΡƒΡ‚Ρ€ΠΈ своСй структуры, сами строки Π½Π΅ ΡΡ‡ΠΈΡ‚Π°ΡŽΡ‚ΡΡ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ Ρ‚ΠΈΠΏΠ°ΠΌΠΈ Π΄Π°Π½Π½Ρ‹Ρ…. Но, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ строка, ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, являСтся ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΌ, Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ для ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ строки Π½Π΅ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ Π³Π»ΡƒΠ±ΠΎΠΊΠΎΠΌΡƒ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡŽ Π±Π°ΠΉΡ‚ΠΎΠ². Бкопированная строка ΠΏΠΎ-ΠΏΡ€Π΅ΠΆΠ½Π΅ΠΌΡƒ Π±ΡƒΠ΄Π΅Ρ‚ ΡΡΡ‹Π»Π°Ρ‚ΡŒΡΡ Π½Π° Ρ‚ΠΎΡ‚ ΠΆΠ΅ Ρ€Π΅Π·Π΅Ρ€Π²Π½Ρ‹ΠΉ массив.

ΠŸΠΎΠΏΡ€Π°Π²ΠΊΠ°:

Π’ GoLang Ρ‚ΠΈΠΏ Π΄Π°Π½Π½Ρ‹Ρ… struct являСтся составным Ρ‚ΠΈΠΏΠΎΠΌ Π΄Π°Π½Π½Ρ‹Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΡΠ΅Ρ‚ нСсколько ΠΏΠΎΠ»Π΅ΠΉ Ρ€Π°Π·Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ… Π² ΠΎΠ΄ΠΈΠ½ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚. struct Π½Π΅ являСтся ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ Ρ‚ΠΈΠΏΠΎΠΌ Π΄Π°Π½Π½Ρ‹Ρ…, Π° являСтся Π·Π½Π°Ρ‡ΠΈΠΌΡ‹ΠΌ Ρ‚ΠΈΠΏΠΎΠΌ Π΄Π°Π½Π½Ρ‹Ρ…, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅ struct Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΈΠ»ΠΈ присваивании Π΅Π³ΠΎ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ происходит ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π΅Π³ΠΎ ΠΏΠΎΠ»Π΅ΠΉ. Однако, ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅ struct Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°, происходит ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° Π΅Π³ΠΎ ΠΊΠΎΠΏΠΈΠΈ, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ нСэффСктивно для Π±ΠΎΠ»ΡŒΡˆΠΈΡ… struct. Π’ Ρ‚Π°ΠΊΠΈΡ… случаях ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ Π½Π° struct.

ΠŸΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° слайса ΠΊΠ°ΠΊ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ

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

package main

import "fmt"

func main() {
	cap := 4 // Ссли 3, Ρ‚ΠΎ ΠΎΡ‚Π²Π΅Ρ‚Ρ‹ Ρ€Π°Π·Π½Ρ‹Π΅; Ссли 4 - ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹Π΅
	var a = make([]int, 0, cap)
	a = append(a, 111, 222, 333)

	fmt.Printf("%#v\n", getArray(a))
	fmt.Printf("%#v\n", a)
}

func remove(slice []int, s int) []int {
	return append(slice[:s], slice[s+1:]...)
}

func getArray(a []int) []int {
	a = append(a, 444)
	a = remove(a, 0)
	return a
}

ΠžΠ±Ρ‰ΠΈΠΉ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ срСза: a[Π½Π°Ρ‡Π°Π»ΠΎ:ΠΊΠΎΠ½Π΅Ρ†:шаг]. Если Π½Π°Ρ‡Π°Π»ΠΎ Π½Π΅ ΡƒΠΊΠ°Π·Π°Π½ΠΎ, Ρ‚ΠΎ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π½Π°Ρ‡Π°Π»ΠΎ считаСтся 0. Если ΠΊΠΎΠ½Π΅Ρ† Π½Π΅ ΡƒΠΊΠ°Π·Π°Π½, Ρ‚ΠΎ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΊΠΎΠ½Π΅Ρ† считаСтся Π΄Π»ΠΈΠ½ΠΎΠΉ массива. Если шаг Π½Π΅ ΡƒΠΊΠ°Π·Π°Π½, Ρ‚ΠΎ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ шаг считаСтся Ρ€Π°Π²Π½Ρ‹ΠΌ 1.

ЭмпиричСски установлСно. Если ΠΎΡ‚Ρ€Π΅Π·Π°Ρ‚ΡŒ слайс сначала, Ρ‚ΠΎ capacity ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π΅Ρ‚ΡΡ Π΄ΠΎ Π½ΠΎΠ²ΠΎΠΉ Π΄Π»ΠΈΠ½Ρ‹, Π° Ссли с ΠΊΠΎΠ½Ρ†Π°, Ρ‚ΠΎ остаётся Ρ€Π°Π²Π΅Π½ исходному Ρ€Π°Π·ΠΌΠ΅Ρ€Ρƒ слайса. Π’Ρ€Π΅Ρ‚ΠΈΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ позволяСт ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ capacity явно (Π½ΠΎ Π½Π΅ большС исходного), ΠΈ ΠΎΠ½ Ρ‚ΠΎΠΆΠ΅ ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π΅Ρ‚ΡΡ ΠΎΡ‚ ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ, Ссли ΠΎΡ‚Ρ€Π΅Π·Π°Ρ‚ΡŒ слайс сначала.

Если append() добавляСт Π½ΠΎΠ²Ρ‹ΠΉ элСмСнт Π² слайс, Ρƒ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΏΡ€Π΅Π²Ρ‹ΡˆΠ΅Π½Π° capacity, Ρ‚ΠΎ capacity увСличиваСтся Π² Π΄Π²Π° Ρ€Π°Π·Π° ΠΎΡ‚ исходного. Но Ссли Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ Π·Π° Ρ€Π°Π· нСсколько элСмСнтов (большС Ρ‡Π΅ΠΌ Π² Π΄Π²Π° Ρ€Π°Π·Π° ΠΎΡ‚ исходного), Ρ‚ΠΎ дальшС capacity увСличиваСтся с шагом Π΄Π²Π°.

Π’ΠΈΠ΄Π΅ΠΎ: Π§Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ Π·Π½Π°Ρ‚ΡŒ ΠΎ слайсах Π² Go

Π‘ΠΎΠ»ΡŒΡˆΠ΅ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠΈ ΠΏΠΎ слайсам

package main

import (
	"fmt"
)

// Ρ‡Ρ‚ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π²Π΅Π΄Π΅Π½ΠΎ?
// Ссли Π³Π΄Π΅-Ρ‚ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠ°Π½ΠΈΠΊΠ°, Ρ‚ΠΎ Π² ΠΊΠ°ΠΊΠΎΠΉ сторкС ΠΈ ΠΏΠΎΡ‡Π΅ΠΌΡƒ?

func example1Slice() {
	var slice []int
	fmt.Printf("slice is nil %t\n", slice == nil) // true (!)
	slice2 := []int{}
	fmt.Printf("slice2 is nil %t\n", slice2 == nil) // false
	// append() ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚ Π΅ΠΌΠΊΠΎΡΡ‚ΡŒ срСза Π² Π΄Π²Π° Ρ€Π°Π·Π°:
	slice = append(slice, 1)
	fmt.Printf("slise = %+v len = %d; cap = %d;\n", slice, len(slice), cap(slice))
	// slise = [1] len = 1 cap = 1
	slice = append(slice, 2)
	fmt.Printf("slice = %+v len = %d; cap = %d;\n", slice, len(slice), cap(slice))
	// slise = [1, 2] len = 2 cap = 2
	slice = append(slice, 3)
	fmt.Printf("slice = %+v len = %d; cap = %d;\n", slice, len(slice), cap(slice))
	// slise = [1, 2, 3] len = 3 cap = 4 (!)
}

func example2Slice() {
	sl := []int{1, 2, 3, 4, 5, 6}
	sl1 := sl[:3]
	sl2 := sl[1:3:4]

	fmt.Printf("sl1 = %+v len = %d; cap = %d;\n", sl1, len(sl1), cap(sl1))
	// sl1 = [1, 2, 3] len = 3 cap = 6
	fmt.Printf("sl2 = %+v len = %d; cap = %d;\n", sl2, len(sl2), cap(sl2))
	// sl2 = [2, 3] len = 2 cap = 3

	sl2 = append(sl2, 9)
	sl1 = sl1[:4]

	fmt.Printf("sl = %+v len = %d; cap = %d;\n", sl, len(sl), cap(sl))
	// sl = [1, 2, 3, 9, 5, 6] len = 6 cap = 6
	fmt.Printf("sl1 = %+v len = %d; cap = %d;\n", sl1, len(sl1), cap(sl1))
	// sl1 = [1, 2, 3, 9] len = 4 cap = 6
	fmt.Printf("sl2 = %+v len = %d; cap = %d;\n", sl2, len(sl2), cap(sl2))
	// sl2 = [2, 3, 9] len = 3 cap = 3

	add(sl1, 8)
	fmt.Printf("sl = %+v len = %d; cap = %d;\n", sl, len(sl), cap(sl))
	// sl = [1, 2, 3, 9, 8, 6] len = 6 cap = 6
	fmt.Printf("sl1 = %+v len = %d; cap = %d;\n", sl1, len(sl1), cap(sl1))
	// sl1 = [1, 2, 3, 9] len = 4 cap = 6
	fmt.Printf("sl2 = %+v len = %d; cap = %d;\n", sl2, len(sl2), cap(sl2))
	// sl2 = [2, 3, 9] len = 3 cap = 3

	changeSlice(sl, 5, 20)
	fmt.Printf("sl = %+v len = %d; cap = %d;\n", sl, len(sl), cap(sl))
	// sl = [1, 2, 3, 9, 8, 20] len = 6 cap = 6

	sl = append(sl, 7)
	fmt.Printf("sl = %+v len = %d; cap = %d;\n", sl, len(sl), cap(sl))
	// sl = [1, 2, 3, 9, 8, 20, 7] len = 7 cap = 12

	// sl1 = sl1[:7] - panic, cap = 6
	// fmt.Printf("sl1 = %+v len = %d; cap = %d;\n", sl1, len(sl1), cap(sl1))
	// sl1 = [1, 2, 3, 9] len = 4 cap = 6
}

func example3Map() {
	var myMap map[int]int
	fmt.Printf("myMap is nil %t len = %d;\n", myMap == nil, len(myMap)) // true, len = 0
	// myMap[5] = 55 // panic
	// fmt.Printf("myMap is nil %t len = %d;\n", myMap == nil, len(myMap))

	myMap = map[int]int{}
	fmt.Printf("myMap is nil %t len = %d;\n", myMap == nil, len(myMap)) // false, len = 0
	changeMap(myMap, 6, 66)
	fmt.Printf("myMap is nil %t len = %d;\n", myMap == nil, len(myMap)) // false, len = 1
}

func changeSlice(sl []int, idx int, val int) {
	if 0 <= idx && idx < len(sl) {
		sl[idx] = val
	}
}

func changeMap(myMap map[int]int, key int, val int) {
	myMap[key] = val
}

func add(sl []int, val int) {
	sl = append(sl, val)
}

func main() {
	// example1Slice()
	// example2Slice()
	example3Map()
}

Как ΡƒΠ·Π½Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π΄Π²Π° слайса ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ ΠΎΠ΄ΠΈΠ½ Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ массив?

package main

import "unsafe"

func slicesShareMemory[T any](inner, outer []T) bool {
	if len(inner) == 0 || len(outer) == 0 {
		return false
	}

	aFirstAddr := unsafe.Pointer(&inner[0])
	bFirstAddr := unsafe.Pointer(&outer[0])
	aLastAddr := unsafe.Add(aFirstAddr, uintptr(cap(inner)-1)*unsafe.Sizeof(inner[0]))
	bLastAddr := unsafe.Add(bFirstAddr, uintptr(cap(outer)-1)*unsafe.Sizeof(outer[0]))

	switch {
	case uintptr(aFirstAddr) >= uintptr(bFirstAddr) && uintptr(aFirstAddr) <= uintptr(bLastAddr),
		uintptr(bFirstAddr) >= uintptr(aFirstAddr) && uintptr(bFirstAddr) <= uintptr(aLastAddr):
		return true
	default:
		return false
	}
}

func main() {
	a := []int{1, 2, 3}
	b := a[1:2]
	c := a[2:3]
	d := []int{1, 2, 3}
	e := append(a, 4)
	println(slicesShareMemory(b, a))
	println(slicesShareMemory(a, b))
	println(slicesShareMemory(b, c))
	println(slicesShareMemory(c, b))
	println(slicesShareMemory(a, c))
	println(slicesShareMemory(c, d))
	println(slicesShareMemory(c, e))
}

Heap

ΠšΡƒΡ‡Π° (heap) - это структура Π΄Π°Π½Π½Ρ‹Ρ…, которая упорядочиваСт элСмСнты Π² Π²ΠΈΠ΄Π΅ Π΄Π²ΠΎΠΈΡ‡Π½ΠΎΠ³ΠΎ Π΄Π΅Ρ€Π΅Π²Π°, ΠΏΡ€ΠΈ этом ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΡƒΠ·Π΅Π» ΠΈΠΌΠ΅Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π½Π΅ мСньшС (для ΠΊΡƒΡ‡ΠΈ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌΠΎΠ²) ΠΈΠ»ΠΈ Π½Π΅ большС (для ΠΊΡƒΡ‡ΠΈ максимумов) Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π΅Π³ΠΎ ΠΏΠΎΡ‚ΠΎΠΌΠΊΠΎΠ². Π’ GoLang ΠΊΡƒΡ‡Π° прСдставлСна Ρ‚ΠΈΠΏΠΎΠΌ heap.Interface, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ описываСт ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΊΡƒΡ‡Π΅ΠΉ:

// heap.go
type Interface interface {
	sort.Interface
	Push(x any) // add x as element Len()
	Pop() any   // remove and return element Len() - 1.
}
// sort.go
type Interface interface {
	// Len is the number of elements in the collection.
	Len() int

	// Less reports whether the element with index i
	// must sort before the element with index j.
	//
	// If both Less(i, j) and Less(j, i) are false,
	// then the elements at index i and j are considered equal.
	// Sort may place equal elements in any order in the final result,
	// while Stable preserves the original input order of equal elements.
	//
	// Less must describe a transitive ordering:
	//  - if both Less(i, j) and Less(j, k) are true, then Less(i, k) must be true as well.
	//  - if both Less(i, j) and Less(j, k) are false, then Less(i, k) must be false as well.
	//
	// Note that floating-point comparison (the < operator on float32 or float64 values)
	// is not a transitive ordering when not-a-number (NaN) values are involved.
	// See Float64Slice.Less for a correct implementation for floating-point values.
	Less(i, j int) bool

	// Swap swaps the elements with indexes i and j.
	Swap(i, j int)
}

На ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ΅ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ справа, ΠΊΠ°ΠΊ выглядит ΠΊΡƒΡ‡Π° ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌΠΎΠ² (i.e. "Priority Queue"), Π³Π΄Π΅ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΡƒΠ·Π΅Π» ΠΈΠΌΠ΅Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π½Π΅ мСньшС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π΅Π³ΠΎ ΠΏΠΎΡ‚ΠΎΠΌΠΊΠΎΠ². Π’ ΠΊΡƒΡ‡Π΅ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌΠΎΠ² наимСньший элСмСнт всСгда находится Π² ΠΊΠΎΡ€Π½Π΅ Π΄Π΅Ρ€Π΅Π²Π°, Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ Π΅Π³ΠΎ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΌ для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ряда Π·Π°Π΄Π°Ρ‡, Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ Π½Π°Ρ…ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ k Π½Π°ΠΈΠΌΠ΅Π½ΡŒΡˆΠΈΡ… элСмСнтов Π² спискС ΠΈΠ»ΠΈ поиск ΠΌΠ΅Π΄ΠΈΠ°Π½Ρ‹ Π² ΠΏΠΎΡ‚ΠΎΠΊΠ΅ Π΄Π°Π½Π½Ρ‹Ρ…. Для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΊΡƒΡ‡Π΅ΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ°ΠΊΠ΅Ρ‚ container/heap, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ прСдоставляСт Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΊΡƒΡ‡ΠΈ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌΠΎΠ² ΠΈ максимумов, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π½Π΅ΠΉ, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ Push(), Pop(), Fix(), Remove(), ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅.

Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Π½ΠΎΠ²ΠΎΠ³ΠΎ элСмСнта Π² ΠΊΡƒΡ‡Ρƒ выполняСтся ΠΏΡƒΡ‚Π΅ΠΌ помСщСния элСмСнта Π² послСднюю ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΡƒΡŽ ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ Π² массивС ΠΈ Π·Π°Ρ‚Π΅ΠΌ "всплытия" Π΅Π³ΠΎ Π²Π²Π΅Ρ€Ρ… ΠΏΠΎ Π΄Π΅Ρ€Π΅Π²Ρƒ, ΠΏΠΎΠΊΠ° Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π½Π°ΠΉΠ΄Π΅Π½Π° Π΅Π³ΠΎ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Π°Ρ позиция. Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ элСмСнта с наимСньшим (наибольшим) Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ выполняСтся ΠΏΡƒΡ‚Π΅ΠΌ Π·Π°ΠΌΠ΅Π½Ρ‹ Π΅Π³ΠΎ послСдним элСмСнтом Π² массивС, послС Ρ‡Π΅Π³ΠΎ ΠΎΠ½ "просСиваСтся" Π²Π½ΠΈΠ· ΠΏΠΎ Π΄Π΅Ρ€Π΅Π²Ρƒ, ΠΏΠΎΠΊΠ° Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π½Π°ΠΉΠ΄Π΅Π½Π° Π΅Π³ΠΎ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Π°Ρ позиция.

DFS/BFS

DFS (Depth-First Search) ΠΈ BFS (Breadth-First Search) - это Π΄Π²Π° Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° поиска Π² Π³Ρ€Π°Ρ„Π΅. DFS ΠΈΡ‰Π΅Ρ‚ Π² Π³Π»ΡƒΠ±ΠΈΠ½Ρƒ, пСрСходя Π½Π° ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ Π³Ρ€Π°Ρ„Π°, ΠΏΠΎΠΊΠ° Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π½Π°ΠΉΠ΄Π΅Π½ Ρ†Π΅Π»Π΅Π²ΠΎΠΉ ΡƒΠ·Π΅Π» ΠΈΠ»ΠΈ Π½Π΅ Π±ΡƒΠ΄ΡƒΡ‚ исслСдованы всС ΡƒΠ·Π»Ρ‹. BFS ΠΈΡ‰Π΅Ρ‚ Π² ΡˆΠΈΡ€ΠΈΠ½Ρƒ, посСщая всС ΡƒΠ·Π»Ρ‹ Π½Π° ΠΎΠ΄Π½ΠΎΠΌ ΡƒΡ€ΠΎΠ²Π½Π΅ ΠΏΠ΅Ρ€Π΅Π΄ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΎΠΌ ΠΊ ΡƒΠ·Π»Π°ΠΌ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ уровня. Оба Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½Ρ‹ для поиска ΠΊΡ€Π°Ρ‚Ρ‡Π°ΠΉΡˆΠ΅Π³ΠΎ ΠΏΡƒΡ‚ΠΈ Π² нСвзвСшСнном Π³Ρ€Π°Ρ„Π΅, Π½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ BFS ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ использован для этой Ρ†Π΅Π»ΠΈ Π²ΠΎ взвСшСнном Π³Ρ€Π°Ρ„Π΅.

Π’Π·Π²Π΅ΡˆΠ΅Π½Π½Ρ‹ΠΉ Π³Ρ€Π°Ρ„ - это Π³Ρ€Π°Ρ„, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ Ρ€Π΅Π±Ρ€Ρƒ присвоСно Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ числовоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΠΎΠ΅ вСсом. ВСс ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΡ‚Ρ€Π°ΠΆΠ°Ρ‚ΡŒ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, расстояниС ΠΌΠ΅ΠΆΠ΄Ρƒ двумя Π²Π΅Ρ€ΡˆΠΈΠ½Π°ΠΌΠΈ, ΡΡ‚ΠΎΠΈΠΌΠΎΡΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π° ΠΎΡ‚ ΠΎΠ΄Π½ΠΎΠΉ Π²Π΅Ρ€ΡˆΠΈΠ½Ρ‹ ΠΊ Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΈ Ρ‚.Π΄. Π’Π·Π²Π΅ΡˆΠ΅Π½Π½Ρ‹ΠΉ Π³Ρ€Π°Ρ„ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π·Π°Π΄Π°Ρ‡, связанных с ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ ΠΈ Π½Π°Ρ…ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ΠΌ ΠΊΡ€Π°Ρ‚Ρ‡Π°ΠΉΡˆΠ΅Π³ΠΎ ΠΏΡƒΡ‚ΠΈ ΠΌΠ΅ΠΆΠ΄Ρƒ Π²Π΅Ρ€ΡˆΠΈΠ½Π°ΠΌΠΈ. Для поиска ΠΊΡ€Π°Ρ‚Ρ‡Π°ΠΉΡˆΠ΅Π³ΠΎ ΠΏΡƒΡ‚ΠΈ Π² взвСшСнном Π³Ρ€Π°Ρ„Π΅ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ ДСйкстры ΠΈΠ»ΠΈ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ Π€Π»ΠΎΠΉΠ΄Π°-Π£ΠΎΡ€ΡˆΠ΅Π»Π»Π°.

Dynamic Programming

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

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

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

Π Π°Π·Π½ΠΈΡ†Π° ΠΌΠ΅ΠΆΠ΄Ρƒ динамичСским ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΈ ΠΆΠ°Π΄Π½Ρ‹ΠΌΠΈ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ°ΠΌΠΈ Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ динамичСском ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ ΠΏΠ΅Ρ€Π΅ΠΊΡ€Ρ‹Π²Π°ΡŽΡ‰ΠΈΠ΅ΡΡ ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹, ΠΈ эти ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ Ρ€Π΅ΡˆΠ°ΡŽΡ‚ΡΡ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΌΠ΅ΠΌΠΎΠΈΠ·Π°Ρ†ΠΈΠΈ. "ΠœΠ΅ΠΌΠΎΠΈΠ·Π°Ρ†ΠΈΡ" - это Ρ‚Π΅Ρ…Π½ΠΈΠΊΠ°, ΠΏΡ€ΠΈ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ для Π±ΠΎΠ»Π΅Π΅ быстрого Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ.

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

Greedy Method

Π–Π°Π΄Π½Ρ‹ΠΉ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ β€” Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ, Π·Π°ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰ΠΈΠΉΡΡ Π² принятии локально ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹Ρ… Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΌ этапС, допуская, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Ρ‚Π°ΠΊΠΆΠ΅ окаТСтся ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌ. Π’ ΠΎΠ±Ρ‰Π΅ΠΌ случаС нСльзя ΡΠΊΠ°Π·Π°Ρ‚ΡŒ, ΠΌΠΎΠΆΠ½ΠΎ Π»ΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½ΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΆΠ°Π΄Π½ΠΎΠ³ΠΎ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΊ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΉ Π·Π°Π΄Π°Ρ‡Π΅. Но Π΅ΡΡ‚ΡŒ Π΄Π²Π΅ особСнности, Ρ…Π°Ρ€Π°ΠΊΡ‚Π΅Ρ€Π½Ρ‹Π΅ для Π·Π°Π΄Π°Ρ‡, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ€Π΅ΡˆΠ°ΡŽΡ‚ΡΡ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΆΠ°Π΄Π½Ρ‹Ρ… Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ²: ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ ΠΆΠ°Π΄Π½ΠΎΠ³ΠΎ Π²Ρ‹Π±ΠΎΡ€Π° ΠΈ свойство ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ для ΠΏΠΎΠ΄Π·Π°Π΄Π°Ρ‡.

ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏ ΠΆΠ°Π΄Π½ΠΎΠ³ΠΎ Π²Ρ‹Π±ΠΎΡ€Π°

Говорят, Ρ‡Ρ‚ΠΎ ΠΊ Π·Π°Π΄Π°Ρ‡Π΅ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ ΠΆΠ°Π΄Π½ΠΎΠ³ΠΎ Π²Ρ‹Π±ΠΎΡ€Π°, Ссли ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ локально ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹Ρ… Π²Ρ‹Π±ΠΎΡ€ΠΎΠ² Π΄Π°Ρ‘Ρ‚ глобально ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½ΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅. Π’ этом состоит Π³Π»Π°Π²Π½ΠΎΠ΅ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΆΠ°Π΄Π½Ρ‹Ρ… Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ² ΠΎΡ‚ динамичСского программирования: Π²ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌ ΠΏΡ€ΠΎΡΡ‡ΠΈΡ‚Ρ‹Π²Π°ΡŽΡ‚ΡΡ сразу послСдствия всСх Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ².

Π§Ρ‚ΠΎΠ±Ρ‹ Π΄ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΆΠ°Π΄Π½Ρ‹ΠΉ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ Π΄Π°Ρ‘Ρ‚ ΠΎΠΏΡ‚ΠΈΠΌΡƒΠΌ, Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠΏΡ‹Ρ‚Π°Ρ‚ΡŒΡΡ провСсти Π΄ΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒΡΡ‚Π²ΠΎ, Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎΠ΅ Π΄ΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒΡΡ‚Π²Ρƒ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° Π·Π°Π΄Π°Ρ‡ΠΈ ΠΎ Π²Ρ‹Π±ΠΎΡ€Π΅ заявок. Π‘Π½Π°Ρ‡Π°Π»Π° ΠΌΡ‹ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ ΠΆΠ°Π΄Π½Ρ‹ΠΉ Π²Ρ‹Π±ΠΎΡ€ Π½Π° ΠΏΠ΅Ρ€Π²ΠΎΠΌ шагС Π½Π΅ Π·Π°ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ ΠΏΡƒΡ‚ΡŒ ΠΊ ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½ΠΎΠΌΡƒ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡŽ: для любого Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π΅ΡΡ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΎΠ΅, согласованноС с ΠΆΠ°Π΄Π½Ρ‹ΠΌ Π²Ρ‹Π±ΠΎΡ€ΠΎΠΌ ΠΈ Π½Π΅ Ρ…ΡƒΠΆΠ΅ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ. ΠŸΠΎΡ‚ΠΎΠΌ ΠΌΡ‹ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ΄Π·Π°Π΄Π°Ρ‡Π°, возникшая послС ΠΆΠ°Π΄Π½ΠΎΠ³ΠΎ Π²Ρ‹Π±ΠΎΡ€Π° Π½Π° ΠΏΠ΅Ρ€Π²ΠΎΠΌ шагС, Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Π° исходной. По ΠΈΠ½Π΄ΡƒΠΊΡ†ΠΈΠΈ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ такая ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΆΠ°Π΄Π½Ρ‹Ρ… Π²Ρ‹Π±ΠΎΡ€ΠΎΠ² Π΄Π°Ρ‘Ρ‚ ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½ΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅.

ΠžΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ для ΠΏΠΎΠ΄Π·Π°Π΄Π°Ρ‡

Π­Ρ‚ΠΎ свойство Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½ΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ всСй Π·Π°Π΄Π°Ρ‡ΠΈ содСрТит Π² сСбС ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹Π΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΏΠΎΠ΄Π·Π°Π΄Π°Ρ‡.

Π₯востовая рСкурсия

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

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

func factorialHelper(n int, acc int) int {
	if n == 0 {
		return acc
	}
	return factorialHelper(n-1, n*acc)
}

func factorial(n int) int {
	return factorialHelper(n, 1)
}

Π­Ρ‚Π° рСализация ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ factorialHelper, которая Π±Π΅Ρ€Π΅Ρ‚ Π΄Π²Π° Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°: n - число, Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΠ°Π» ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ, ΠΈ acc - аккумулятор, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ вычислСния. Ѐункция factorial Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ factorialHelper с Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ аккумулятора Ρ€Π°Π²Π½Ρ‹ΠΌ 1. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° factorialHelper Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ саму сСбя, ΠΎΠ½Π° ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‘Ρ‚ Π² качСствС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² n-1 ΠΈ n*acc. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, рСкурсия прСвращаСтся Π² Ρ†ΠΈΠΊΠ», ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ, ΠΊΠΎΠ³Π΄Π° n Ρ€Π°Π²Π½ΠΎ 0. Π­Ρ‚ΠΎ позволяСт ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ пСрСполнСния стСка ΠΈ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π±ΠΎΠ»Π΅Π΅ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ.

Π₯востовая рСкурсия Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ использована Π² Ρ‚Π΅Ρ… случаях, ΠΊΠΎΠ³Π΄Π° Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ вычислСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ зависит ΠΎΡ‚ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° всСх Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠ΅ рСкурсии, Π° Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΡ‚ послСднСго Π²Ρ‹Π·ΠΎΠ²Π°. НапримСр, рассмотрим ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ Ρ€Π΅ΠΊΡƒΡ€ΡΠΈΠ²Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ для вычислСния чисСл Π€ΠΈΠ±ΠΎΠ½Π°Ρ‡Ρ‡ΠΈ:

func fibonacci(n int) int {
	if n == 0 {
		return 0
	} else if n == 1 {
		return 1
	} else {
		return fibonacci(n-1) + fibonacci(n-2)
	}
}

Π—Π΄Π΅ΡΡŒ для вычислСния n-Π³ΠΎ числа Π€ΠΈΠ±ΠΎΠ½Π°Ρ‡Ρ‡ΠΈ функция Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ сСбя Π΄Π²Π° Ρ€Π°Π·Π° - для вычислСния (n-1)-Π³ΠΎ ΠΈ (n-2)-Π³ΠΎ чисСл. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌ для вычислСния ΠΈΡ‚ΠΎΠ³ΠΎΠ²ΠΎΠ³ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°. Π’ этом случаС, хвостовая рСкурсия Π½Π΅ примСняСтся, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΏΡ€ΠΈ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ хвостовой рСкурсии сохраняСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ послСдний Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π° Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΡ… Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² Ρ‚Π΅Ρ€ΡΡŽΡ‚ΡΡ. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ, для вычислСния чисСл Π€ΠΈΠ±ΠΎΠ½Π°Ρ‡Ρ‡ΠΈ, трСбуСтся ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±Ρ‹Ρ‡Π½ΡƒΡŽ Ρ€Π΅ΠΊΡƒΡ€ΡΠΈΡŽ.

ΠŸΡ€ΠΎ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° O(n)

Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° это Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Π°, которая измСряСт количСство инструкций процСссора Π·Π°Ρ‚Ρ€Π°Ρ‡Π΅Π½Π½ΠΎΠ΅ Π½Π° Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ°.

Если Π΅ΡΡ‚ΡŒ Ρ†ΠΈΠΊΠ» ΠΏΡ€ΠΎΠ±Π΅Π³Π°ΡŽΡ‰ΠΈΠΉ ΠΏΠΎ всСм элСмСнтам массива ΠΈΠ· n элСмСнтов, Ρ‚ΠΎ это Π·Π½Π°Ρ‡ΠΈΡ‚ Ρ‡Ρ‚ΠΎ процСссору потрСбуСтся Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ n инструкций, ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π±ΡƒΠ΄Π΅Ρ‚ O(n).

ΠŸΡ€ΠΈ ΠΎΡ†Π΅Π½ΠΊΠ΅ слоТности всСгда считаСтся Ρ…ΡƒΠ΄ΡˆΠΈΠΉ случай, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ, Ссли ΠΌΡ‹ Π²Ρ‹Ρ…ΠΎΠ΄ΠΈΠΌ ΠΈΠ· Ρ†ΠΈΠΊΠ»Π° ΠΏΡ€ΠΈ Π½Π°Ρ…ΠΎΠΆΠ΄Π΅Π½ΠΈΠΈ ΠΎΡ‚Π²Π΅Ρ‚Π° Ρ€Π°Π½ΡŒΡˆΠ΅, Ρ‚ΠΎ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ всё Ρ€Π°Π²Π½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ O(n), Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π² Ρ…ΡƒΠ΄ΡˆΠ΅ΠΌ случаС ΠΎΡ‚Π²Π΅Ρ‚ Π±ΡƒΠ΄Π΅Ρ‚ Π² послСднСм ​элСмСнтС массива.

Из этого слСдуСт Ρ‡Ρ‚ΠΎ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° с двумя Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΌΠΈ Ρ†ΠΈΠΊΠ»Π°ΠΌΠΈ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ΠΈΡ‡Π½Π°, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ O(n^2) ΠΈ Ρ‚.Π΄.

Если Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ выполняСтся Π·Π° строго ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½ΠΎΠ΅ количСство инструкций (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΊ элСмСнту массива ΠΏΠΎ индСксу), Ρ‚ΠΎ такая ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ называСтся константной O(1).

β€‹Π•ΡΡ‚ΡŒ Π΅Ρ‰Ρ‘ Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΠ°Π»ΡŒΠ½Π°Ρ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ O(n!) такая ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠ»ΠΎΡ…Π°, ΠΈ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹ Π²ΠΎΠΎΠ±Ρ‰Π΅ Π½Π΅ эффСктивны. Π’Π°ΠΊΠΆΠ΅ ΠΊΠ°ΠΊ ΠΈ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ O(2^n). ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Ρ‚Π°ΠΊΠΎΠ³ΠΎ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° - рСкурсивноС вычислСниС чисСл Π€ΠΈΠ±Π±Π°Π½Π°Ρ‡ΠΈ (Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ Π±Π΅Π· ΠΌΠ΅ΠΌΠΎΠΈΠ·Π°Ρ†ΠΈΠΈ).

Π—Π°ΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅: O(n^2) Π½Π΅ Ρ€Π°Π²Π½ΠΎ O(2^n). ВрСмСнная ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ O(n^2) ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ врСмя выполнСния Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° увСличиваСтся ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ΠΈΡ‡Π½ΠΎ с ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠ΅ΠΌ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…, Ρ‚ΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ O(2^n) ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ΡΠΊΡΠΏΠΎΠ½Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½ΡƒΡŽ Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ, ΠΏΡ€ΠΈ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ врСмя выполнСния Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° увСличиваСтся ΡΠΊΡΠΏΠΎΠ½Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ с ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠ΅ΠΌ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ….

Π‘Ρ‚ΠΎΠΈΡ‚ ΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ΡŒΡΡ, Ссли нас просят ΠΎΡ†Π΅Π½ΠΈΡ‚ΡŒ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ добавлСния элСмСнта Π² массив, Ρ‚ΠΎ Ρ‚ΡƒΡ‚ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ O(1*), Ρ‚Π°ΠΊ называСмая амортизированная ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ. Π’ΠΎ Π΅ΡΡ‚ΡŒ добавляСм элСмСнт всСгда Π·Π° O(1), Π½ΠΎ ΠΊΠΎΠ³Π΄Π° Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π·Π°ΠΏΡ€ΠΎΡΠΈΡ‚ΡŒ Π½ΠΎΠ²ΡƒΡŽ ΠΏΠ°ΠΌΡΡ‚ΡŒ для элСмСнта ΠΏΡ€ΠΈ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠΈ создастся Π½ΠΎΠ²Ρ‹ΠΉ массив ΠΈ Ρ‚ΡƒΠ΄Π° всё скопируСтся. Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π±ΡƒΠ΄Π΅Ρ‚ O(n).

ПояснСния: O – ΠΎΡ†Π΅Π½ΠΊΠ° для Ρ…ΡƒΠ΄ΡˆΠ΅Π³ΠΎ случая, Ξ© – ΠΎΡ†Π΅Π½ΠΊΠ° для Π»ΡƒΡ‡ΡˆΠ΅Π³ΠΎ случая, Θ – ΠΎΡ†Π΅Π½ΠΊΠ° для срСднСго случая.

ΠŸΡ€ΠΎ O(log n)

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

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

Однако, Π½Π΅ всС Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹ ΠΌΠΎΠ³ΡƒΡ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с O(log n) ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒΡŽ. НапримСр, сортировка ΠΏΡƒΠ·Ρ‹Ρ€ΡŒΠΊΠΎΠΌ ΠΈΠΌΠ΅Π΅Ρ‚ O(n^2) ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ врСмя выполнСния Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° увСличиваСтся ΠΏΡ€ΠΎΠΏΠΎΡ€Ρ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Ρƒ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π²Π°ΠΆΠ½ΠΎ Π²Ρ‹Π±ΠΈΡ€Π°Ρ‚ΡŒ подходящий Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ Π² зависимости ΠΎΡ‚ Π·Π°Π΄Π°Ρ‡ΠΈ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ.

ΠŸΡ€ΠΎ O(n log n)

O(n * log(n)) ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ врСмя выполнСния Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° увСличиваСтся Π² логарифмичСской ΠΏΡ€ΠΎΠΏΠΎΡ€Ρ†ΠΈΠΈ с ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠ΅ΠΌ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…. Π­Ρ‚ΠΎ врСмСнная ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ, которая являСтся Π±ΠΎΠ»Π΅Π΅ быстрой, Ρ‡Π΅ΠΌ квадратичная O(n^2), Π½ΠΎ ΠΌΠ΅Π΄Π»Π΅Π½Π½Π΅Π΅, Ρ‡Π΅ΠΌ линСйная O(n) ΠΈΠ»ΠΈ константная O(1). Алгоритмы с Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒΡŽ O(n log n) часто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π² сортировкС Π΄Π°Π½Π½Ρ‹Ρ…, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, быстрой сортировкС (quicksort) ΠΈΠ»ΠΈ сортировкС слияниСм (merge sort).

КниТки ΠΏΡ€ΠΎ Алгоритмы

Для изучСния ΠΎΡ†Π΅Π½ΠΊΠΈ слоТности Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° ΠΏΠΎ "time complexity" & "space complexity" ΠΌΠΎΠΆΠ½ΠΎ Π½Π°Ρ‡Π°Ρ‚ΡŒ с ΠΊΠ½ΠΈΠ³ΠΈ "Introduction to Algorithms" Π°Π²Ρ‚ΠΎΡ€ΠΎΠ² ΠšΠΎΡ€ΠΌΠ΅Π½Π°, ЛСйзСрсона, РивСста ΠΈ Π¨Ρ‚Π°ΠΉΠ½Π°. Π­Ρ‚ΠΎ общСпризнанная ΠΊΠ½ΠΈΠ³Π° ΠΏΠΎ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ°ΠΌ, которая ΠΏΠΎΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ Π±Π°Π·ΠΎΠ²Ρ‹Π΅ алгоритмичСскиС ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΈ, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ ΠΎΡ†Π΅Π½ΠΊΡƒ Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΈ пространствСнной слоТности. Книга Ρ‚Π°ΠΊΠΆΠ΅ содСрТит мноТСство ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ² ΠΈ Π·Π°Π΄Π°Ρ‡ для практичСского примСнСния.

Или ΠΆΠ΅ ΠΊΠ½ΠΈΠΆΠΊΠ° "Π“Ρ€ΠΎΠΊΠ°Π΅ΠΌ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹".

Или Π΅Ρ‰Ρ‘ ΠžΡΠ½ΠΎΠ²Ρ‹ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ² - ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ² ΠΎΡ‚ Yandex

Из YouTube: Π’Π‘Π― Π‘Π›ΠžΠ–ΠΠžΠ‘Π’Π¬ ΠΠ›Π“ΠžΠ Π˜Π’ΠœΠžΠ’ ЗА 11 МИНУВ

Π”Π΅Π²ΡΡ‚ΡŒ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ»ΠΈ Π±ΡƒΠ΄ΡƒΡ‰Π΅Π΅ | Π”ΠΆΠΎΠ½ ΠœΠ°ΠΊΠΊΠΎΡ€ΠΌΠΈΠΊ

/article - алгоритмичСскиС Π·Π°Π΄Π°Ρ‡ΠΈ

Π—Π°Π΄Π°Ρ‡Π° A. Камни ΠΈ ΡƒΠΊΡ€Π°ΡˆΠ΅Π½ΠΈΡ

Π”Π°Π½Ρ‹ Π΄Π²Π΅ строки строчных латинских символов: строка J ΠΈ строка S. Π‘ΠΈΠΌΠ²ΠΎΠ»Ρ‹, входящиС Π² строку J, β€” «драгоцСнности», входящиС Π² строку S β€” Β«ΠΊΠ°ΠΌΠ½ΠΈΒ». НуТно ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ, ΠΊΠ°ΠΊΠΎΠ΅ количСство символов ΠΈΠ· S ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΡΠ²Π»ΡΡŽΡ‚ΡΡ «драгоцСнностями». ΠŸΡ€ΠΎΡ‰Π΅ говоря, Π½ΡƒΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, ΠΊΠ°ΠΊΠΎΠ΅ количСство символов ΠΈΠ· S Π²Ρ…ΠΎΠ΄ΠΈΡ‚ Π² J.

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

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

Π—Π°Π΄Π°Ρ‡Π° B. ΠŸΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΈΠ΄ΡƒΡ‰ΠΈΠ΅ Π΅Π΄ΠΈΠ½ΠΈΡ†Ρ‹

ВрСбуСтся Π½Π°ΠΉΡ‚ΠΈ Π² Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠΌ Π²Π΅ΠΊΡ‚ΠΎΡ€Π΅ ΡΠ°ΠΌΡƒΡŽ Π΄Π»ΠΈΠ½Π½ΡƒΡŽ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Π΅Π΄ΠΈΠ½ΠΈΡ† ΠΈ вывСсти Π΅Ρ‘ Π΄Π»ΠΈΠ½Ρƒ.

Алгоритм Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ: ΠΏΡ€ΠΎΠΉΡ‚ΠΈΡΡŒ ΠΏΠΎ всСм элСмСнтам массива; встрСтив Π΅Π΄ΠΈΠ½ΠΈΡ†Ρƒ, Π½ΡƒΠΆΠ½ΠΎ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ счётчик Π΄Π»ΠΈΠ½Ρ‹ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ, Π°, встрСтив ноль, Π½ΡƒΠΆΠ½ΠΎ ΠΎΠ±Π½ΡƒΠ»ΠΈΡ‚ΡŒ этот счётчик. Π’ ΠΊΠΎΠ½Ρ†Π΅ Π½ΡƒΠΆΠ½ΠΎ вывСсти максимальноС ΠΈΠ· Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π» счётчик.

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚Π΅ ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡŽ, ΠΊΠΎΠ³Π΄Π° массив заканчиваСтся Π½Π° ΠΈΡΠΊΠΎΠΌΡƒΡŽ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Π΅Π΄ΠΈΠ½ΠΈΡ†. ΠŸΡ€ΠΈ Π°ΠΊΠΊΡƒΡ€Π°Ρ‚Π½ΠΎΠΉ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ такая ситуация Π½Π΅ ΠΏΠΎΡ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΉ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ.

ΠŸΠΎΡΡ‚Π°Ρ€Π°ΠΉΡ‚Π΅ΡΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ лишь константный ΠΎΠ±ΡŠΡ‘ΠΌ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ памяти.

Π—Π°Π΄Π°Ρ‡Π° C. Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ Π΄ΡƒΠ±Π»ΠΈΠΊΠ°Ρ‚ΠΎΠ²

Π”Π°Π½ упорядочСнный ΠΏΠΎ Π½Π΅ΡƒΠ±Ρ‹Π²Π°Π½ΠΈΡŽ массив Ρ†Π΅Π»Ρ‹Ρ… 32-разрядных чисСл. ВрСбуСтся ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ ΠΈΠ· Π½Π΅Π³ΠΎ всС повторСния.

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

ΠŸΡ€ΠΈ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΈ этой Π·Π°Π΄Π°Ρ‡ΠΈ Ρ‚Π°ΠΊΠΆΠ΅ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΏΠ°ΠΌΡΡ‚ΡŒ.

Π—Π°Π΄Π°Ρ‡Π° D. ГСнСрация скобочных ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚Π΅ΠΉ

Π”Π°Π½ΠΎ Ρ†Π΅Π»ΠΎΠ΅ число n. ВрСбуСтся вывСсти всС ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹Π΅ скобочныС ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Π΄Π»ΠΈΠ½Ρ‹ 2 * n, упорядочСнныС лСксикографичСски (см. https://ru.wikipedia.org/wiki/ЛСксикографичСский_порядок). Π’ Π·Π°Π΄Π°Ρ‡Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊΡ€ΡƒΠ³Π»Ρ‹Π΅ скобки.

Π­Ρ‚ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ слоТной алгоритмичСской Π·Π°Π΄Π°Ρ‡ΠΈ. Π‘ΡƒΠ΄Π΅ΠΌ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΌΡƒ символу; Π² ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΊ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΏΡ€ΠΈΠΏΠΈΡΠ°Ρ‚ΡŒ Π»ΠΈΠ±ΠΎ ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°ΡŽΡ‰ΡƒΡŽ скобку, Π»ΠΈΠ±ΠΎ Π·Π°ΠΊΡ€Ρ‹Π²Π°ΡŽΡ‰ΡƒΡŽ. ΠžΡ‚ΠΊΡ€Ρ‹Π²Π°ΡŽΡ‰ΡƒΡŽ скобку ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠΏΠΈΡΠ°Ρ‚ΡŒ, Ссли Π΄ΠΎ этого Π±Ρ‹Π»ΠΎ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΎ ΠΌΠ΅Π½Π΅Π΅ n ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°ΡŽΡ‰ΠΈΡ… скобок, Π° Π·Π°ΠΊΡ€Ρ‹Π²Π°ΡŽΡ‰ΡƒΡŽ β€” Ссли Π² Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ количСство ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°ΡŽΡ‰ΠΈΡ… скобок прСвосходит количСство Π·Π°ΠΊΡ€Ρ‹Π²Π°ΡŽΡ‰ΠΈΡ…. Π’Π°ΠΊΠΎΠΉ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ ΠΏΡ€ΠΈ Π°ΠΊΠΊΡƒΡ€Π°Ρ‚Π½ΠΎΠΉ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ автоматичСски Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ лСксикографичСский порядок Π² ΠΎΡ‚Π²Π΅Ρ‚Π΅; Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π·Π° врСмя, ΠΏΡ€ΠΎΠΏΠΎΡ€Ρ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠ΅ ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΡŽ количСства элСмСнтов Π² ΠΎΡ‚Π²Π΅Ρ‚Π΅ Π½Π° n; ΠΏΡ€ΠΈ этом Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠ΅ количСство Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ памяти.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠΌ нСэффСктивного Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° Π±Ρ‹Π» Π±Ρ‹ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ: сгСнСрируСм всС Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ скобочныС ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ, Π° Π·Π°Ρ‚Π΅ΠΌ Π²Ρ‹Π²Π΅Π΄Π΅ΠΌ лишь Ρ‚Π΅ ΠΈΠ· Π½ΠΈΡ…, Ρ‡Ρ‚ΠΎ окаТутся ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΌΠΈ. ΠŸΡ€ΠΈ этом ΠΎΠ±ΡŠΡ‘ΠΌ ΠΎΡ‚Π²Π΅Ρ‚Π° Π½Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ Π·Π°Π΄Π°Ρ‡Ρƒ быстрСС, Ρ‡Π΅ΠΌ Ρ‚ΠΎΡ‚ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Ρ‚ Π²Ρ‹ΡˆΠ΅.

Π—Π°Π΄Π°Ρ‡Π° E. Анаграммы

Π­Ρ‚Π° достаточно простая Π·Π°Π΄Π°Ρ‡Π° β€” Ρ‚ΠΈΠΏΠΈΡ‡Π½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π·Π°Π΄Π°Ρ‡ΠΈ, для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ассоциативныС массивы. ΠŸΡ€ΠΈ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΈ Π½ΡƒΠΆΠ½ΠΎ ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ символы ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡΡ‚ΡŒΡΡ, поэтому Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π½Π΅ мноТСства, Π° словари. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ: составим ΠΈΠ· ΠΊΠ°ΠΆΠ΄ΠΎΠΉ строки ΠΏΠΎ ΡΠ»ΠΎΠ²Π°Ρ€ΡŽ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ символа Π±ΡƒΠ΄Π΅Ρ‚ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ количСство Π΅Π³ΠΎ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π΅Π½ΠΈΠΉ; Π·Π°Ρ‚Π΅ΠΌ сравним ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ²ΡˆΠΈΠ΅ΡΡ словари. Если ΠΎΠ½ΠΈ ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡŽΡ‚, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ вывСсти Π΅Π΄ΠΈΠ½ΠΈΡ†Ρƒ, Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС β€” ноль.

ΠΠ»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½ΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅: отсортируСм Π²Ρ…ΠΎΠ΄Π½Ρ‹Π΅ строки, Π° Π·Π°Ρ‚Π΅ΠΌ сравним ΠΈΡ…. Π­Ρ‚ΠΎ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Ρ…ΡƒΠΆΠ΅ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΌΠ΅Π΄Π»Π΅Π½Π½Π΅Π΅, Π° Ρ‚Π°ΠΊΠΆΠ΅ мСняСт Π²Ρ…ΠΎΠ΄Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅. Π—Π°Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ памяти.

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

Π—Π°Π΄Π°Ρ‡Π° F. БлияниС k сортированных списков

Π”Π°Π½Ρ‹ k отсортированных Π² порядкС нСубывания массивов Π½Π΅ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Ρ†Π΅Π»Ρ‹Ρ… чисСл, ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π½Π΅ прСвосходит 100. ВрСбуСтся ΠΏΠΎΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΈΡ… слияния: отсортированный Π² порядкС нСубывания массив, содСрТащий всС элСмСнты исходных k массивов. Π”Π»ΠΈΠ½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ массива Π½Π΅ прСвосходит 10 * k.

Для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ массива создадим ΠΏΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŽ; ΠΈΠ·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ располоТСн Π² Π½Π°Ρ‡Π°Π»Π΅ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ массива. Π­Π»Π΅ΠΌΠ΅Π½Ρ‚Ρ‹, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ позициям ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ, помСстим Π² Π»ΡŽΠ±ΡƒΡŽ структуру Π΄Π°Π½Π½Ρ‹Ρ…, которая ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΠΈΠ·Π²Π»Π΅Ρ‡Π΅Π½ΠΈΠ΅ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌΠ° β€” это ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΌΡƒΠ»ΡŒΡ‚ΠΈΠΌΠ½ΠΎΠΆΠ΅ΡΡ‚Π²ΠΎ ΠΈΠ»ΠΈ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΊΡƒΡ‡Π°. Π”Π°Π»Π΅Π΅ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΠ·Π²Π»Π΅ΠΊΠ°Ρ‚ΡŒ ΠΈΠ· этой структуры ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ элСмСнт, ΠΏΠΎΠΌΠ΅Ρ‰Π°Ρ‚ΡŒ Π΅Π³ΠΎ Π² ΠΎΡ‚Π²Π΅Ρ‚, ΡΠ΄Π²ΠΈΠ³Π°Ρ‚ΡŒ ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ указатСля Π² ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΌ массивС ΠΈ ΠΏΠΎΠΌΠ΅Ρ‰Π°Ρ‚ΡŒ Π² структуру Π΄Π°Π½Π½Ρ‹Ρ… ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎΠΉ элСмСнт ΠΈΠ· этого массива.

Π’ этой Π·Π°Π΄Π°Ρ‡Π΅ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ ΠΈΡΠΏΡ‹Ρ‚Ρ‹Π²Π°ΡŽΡ‚ слоТности с Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΎΠΌ Π²Π²ΠΎΠ΄Π°. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΏΠ΅Ρ€Π²Ρ‹Π΅ элСмСнты строк Π½Π΅ ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ элСмСнты массивов, ΠΎΠ½ΠΈ ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ Π΄Π»ΠΈΠ½Ρ‹ массивов!

Answer #1:

Π’ Π΄Π°Π½Π½ΠΎΠΌ ΠΊΠΎΠ΄Π΅ ΠΌΡ‹ создаСм структуру Item, которая содСрТит Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ элСмСнта, Π½ΠΎΠΌΠ΅Ρ€ массива, ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π±Ρ‹Π» взят элСмСнт, ΠΈ индСкс элСмСнта Π² массивС. Π—Π°Ρ‚Π΅ΠΌ ΠΌΡ‹ создаСм ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π½ΡƒΡŽ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ PriorityQueue Π½Π° основС этой структуры, которая Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для извлСчСния минимального элСмСнта.

Π”Π°Π»Π΅Π΅ ΠΌΡ‹ создаСм ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ Π½Π° Π½Π°Ρ‡Π°Π»ΠΎ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ массива ΠΈ добавляСм ΠΏΠ΅Ρ€Π²Ρ‹Π΅ элСмСнты ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ массива Π² ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π½ΡƒΡŽ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ. Π—Π°Ρ‚Π΅ΠΌ ΠΌΡ‹ Π½Π°Ρ‡ΠΈΠ½Π°Π΅ΠΌ ΠΈΠ·Π²Π»Π΅ΠΊΠ°Ρ‚ΡŒ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹Π΅ элСмСнты ΠΈΠ· ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ, добавляя ΠΈΡ… Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ массив ΠΈ сдвигая ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ массив. Если ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π΅ достиг ΠΊΠΎΠ½Ρ†Π° массива, ΠΌΡ‹ добавляСм ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ элСмСнт ΠΈΠ· этого массива Π² ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π½ΡƒΡŽ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ.

Π’ ΠΈΡ‚ΠΎΠ³Π΅ ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ отсортированный Π² порядкС нСубывания массив, содСрТащий всС элСмСнты исходных k массивов. Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π²Ρ‹ΡˆΠ΅ ΠΌΡ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅ΠΌ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ mergeArrays Ρ‚Ρ€ΠΈ отсортированных массива ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ отсортированный массив [0 0 3 5 6 6 7 28].

Answer #2:

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

Π’Π°ΠΊΠΆΠ΅ ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ append для добавлСния элСмСнтов Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ массив, вмСсто явного указания индСкса. Π­Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ ΠΊΠΎΠ΄ Π±ΠΎΠ»Π΅Π΅ Ρ‡ΠΈΡ‚Π°Π΅ΠΌΡ‹ΠΌ ΠΈ Π»Π°ΠΊΠΎΠ½ΠΈΡ‡Π½Ρ‹ΠΌ.

Π’ ΠΈΡ‚ΠΎΠ³Π΅ ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ Ρ‚ΠΎΡ‚ ΠΆΠ΅ отсортированный Π² порядкС нСубывания массив, содСрТащий всС элСмСнты исходных k массивов.

Answer #3:

Π­Ρ‚ΠΎΡ‚ ΠΊΠΎΠ΄ считываСт количСство массивов k, Π·Π°Ρ‚Π΅ΠΌ считываСт ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ массив ΠΈ Π΅Π³ΠΎ элСмСнты, сливаСт массивы Π² ΠΎΠ΄ΠΈΠ½ отсортированный массив ΠΈ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ Π΅Π³ΠΎ элСмСнты. Для слияния массивов ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΊΡƒΡ‡Π°, которая ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΠΈΠ·Π²Π»Π΅Ρ‡Π΅Π½ΠΈΠ΅ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌΠ° ΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ элСмСнтов. Код Ρ‚Π°ΠΊΠΆΠ΅ содСрТит Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ для построСния ΠΊΡƒΡ‡ΠΈ ΠΈ поддСрТания Π΅Π΅ свойств.

/leetcode (ΠΎΡ‚Π²Π΅Ρ‚Ρ‹)

linked lists:

binary search:

hash table:

queue/stack:

dfs/bfs:

sort:

heap/hash:

two pointers:

sliding window:

tree:

greedy problems:

Π£ΡΠΏΠ΅Π²Π°Π΅ΠΌΠΎΡΡ‚ΡŒ

performance Π˜Ρ‚ΠΎΠ³ΠΎ 835 ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΠΎΠ² Π·Π°Π΄Π°Ρ‡, ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ ΠΏΠΎ 20 Ρ€Π°Π· ΠΊΠ°ΠΆΠ΄ΡƒΡŽ. πŸ€“ Ρ‚Ρ‹Π½Ρ†


About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 2

  •  
  •  

Languages