Skip to content

Yaroslav-Lahtachev/mp2-lab4

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

30 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

РСализация ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π½ΠΎΠΉ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ Π½Π° основС d-ΠΊΡƒΡ‡ΠΈ ΠΈ Π΅Π΅ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ для построСния остовного Π΄Π΅Ρ€Π΅Π²Π° Π³Ρ€Π°Ρ„Π° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° ΠšΡ€Π°ΡΠΊΠ°Π»Π°.


Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΠ΅

ΠŸΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΊΠ° Π·Π°Π΄Π°Ρ‡ΠΈ

ЦСль Π΄Π°Π½Π½ΠΎΠΉ Π»Π°Π±ΠΎΡ€Π°Ρ‚ΠΎΡ€Π½ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹ β€” ΠΈΠ·ΡƒΡ‡Π΅Π½ΠΈΠ΅ структур Π΄Π°Π½Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠ° "d-ΠΊΡƒΡ‡Π°" ΠΈ Ρ€Π°Π·Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ мноТСства.

  1. ΠΠ°ΠΏΠΈΡΠ°Ρ‚ΡŒ Ρ‚Π΅ΡΡ‚ΠΈΡ€ΡƒΡŽΡ‰ΡƒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ структуры Π΄Π°Π½Π½Ρ‹Ρ… с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Google C++ Testing Framework.
  2. Π’ качСствС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π½ΠΎΠΉ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ, Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ ΠšΡ€Π°ΡΠΊΠ°Π»Π°. Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, Π΄Π΅ΠΌΠΎΠ½ΡΡ‚Ρ€ΠΈΡ€ΡƒΡŽΡ‰Π΅Π΅ Ρ€Π°Π±ΠΎΡ‚Ρƒ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ°, Π³Π΄Π΅ Π²Ρ…ΠΎΠ΄Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ β€” количСство Π²Π΅Ρ€ΡˆΠΈΠ½ ΠΈ Ρ€Π΅Π±Π΅Ρ€ ΠΈ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ масс Ρ€Π΅Π±Π΅Ρ€, Π° Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ β€” Π³Ρ€Π°Ρ„ с Ρ€Π°ΡΠΊΡ€Π°ΡˆΠ΅Π½Π½Ρ‹ΠΌ остовным Π΄Π΅Ρ€Π΅Π²ΠΎΠΌ.
  3. ΠΠ°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΊΠΎΠ½ΡΠΎΠ»ΡŒΠ½Ρ‹Π΅ прилоТСния для дСмонстрации Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° ДСйкстра ΠΈ ΠŸΠΈΡ€Π°ΠΌΠΈΠ΄Π°Π»ΡŒΠ½ΠΎΠΉ сортировки.

Руководство ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ

###Запуск прилоТСния ΠΈ Π²Π²ΠΎΠ΄ Π΄Π°Π½Π½Ρ‹Ρ…###

Данная ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π° для построСния Π³Ρ€Π°Ρ„Π° ΠΈ нахоТдСния минимального остовного Π΄Π΅Ρ€Π΅Π²Π° Π½Π° основС Π΄Π°Π½Π½Ρ‹Ρ…, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹Ρ… ΠΎΡ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ.

Для запуска ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Ρ„Π°ΠΉΠ» view_graph.exe ΠΈ Π΄Π°Π»Π΅Π΅ Π²Π²ΠΎΠ΄ΠΈΡ‚ΡŒ Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΡ‹Π΅ значСния.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€

Π’Π²Π΅Π΄ΠΈΡ‚Π΅ Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΡ‹Π΅ числСнныС значСния Π² ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ Ρ„ΠΎΡ€ΠΌΡ‹. И Π½Π°ΠΆΠΌΠΈΡ‚Π΅ ΠΊΠ½ΠΎΠΏΠΊΡƒ "create random" .

start

ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ сгСнСрированный Π³Ρ€Π°Ρ„ Π½Π° основС Π²Π²Π΅Π΄Π΅Π½Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ….

start

Π”Π°Π»Π΅Π΅ Π²Ρ‹Π±Π΅Ρ€Π΅Ρ‚Π΅ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Π΄Π²ΡƒΡ… Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ²: пошаговоС построСниС остовного Π΄Π΅Ρ€Π΅Π²Π° ΠΈΠ»ΠΈ построСниС этого Π΄Π΅Ρ€Π΅Π²Π° Π² ΠΎΠ΄Π½ΠΎ Π½Π°ΠΆΠ°Ρ‚ΠΈΠ΅ ΠΊΠ½ΠΎΠΏΠ°Ρ‡ΠΊΠΈ.

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρ‹ "step by step":

start

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρ‹ "find spanning tree":

start

Кнопка "cancel" отмСняСт всС дСйствия ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½Π½Ρ‹Π΅ с Π³Ρ€Π°Ρ„ΠΎΠΌ.

Кнопка "delete img" удаляСт ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅ΠΌΡ‹ΠΉ Π³Ρ€Π°Ρ„.

Руководство программиста

###Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ инструмСнты###

Π’ Ρ…ΠΎΠ΄Π΅ Π»Π°Π±ΠΎΡ€Π°Ρ‚ΠΎΡ€Π½ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹ использовались ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ инструмСнты:

  • Π€Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊ для написания автоматичСских тСстов Google Test.
  • Π‘Ρ€Π΅Π΄Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Microsoft Visual Studio 2015.

###ΠžΠ±Ρ‰Π°Ρ структура ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°###

Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°:

  • gtest β€” Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Google Test.
  • img β€” дирСктория с изобраТСниями, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… Π² ΠΎΡ‚Ρ‡Π΅Ρ‚Π΅ ΠΊ Π»Π°Π±ΠΎΡ€Π°Ρ‚ΠΎΡ€Π½ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Π΅.
  • include β€” дирСктория для размСщСния Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ².
  • samples β€” дирСктория для размСщСния тСстового прилоТСния.
  • sln β€” дирСктория с Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ ΠΈ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ² для Visual Studio 2015.
  • src β€” дирСктория для размСщСния исходных ΠΊΠΎΠ΄ΠΎΠ² (cpp-Ρ„Π°ΠΉΠ»Ρ‹).
  • test β€” дирСктория с ΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½Ρ‹ΠΌΠΈ тСстами ΠΈ основным тСстовым ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ, ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΌ запуск тСстов.
  • README.md β€” ΠΎΡ‚Ρ‡Π΅Ρ‚ ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Π½ΠΎΠΉ Π»Π°Π±ΠΎΡ€Π°Ρ‚ΠΎΡ€Π½ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Π΅.

Π‘Π»ΡƒΠΆΠ΅Π±Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹:

  • .gitignore β€” ΠΏΠ΅Ρ€Π΅Ρ‡Π΅Π½ΡŒ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠΉ Ρ„Π°ΠΉΠ»ΠΎΠ², ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΡƒΠ΅ΠΌΡ‹Ρ… Git ΠΏΡ€ΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ² Π² Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ.

ОписаниС структуры ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° состоит ΠΈΠ· 7 ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ²:

  • d-tree-lib β€” статичСская Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°, которая содСрТит объявлСниС ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ классов Data, Tree.
    • Data β€” класс, ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‰ΠΈΠΉ вСса(ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Ρ‹) ΡƒΠ·Π»ΠΎΠ².
    • Tree β€” класс, содСрТащий Π±Π°Π·ΠΎΠ²Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΠ΅ с d-ΠΊΡƒΡ‡Π°ΠΌΠΈ.
  • queue β€” статичСская Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°, содСрТащая Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π½ΠΎΠΉ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ Π½Π° основС d-Π°Ρ€Π½ΠΎΠ³ΠΎ Π΄Π΅Ρ€Π΅Π²Π°.
    • Queue β€” класс, ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π½ΡƒΡŽ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ, содСрТит 5 Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ².
    • QueueHeap β€” класс, наслСдник Queue, содСрТит Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ 5-ΠΈ унаслСдованных ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ².
  • graph β€” статичСская Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°, которая содСрТит объявлСниС ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ классов Graph ΠΈ Edges.
    • Graph β€” класс, ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‰ΠΈΠΉ ΡΡƒΡ‰Π½ΠΎΡΡ‚ΡŒ Π³Ρ€Π°Ρ„ ΠΈ содСрТащий 14 ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ².
    • Edges β€” класс, ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‰ΠΈΠΉ ΡΡƒΡ‰Π½ΠΎΡΡ‚ΡŒ Ρ€Π΅Π±Ρ€ΠΎ.
  • sep-set β€” статичСская Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°, которая содСрТит объявлСниС ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ класса separatedSet.
    • separatedSet β€” класс, ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‰ΠΈΠΉ Ρ€Π°Π·Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ мноТСства.
  • Dijkstra β€” статичСская Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°, содСрТащая объявлСниС ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ классов Dijkstra ΠΈ DijkstraData.
    • Dijkstra β€” класс, содСрТащий Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ ДСйкстра.
    • DijkstraData β€” класс-наслСдник Data.
  • Kruskl β€” статичСская Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°, содСрТащая объявлСниС ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ классов Kruskl ΠΈ KrusklEdges.
    • Kruskl β€” класс, содСрТащий Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ ΠšΡ€Π°ΡΠΊΠ°Π»Π°.
    • KrusklEdges β€” класс-наслСдник Data.
  • HeapSort β€” статичСская Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°, содСрТащая объявлСниС ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ классов HeapSort ΠΈ DataHeap.
    • HeapSort β€” класс, содСрТащий ΠœΠ΅Ρ‚ΠΎΠ΄ ΠΏΠΈΡ€Π°ΠΌΠΈΠ΄Π°Π»ΡŒΠ½ΠΎΠΉ сортировки.
    • DataHeap β€” класс-наслСдник Data.
  • sample-Dijkstra β€” консольноС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, Π΄Π΅ΠΌΠΎΠ½ΡΡ‚Ρ€ΠΈΡ€ΡƒΡŽΡ‰Π΅Π΅ Ρ€Π°Π±ΠΎΡ‚Ρƒ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° ДСйкстры.
  • sample-Kruskl β€” консольноС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, Π΄Π΅ΠΌΠΎΠ½ΡΡ‚Ρ€ΠΈΡ€ΡƒΡŽΡ‰Π΅Π΅ Ρ€Π°Π±ΠΎΡ‚Ρƒ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° ΠšΡ€Π°ΡΠΊΠ°Π»Π°.
  • sample-heapsort β€” консольноС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, Π΄Π΅ΠΌΠΎΠ½ΡΡ‚Ρ€ΠΈΡ€ΡƒΡŽΡ‰Π΅Π΅ Ρ€Π°Π±ΠΎΡ‚Ρƒ ΠΏΠΈΡ€Π°ΠΌΠΈΠ΄Π°Π»ΡŒΠ½ΠΎΠΉ сортировки.
  • view_graph β€” Windows Forms ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅.
  • gtest β€” Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊ Google Test.
  • test β€” консольноС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰Π΅Π΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ Google Test, ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡŽΡ‰Π΅Π΅ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΡΡ‚ΡŒ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ всСх классов. Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠΈΡ‚ 78 тСстов.

###ОписаниС структур Π΄Π°Π½Π½Ρ‹Ρ…###

####Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° Π΄Π°Π½Π½Ρ‹Ρ… "d-арная ΠΊΡƒΡ‡Π°"####

Π—Π°Π²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎΠ΅ d-Π°Ρ€Π½ΠΎΠ΅ Π΄Π΅Ρ€Π΅Π²ΠΎ – ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠ΅ Π΄Π΅Ρ€Π΅Π²ΠΎ, Ρƒ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡƒΠ·Π»Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ, Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ, Π±Ρ‹Ρ‚ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚, ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΡƒΠ·Π»Π°, Ρ€ΠΎΠ²Π½ΠΎ d ΠΏΠΎΡ‚ΠΎΠΌΠΊΠΎΠ². ΠŸΡ€ΠΈ этом Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ нумСрация ΡƒΠ·Π»ΠΎΠ²:

  1. ΠšΠΎΡ€Π΅Π½ΡŒ ΠΈΠΌΠ΅Π΅Ρ‚ Π½ΠΎΠΌΠ΅Ρ€ 0.
  2. Если ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ ΡƒΠ·Π΅Π» ΠΈΠΌΠ΅Π΅Ρ‚ Π½ΠΎΠΌΠ΅Ρ€ i, Ρ‚ΠΎ ΠΎΠ½ ΠΈΠΌΠ΅Π΅Ρ‚ ΠΏΠΎΡ‚ΠΎΠΌΠΊΠΎΠ² с Π½ΠΎΠΌΠ΅Ρ€Π°ΠΌΠΈ id + 1,id + 2, ... , id + d.

Π’ Ρ‚Π°ΠΊΠΎΠΌ случаС ΡƒΠ·Π΅Π» с Π½ΠΎΠΌΠ΅Ρ€ΠΎΠΌ i ΠΈΠΌΠ΅Π΅Ρ‚ ΠΏΡ€Π΅Π΄ΠΊΠ° (i-1)/d.

Если ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ ΡƒΠ·Π»Ρƒ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎΠ³ΠΎ d-Π°Ρ€Π½ΠΎΠ³ΠΎ Π΄Π΅Ρ€Π΅Π²Π° ΠΏΡ€ΠΈΠΏΠΈΡΠ°Ρ‚ΡŒ элСмСнт ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π½ΠΎΠΉ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ вСс ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡƒΠ·Π»Π° Π½Π΅ прСвосходил вСсов элСмСнтов, находящихся Π² Π΅Π³ΠΎ ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ°Ρ…, Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π΄Π΅Ρ€Π΅Π²ΠΎ называСтся d-ΠΊΡƒΡ‡Π΅ΠΉ.

Π‘Π°Π·ΠΎΠ²Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π½Π°Π΄ d-ΠΊΡƒΡ‡Π°ΠΌΠΈ (транспонированиС, всплытиС, ΠΏΠΎΠ³Ρ€ΡƒΠΆΠ΅Π½ΠΈΠ΅) ΠΈ ΠΈΡ… Ρ‚Ρ€ΡƒΠ΄ΠΎΠ΅ΠΌΠΊΠΎΡΡ‚ΡŒ

Π‘ΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ d-ΠΊΡƒΡ‡Ρƒ ΠΌΠΎΠΆΠ½ΠΎ Π² ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΌ массивС (сначала ΠΊΠΎΡ€Π΅Π½ΡŒ, ΠΏΠΎΡ‚ΠΎΠΌ έ€ Π΅Π³ΠΎ ΠΏΠΎΡ‚ΠΎΠΌΠΊΠΎΠ², Π·Π°Ρ‚Π΅ΠΌ έ€ ΠΏΠΎΡ‚ΠΎΠΌΠΊΠΎΠ² ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ° корня ΠΈ Ρ‚.Π΄), Π½ΠΎ с Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠΉ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ это Π½Π΅ совсСм ΡƒΠ΄ΠΎΠ±Π½ΠΎ, Ρ‚.ΠΊ. ΠΏΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ с ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π½Ρ‹ΠΌΠΈ очСрСдями ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΏΠ΅Ρ€Π΅ΠΏΠ°ΠΊΠΎΠ²ΠΊΠ° элСмСнтов.

Π‘Π½Π°Ρ‡Π°Π»Π° рассмотрим Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±Π°Π·ΠΎΠ²Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π½Π°Π΄ ΡƒΠ·Π»Π°ΠΌΠΈ d-ΠΊΡƒΡ‡ΠΈ:

  • ВранспонированиС ΡƒΠ·Π»ΠΎΠ² с Π½ΠΎΠΌΠ΅Ρ€Π°ΠΌΠΈ i ΠΈ jέ†
	tmp = key[i];
	key[i] = key[j];
	key[j] = tmp;
  • ВсплытиС ΡƒΠ·Π»Π° с Π½ΠΎΠΌΠ΅Ρ€ΠΎΠΌ έ…. Данная опСрация, ΠΊΠ°ΠΊ ΠΈ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для установлСния порядка Π² d-ΠΊΡƒΡ‡Π΅. ΠžΡΡƒΡ‰Π΅ΡΡ‚Π²Π»ΡΠ΅ΠΌ транспонированиС ΠΏΡ€Π΅Π΄ΠΊΠ° ΠΈ ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ° Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎΠΉ ΠΏΡ€Π΅Π΄ΠΎΠΊ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ ΠΊΠ»ΡŽΡ‡, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ мСньшС ΠΊΠ»ΡŽΡ‡Π° Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ°.
while (i > 0){
	P = (i - 1) / d;
	if (key[p] > key[i])
	{
		ВранспонированиС(i, p);
		i = p;
	}
	else
	{
		break;
	}
}
  • ΠŸΠΎΠ³Ρ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ ΡƒΠ·Π»Π° с Π½ΠΎΠΌΠ΅Ρ€ΠΎΠΌ έ…. ΠŸΠΎΠ³Ρ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ выполняСтся Π² сторону ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ° с наимСньшим ΠΊΠ»ΡŽΡ‡ΠΎΠΌ.
c = minchild(i);
while (c != -1 && key[c] < key[i]){
	ВранспонированиС(c, i);
	i = c;
	c = minchild(i);
}
minchild(i)
{
	if (id + 1 > n) return -1;
	else
	{
		firstChild = id + 1;
		lastChild = min{id + d, n};
		minKey = key[firstChild];
		minChild = firstChild;
		for (int i = firstChild; i < lastChild; i++)
			if (key[i] < minKey)
			{
				minKey = key[i];
				minChild = i;
			}
		return minChild;
	}
}

ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΡ ΠΈΠ·ΡŠΡΡ‚ΠΈΡ элСмСнта с ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌ ΠΊΠ»ΡŽΡ‡ΠΎΠΌ (вСсом)

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

  1. Π£Π±ΠΈΠ²Π°Π΅ΠΌ ΡƒΠ·Π΅Π» с ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌ Π½ΠΎΠΌΠ΅Ρ€ΠΎΠΌ.
  2. ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°Π΅ΠΌ этот ΡƒΠ·Π΅Π» Π² ΠΊΠΎΡ€Π΅Π½ΡŒ.
  3. ВыполняСм ΠΏΠΎΠ³Ρ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠ³ΠΎ ΡƒΠ·Π»Π°.
key[0] = key[n - 1];
n--;
ΠŸΠΎΠ³Ρ€ΡƒΠΆΠ΅Π½ΠΈΠ΅(0);

ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΡ окучивания

Данная опСрация позволяСт ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΠ· Π½Π°Π±ΠΎΡ€Π° ΠΊΠ»ΡŽΡ‡Π΅ΠΉ d-ΠΊΡƒΡ‡Ρƒ. ΠšΡƒΡ‡Π΅ΠΎΠ±Ρ€Π°Π·Π½ΠΎΡΡ‚ΡŒ согласно ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΡŽ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ вСса ΠΏΠΎΡ‚ΠΎΠΌΠΊΠΎΠ² ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡƒΠ·Π»Π° большС вСса этого ΡƒΠ·Π»Π°. ΠžΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ΡΡ, Ρ‡Ρ‚ΠΎ Ссли Π΄Π΅Ρ€Π΅Π²ΡŒΡ с корнями, ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠΌΠΈ Π½ΠΎΠΌΠ΅Ρ€Π° n βˆ’ 1, n βˆ’ 2, ... , n - i ΠΎΠΊΡƒΡ‡Π΅Π½Ρ‹, примСняя ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ погруТСния для ΡƒΠ·Π»Π° n βˆ’ i βˆ’ 1, Π΄Π΅Ρ€Π΅Π²ΠΎ с ΠΊΠΎΡ€Π½Π΅ΠΌ n βˆ’ i βˆ’ 1 Ρ‚ΠΎΠΆΠ΅ оказываСтся ΠΎΠΊΡƒΡ‡Π΅Π½Π½Ρ‹ΠΌ.

for (int i = n – 1; i >= 0; i--){
	ΠŸΠΎΠ³Ρ€ΡƒΠΆΠ΅Π½ΠΈΠ΅(i);
}

####Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° Π΄Π°Π½Π½Ρ‹Ρ… "Π‘ΠŸΠ”"####

Π‘ΠΈΠ½Π°Ρ€Π½ΠΎΠ΅ поисковоС Π΄Π΅Ρ€Π΅Π²ΠΎ – Ρ‚Π°ΠΊΠΎΠ΅ Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠ΅ Π΄Π΅Ρ€Π΅Π²ΠΎ, ΡƒΠ·Π»Π°ΠΌ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ приписаны элСмСнты взвСшСнного мноТСства Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎ выполняСтся ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ условиС: start Ρ‚.Π΅. для любого ΡƒΠ·Π»Π° справСдливо ΡƒΡ‚Π²Π΅Ρ€ΠΆΠ΄Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π΅Π³ΠΎ Π»Π΅Π²ΠΎΠ΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€Π΅Π²ΠΎ содСрТит элСмСнты с мСньшими ΠΊΠ»ΡŽΡ‡Π°ΠΌΠΈ, Π° ΠΏΡ€Π°Π²ΠΎΠ΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€Π΅Π²ΠΎ – с большими ΠΊΠ»ΡŽΡ‡Π°ΠΌΠΈ.

ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, псСвдокод ΠΈ ΠΈΡ… Ρ‚Ρ€ΡƒΠ΄ΠΎΠ΅ΠΌΠΊΠΎΡΡ‚ΡŒ

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

  • Π£ΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Π»Π΅Π²ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ°.
  • Π£ΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΠΏΡ€Π°Π²ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ°.
  • ΠšΠ»ΡŽΡ‡ ΡƒΠ·Π»Π°.
  • Π˜Π½Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΠ²Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅.

ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ с Π±ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΌ поисковым Π΄Π΅Ρ€Π΅Π²ΠΎΠΌ

  • Поиск элСмСнта с Π·Π°Π΄Π°Π½Π½Ρ‹ΠΌ ΠΊΠ»ΡŽΡ‡ΠΎΠΌ. ЀактичСски рСализуСтся ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ Π±ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΉ поиск ΠΏΠΎ ΠΏΠΎΠ΄Π΄Π΅Ρ€Π΅Π²ΡŒΡΠΌ. // рСкусивная ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π°
Node* search(Node *root, int key){
	if (root == NULL) return NULL;
	if (root->key == key) return root;
	if (key < root->key) return search(root->left, key);
	else return search(root->right, key);
}

// итСративная ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π°

Node* search(Node* root, int key){
	Node *curr = root;
	while (curr != NULL && curr->key != key);
	{
		if (key < curr->key) curr = curr->left;
		else curr = curr->right;
	}
	return curr;
}
  • Поиск элСмСнта с ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌ ΠΊΠ»ΡŽΡ‡ΠΎΠΌ. ΠŸΡ€ΠΎΡ…ΠΎΠ΄ ΠΏΠΎ ΠΊΡ€Π°ΠΉΠ½Π΅ΠΉ ΠΏΡ€Π°Π²ΠΎΠΉ Π²Π΅Ρ‚Π²ΠΈ Π΄Π΅Ρ€Π΅Π²Π° Π΄ΠΎ ΠΊΠΎΠ½Ρ†Π°.
Node* searchMax(Node* root){
	Node* curr = root;
	while (curr->right != NULL)
	{
		curr = curr->right;
	}
	return curr;
}
  • Поиск элСмСнта с ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌ ΠΊΠ»ΡŽΡ‡ΠΎΠΌ. ΠŸΡ€ΠΎΡ…ΠΎΠ΄ ΠΏΠΎ ΠΊΡ€Π°ΠΉΠ½Π΅ΠΉ Π»Π΅Π²ΠΎΠΉ Π²Π΅Ρ‚Π²ΠΈ Π΄Π΅Ρ€Π΅Π²Π° Π΄ΠΎ ΠΊΠΎΠ½Ρ†Π°.
Node* searchMin(Node* root){
	Node* curr = root;
	while (curr->left != NULL)
	{
		curr = curr->left;	
	}
	return curr;
}
  • Поиск элСмСнта со ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΊΠ»ΡŽΡ‡ΠΎΠΌ. Если элСмСнт, для ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ осущСствляСтся поиск ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ, ΠΈΠΌΠ΅Π΅Ρ‚ ΠΏΡ€Π°Π²ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ°, Ρ‚ΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ Π±ΡƒΠ΄Π΅Ρ‚ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ элСмСнт ΠΏΡ€Π°Π²ΠΎΠ³ΠΎ ΠΏΠΎΠ΄Π΄Π΅Ρ€Π΅Π²Π°. Если ΠΆΠ΅ ΠΎΠ½ Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ ΠΏΡ€Π°Π²ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ°, Ρ‚ΠΎ ΠΈΡ‰Π΅ΠΌ ΡƒΠ·Π΅Π», ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ являСтся Π»Π΅Π²Ρ‹ΠΌ сыном для родитСля рассматриваСмого элСмСнта.
Node* searchNext(Node* curr){
	Node *res = NULL;
	if (curr->right != NULL)
	{
		res = searchMin(curr);
		return res;
	}
	res = curr->parent;
	Node *tmp = curr;
	while (res != NULL && tmp == res->right)
	{
		tmp = res;
		res = res->parent;
	}
	return res;
}
  • Поиск элСмСнта с ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠΌ ΠΊΠ»ΡŽΡ‡ΠΎΠΌ. Если элСмСнт, для ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ осущСствляСтся поиск ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π³ΠΎ, ΠΈΠΌΠ΅Π΅Ρ‚ Π»Π΅Π²ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ°, Ρ‚ΠΎ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠΌ Π±ΡƒΠ΄Π΅Ρ‚ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ элСмСнт Π»Π΅Π²ΠΎΠ³ΠΎ ΠΏΠΎΠ΄Π΄Π΅Ρ€Π΅Π²Π°. Если ΠΆΠ΅ ΠΎΠ½ Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ Π»Π΅Π²ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ°, Ρ‚ΠΎ ΠΈΡ‰Π΅ΠΌ ΡƒΠ·Π΅Π», ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ являСтся ΠΏΡ€Π°Π²Ρ‹ΠΌ сыном для родитСля рассматриваСмого элСмСнта.
Node* searchPrev(Node* curr){
	Node *res = NULL;
	if (curr->left != NULL)
	{
		res = searchMax(curr);
		return res;
	}
	res = curr->parent;
	Node *tmp = curr;
	while (res != NULL && tmp == res->left)
	{
		tmp = res;
		res = res->parent;
	}
	return res;
}
  • Вставка Π½ΠΎΠ²ΠΎΠ³ΠΎ элСмСнта со своим ΠΊΠ»ΡŽΡ‡ΠΎΠΌ. ΠŸΡƒΡΡ‚ΡŒ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π²ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π² нСпустоС Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠ΅ поисковоС Π΄Π΅Ρ€Π΅Π²ΠΎ ΡƒΠ·Π΅Π» с ΠΊΠ»ΡŽΡ‡ΠΎΠΌ key ΠΈ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΠ²Π½ΠΎΠΉ Ρ‡Π°ΡΡ‚ΡŒΡŽ data. Π˜Π·Π²Π΅ΡΡ‚Π½ΠΎ, Ρ‡Ρ‚ΠΎ Ρ‚ΠΎΠ³Π΄Π° Π² Π΄Π΅Ρ€Π΅Π²Π΅ всСгда Π½Π°ΠΉΠ΄Π΅Ρ‚cя ΡƒΠ·Π΅Π» Y, Ρ‚Π°ΠΊΠΎΠΉ, Ссли Y->key>key, Ρ‚ΠΎ Ρƒ ΡƒΠ·Π»Π° Y Π½Π΅Ρ‚ Π»Π΅Π²ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ°, Ссли ΠΆΠ΅ Y->key<key, Ρ‚ΠΎ Ρƒ ΡƒΠ·Π»Π° Y Π½Π΅Ρ‚ ΠΏΡ€Π°Π²ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ°.
void insert(Node **root, Node *node){
	if (*root == NULL)
	{
		*root = node;
		return;
	}
	Node *x = *root, *y;
	while (x != NULL)
	{
		y = x;
		if (node->key < x->key) x = x->left;
		else x = x->right;
	}
	node->parent = y;
	if (node->key < y->key) y->left = node;
	else y->right = node;
}
  • Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ элСмСнта. Данная опСрация являСтся самой слоТной с алгоритмичСской Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния, Ρ‚.ΠΊ. ΠΏΡ€ΠΈ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠΈ ΡƒΠ·Π»Π° Π΄Π΅Ρ€Π΅Π²ΠΎ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΎΡΡ‚Π°Ρ‚ΡŒΡΡ поисковым. ΠŸΡƒΡΡ‚ΡŒ z - ΡƒΠ·Π΅Π», ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ. Рассмотрим 3 случая:
  1. Π£Π·Π΅Π» z являСтся листом, Ρ‚.Π΅. Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ ΠΏΠΎΡ‚ΠΎΠΌΠΊΠΎΠ². Π’ΠΎΠ³Π΄Π° ΠΏΡ€ΠΈ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠΈ ΡƒΠ·Π»Π° достаточно Ρƒ родитСля ΠΎΠ±Π½ΡƒΠ»ΠΈΡ‚ΡŒ ссылку Π½Π° этого ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ°.
  2. Π£Π·Π΅Π» z ΠΈΠΌΠ΅Π΅Ρ‚ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ° (Рис. 1). Π’ этом случаС достаточно ΠΏΠ΅Ρ€Π΅ΠΊΠΈΠ½ΡƒΡ‚ΡŒ ΠΏΡ€Π°Π²ΡƒΡŽ ΠΈΠ»ΠΈ Π»Π΅Π²ΡƒΡŽ ссылку Π² зависимости ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊΠΎΠΉ Ρ€Π΅Π±Π΅Π½ΠΎΠΊ.
  3. Π£Π·Π΅Π» z ΠΈΠΌΠ΅Π΅Ρ‚ Π΄Π²ΡƒΡ… ΠΏΠΎΡ‚ΠΎΠΌΠΊΠΎΠ² (ΠΎΠ±Ρ‰ΠΈΠΉ случай). Рассмотрим ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρƒ удалСния ΡƒΠ·Π»Π° с двумя ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ°ΠΌΠΈ Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π΄Π΅Ρ€Π΅Π²Π°, ΠΏΠΎΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ Π½Π° Рис. 2:
    1. ΠžΠΏΡ€Π΅Π΄Π΅Π»ΡΠ΅ΠΌ ΡƒΠ·Π΅Π» Y ,ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΠΌΠ΅Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠ»ΡŽΡ‡ Π·Π° удаляСмым.
    2. ΠŸΠΎΠΌΠ΅Ρ‰Π°Π΅ΠΌ ΡƒΠ·Π΅Π» Y Π½Π° мСсто ΡƒΠ·Π»Π° z.
    3. ΠŸΠΎΡ‚ΠΎΠΌΠΊΠ° ΡƒΠ·Π»Π° Y Π΄Π΅Π»Π°Π΅ΠΌ ΠΏΠΎΡ‚ΠΎΠΌΠΊΠΎΠΌ Π΅Π³ΠΎ старого родитСля (пунктирная стрСлка). НСобходимо ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΡƒΠ·Π΅Π» Y Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ Π»Π΅Π²ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ° Π² соотвСтствии с Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠΌ поиска ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ ΡƒΠ·Π»Π°. Π£ Π½Π΅Π³ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€Π°Π²Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΌΠΎΠΊ.

start

Рис.1. Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ ΡƒΠ·Π»Π° с ΠΎΠ΄Π½ΠΈΠΌ ΠΏΠΎΡ‚ΠΎΠΌΠΊΠΎΠΌ.

start

Рис.2. Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ ΡƒΠ·Π»Π° с двумя ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ°ΠΌΠΈ (синий ΡƒΠ·Π΅Π» – ΡƒΠ·Π΅Π», ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ удаляСм).
void remove(Node *z){
	Node *y = NULL, *x = NULL;
	if (z->left != NULL && z->right != NULL)
	{
		y = searchNext(z); // 3d case
	}
	else
	{
		y = z; // 1st and 2d cases
	}
	if (y->left != NULL)
	{
		x = y->left;
	}
	else
	{
		x = y->right;
	}
	if (x != NULL) x->parent = y->parent;
	if (y->parent != NULL)
	{
		if (y == y->parent->left) y->parent->left = x;
		else y->parent->right = x;
	}
	if (y != z)
	{
		z->key = y->key;
		delete z->data;
		z->data = y->data;
	}
}

####Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° Π΄Π°Π½Π½Ρ‹Ρ… "АВЛ-Π΄Π΅Ρ€Π΅Π²ΡŒΡ"####

ПоисковоС Π΄Π΅Ρ€Π΅Π²ΠΎ называСтся АВЛ-сбалансированным, Ссли для любого ΡƒΠ·Π»Π° высоты Π΅Π³ΠΎ ΠΏΡ€Π°Π²ΠΎΠ³ΠΎ ΠΈ Π»Π΅Π²ΠΎΠ³ΠΎ ΠΏΠΎΠ΄Π΄Π΅Ρ€Π΅Π²ΡŒΠ΅Π² ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ Π½Π΅ Π±ΠΎΠ»Π΅Π΅ Ρ‡Π΅ΠΌ Π½Π° Π΅Π΄ΠΈΠ½ΠΈΡ†Ρƒ. АВЛ-ΡΠ±Π°Π»Π°Π½ΡΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΡΡ‚ΡŒ Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠ³ΠΎ Π΄Π΅Ρ€Π΅Π²Π° ΠΏΡ€ΠΈ вставкС ΠΈ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠΈ ΡƒΠ·Π»ΠΎΠ² поддСрТиваСтся посрСдством ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ Π»Π΅Π²ΠΎΠ³ΠΎ ΠΈ ΠΏΡ€Π°Π²ΠΎΠ³ΠΎ Π²Ρ€Π°Ρ‰Π΅Π½ΠΈΠΉ (Рис. 3.). Рассмотрим Π΄Π²Π΅ ситуации вставки элСмСнта Π² Π»Π΅Π²ΠΎΠ΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€Π΅Π²ΠΎ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ приводят ΠΊ ΠΏΡ€Π°Π²ΠΎΠΌΡƒ Π²Ρ€Π°Ρ‰Π΅Π½ΠΈΡŽ:

  1. ΠžΠ΄Π½ΠΎΠΊΡ€Π°Ρ‚Π½Ρ‹ΠΉ ΠΏΡ€Π°Π²Ρ‹ΠΉ ΠΏΠΎΠ²ΠΎΡ€ΠΎΡ‚ (Рис. 4.). Вакая опСрация выполняСтся, ΠΊΠΎΠ³Π΄Π° Π² Π»Π΅Π²ΠΎΠ΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€Π΅Π²ΠΎ Π»Π΅Π²ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ° добавляСтся ΡƒΠ·Π΅Π», Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Ρ‡Π΅Π³ΠΎ Π½Π°Ρ€ΡƒΡˆΠ°Π΅Ρ‚ΡΡ балансировка. ΠŸΡ€ΠΈ этом ΠΊΠΎΡ€Π΅Π½ΡŒ Π»Π΅Π²ΠΎΠ³ΠΎ ΠΏΠΎΠ΄Π΄Π΅Ρ€Π΅Π²Π° становится ΠΊΠΎΡ€Π½Π΅ΠΌ всСго Π΄Π΅Ρ€Π΅Π²Π°, Π° Π΅Π³ΠΎ ΠΏΡ€Π°Π²ΠΎΠ΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€Π΅Π²ΠΎ становится Π»Π΅Π²Ρ‹ΠΌ ΠΏΠΎΠ΄Π΄Π΅Ρ€Π΅Π²ΠΎΠΌ Β«Π±Ρ‹Π²ΡˆΠ΅Π³ΠΎΒ» ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠ³ΠΎ ΡƒΠ·Π»Π°.

  2. Π”Π²ΡƒΠΊΡ€Π°Ρ‚Π½Ρ‹ΠΉ ΠΏΡ€Π°Π²Ρ‹ΠΉ ΠΏΠΎΠ²ΠΎΡ€ΠΎΡ‚ (Рис. 10). Π”Π²ΡƒΠΊΡ€Π°Ρ‚Π½Ρ‹ΠΉ ΠΏΠΎΠ²ΠΎΡ€ΠΎΡ‚ выполняСтся, Ссли Π² ΠΏΡ€Π°Π²ΠΎΠ΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€Π΅Π²ΠΎ Π»Π΅Π²ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ° добавляСтся ΡƒΠ·Π΅Π» ΠΈ, ΠΊΠ°ΠΊ слСдствиС, Π΄Π΅Ρ€Π΅Π²ΠΎ становится разбалансированным. Π’Π°ΠΊΠΎΠΉ ΠΏΠΎΠ²ΠΎΡ€ΠΎΡ‚ осущСствляСтся Π² нСсколько шагов:

    1. ΠžΠΏΡ€Π΅Π΄Π΅Π»ΡΠ΅Ρ‚ΡΡ ΡƒΠ·Π΅Π» Π’, ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Π·Π° ΠΊΠΎΡ€Π½Π΅ΠΌ Π»Π΅Π²ΠΎΠ³ΠΎ ΠΏΠΎΠ΄Π΄Π΅Ρ€Π΅Π²Π° А.
    2. Π£Π·Π΅Π» Π’ становится ΠΊΠΎΡ€Π½Π΅ΠΌ Π΄Π΅Ρ€Π΅Π²Π°.
    3. Π›Π΅Π²ΠΎΠ΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€Π΅Π²ΠΎ Π’2 ΡƒΠ·Π»Π° Π’ становится ΠΏΡ€Π°Π²Ρ‹ΠΌ ΠΏΠΎΠ΄Π΄Π΅Ρ€Π΅Π²ΠΎΠΌ ΡƒΠ·Π»Π° А.
    4. ΠŸΡ€Π°Π²ΠΎΠ΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€Π΅Π²ΠΎ Π’3 ΡƒΠ·Π»Π° Π’ становится Π»Π΅Π²Ρ‹ΠΌ ΠΏΠΎΠ΄Π΄Π΅Ρ€Π΅Π²ΠΎΠΌ ΡƒΠ·Π»Π° Π‘.

start

Рис.3. ΠžΠ΄Π½ΠΎΠΊΡ€Π°Ρ‚Π½Ρ‹ΠΉ ΠΏΡ€Π°Π²Ρ‹ΠΉ ΠΏΠΎΠ²ΠΎΡ€ΠΎΡ‚. start

Рис.4. Π”Π²ΡƒΠΊΡ€Π°Ρ‚Π½Ρ‹ΠΉ ΠΏΡ€Π°Π²Ρ‹ΠΉ ΠΏΠΎΠ²ΠΎΡ€ΠΎΡ‚.

Для ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ вставки Π² ΠΏΡ€Π°Π²ΠΎΠ΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€Π΅Π²ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ Π΄Π΅Ρ€Π΅Π²ΡŒΡ, Π·Π΅Ρ€ΠΊΠ°Π»ΡŒΠ½ΠΎ ΠΎΡ‚Ρ€Π°ΠΆΠ΅Π½Π½Ρ‹Π΅ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠ³ΠΎ ΡƒΠ·Π»Π°, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚ ΠΊ нСобходимости Π»Π΅Π²ΠΎΠ³ΠΎ вращСния.

ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΡ удалСния ΡƒΠ·Π»Π° ΠΈΠ· ΠΏΡ€Π°Π²ΠΎΠ³ΠΎ ΠΏΠΎΠ΄Π΄Π΅Ρ€Π΅Π²Π° ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ ΠΎΠ±Ρ€Π°Ρ‚Π½Ρ‹ΠΌ ситуациям Π»Π΅Π²ΠΎΠ³ΠΎ вращСния, Ссли Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ ΠΏΡ€Π°Π²Ρ‹ΠΉ Π³Ρ€Π°Ρ„, ΠΏΠΎΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΉ Π½Π° Рис. 3 ΠΈ Рис. 4, с Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния удалСния ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· Π·Π°ΠΊΡ€Π°ΡˆΠ΅Π½Π½Ρ‹Ρ… ΡƒΠ·Π»ΠΎΠ².

Алгоритм добавлСния элСмСнта Π² АВЛ-сбалансированноС Π΄Π΅Ρ€Π΅Π²ΠΎ

Π”Π°Π½ΠΎ: Π΄Π΅Ρ€Π΅Π²ΠΎ Π’ ΠΈ ΠΏΠ°Ρ€Π° (K,V). Π—Π°Π΄Π°Ρ‡Π°: Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΏΠ°Ρ€Ρƒ (K, V) Π² Π΄Π΅Ρ€Π΅Π²ΠΎ Π’.

Алгоритм:

  1. Если Π΄Π΅Ρ€Π΅Π²ΠΎ пусто, Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π΅Π³ΠΎ Π½Π° Π΄Π΅Ρ€Π΅Π²ΠΎ с ΠΎΠ΄Π½ΠΈΠΌ ΠΊΠΎΡ€Π½Π΅Π²Ρ‹ΠΌ ΡƒΠ·Π»ΠΎΠΌ ((K,V),null, null) ΠΈ ΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒΡΡ.
  2. Π˜Π½Π°Ρ‡Π΅ ΡΡ€Π°Π²Π½ΠΈΡ‚ΡŒ K с ΠΊΠ»ΡŽΡ‡ΠΎΠΌ ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠ³ΠΎ ΡƒΠ·Π»Π° X. a. Если K>=X, рСкурсивно Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ (K,V) Π² ΠΏΡ€Π°Π²ΠΎΠ΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€Π΅Π²ΠΎ Π’. b. Если K<X, рСкурсивно Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ (K,V) Π² Π»Π΅Π²ΠΎΠ΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€Π΅Π²ΠΎ Π’.

Алгоритм удалСния ΡƒΠ·Π»Π° ΠΈΠ· АВЛ-сбалансированного Π΄Π΅Ρ€Π΅Π²Π°

Π”Π°Π½ΠΎ: Π΄Π΅Ρ€Π΅Π²ΠΎ Π’ с ΠΊΠΎΡ€Π½Π΅ΠΌ root ΠΈ ΠΊΠ»ΡŽΡ‡ΠΎΠΌ K. Π—Π°Π΄Π°Ρ‡Π°: ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ ΠΈΠ· Π΄Π΅Ρ€Π΅Π²Π° Π’ ΡƒΠ·Π΅Π» с ΠΊΠ»ΡŽΡ‡ΠΎΠΌ K (Ссли Ρ‚Π°ΠΊΠΎΠΉ Π΅ΡΡ‚ΡŒ).

Алгоритм:

  1. Если Π΄Π΅Ρ€Π΅Π²ΠΎ T пусто, ΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒΡΡ.
  2. Π˜Π½Π°Ρ‡Π΅ ΡΡ€Π°Π²Π½ΠΈΡ‚ΡŒ K с ΠΊΠ»ΡŽΡ‡ΠΎΠΌ X ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠ³ΠΎ ΡƒΠ·Π»Π° root:
    1. Если K>X, рСкурсивно ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ K ΠΈΠ· ΠΏΡ€Π°Π²ΠΎΠ³ΠΎ ΠΏΠΎΠ΄Π΄Π΅Ρ€Π΅Π²Π° Π’ ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ балансировку;
    2. Если K<X, рСкурсивно ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ K ΠΈΠ· Π»Π΅Π²ΠΎΠ³ΠΎ ΠΏΠΎΠ΄Π΄Π΅Ρ€Π΅Π²Π° Π’ ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ балинсировку;
    3. Если K=X, Ρ‚ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Ρ€Π°ΡΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ‚Ρ€ΠΈ случая.
      1. Если ΠΎΠ±ΠΎΠΈΡ… Π΄Π΅Ρ‚Π΅ΠΉ Π½Π΅Ρ‚, Ρ‚ΠΎ удаляСм Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΡƒΠ·Π΅Π» ΠΈ обнуляСм ссылку Π½Π° Π½Π΅Π³ΠΎ Ρƒ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ ΡƒΠ·Π»Π°;
      2. Если ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· Π΄Π΅Ρ‚Π΅ΠΉ Π½Π΅Ρ‚, Ρ‚ΠΎ значСния ΠΏΠΎΠ»Π΅ΠΉ Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ Ρ€Π΅Π±Ρ‘Π½ΠΊΠ° ставим вмСсто ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠ³ΠΎ ΡƒΠ·Π»Π°, затирая Π΅Π³ΠΎ старыС значСния, ΠΈ освобоТдаСм ΠΏΠ°ΠΌΡΡ‚ΡŒ, Π·Π°Π½ΠΈΠΌΠ°Π΅ΠΌΡƒΡŽ удаляСмым ΡƒΠ·Π»ΠΎΠΌ;
      3. Если ΠΎΠ±Π° Ρ€Π΅Π±Ρ‘Π½ΠΊΠ° ΠΏΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‚, Ρ‚ΠΎ:
        1. Найдём ΡƒΠ·Π΅Π», ΡΠ²Π»ΡΡŽΡ‰ΠΈΠΉΡΡ самым Π»Π΅Π²Ρ‹ΠΌ ΡƒΠ·Π»ΠΎΠΌ ΠΏΡ€Π°Π²ΠΎΠ³ΠΎ ΠΏΠΎΠ΄Π΄Π΅Ρ€Π΅Π²Π° с ΠΊΠΎΡ€Π½Π΅Π²Ρ‹ΠΌ ΡƒΠ·Π»ΠΎΠΌ Right(root);
        2. Π‘ΠΊΠΎΠΏΠΈΡ€ΡƒΠ΅ΠΌ Π΄Π°Π½Π½Ρ‹Π΅ (ΠΊΡ€ΠΎΠΌΠ΅ ссылок Π½Π° Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠ΅ элСмСнты);
        3. рСкурсивно ΡƒΠ΄Π°Π»ΠΈΠΌ ΡƒΠ·Π΅Π».
int rightTreeBalancing(BalanceTreeNode** node){
	int height = 0; // ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ высоты Π΄Π΅Ρ€Π΅Π²Π° послС вставки
	switch ((*node)->GetBalance())
	{
		case -1:
		{
			// Π»Π΅Π²ΠΎΠ΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€Π΅Π²ΠΎ ΠΏΠ΅Ρ€Π΅Π²Π΅ΡˆΠΈΠ²Π°Π»ΠΎ
			// 1. ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ Π»Π΅Π²ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ° ΡƒΠ·Π»Π°
			BalanceTreeNode *left = (BalanceTreeNode *)((*node)->left);
			// 2. Если Ρƒ Π»Π΅Π²ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ° ΠΏΠ΅Ρ€Π΅Π²Π΅ΡˆΠΈΠ²Π°Π΅Ρ‚ Π»Π΅Π²ΠΎΠ΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€Π΅Π²ΠΎ,
			// Ρ‚ΠΎ это случай ΠΎΠ΄Π½ΠΎΠΊΡ€Π°Ρ‚Π½ΠΎΠ³ΠΎ ΠΏΠΎΠ²ΠΎΡ€ΠΎΡ‚Π°,
			if (left->GetBalance() == -1)
			{
				// Π΄Π΅Π»Π°Π΅ΠΌ ΠΏΡ€Π°Π²ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ° Π»Π΅Π²ΠΎΠ³ΠΎ ΠΏΠΎΠ΄Π΄Π΅Ρ€Π΅Π²Π° Π»Π΅Π²Ρ‹ΠΌ ΠΏΠΎΠ΄Π΄Π΅Ρ€Π΅Π²ΠΎΠΌ
				// ΡƒΠ·Π»Π°, ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ выполняСтся балансировка
				(*node)->left = left->right;
				// ΠΏΡ€Π°Π²Ρ‹ΠΌ ΠΏΠΎΠ΄Π΄Π΅Ρ€Π΅Π²ΠΎΠΌ Π»Π΅Π²ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ° становится Π΄Π΅Ρ€Π΅Π²ΠΎ с
				// ΠΊΠΎΡ€Π½Π΅ΠΌ Π² ΡƒΠ·Π»Π΅, ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½ΠΎΠ³ΠΎ для балансировки
				left->right = (*node);
				(*node)->SetBalance(0);
				(*node) = left;
			}
			else
			{
				BalanceTreeNode *right = (BalanceTreeNode *)(left->right);
				left->right = right->left;
				right->left = left;
				(*node)->left = right->right;
				right->right = (*node);
				if (right->GetBalance() == -1) (*node)->SetBalance(1);
				else (*node)->SetBalance(0);
				if (right->GetBalance() == 1) (*node)->SetBalance(-1);
				else (*node)->SetBalance(0);
				(*node) = right;
				(*node)->SetBalance(0);
			}
			height = 0;
			break;
		}
		case 0;
		{
			// Π»Π΅Π²ΠΎΠ΅ ΠΈ ΠΏΡ€Π°Π²ΠΎΠ΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€Π΅Π²ΡŒΡ ΠΈΠΌΠ΅Π»ΠΈ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΡƒΡŽ высоту
			(*node)->SetBalance(-1); // послС вставки Π»Π΅Π²ΠΎΠ΅ ΠΏΠ΅Ρ€Π΅Π²Π΅ΡˆΠΈΠ²Π°Π΅Ρ‚
			height = 1;
			break;
		}
		case 1:
		{
			// ΠΏΡ€Π°Π²ΠΎΠ΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€Π΅Π²ΠΎ ΠΏΠ΅Ρ€Π΅Π²Π΅ΡˆΠΈΠ²Π°Π»ΠΎ
			(*node)->SetBalance(0); // послС вставки высота одинаковая
			height = 0;
			break;
		}
	}
return height;
} 

####Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° Π΄Π°Π½Π½Ρ‹Ρ… "Π’Π°Π±Π»ΠΈΡ†Ρ‹"####

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

  1. МаксимальноС количСство записСй, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒΡΡ Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅.
  2. Π’Π΅ΠΊΡƒΡ‰Π΅Π΅ количСство записСй, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΅ΡΡ‚ΡŒ Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅.

ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ситуации пСрСполнСния ΠΈ пустоты Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹. ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π½Π°Π΄ Ρ‚Π°Π±Π»ΠΈΡ†Π°ΠΌΠΈ:

  • Поиск записи с Π·Π°Π΄Π°Π½Π½Ρ‹ΠΌ ΠΊΠ»ΡŽΡ‡ΠΎΠΌ.
  • Π’ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ элСмСнта Π² Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ.
  • Π˜ΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΈΠ· Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ записи с Π·Π°Π΄Π°Π½Π½Ρ‹ΠΌ ΠΊΠ»ΡŽΡ‡ΠΎΠΌ.

РСализация Ρ‚Π°Π±Π»ΠΈΡ† РСализация записи Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹

class TabRecord{
	protected:
		TKey key;
		TData *data;
	public:
	TabRecord(TKey _key, TData *_data)
	{
		key = _key;
		data = _data;
	}
	TData* GetData() { return data; }
	TKey GetKey() { return key; }
}

Абстракция для прСдставлСния ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎΠΉ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹

class Table{
	protected:
		int tabSize;
		int dataCount;
		int currPos;
	public:
	Table(int _tabSize);
	// ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΎΠ½Π½Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹
	int IsEmpty() const;
	int IsFull() const;
	int GetDataCount() const;
	// ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π½Π°Π΄ Ρ‚Π°Π±Π»ΠΈΡ†Π°ΠΌΠΈ
	virtual TabRecord* FindRecord(TKey key) = 0;
	virtual void InsertRecord(TKey key, TData* data) = 0;
	virtual void RemoveRecord(TKey key) = 0;
	// навигация ΠΏΠΎ Ρ‚Π°Π±Π»ΠΈΡ†Π΅
	virtual int Reset()
	{
		currPos = 0;
		return IsTabEnded();
	}
	virtual int GetNext()
	{
		if (!IsTabEnded()) currPos++;
		return IsTabEnded();
	}
	virtual int IsTabEnded() const { return currPos >= tabSize; }
	// доступ ΠΊ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ записи Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹
	virtual TKey GetKey() const;
	virtual TData* GetData() const;
}

####Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° Π΄Π°Π½Π½Ρ‹Ρ… "ΠŸΡ€ΠΎΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Π΅ΠΌΡ‹Π΅ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹"####

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

РСализация просматриваСмых Ρ‚Π°Π±Π»ΠΈΡ†

class ScanTable: public Table{
	protected:
		TabRecord **records;
	public:
		ScanTable(int _tabSize):Table(_tabSize) { };
		// ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π½Π°Π΄ Ρ‚Π°Π±Π»ΠΈΡ†Π°ΠΌΠΈ
		virtual TabRecord* FindRecord(TKey key)
		{
		for (int i = 0; i < dataCount; i++)
		{
			if (records[i]->key == key)
			{
				currPos = i;
				return records[i];
			}
		}
		return NULL;
	}
	virtual void InsertRecord(TKey key, TData* data)
	{
		if (!IsFull())
		{
			records[dataCount++] = new TabRecord(key, data);
		}
	}
	virtual void RemoveRecord(TKey key)
	{
		if (!IsEmpty())
		{
			if (FindRecord(key) != NULL)
			{
				delete records[currPos];
				records[currPos] = records[--dataCount];
			}
		}
	}
}

####Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° Π΄Π°Π½Π½Ρ‹Ρ… "УпорядочСнныС Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹"####

УпорядочСнныС Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ – это Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… записи Ρ€Π°ΡΠΏΠΎΠ»Π°Π³Π°ΡŽΡ‚ΡΡ Π² порядкС возрастания (ΠΈΠ»ΠΈ убывания) ΠΊΠ»ΡŽΡ‡Π΅ΠΉ. Π£ΠΏΠΎΡ€ΡΠ΄ΠΎΡ‡Π΅Π½Π½ΠΎΡΡ‚ΡŒ Ρ‚Π°Π±Π»ΠΈΡ† ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Π½Π°Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΈ возмоТности ввСдСния Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠ³ΠΎ порядка Π½Π° мноТСствС ΠΊΠ»ΡŽΡ‡Π΅ΠΉ ΠΈ поддСрТиваСтся ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠΈ сортировки ΠΏΠΎ ΠΊΠ»ΡŽΡ‡Π°ΠΌ записСй. Π”Π°Π»Π΅Π΅ Π±ΡƒΠ΄Π΅ΠΌ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Ρ‚Π°Π±Π»ΠΈΡ†Π° упорядочСна ΠΏΠΎ Π²ΠΎΠ·Ρ€Π°ΡΡ‚Π°Π½ΠΈΡŽ. Для ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ поиска ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠ³ΠΎ поиска, Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Ρ‡Π΅Π³ΠΎ Ρ‚Ρ€ΡƒΠ΄ΠΎΠ΅ΠΌΠΊΠΎΡΡ‚ΡŒ поиска становится логарифмичСской ΠΎΡ‚ числа записСй Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹. ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΡ вставки ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅Ρ‚ сдвиг Π²ΠΏΡ€Π°Π²ΠΎ записСй Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ Π½Π°Ρ€ΡƒΡˆΠΈΡ‚ΡŒ порядок слСдования ΠΊΠ»ΡŽΡ‡Π΅ΠΉ. Начиная с максимального элСмСнта, просматриваСм записи ΠΈ сдвигаСм Π²ΠΏΡ€Π°Π²ΠΎ, ΠΏΠΎΠΊΠ° Π½Π΅ Π½Π°ΠΉΠ΄Π΅ΠΌ запись с ΠΊΠ»ΡŽΡ‡ΠΎΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ мСньшС ΠΈΠ»ΠΈ Ρ€Π°Π²Π΅Π½ вставляСмого.

ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΡ удалСния Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅Ρ‚ сдвиг записСй:

  1. Поиск удаляСмой записи.
  2. УдалСниС записи.
  3. Π‘Π΄Π²ΠΈΠ³ записСй с большими ΠΊΠ»ΡŽΡ‡Π°ΠΌΠΈ Π²Π»Π΅Π²ΠΎ.
class SortTable: public ScanTable{
	protected:
		void SortData(); // ΠΌΠ΅Ρ‚ΠΎΠ΄ сортировки записСй ΠΏΠΎ ΠΊΠ»ΡŽΡ‡Π°ΠΌ
	public:
		SortTable(int _tabSize): ScanTable(_tabSize) { };
		SortTable(const ScanTable *table);
		// ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π½Π°Π΄ Ρ‚Π°Π±Π»ΠΈΡ†Π°ΠΌΠΈ
		virtual TabRecord* FindRecord(TKey key)
		{
			int i, i1 = 0, i2 = dataCount – 1;
			TabRecord *rec = NULL:
			while (i1 <= i2)
			{
				i = (i1 + i2) / 2;
				if (key == records[i]->key)
				{
					i1 = i + 1;
					i2 = i;
					rec = records[i];
				}
				else if (key > records[i]->key)
				{
					i1 = i + 1;
				}
				else
				{
					i2 = i – 1;
				}
			}
			currPos = i2;
			return rec;
		}
		virtual void InsertRecord(TKey key, TData* data)
		{
			if (!IsFull())
			{
				TabRecord* rec = FindRecord(key);
				for (int i = dataCount; i > currPos; i--)
				{
					records[i] = records[i – 1];
				}
				records[currPos] = new TabRecord(key, data);
				dataCount++;
			}
		}
		virtual void RemoveRecord(TKey key)
		{
			if (!IsEmpty())
			{
				TabRecord *rec = FindRecord(key);
				if (rec != NULL)
				{
					delete records[currPos];
					for (int i = currPos; i < dataCount - 1; i++)
					{
						records[i] = records[i + 1];
					}
					dataCount--;
				}
			}
		}
	}

###Π‘Ρ…Π΅ΠΌΠ° наслСдования классов###

start

###ОписаниС Классов###

####ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Π°Ρ рСализация "d-Π°Ρ€Π½ΠΎΠΉ ΠΊΡƒΡ‡Π°"####

  • Поля:

  • Key (Data) - массив для хранСния Π΄Π΅Ρ€Π΅Π²Π°.

  • Size (int) - количСство элСмСнтов Π² Π΄Π΅Ρ€Π΅Π²Π΅.

  • d (int) - Π°Ρ€Π½ΠΎΡΡ‚ΡŒ ΠΊΡƒΡ‡ΠΈ.

  • ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹:

  • Tree(int d) - конструктор. ΠŸΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ арности ΠΊΡƒΡ‡ΠΈ.

  • ~Tree() - дСструктор.

  • void input(Data *&i) - ΠΌΠ΅Ρ‚ΠΎΠ΄ добавлСния Π½ΠΎΠ²Ρ‹Ρ… ΡƒΠ·Π»ΠΎΠ².

  • void inputGroup(Data **keys, int num) - ΠΌΠ΅Ρ‚ΠΎΠ΄ добавлСния Π³Ρ€ΡƒΠΏΠΏΡ‹ ΡƒΠ·Π»ΠΎΠ².

  • Data* erase() - ΠΌΠ΅Ρ‚ΠΎΠ΄ ΡƒΠ΄Π°Π»ΡΡŽΡ‰ΠΈΠΉ послСдний ΡƒΠ·Π΅Π».

  • Data* erase(int i) - ΠΌΠ΅Ρ‚ΠΎΠ΄ ΡƒΠ΄Π°Π»ΡΡŽΡ‰ΠΈΠΉ i-Ρ‹ΠΉ ΡƒΠ·Π΅Π».

  • void transposing(int i, int j) - ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΌΠ΅Π½ΡΡŽΡ‰ΠΈΠΉ Π΄Π²Π° ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Ρ… ΡƒΠ·Π»Π° мСстами.

  • void surfacing(int i) - ΠΌΠ΅Ρ‚ΠΎΠ΄ всплытия i-ΠΎΠ³ΠΎ ΡƒΠ·Π»Π°.

  • void immersion(int i) - ΠΌΠ΅Ρ‚ΠΎΠ΄ погруТСния i-ΠΎΠ³ΠΎ ΡƒΠ·Π»Π°.

  • void withdrawal(int i) - ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΈΠ·ΡŠΡΡ‚ΠΈΡ минимального ΡƒΠ·Π»Π°.

  • void hilling() - ΠΌΠ΅Ρ‚ΠΎΠ΄ окучивания.

  • int isFull() - ΠΌΠ΅Ρ‚ΠΎΠ΄ ΡΠΈΠ³Π½Π°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ ΠΎ ΠΏΠΎΠ»Π½ΠΎΡ‚Π΅ ΠΊΡƒΡ‡ΠΈ.

  • int isEmpty() - ΠΌΠ΅Ρ‚ΠΎΠ΄ ΡΠΈΠ³Π½Π°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ ΠΎ пустотС ΠΊΡƒΡ‡ΠΈ.

  • int minchild(int i) - ΠΌΠ΅Ρ‚ΠΎΠ΄ нахоТдСния минимального ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ° i-ΠΎΠ³ΠΎ ΡƒΠ·Π»Π°.

####ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Π°Ρ рСализация "Π‘ΠŸΠ”"####

Π£Π·Π΅Π» Π΄Π΅Ρ€Π΅Π²Π° прСдставлСн классом Node, со ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌΠΈ полями:

  • key (float) - ΠΊΠ»ΡŽΡ‡.

  • data (void*) - Π΄Π°Π½Π½Ρ‹Π΅.

  • pleft (Node*) - ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Π»Π΅Π²ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ°.

  • pright (Node*) - ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΠΏΡ€Π°Π²ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ°.

  • parent (Node*) - ΡƒΠΊΠ°Π°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° родитСля.

  • root (Node*) - ΠΊΠΎΡ€Π΅Π½ΡŒ Π΄Π΅Ρ€Π΅Π²Π°.

  • ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹:

  • BinSearchTree() - конструктор.

  • ~BinSearchTree() - дСструктор.

  • Node* search(float key) - поиск ΡƒΠ·Π»Π° ΠΏΠΎ ΠΊΠ»ΡŽΡ‡Ρƒ.

  • Node* searchPrev(Node *node) - поиск ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π³ΠΎ ΡƒΠ·Π»Π°.

  • Node* searchNext(Node *node) - поиск ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ ΡƒΠ·Π»Π°.

  • Node* searchMin(Node *node = 0) - поиск минимального ΡƒΠ·Π»Π°.

  • Node* searchMax(Node *node = 0) - поиск максимального ΡƒΠ·Π»Π°.

  • void DelNode(Node *node) - ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ ΡƒΠ·Π»Π°.

  • virtual void add(Node *&node) - Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΡƒΠ·Π»Π°.

  • virtual void del(float key) - ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ ΡƒΠ·Π»Π° ΠΏΠΎ ΠΊΠ»ΡŽΡ‡Ρƒ.

  • virtual Node* pull(float key) - ΠΈΠ·ΡŠΡΡ‚ΠΈΠ΅ ΡƒΠ·Π»Π° ΠΏΠΎ ΠΊΠ»ΡŽΡ‡Ρƒ.

  • int isEmpty() const - ΠΌΠ΅Ρ‚ΠΎΠ΄ ΡΠΈΠ³Π½Π°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ ΠΎ пустотС Π΄Π΅Ρ€Π΅Π²Π°.

####ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Π°Ρ рСализация "АВЛ-Π΄Π΅Ρ€Π΅Π²ΡŒΡ"####

  • ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹:

  • AVLTree() - конструктор.

  • virtual ~AVLTree() - дСструктор.

  • virtual void add(AVLNode *&node) - Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΡƒΠ·Π»Π°.

  • virtual void del(float key) - ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ ΡƒΠ·Π»Π° ΠΏΠΎ ΠΊΠ»ΡŽΡ‡Ρƒ.

  • virtual void del(Node* node) - ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ ΡƒΠ·Π»Π°.

  • virtual Node* pull(float key) - ΠΈΠ·ΡŠΡΡ‚ΠΈΠ΅ ΡƒΠ·Π»Π° ΠΏΠΎ ΠΊΠ»ΡŽΡ‡Ρƒ.

  • virtual Node* pull(Node* node) - ΠΈΠ·ΡŠΡΡ‚ΠΈΠ΅ ΡƒΠ·Π»Π°.

  • int rotateRight(AVLNode *&node) - ΠΏΡ€Π°Π²Ρ‹ΠΉ ΠΏΠΎΠ²ΠΎΡ€ΠΎΡ‚.

  • int rotateLeft(AVLNode *&node) - Π»Π΅Π²Ρ‹ΠΉ ΠΏΠΎΠ²ΠΎΡ€ΠΎΡ‚.

  • int DRotateRight(AVLNode *&node) - Π΄Π²ΡƒΠΊΡ€Π°Ρ‚Π½Ρ‹ΠΉ ΠΏΡ€Π°Π²Ρ‹ΠΉ ΠΏΠΎΠ²ΠΎΡ€ΠΎΡ‚.

  • int DRotateLeft(AVLNode *&node) - Π΄Π²ΡƒΠΊΡ€Π°Ρ‚Π½Ρ‹ΠΉ Π»Π΅Π²Ρ‹ΠΉ ΠΏΠΎΠ²ΠΎΡ€ΠΎΡ‚.

  • int balanceDetection(AVLNode *node, int &dep) - опрСдСляСт Ρ€Π°Π·Π½ΠΈΡ†Ρƒ высот Π² Π»Π΅Π²ΠΎΠΌ ΠΈ ΠΏΡ€Π°Π²ΠΎΠΌ ΠΏΠΎΠ΄Π΄Π΅Ρ€Π΅Π²Π΅.

  • int height(AVLNode *node) - опрСдСляСт высоту ΠΏΠΎΠ΄Π΄Π΅Ρ€Π΅Π²Π°.

  • int needBalance(AVLNode *&node) - Ρ€Π΅ΡˆΠ°Π΅Ρ‚, Ссли баланс большС 2 ΠΏΠΎ ΠΌΠΎΠ΄ΡƒΠ»ΡŽ, Ρ‚ΠΎ ΠΊΠ°ΠΊΠΎΠΉ ΠΏΠΎΠ²ΠΎΡ€ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ.

  • void ins(AVLNode *&localRoot, AVLNode *&node) - рСкурсивная вставка ΡƒΠ·Π»Π°.

  • Node* remuve(AVLNode *&localRoot, float key) - рСкурсивноС ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ ΡƒΠ·Π»Π° ΠΈ Π΅Π³ΠΎ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅.

####ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Π°Ρ рСализация "Π’Π°Π±Π»ΠΈΡ†Π°"####

Π—Π°ΠΏΠΈΡΡŒ Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ прСдставлСна классом TabRecord, содСрТащим Π² качСствС поля ΠΊΠ»ΡŽΡ‡ с ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΌ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠ΅ΠΌ порядка. Π‘Π°Π·Π° для всСх Ρ‚Π°Π±Π»ΠΈΡ† прСдставлСна классом Table, содСрТащим:

  • Поля(TabRecord):

  • Key (int) - ΠΊΠ»ΡŽΡ‡.

  • data (void*) - Π΄Π°Π½Π½Ρ‹Π΅.

  • ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹(TabRecord):

  • TabRecord(float key, void *data) - конструктор.

  • float GetKey() const - Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π°.

  • void* GetData() const - Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ….

  • Поля(Table):

  • Size (int) - ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹.

  • count (int) - количСство записСй Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅.

  • CurrPos (int) - тСкущая позиция.

  • ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹(Table):

  • Table(int Size) - конструктор.

  • virtual ~Table() - дСструктор.

  • virtual TabRecord *find(float key) - поиск записи ΠΏΠΎ ΠΊΠ»ΡŽΡ‡Ρƒ.

  • virtual int add(float key, void *data) = 0 - Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ записи Π² Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ.

  • virtual int del(float key) = 0 - ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ записи ΠΈΠ· Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹.

  • virtual TabRecord* getm() = 0 - ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ минимальной записи.

  • virtual TabRecord* getM() = 0 - ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ максимальной записи.

  • int isEmpty() const - ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ Π½Π° пустоту.

  • int isFull() const - ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ Π½Π° ΠΏΠΎΠ»Π½ΠΎΡ‚Ρƒ.

  • int getDataCount() const - ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ количСства записСй.

  • virtual int Reset() - установка индСкса Π½Π°Π²ΠΈΠ³Π°Ρ†ΠΈΠΈ Π² ΡΡ‚Π°Ρ€Ρ‚ΠΎΠ²ΡƒΡŽ ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ.

  • virtual int GetNext() - ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ индСкса Π½Π°Π²ΠΈΠ³Π°Ρ†ΠΈΠΈ Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ.

  • virtual int isTableEnded() - ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° достиТСниС ΠΊΠΎΠ½Ρ†Π° Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹.

####ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Π°Ρ рСализация "ΠŸΡ€ΠΎΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Π΅ΠΌΡ‹Π΅ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹"####

  • Поля:

  • recs (TabRecord**) - массив ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ Π½Π° записи.

  • ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹:

  • ScanTable(int Size) - конструктор.

  • virtual ~ScanTable() - дСструктор.

  • virtual TabRecord *find(float key) - поиск записи ΠΏΠΎ ΠΊΠ»ΡŽΡ‡Ρƒ.

  • virtual int add(float key, void* data) - Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ записи Π² Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ.

  • virtual int del(float key) - ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ записи ΠΈΠ· Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹.

  • virtual TabRecord* pull(float key) - ΠΈΠ·ΡŠΡΡ‚ΠΈΠ΅ записи.

  • virtual TabRecord* getm() - ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ минимальной записи.

  • virtual TabRecord* getM() - ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ максимальной записи.

####ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Π°Ρ рСализация "УпорядочСнныС Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹"####

  • ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹:

  • ScanTable(int Size) - конструктор.

  • virtual ~ScanTable() - дСструктор.

  • virtual TabRecord *find(float key) - поиск записи ΠΏΠΎ ΠΊΠ»ΡŽΡ‡Ρƒ.

  • virtual int add(float key, void* data) - Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ записи Π² Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ.

  • virtual int del(float key) - ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ записи ΠΈΠ· Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹.

  • virtual TabRecord* pull(float key) - ΠΈΠ·ΡŠΡΡ‚ΠΈΠ΅ записи.

  • virtual TabRecord* getm() - ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ минимальной записи.

  • virtual TabRecord* getM() - ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ максимальной записи.

####ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Π°Ρ рСализация "приоритСтная ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ"####

ΠŸΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π½Π°Ρ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ β€” это абстрактная структура Π΄Π°Π½Π½Ρ‹Ρ… Π½Π° ΠΏΠΎΠ΄ΠΎΠ±ΠΈΠΈ стСка ΠΈΠ»ΠΈ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ, Π³Π΄Π΅ Ρƒ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ элСмСнта Π΅ΡΡ‚ΡŒ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚. Π­Π»Π΅ΠΌΠ΅Π½Ρ‚ с Π±ΠΎΠ»Π΅Π΅ высоким ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠΌ находится ΠΏΠ΅Ρ€Π΅Π΄ элСмСнтом с Π±ΠΎΠ»Π΅Π΅ Π½ΠΈΠ·ΠΊΠΈΠΌ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠΌ. Если Ρƒ элСмСнтов ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹Π΅ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Ρ‹, ΠΎΠ½ΠΈ Ρ€Π°ΡΠΏΠΎΠ»Π°Π³Π°ΡŽΡ‚ΡΡ Π² зависимости ΠΎΡ‚ своСй ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π½Ρ‹Π΅ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‚ΡΡ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΡƒΡ‡ (heap).

QueueHeap являСтся наслСдником класса Queue ΠΈ пСрСопрСдСляСт Π΅Π³ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹.

  • Поля:

  • *heap (Tree) - ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΠΊΡƒΡ‡Ρƒ.

  • ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹:

  • QueueHeap(int d=4) - ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€.

  • QueueHeap(Data **keys, int num, int d) - конструктор с Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ Π³ΡƒΠΏΠΏΡ‹ элСмСнтов.

  • ~QueueHeap() - дСструктор.

  • virtual void add(Data *&key) β€” ΠΌΠ΅Ρ‚ΠΎΠ΄ вставки элСмСнта Π² ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π½ΡƒΡŽ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ с ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΌ ΠΊΠ»ΡŽΡ‡ΠΎΠΌ.

  • virtual Data* popidx(int i) β€” ΠΌΠ΅Ρ‚ΠΎΠ΄ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰ΠΈΠΉ всплытиС элСмСнта ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π½ΠΎΠΉ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ с i-Ρ‹ΠΌ ΠΊΠ»ΡŽΡ‡ΠΎΠΌ.

  • virtual void update() β€” ΠΌΠ΅Ρ‚ΠΎΠ΄ ΡƒΠΏΠΎΡ€ΡΠ΄ΠΎΡ‡ΠΈΠ²Π°ΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π½ΡƒΡŽ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ.

  • virtual int isFull() β€” ΠΌΠ΅Ρ‚ΠΎΠ΄ ΡΠΈΠ³Π½Π°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ ΠΎ пСрСполнСнности ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π½ΠΎΠΉ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ.

  • virtual int isEmpty() β€” ΠΌΠ΅Ρ‚ΠΎΠ΄ ΡΠΈΠ³Π½Π°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ ΠΎ пустотС ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π½ΠΎΠΉ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ.

QueueTree Ρ‚Π°ΠΊ ΠΆΠ΅ являСтся наслСдником класса Queue.

  • Поля:

*tree (AVLTree) - ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Π΄Π΅Ρ€Π΅Π²ΠΎ.

  • ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹:

  • QueueTree() - ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€.

  • QueueTree(Data **keys, int num) - конструктор с Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ Π³ΡƒΠΏΠΏΡ‹ элСмСнтов.

  • ~QueueTree() - дСструктор.

  • virtual void add(Data *&key) β€” ΠΌΠ΅Ρ‚ΠΎΠ΄ вставки элСмСнта Π² ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π½ΡƒΡŽ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ с ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΌ ΠΊΠ»ΡŽΡ‡ΠΎΠΌ.

  • virtual Data* popidx(int i) β€” ΠΌΠ΅Ρ‚ΠΎΠ΄ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰ΠΈΠΉ всплытиС элСмСнта ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π½ΠΎΠΉ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ с i-Ρ‹ΠΌ ΠΊΠ»ΡŽΡ‡ΠΎΠΌ.

  • virtual void update() β€” ΠΌΠ΅Ρ‚ΠΎΠ΄ ΡƒΠΏΠΎΡ€ΡΠ΄ΠΎΡ‡ΠΈΠ²Π°ΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π½ΡƒΡŽ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ.

  • virtual int isFull() β€” ΠΌΠ΅Ρ‚ΠΎΠ΄ ΡΠΈΠ³Π½Π°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ ΠΎ пСрСполнСнности ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π½ΠΎΠΉ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ.

  • virtual int isEmpty() β€” ΠΌΠ΅Ρ‚ΠΎΠ΄ ΡΠΈΠ³Π½Π°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ ΠΎ пустотС ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π½ΠΎΠΉ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ.

QueueTable ΠΈ это Ρ‚ΠΎΠΆΠ΅ являСтся наслСдником класса Queue...

  • Поля:

*tab (SortTable) - ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ.

  • ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹:

  • QueueTab() - ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€.

  • QueueTab(int Size) - конструктор с Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ Π³ΡƒΠΏΠΏΡ‹ элСмСнтов.

  • ~QueueTab() - дСструктор.

  • virtual void add(Data *&key) β€” ΠΌΠ΅Ρ‚ΠΎΠ΄ вставки элСмСнта Π² ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π½ΡƒΡŽ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ с ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΌ ΠΊΠ»ΡŽΡ‡ΠΎΠΌ.

  • virtual Data* popidx(int i) β€” ΠΌΠ΅Ρ‚ΠΎΠ΄ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰ΠΈΠΉ всплытиС элСмСнта ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π½ΠΎΠΉ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ с i-Ρ‹ΠΌ ΠΊΠ»ΡŽΡ‡ΠΎΠΌ.

  • virtual void update() β€” ΠΌΠ΅Ρ‚ΠΎΠ΄ ΡƒΠΏΠΎΡ€ΡΠ΄ΠΎΡ‡ΠΈΠ²Π°ΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π½ΡƒΡŽ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ.

  • virtual int isFull() β€” ΠΌΠ΅Ρ‚ΠΎΠ΄ ΡΠΈΠ³Π½Π°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ ΠΎ пСрСполнСнности ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π½ΠΎΠΉ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ.

  • virtual int isEmpty() β€” ΠΌΠ΅Ρ‚ΠΎΠ΄ ΡΠΈΠ³Π½Π°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ ΠΎ пустотС ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π½ΠΎΠΉ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ.

ОписаниС Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ²

Алгоритм ΠšΡ€Π°ΡΠΊΠ°Π»Π°

Алгоритм ΠšΡ€Π°ΡΠΊΠ°Π»Π° относится ΠΊ числу Β«ΠΆΠ°Π΄Π½Ρ‹Ρ…Β» Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ², Ρ‚.Π΅. Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΌ шагС получаСтся ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ Π²Ρ‹ΠΈΠ³Ρ€Ρ‹Ρˆ.

Алгоритм состоит ΠΈΠ· Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… дСйствий:

  1. Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΈ ΠΈΠ· ver синглСтонов унивСрса {1, 2, ... , ver}. (separatedSet *SArr=new separatedSet(ver);)
  2. Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ пустого мноТСства Ρ€Π΅Π±Π΅Ρ€ tree, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ входят Π² состав остовного Π΄Π΅Ρ€Π΅Π²Π°. (Graph *tree=new Graph(ver))
  3. Поиск Ρ€Π΅Π±Ρ€Π° e с ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌ вСсом ΠΈ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ Π΅Π³ΠΎ ΠΈΠ· мноТСства Ρ€Π΅Π±Π΅Ρ€ (e=q->popidx(0)).
  4. ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Ρ€Π°Π·Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ мноТСства A ,ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ‚ n(e).(n=((KrasklEdges*)e)->edge->n; A=SArr->subDef(n);)
  5. ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Ρ€Π°Π·Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ мноТСства B ,ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ‚ k(e).(k=((KrasklEdges*)e)->edge->k; B=SArr->subDef(k);)
  6. Если A!=B ,Ρ‚ΠΎ объСдиняСм Ρ€Π°Π·Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ мноТСства ΠΈ добавляСм Ρ€Π΅Π±Ρ€ΠΎ e Π² мноТСство tree. (SArr->unionS(A, B); tree->inputEdge(n, k, w);)
  7. Π¨Π°Π³ΠΈ 3-6 ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡΡŽΡ‚ΡΡ Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° q!=βˆ… ΠΈ |Size| < ver βˆ’ 1. (while(Size<ver-1 && !q->isEmpty()))

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

Алгоритм ДСйкстры Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΊΡ€Π°Ρ‚Ρ‡Π°ΠΉΡˆΠΈΠ΅ ΠΏΡƒΡ‚ΠΈ ΠΎΡ‚ ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· Π²Π΅Ρ€ΡˆΠΈΠ½ Π³Ρ€Π°Ρ„Π° Π΄ΠΎ всСх ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Ρ…. Алгоритм Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для Π³Ρ€Π°Ρ„ΠΎΠ² Π±Π΅Π· Ρ€Ρ‘Π±Π΅Ρ€ ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ вСса.

Алгоритм состоит ΠΈΠ· Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… дСйствий:

  1. Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ мноТСства расстояний dist[i] со значСниями Ρ€Π°Π²Π½Ρ‹ΠΌ бСсконСчности.
  2. Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ массива с Π½ΡƒΠ»Π΅Π²Ρ‹ΠΌΠΈ значСниями p[i] содСрТащСго ΠΏΠΎ ΠΎΠΊΠΎΠ½Ρ‡Π°Π½ΠΈΠΈ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° ΠΊΡ€Π°Ρ‚Ρ‡Π°ΠΉΡˆΠΈΠΉ ΠΏΡƒΡ‚ΡŒ ΠΎΡ‚ startV Π΄ΠΎ i.
  3. Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π½ΠΎΠΉ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ q.
  4. Пока приоритСтная ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ Π½Π΅ пуста (!q->isEmpty) ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡΡŽΡ‚ΡΡ дСйствия:
    1. Π˜Π·Ρ‹ΠΌΠ°Π΅Ρ‚ΡΡ Π²Π΅Ρ€ΡˆΠΈΠ½Π° currV с ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠΌ. (currV=((DijkstraData*)q->popidx(0))->num;)
    2. Π’ Ρ†ΠΈΠΊΠ»Π΅ ΠΎΡ‚ 0 Π΄ΠΎ edg(количСства Ρ€Π΅Π±Π΅Ρ€) ΠΈΡ‰Π΅ΠΌ Ρ€Π΅Π±Ρ€Π° ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡŽΡ‰ΠΈΠ΅ Π½Π°Ρ‡Π°Π»ΠΎΠΌ(ΠΊΠΎΠ½Ρ†ΠΎΠΌ) с currV.
    3. Если Ρ‚Π°ΠΊΠΎΠ΅ Ρ€Π΅Π±Ρ€ΠΎ нашлось, Ρ‚ΠΎ ΠΌΡ‹ провСряСм, являСтся Π»ΠΈ Π½ΠΎΠ²Ρ‹ΠΉ ΠΏΡƒΡ‚ΡŒ ΠΊΠΎΡ€ΠΎΡ‡Π΅, Ρ‡Π΅ΠΌ Ρ€Π°Π½Π΅Π΅ имСвшийся Π΄ΠΎ этой Π²Π΅Ρ€ΡˆΠΈΠ½Ρ‹.
      1. Если Π΄Π°, Ρ‚ΠΎ ΠΌΡ‹ добаляСм расстояниС Π΄ΠΎ этой Π²Π΅Ρ€ΡˆΠΈΠ½Ρ‹ Π² мноТСство dist.
      2. ДобавляСм ΠΊΠΎΠ½Π΅Ρ†(Π½Π°Ρ‡Π°Π»ΠΎ) Ρ€Π΅Π±Ρ€Π° Π² массив ΠΊΡ€Π°Ρ‚Ρ‡Π°ΠΉΡˆΠΈΡ… ΠΏΡƒΡ‚Π΅ΠΉ p.
      3. ОбновляСм ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π½ΡƒΡŽ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ. (q->update();)
      4. Π”Π°Π»Π΅Π΅ ΠΌΡ‹ возвращаСмся Π² ΠΏΡƒΠ½ΠΊΡ‚ 4.

ΠŸΠΈΡ€Π°ΠΌΠΈΠ΄Π°Π»ΡŒΠ½Π°Ρ сортировка

ΠŸΠΈΡ€Π°ΠΌΠΈΠ΄Π°Π»ΡŒΠ½Π°Ρ сортировка β€” Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ сортировки, Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΠΉ Π² Ρ…ΡƒΠ΄ΡˆΠ΅ΠΌ, Π² срСднСм ΠΈ Π»ΡƒΡ‡ΡˆΠ΅ΠΌ случаС Π·Π° О(n log(n))

Алгоритм состоит ΠΈΠ· Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… дСйствий:

Π½Π° Π²Ρ…ΠΎΠ΄ поступаСт массив Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Elems

  1. Π’ Ρ†ΠΈΠΊΠ»Π΅ ΠΎΡ‚ i=Size(ΠΊΠΎΠ»-Π²ΠΎ элСмСнтов массива) Π΄ΠΎ 1 выполняСтся:
    1. ВранспонированиС 0-ΠΎΠ³ΠΎ ΠΈ Size-1 элСмСнта. (heap->transposing(i, 0);)
    2. i-ΠΎΠΌΡƒ элСмСнту массива присваиваСтся Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ послСднСго элСмСнта ΠΊΡƒΡ‡ΠΈ. (Elems[i] =(int)heap->erase()->priority;)
    3. ΠŸΠΎΠ³Ρ€ΡƒΠΆΠ΅Π½ΠΈΠ΅(0). (heap->immersion(0);)
  2. ΠŸΠ΅Ρ€Π²ΠΎΠΌΡƒ элСмСнту массива Elems[0] присваиваСтся Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ послСднСго ΠΎΡΡ‚Π°Π²ΡˆΠ΅Π³ΠΎΡΡ элСмСнта ΠΊΡƒΡ‡ΠΈ(heap)

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

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

Π’ процСссС Π±Ρ‹Π»ΠΎ написано 78 тСстов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠΊΡ€Ρ‹Π²Π°ΡŽΡ‚ всСвозмоТныС ситуации использования ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² класса. ВсС тСсты ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ ΠΏΡ€ΠΎΠΉΠ΄Π΅Π½Ρ‹.

Π›ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΡƒΡ€Π°

  • Π›Π΅Π²ΠΈΡ‚ΠΈΠ½ А. Π’. Π“Π»Π°Π²Π° 6. ΠœΠ΅Ρ‚ΠΎΠ΄ прСобразования: ΠŸΠΈΡ€Π°ΠΌΠΈΠ΄Ρ‹ ΠΈ ΠΏΠΈΡ€Π°ΠΌΠΈΠ΄Π°Π»ΡŒΠ½Π°Ρ сортировка // Алгоритмы. Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ ΠΈ Π°Π½Π°Π»ΠΈΠ· β€” М.: Π’ΠΈΠ»ΡŒΡΠΌΡ, 2006. β€” Π‘. 275β€”284. β€” 576 с.
  • Вомас Π₯. ΠšΠΎΡ€ΠΌΠ΅Π½, Π§Π°Ρ€Π»ΡŒΠ· И. ЛСйзСрсон, Рональд Π›. РивСст, ΠšΠ»ΠΈΡ„Ρ„ΠΎΡ€Π΄ Π¨Ρ‚Π°ΠΉΠ½. Алгоритмы: построСниС ΠΈ Π°Π½Π°Π»ΠΈΠ· = Introduction to Algorithms. β€” 2-Π΅ ΠΈΠ·Π΄. β€” М.: Β«Π’ΠΈΠ»ΡŒΡΠΌΡΒ», 2006. β€” Π‘. 1296.
  • БСлоусов А. И., Π’ΠΊΠ°Ρ‡Π΅Π² Π‘. Π‘. ДискрСтная ΠΌΠ°Ρ‚Π΅ΠΌΠ°Ρ‚ΠΈΠΊΠ°. β€” М.: ΠœΠ“Π’Π£, 2006. β€” 744 с.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages