Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Dolný odhad zložitosti problému triedenia

Každý, kto sa stretol s aspoň dvoma triediacimi algoritmy, si iste položil otázku, či môže existovať algoritmus, ktorý to urobí rýchlejšie. A tým rýchlejšie mám na mysli z hľadiska (asymptotickej) časovej zložitosti, teda či existuje kategoricky efektívnejší algoritmus. Zložitosťou problému (nie zložitosťou algoritmu) je teda myslená zložitosť úlohy, teda zložitosť najlepšieho možného algoritmu, ktorý úlohu vyrieši. V niektorých prípadoch algoritmus dokonca nemusí byť ani známy, ale my budeme vedieť, že existuje a že bude niekedy objavený. Teraz sa zameriame na problém triedenie prvkov.

Každý tu uvedený algoritmus nám dávali vlastne horný odhad zložitosti problému triedenia. Bubblesort mal časovú zložitosť O (n 2), vedeli sme teda, že triediť môžeme najhoršie s touto zložitosťou. Napr. Heap sort však ten istý problém zvládol s časovou zložitosťou O (n log n). Automaticky vieme, že to pôjde najhoršie takto. Ale môže existovať algoritmus s ešte lepšou časovou zložitosťou? Budeme predpokladať, že nie a toto tvrdenie sa pokúsime dokázať. Dokazujeme teda dolná zložitosť problému triedenia, teda že to nejde lepšie ako v O (n log n).

Dôkaz

Ak triedime na základe porovnávania prvkov (pre dvojice prvkov určujeme, ktorý je väčší, resp. Menší), môžeme každý takýto algoritmus zapísať ako rozhodovací strom. Rozhodovací strom je binárny strom, ktorý vo vnútorných vrcholoch obsahuje dvojice porovnávaných prvkov a v listoch ich permutácie. V každom liste je teda uložený jeden možný výstup algoritmu, vo všetkých listoch sú potom všetky možnosti, ako môžu byť prvky v poli zoradené.

Takýto rozhodovací strom pre pole 2 prvkov by bol jednoduchý, obsahoval by len koreň, v ktorom by sme sa spýtali: je a <b? Ak áno, dostali by sme permutáciu [a, b]. Ak nie, dostali by sme [b, a] a bolo by zotriedené. Rozhodovací strom však s pribúdajúcimi prvkami veľmi rýchlo rastie. Takto by vyzeral rozhodovací strom pre 3 prvky:

Rozhodovací strom pre 3 prvky - Triediace / radiacej algoritmy

Pre 4 prvky by bol strom asi 4x väčšie.

Ak triedime n prvkov, všetkých permutácií týchto prvku bude celkom určite n !, strom teda musí mať najmenej n! listov. Stromy hlúpejší algoritmov ich budú mať oveľa viac. Môžeme si predstaviť, že ten úplne najlepší algoritmus má ideálne strom sn! listy. V najhoršom prípade (ak pôjde po najdlhšej vetve) pri priechode od koreňa do listu urobí toľko nákupný, koľko má strom "úroveň", teda aká je výška stromu h.

Binárne strom výšky h bude určite obsahovať max. 2 ^ h listov.

Počet listov binárneho stromu výšky h - Triediace / radiacej algoritmy

Ako som spomenul vyššie, listov musí byť najmenej n !, aby bol strom úplný, inak by nejakú permutáciu vstupných prvkov nedokázal zotrieďiť. Budeme teda vychádzať z nerovnice:

Triediace / radiacej algoritmy

Po zlogaritmování dostaneme:

Triediace / radiacej algoritmy

Teraz sa podrobne zamerajme iba na n! a na to, či by sme ho nemohli pre naše potreby nejako upraviť. K ďalším krokom by sa nám veľmi hodilo dostať miesto n! výraz (n / 2) ^ (n / 2). To dosiahneme nasledujúcim trikom:
Pre lepšiu predstavu som na ukážku pridal členmi 8 !. n! si môžeme rozpísať ako:

Triediace / radiacej algoritmy

Keďže v našej pôvodnej nerovnicu bolo> = n !, môžeme si pokojne dovoliť n! zmenšiť a nerovnosť neporušíme. Vezmeme si teda len ľavú polovicu zo zápisu vyššie a tú pravú zahodíme.

Triediace / radiacej algoritmy

Môžeme si dokonca dovoliť nahradiť všetky členmi za n / 2, pretože každý člen je určite> = n / 2, nerovnosť teda opäť neporušíme.

Triediace / radiacej algoritmy

Vyššie uvedený výraz môžeme zapísať ako (n / 2) ^ (n / 2) a dosadiť do pôvodnej nerovnice.

Triediace / radiacej algoritmy

upravujeme:

Triediace / radiacej algoritmy

(Mocnina išla pred logaritmus, log. Podielu je rozdiel logaritmov, log 2 je 1, tú zanedbáme a zvýšim menovateľ). Dostávame teda h> = n / 4 log n.

Čo znamená, že každý algoritmus musí v najlepšom prípade urobiť Triediace / radiacej algoritmy
nákupný (konštantu sme schovali do symbolu Omega)

Dolné odhad zložitosti problému triedenie je Triediace / radiacej algoritmy
a teda nemôže existovať triediace algoritmus založený na základe spoločnej porovnávanie prvkov s lepšou časovou zložitosťou než touto. Všimnite si, že som zdôraznil založený na základe spoločnej porovnávanie prvkov. Že by to predsa len išlo rýchlejšie? O tom je nasledujúci článok - Counting sort :)


 

Všetky články v sekcii
Triediace / radiacej algoritmy
Článok pre vás napísal David Hartinger
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
David je zakladatelem ITnetwork a programování se profesionálně věnuje 15 let. Má rád Nirvanu, nemovitosti a svobodu podnikání.
Unicorn university David sa informačné technológie naučil na Unicorn University - prestížnej súkromnej vysokej škole IT a ekonómie.
Aktivity