IB108 Sada 1, Příklad 1 Vypracovali: Tomáš Krajča (255676), Martin Milata (256615)



Podobné dokumenty
Intervalové stromy. Představme si, že máme posloupnost celých čísel p 0, p 1,... p N 1, se kterou budeme. 1. Změna jednoho čísla v posloupnosti.

Stromy, haldy, prioritní fronty

Základní datové struktury III: Stromy, haldy

5 Rekurze a zásobník. Rekurzivní volání metody

přirozený algoritmus seřadí prvky 1,3,2,8,9,7 a prvky 4,5,6 nechává Metody řazení se dělí:

Stromy. Strom: souvislý graf bez kružnic využití: počítačová grafika seznam objektů efektivní vyhledávání výpočetní stromy rozhodovací stromy

13. Třídící algoritmy a násobení matic

STROMOVE ALGORITMY Prohledavani do sirky (level-order) Po vodorovnejch carach fronta

Dynamické datové struktury III.

Algoritmizace I. Ak. rok 2015/2016 vbp 1. ze 132

TGH07 - Chytré stromové datové struktury

DYNAMICKÉ PROGRAMOVÁNÍ A PROBLÉM BATOHU

Seminář z IVT Algoritmizace. Slovanské gymnázium Olomouc Tomáš Kühr

Na začátku rozdělíme práci a určíme, které podproblémy je potřeba vyřešit. Tyto

(Auto)korelační funkce Statistické vyhodnocování exp. dat M. Čada ~ cada

Algoritmus Minimax. Tomáš Kühr. Projektový seminář 1

Algoritmy a datové struktury

Vyhledávání. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava. Prezentace ke dni 21.

Binární vyhledávací stromy pokročilé partie

IB111 Úvod do programování skrze Python

Determinant. Definice determinantu. Permutace. Permutace, vlastnosti. Definice: Necht A = (a i,j ) R n,n je čtvercová matice.

TGH07 - Chytré stromové datové struktury

GRAFY A GRAFOVÉ ALGORITMY

8) Jaké jsou důvody pro použití víceprůchodového překladače Dříve hlavně kvůli úspoře paměti, dnes spíše z důvodu optimalizace

Složitosti základních operací B + stromu

zejména Dijkstrův algoritmus pro hledání minimální cesty a hladový algoritmus pro hledání minimální kostry.

DSA, První krok: máme dokázat, že pro left = right vrátí volání f(array, elem, left, right)

Rekurzivní algoritmy

KMA/PDB. Karel Janečka. Tvorba materiálů byla podpořena z prostředků projektu FRVŠ č. F0584/2011/F1d

4 Stromy a les. Definice a základní vlastnosti stromů. Kostry grafů a jejich počet.

V každém kroku se a + b zmenší o min(a, b), tedy vždy alespoň o 1. Jestliže jsme na začátku dostali 2

Anotace. Dynamické programování, diskrétní simulace.

Predispozice pro výuku IKT (2015/2016)

Stromy. Karel Richta a kol. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze Karel Richta a kol.

Implementace seznamů do prostředí DELPHI pomocí lineárního seznamu

ALGORITMIZACE 2010/03 STROMY, BINÁRNÍ STROMY VZTAH STROMŮ A REKURZE ZÁSOBNÍK IMPLEMENTUJE REKURZI PROHLEDÁVÁNÍ S NÁVRATEM (BACKTRACK)

ALG 04. Zásobník Fronta Operace Enqueue, Dequeue, Front, Empty... Cyklická implementace fronty. Průchod stromem do šířky

Složitost a NP-úplnost

2 Základní funkce a operátory V této kapitole se seznámíme s použitím funkce printf, probereme základní operátory a uvedeme nejdůležitější funkce.

Reprezentace aritmetického výrazu - binární strom reprezentující aritmetický výraz

Kapitola 11. Vzdálenost v grafech Matice sousednosti a počty sledů

Vyhledávání. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava. Prezentace ke dni 12.

TGH05 - Problém za milion dolarů.

Maticové operace projekt č. 3

3. Středoškolská stereometrie v anaglyfech

Vyvažování a rotace v BVS, všude se předpokládá AVL strom

Řešení: PŘENESVĚŽ (N, A, B, C) = přenes N disků z A na B pomocí C

Pokročilé haldy. prof. Ing. Pavel Tvrdík CSc. Fakulta informačních technologií České vysoké učení technické v Praze c Pavel Tvrdík, 2010

Složitost algoritmů. Karel Richta a kol. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze Karel Richta a kol.

bin arn ı vyhled av an ı a bst Karel Hor ak, Petr Ryˇsav y 23. bˇrezna 2016 Katedra poˇ c ıtaˇ c u, FEL, ˇ CVUT

DobSort. Úvod do programování. DobSort Implementace 1/3. DobSort Implementace 2/3. DobSort - Příklad. DobSort Implementace 3/3

0. Lineární rekurence Martin Mareš,

Binární vyhledávací strom pomocí směrníků Miroslav Hostaša L06620

a) Θ(1) b) závislou na hloubce uzlu u c) mezi O(1) a Ω (log n) Jméno:... St. Sk.:. Cvičící:.. Bodů ze cv.: a) Ο(n) b) Θ(n) d) Ο(n 2 )

Obecná informatika. Matematicko-fyzikální fakulta Univerzity Karlovy v Praze. Podzim 2012

Kód uchazeče ID:... Varianta: 14

Tento text je stručným shrnutím těch tvrzení Ramseyovy teorie, která zazněla

Mgr. Karel Pazourek. online prostředí, Operační program Praha Adaptabilita, registrační číslo CZ.2.17/3.1.00/31165.

NPRG030 Programování I 3/2 Z --- NPRG031 Programování II --- 2/2 Z, Zk

Matice se v některých publikacích uvádějí v hranatých závorkách, v jiných v kulatých závorkách. My se budeme držet zápisu s kulatými závorkami.

Časová a prostorová složitost algoritmů

Počítačové šachy. Otakar Trunda

Jak pracovat s absolutními hodnotami

Zlatý řez nejen v matematice

1. Minimální kostry Od mìsteèka ke kostøe

Hledání k-tého nejmenšího prvku

Test prvočíselnosti. Úkol: otestovat dané číslo N, zda je prvočíslem

Prioritní fronta, halda

Dynamické datové struktury IV.

Základy algoritmizace c2005, 2007 Michal Krátký, Jiří Dvorský1/39

Volné stromy. Úvod do programování. Kořenové stromy a seřazené stromy. Volné stromy

BINARY SEARCH TREE

a n (z z 0 ) n, z C, (1) n=0

BAKALÁŘSKÁ PRÁCE. Numerické metody jednorozměrné minimalizace

Union-Find problém. Kapitola 1

Třídění a vyhledávání Searching and sorting

VYSOKÁ ŠKOLA EKONOMICKÁ V PRAZE. Optimalizace trasy při revizích elektrospotřebičů

Digitální učební materiál

a) b) c) Radek Mařík

ALGORITMIZACE 2010/03 STROMY, BINÁRNÍ STROMY VZTAH STROMŮ A REKURZE ZÁSOBNÍK IMPLEMENTUJE REKURZI PROHLEDÁVÁNÍ S NÁVRATEM (BACKTRACK)

2) Napište algoritmus pro vložení položky na konec dvousměrného seznamu. 3) Napište algoritmus pro vyhledání položky v binárním stromu.

Často potřebujeme hledat mezi dvěma vrcholy grafu cestu, která je v nějakém

Různé algoritmy mají různou složitost

Zdůvodněte, proč funkce n lg(n) roste alespoň stejně rychle nebo rychleji než než funkce lg(n!). Symbolem lg značíme logaritmus o základu 2.

Lenka Zalabová. Ústav matematiky a biomatematiky, Přírodovědecká fakulta, Jihočeská univerzita. zima 2012

PODOBÁ SE JAZYKU C S NĚKTERÝMI OMEZENÍMI GLOBÁLNÍ PROMĚNNÉ. NSWI162: Sémantika programů 2

Rekurze a rychlé třídění

Algoritmy I, složitost

autoři: Rudolf Bayer, Ed McCreight všechny vnější uzly (listy) mají stejnou hloubku ADS (abstraktní datové struktury)

SII - Informatika. 1. Atribut relace, jehož hodnota jednoznačně určuje prvek v jiné relaci, se nazývá:

Břetislav Fajmon, UMAT FEKT, VUT Brno. Poznámka 1.1. A) první část hodiny (cca 50 minut): představení všech tří metod při řešení jednoho příkladu.

Katedra kybernetiky skupina Inteligentní Datové Analýzy (IDA) 9. dubna Filip Železný (ČVUT) Vytěžování dat 9.

Paralelní LU rozklad

Několik poznámek na téma lineární algebry pro studenty fyzikální chemie

Klíčové pojmy: Cyklus, řídící proměnná, inicializace, test podmínky, přerušení cyklu, vnořování cyklů.

Dynamické programování. Optimální binární vyhledávací strom

TÉMATICKÝ OKRUH TZD, DIS a TIS

Předmět: Algoritmizace praktické aplikace

Základy řazení. Karel Richta a kol.

Algoritmizace složitost rekurzivních algoritmů. Jiří Vyskočil, Marko Genyg-Berezovskyj 2010

Transkript:

IB108 Sada 1, Příklad 1 ( ) Složitost třídícího algoritmu 1/-Sort je v O n log O (n.71 ). Necht n = j i (velikost pole, které je vstupním parametrem funkce 1/-Sort). Lehce spočítáme, že velikost pole předávaná rekurzivně volaným 1/-Sort je n. Z toho můžeme odvodit rekurentní rovnici: ( ) T (n) = T n + c, kde c N T (1) = c, kde c N ( ) Dle Master Theorem je tedy T (n) O n log, (a =, b =, d = 0). Algoritmus korektně utřídí danou posloupnost. Algoritmus konverguje - zřejmé, pro i + 1 < j bude k 1, tedy rekurzivně volané funkce budou mít jako parametr alepoň o 1 menší pole, než měla původní funkce. Pro i + 1 j končí rekurzivní zanořování. Algoritmus je parciálně korektní. Invariant: V každém exempláři funkce 1/ Sort je možné vstupní pole rozdělit na následující části: A[i]... A[i + k]... A[j k]... A[j], kde a) prostřední část je alespoň tak velká jako poslední část a zároveň b) prostřední část je neprázdná a zároveň c) prostřední část je alespoň tak velká jako první část. a) (j k) (i + k) = j k k i k 1 = j (j k + 1) j k k k i + 1 0 j j + i 1 i + k k 0 j i + j i + 1 j i + 1 0 b) předpokládáme, že j i + (řádek algoritmu). (i + ) i + 1 (i + ) i + 1 (j k) (i + k) = j k k i (i + ) i = 0 c) Pokračování na dalším listu. (j k) (i + k) k 1 = (i + k 1) i 1

IB108 Sada 1, Příklad 1 Nyní indukcí k délce vstupního pole ukážeme parciální korektnost algoritmu. Pro pole délky (triviálně pro délku 1): z řádků 1 4 algoritmu je zřejmé, že báze indukce platí (žádné rekurzivní zanořování). Předpokládejme tedy, že daný algoritmus korektně utřídí pole délky n 1. Pak volejme funkci 1/ Sort(A, i, j) : j i = n. Dle indukčního předpokladu nám volání funkce 1/ Sort na řádku 6 utřídí část pole A[l]... A[j k]. Poté volání na řádku 7 nám utřídí část pole A[i + k]... A[j]. Přičemž bude platit: A[i], A[i + 1],..., A[j k] A[j k + 1] A[j k + ] A[j] Plyne z invariantu z velikosti jednotlivých částí pole. Další rekurzivní volání funkce 1/ Sort na řádku 8 nám setřídí zbývající část pole A[i]... A[j k].

IB108 Sada 1, Příklad Necht přiřazení trvá 1 časovou jednotku, pak přesná časová složitost algoritmu je 1 n + 1 8 n + 5 1 n + 1 8 n4 + 1 O(n 4 ). Funkce UNKNOWN(n) vypočítá hodnotu 1 n + 1 8 n + 5 1 n + 1 8 n4. Cyklus na řádku 4 proběhne vždy i krát ((i + j) j = i). Protože k j, cyklus na řádku 5 proběhne i krát, i 1 krát... 1 krát (analyzujeme pouze cykly na řádcích 4, 5). Tedy tato dvojice cyklů proběhne i (i + 1). Cyklus na řádku proběhne i krát, tedy dohromady s cykly na řádcích 4, 5 to bude T (i) = i i (i + 1). Nyní už snadno nahlédneme, že platí rekurentní vztahy (analyzujeme všechny cykly): T (1) = 1 T (n) = T (n 1) + T (n) = T (n 1) + n (n + 1) n ( ) ( ( ) ( ) ( )) 1 1 1 1 T (n) = (n + 1) n + 1 5 n + 1 + n + 1 4 n + 1 1 T (n) = 1 n + 8 n + 5 1 n + 1 8 n4

IB108 Sada 1, Příklad Algoritmus: Require: A[l..r], A[ ] Z Ensure: j k=i A[k] is maximum 1: max max suf 0 : i j i suf j suf 0 : for k l to r do 4: if 0 > max suf + A[k] then 5: max suf 0 6: i suf k + 1 7: else 8: max suf max suf + A[k] 9: j suf k 10: end if 11: if max < max suf then 1: max max suf 1: i i suf 14: j j suf 15: end if 16: end for 17: if max 0 then 18: max = A[l] 19: i j l 0: for k l + 1 to r do 1: if A[k] > max then : max A[k] : i j k 4: end if 5: end for 6: end if 7: return (i, j) Analýza složitosti: Necht n = r l je velikost pole A[ ]. Pak složitost algoritmu je zřejmě Θ(n) O (n log n). Máme oddělené for cykly s n iteracemi. Pokračování na dalším listu. 4

IB108 Sada 1, Příklad Konvergence triviální - pouze konečné for cykly. Korektnost: Dokážeme, že max je suma podintervalu pole A[ ], která je maximální. Argumentace, že nejlevější prvek takového podintervalu je i a nejpravější j by byla obdobná. Tento invariant platí po celou dobu výpočtu. (a) b.a[b] > 0 Pro for cyklus na řádku bude platit invariant: max je suma podintervalu pole A[l..k], která je maximální. Další invariant pro tento for cyklus je: max suf je suma podintervalu pole A[l..k], která je maximální a zároveň nejpravější prvek podintervalu je A[k]. Pokud by měla být proměnná max nebo max suf záporná, pokládáme je rovny 0. To můžeme, protože víme, že v poli existuje prvek větší než 0. Po opuštění tohoto for cyklu bude tedy v max suma podintervalu pole A[l..r], která je maximální. Předpokládáme, že pole obsahuje nějaký prvek větší než 0, if podmínka na řádku 17 se tedy vyhodnotí na false. (b) b.a[b] 0 Z úvodního předpokladu hned vidíme, že podinterval s maximální sumou bude obsahovat 1 prvek (A[b] + A[c] A[b]). Necht tedy proběhne úvodních 16 řádků, je zřejmé, že max 0, provedou se tedy řádky 18..6. To je ovšem aplikace standardního algoritmu pro nalezení největšího prvku pole A[l..r]. Invariant pro for cyklus na řádku 0: max je maximální položka pole A[l..k]. Tento největší prvek pole bude jediný prvek maximálního podintervalu pole A[l..r]. 5

IB108 Sada 1, Příklad 4 Pro navržení datové struktury využijeme následující fakt. Mějme posloupnost čísel (na obrázku 1 ) a nad ní postavený binární strom. Dále pak mějme nějaký interval ležící v této posloupnosti (na obrázku 19 7). Na obrázku jsou pro názornost vyznačeny obě cesty z kořene do krajních bodů tohoto intervalu. Vlastnost, která je pro nás podstatná je, že každá cesta z kořene do nějákého bodu intervalu vypadá následovně: projde uzlem, kde se cesty do krajních intervalů rozdvojují (v hraničních případech může být tento uzel kořen nebo list) a pak pokračuje bud po cestě vedoucí do levého krajního bodu a z ní odbočí doprava, nebo pokračují po cestě do pravého krajního bodu a z ní odbočí doleva, případně dojdou po jedné z těchto cest až do krajního bodu. 1 4 5 6 7 8 9 10 11 1 1 14 15 16 17 18 19 0 1 4 5 6 7 8 9 0 1 Jinak řečeno, projdou právě jednou uzlem, který je pravým (resp. levým) synem nějákého uzlu ležícího na cestě do levého (resp. pravého) krajního bodu, který sám na této cestě neleží (pokud není cílový bod zároveň bodem krajním). Tyto uzly jsou na obrázku vyznačeny tečkou. Jako datovou strukturu tedy použijeme binární strom, do jehož uzlů si budeme ukládat přirozená čísla. Pro každý zadaný interval najdeme výše popsané uzly a přičteme do nich číslo přiřazené danému intervalu. Tím dosáhneme toho, že na každé cestě z kořene do listu bude ležet takový součet čísel, který odpovídá součtu čísel přiřazených k intervalům, v nichž leží číslo v listu. Pro nalezení uzlů, do kterých budeme ukládat hodnoty nám stačí projít obě cesty z kořene do krajních bodů intervalu. Při tom projdeme nejvýše tolik uzlů, kolik je dvojnásobek výšky stromu. Použijeme-li vyvážený binární strom, bude nám to trvat logaritmický čas vzhledem k počtu listů a tedy vzhledem k velikosti nosného intervalu. Pro nalezení součtu náležícího nějákému číslu stačí projít uzly od kořene k danému listu, což bude také trvat logaritmický čas. Protože ve stromu uchováváme součty hodnot a protože parametry druhé operace jsou pouze krajní body intervalu, musíme si ještě někde uchovávat jednotlivá čísla přiřazená ke každému intervalu. Pro tento účel použijeme dvourozměrné pole velikosti n n (kde n má význam jako v zadání). 6

IB108 Sada 1, Příklad 4 Algoritmus pro inicializaci datové struktury vytvoří vyvážený binární strom. Hodnotu uzlu, nazvanou val, inicializuje na nulu. Pro zjednodušení si do uzlů přidáme ještě položku i, která bude udávat hodnotu nejpravějšího potomka levého podstromu (v případě vnitřního uzlu), v případě listu jeho hodnotu. Algoritmus dále vytvoří pole velikosti n n, jehož prvky inicializuje na nulu. Stav, kdy je k intervalu přiřazena nula a stav, kdy interval není ve struktuře obsažen jsou z hlediska obou operací nerozlišitelné. Init(n) 1: Tree InitTree(n, 0) : Arr alokuj pole velikosti n n a vynuluj jeho prvky InitTree(size, offset) 1: leftsize size/ : newnode alokuj nový uzel : newnode.val 0 4: newnode.i leftsize + offset 5: if size = 1 then 6: newnode.left NIL 7: newnode.right NIL 8: newnode.i newnode.i + 1 9: else 10: newnode.left InitTree(leftsize,offset) 11: newnode.right InitTree(size leftsize,offset + leftsize) 1: end if 1: return newnode Algoritmus pro nalezení součtu čísel přiřazených intervalům do kterých patří dané číslo k pouze sčítá hodnoty na cestě k listu s hodnotou k. Get(tree, k) 1: if tree = NIL then : return 0 : else if k tree.i then 4: return Get(tree.left,k) + tree.val 5: else 6: return Get(tree.right,k) + tree.val 7: end if 7

IB108 Sada 1, Příklad 4 Algoritmus pro změnu čísla nejprve přičte rozdíl nové a staré hodnoty do uzlů s vlastností uvedenou na začátku a poté novou hodnotu zapíše do pole. Cesty k hraničním uzlům se neprochází explicitně dvakrát, místo toho se zjišt uje vztah intervalu který měníme a intervalů, které jsou reprezentovány oběma podstromy a podle toho se bud algoritmus rekurzivně zavolá na daný podstrom, nebo je do kořene podstromu přičten rozdíl hodnot, nebo se neprovede nic. Pro levý i pravý podstrom se tedy zjišt uje, zda: Interval reprezentovaný daným podstromem je celý obsažen v měněném intervalu. Pokud ano, je v jeho kořeni obsažena hodnota tohoto intervalu a přičteme do něj tedy rozdíl nové a staré hodnoty (podmínky na řádcích 5 a 10). Interval reprezentovaný daným podstromem je částečně obsažen v měněném intervalu. Pokud ano, leží v něm hraniční bod intervalu, ke kterému se rekurzivním voláním přiblížíme (podmínky na řádcích 7 a 1). Konjunkce podmínek na řádcích 7 a 1, tedy situace, kdy levý krajní bod leží v levém podstromě a pravý v pravém, a kdy dojde ke dvěma rekurzivním voláním, může zřejmě nastat pouze jednou. Update(int begin, int end, newvalue) 1: Update (Tree,0,n,int begin,int end,newvalue Arr[int begin][int end]) : Arr[int begin][int end] newvalue Update (node, begin, end, int begin, int end, updval) 1: left begin begin : left end node.i : right begin left end+1 4: right end end 5: if left begin int begin left end int end then 6: node.left.val node.left.val + updval 7: else if int begin left end then 8: Update (node.left, left begin, left end, int begin, int end, updval) 9: end if 10: if right begin int begin right end int end then 11: node.right.val node.right.val + updval 1: else if right begin int end then 1: Update (node.right, right begin, right end, int begin, int end, updval) 14: end if 8

IB108 Sada 1, Příklad 5 Rozdělme kredity následovně (cena je vyjádřena jako počet přístupů do pole): Operace Kredity Cena Přidej 1 1 Sečti 4 Odstraň-Maximum 0 cena shora ohraničena hodnotou odstraňovaného prvku Při každém použití operace Sečti přidáme na účet jeden kredit. Získáváme tak invariant, že každé číslo n v multimnožině má na účtu n 1 kreditů. Jinými slovy, každému indexu pole i (s hodnotou Arr[i]) je přiřazeno Arr[i] (i 1) kreditů. Důkaz indukcí podle indexu i: Báze (i = 1) Nula kreditů triviálně platí. Indukční krok Předpokládejme, že pro i = 1... n tvrzení platí. Pak každé číslo n + 1 v multimnožině muselo vzniknout součtem dvou čísel 1 a, b n, takže bude mít přiřazen součet jejich kreditů a navíc jeden kredit za operaci Sečti. Tedy (a 1) + (b 1) + 1 = a + b 1 = (n + 1) 1 = n kreditů. Cena operace Odstraň-Maximum je v nejhorším případě rovna hodnotě odstraňovaného maxima. Takový případ nastane, pokud je aktuální maximum n jediným prvkem multimnožiny a po jeho odstranění se musí prohledat všechny indexy menší než n, aby se určilo nové maximum. Protože má n na účtu n 1 kreditů, můžeme zaplatit prohledání těchto n 1 indexů, aniž bychom uvedli účet do záporného stavu. V případě, že jsou v multimnožině ještě nějaké prvky, může být skutečná cena operace menší. To, že nám nějaké kredity zbudou ovšem není podstatné. Posloupnost n operací bude stát nejvýše 4n kreditů a je tím pádem v O(n). 9

IB108 Sada 1, Příklad 6 1. Tvrzení neplatí. Protipříklad: Necht n N je vhodný, velký počet operací. Uděláme n operací IN- SERT(S,i), poté budeme už jen střídat operace MIN-ALL(S) a INSERT(S,i+1) (v tomto pořadí). Takže uděláme n + n operací INSERT(S, ) a n operací MIN- 4 4 ALL(S), které odeberou jen prvek i+1 (cena bude n +1). Tedy časová složitost těchto n operací bude n 1 + n ( n + 1) Θ (n ). 4 4. Tvrzení platí. Analyzujeme technikou účtů: Každá operace INSERT(S, ) si přinese kredity. 1 kredit se použije na zaplacení operace vložení, 1 kreditem se zaplatí (pokud to bude třeba) přístup na prvek při operaci MIN-ONE(S). MIN-ONE(S) si nepřinese žádný kredit. Invariantem tedy bude: na účtu máme alespoň krát tolik kreditů, kolik máme prvků v seznamu S. Protože operace MIN-ONE(S) odstraní ze seznamu alespoň 1 prvek (jinak by byla nezajímavá - stála konstantní cenu), můžeme jeho 1 zbylý kredit vložit na účet jednoho neodstraněného prvku (ten na svém účtu už alespoň 1 kredit mít musel). Složitost n operací tedy bude O(n). 10

IB108 Sada 1, Příklad 9 Horní odhad Horní odhad provedeme konstrukcí a analýzou složitosti (ne nezbytně optimálního) algoritmu. Necht n značí počet disků se kterými algoritmus pracuje (na počátku roven celkovému počtu disků), m pozici aktuálně největšího disku. if n = 1 then return else obrat m disků (takže největší disk bude nahoře) obrat n disků (největší disk bude dole) rekurzivně zavolej tento algoritmus na n 1 horních disků end if Algoritmus využívá toho, že (podobně jako u zásobníku) můžeme pracovat jen s několika horními disky bez ohledu na to, co je pod nimi. Algoritmus je zřejmě konvergentní (rekurze se snižujícím se n) a korektně uspořádá disky (indukcí triviálně pro jeden disk, pro n + 1 disků nejprve přesune největší disk dospoda a potom uspořádá zbylých n disků). Přitom provede n operací,,obrat. Dolní odhad Pro provedení dolního odhadu si stačí uvědomit tyto skutečnosti: Cílové uspořádání disků má tu vlastnost, že každá dvojice vzájemně sousedících disků se velikostí liší o jedničku. Tedy pro n disků existuje n 1 sousedících dvojic takových, že se liší právě o jedna. Provedením jedné operace se počet dvojic takových, které se liší o jedničku změní nejvýše o jednu takovou dvojici (Obrátíme-li m disků, zrušíme dvojici m, m + 1 a vznikne nám dvojice 1, m + 1, ostatním diskům zůstanou původní sousedé). Z těchto pozorování vyplývá, že máme-li n disků v pořadí 1, n,, n 1,, n,..., n, n + 1 (pro sudá n) nebo n n 1, n,, n 1,, n,..., + 1, (pro lichá n), tedy takovém, kdy pouze jedna sousedící dvojice je ve správném pořadí, potřebujeme provést alespoň n operací otočení, abychom mohli dosáhnout toho, že budou disky seřazené podle velikosti. Dostáváme tedy A O(n) a zároveň A Ω(n), což mimo jiné znamená, že algoritmus z horního odhadu je asymptoticky optimální. 11