# check invariant holds
while condition:
# check (condition and invariant) holds
# do, what must be done
# check (!condition and invariant) holds
Korektnost a složitost algoritmu
Editovat
Note
|
Parciální a totální korektnost, důkazy korektnosti. Asymptotická složitost, O-notace. Zdůvodnění korektnosti a složitosti základních algoritmů (např. řadicí algoritmy, binární vyhledávání). IB002, IB102/IB107 |
Algoritmy
Algoritmus je posloupnost příkazů, kterou je schopen provést Turingův stroj nebo jeho ekvivalent.
- Vstupní podmínka
-
Ze všech možných vstupů pro daný algoritmus vymezujeme ty, pro které je algoritmus definován.
- Výstupní podmínka
-
Pro každý vstup daného algoritmu splňující vstupní podmínku určuje, jak má vypadat odpovídající výsledek.
- Invariant cyklu
-
Invariant cyklu je tvrzení cyklu v algoritmu, které platí před a po vykonání každé jeho iterace.
Přesněji:
- Délka výpočtu
-
Délka výpočtu konkrétního algoritmu na daném vstupu odpovídá počtu elementárních operací, ze kterých se výpočet skládá.
NoteCo je elementární operace? Záleží na algoritmu.
Korektnost
Algoritmus je parciálně korektní, pokud pro každý vstup, který splňuje vstupní podmínku a algoritmus na něm skončí, výstup splňuje výstupní podmínku.
Algoritmus je úplný (konvergentní), pokud pro každý vstup, jenž splňuje vstupní podmínku, výpočet skončí.
Algoritmus je totálně korektní, právě když je parciálně korektní a úplný.
Dokazovaní korektnosti
- U iterativního algoritmu
-
Pro každý cyklus algoritmu stanovíme invariant. Začínáme od nejvíce zanořených cyklů. Pro každý invariant dokážeme konečnost cyklu a jeho efekt. Činíme tak ve třech fázích:
-
inicializace — platnost invariantu před vykonáním cyklu.
-
iterace — invariant platí před i po každé iteraci,
-
ukončení — cyklus skončí a platný invariant garantuje požadovaný efekt cyklu.
-
- U rekurzivního algoritmu
-
Pomocí matematické indukce.
Složitost
Složitost vyjadřuje náročnost algoritmu na zdroje výpočtu (čas, paměť, počet procesorů, atd.).
- Časová složitost algoritmu
-
Funkce taková, že pro vstup délky daný algoritmus provede výpočet o délce nejvýše . Obvykle vyjadřujeme asymptoticky.
Asymptotická notace
Geometricky, asymptota křivky je přímka taková, že její vzdálenost od křivky se limitně blíží 0 v nekonečnu.
Note
|
Podstatné je, že asymptota je od určitého bodu nad nebo pod svojí křivkou a setkává se s ní až v nekonečnu. |
- notace
-
Je množina funkcí rostoucích stejně rychle jako , nebo pomaleji.
NoteGeometricky, jsou to všechny funkce , kterou jsou od nějakého bodu pod . - notace
-
Je množina funkcí rostoucích stejně rychle jako , nebo rychleji.
NoteGeometricky, jsou to všechny funkce , kterou jsou od nějakého bodu nad . - notace
-
Je množina funkcí rostoucích stejně rychle jako .
Note
|
Existuje i a , kde je rozdíl v tom, že . |
- Vlastnosti
Vlastnost | Formulka | Poznámka |
---|---|---|
Tranzitivita |
Stejně pro |
|
Reflexivita |
Stejně pro |
|
Symetrie |
||
Transpozice |
Korektnost a složitost základních algoritmů
Binární vyhledávání
def binsearch(x: int, S: List[int]) -> int:
f = 0
l = len(S) - 1
i = (f + l) // 2
while f != l:
if S[i] == x:
return i
if x < S[i]:
l = i
else:
f = i
i = (f + l) // 2
return -1
- Invariant
-
Na začátku každé iterace platí, že jestli se nalézá v , tak se nalézá mezi pozicemi (first) a (last).
- Inicializace
-
Na začátku je , takže tvrzení platí.
- Iterace
-
Pokud a , nachází se mezi pozicemi a . Pokud , pak mezi a . Pokud je vrácena hodnota , invariant také platí.
- Ukončení
-
Cyklus končí buď protože , nebo protože .
- Složitost
-
Řadicí algoritmy
Algoritmus | Složitost | Poznámka |
---|---|---|
Bubble sort |
invariant: rozsah |
|
Insert sort |
||
Merge sort |
||
Quick sort |
očekávaná složitost |
|
Heap sort |
||
Counting sort |
hodnoty z intervalu 0..k |
|
Radix sort |
čísla z d číslic, číslicové řazení |
|
Bucket sort |