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:

# check invariant holds
while condition:
    # check (condition and invariant) holds
    # do, what must be done
# check (!condition and invariant) holds
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á.

Note
Co 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.

Note
Geometricky, 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.

Note
Geometricky, 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 a[n-i-1:] je ve finální pozici

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