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



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

A0M15EZS Elektrické zdroje a soustavy ZS 2011/2012 cvičení 1. Jednotková matice na hlavní diagonále jsou jedničky, všude jinde nuly

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.

8. Geometrie vrací úder (sepsal Pavel Klavík)

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

0. Lineární rekurence Martin Mareš,

Regulární matice. Věnujeme dále pozornost zejména čtvercovým maticím.

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

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

Algoritmizace prostorových úloh

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

Jazyk matematiky Matematická logika Množinové operace Zobrazení Rozšířená číslená osa

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

Součin matice A a čísla α definujeme jako matici αa = (d ij ) typu m n, kde d ij = αa ij pro libovolné indexy i, j.

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

ALGORITMY A DATOVÉ STRUKTURY

GRAFY A GRAFOVÉ ALGORITMY

1. Vyhledávání a tøídìní

NPRG030 Programování I, 2018/19 1 / :03:07

3. Matice a determinanty

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

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

Matice. Přednáška MATEMATIKA č. 2. Jiří Neubauer. Katedra ekonometrie FEM UO Brno kancelář 69a, tel

Skalární součin je nástroj, jak měřit velikost vektorů a úhly mezi vektory v reálných a komplexních vektorových prostorech.

Vektorové podprostory, lineární nezávislost, báze, dimenze a souřadnice

12. Aproximační algoritmy

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

Elegantní algoritmus pro konstrukci sufixových polí

Sbírka příkladů. verze

Dynamické programování

Prioritní fronta, halda

Základy algoritmizace a programování

Stromy, haldy, prioritní fronty

2 Spojité modely rozhodování

Algoritmizace Dynamické programování. Jiří Vyskočil, Marko Genyg-Berezovskyj 2010

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

Náplň. v Jednoduché příklady na práci s poli v C - Vlastnosti třídění - Způsoby (algoritmy) třídění

Prohledávání do šířky = algoritmus vlny

KATEDRA INFORMATIKY UNIVERZITA PALACKÉHO LINEÁRNÍ ALGEBRA 1 OLGA KRUPKOVÁ VÝVOJ TOHOTO UČEBNÍHO TEXTU JE SPOLUFINANCOVÁN

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

Skalár- veličina určená jedním číselným údajem čas, hmotnost (porovnej životní úroveň, hospodaření firmy, naše poloha podle GPS )

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

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

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

Jak pracovat s absolutními hodnotami

0.1 Úvod do lineární algebry

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.

Euklidovský prostor Stručnější verze

Maticové operace projekt č. 3

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

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

Stochastické modely: prezentace k přednášce

Složitost a NP-úplnost

v nichž byly zadány, s možnou výjimkou konstantně mnoha tzv. pracovních

2. Matice, soustavy lineárních rovnic

2.2. SČÍTÁNÍ A NÁSOBENÍ MATIC

Lineární algebra II. Adam Liška. 9. února Zápisky z přednášek Jiřího Fialy na MFF UK, letní semestr, ak. rok 2007/2008

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

Lineární algebra : Násobení matic a inverzní matice

H {{u, v} : u,v U u v }

Kapitola 1. Tenzorový součin matic

ALGORITMIZACE PROGRAMOVÁNÍ VT3/VT4

ˇ razen ı rychlejˇ s ı neˇ z kvadratick e Karel Hor ak, Petr Ryˇsav y 20. dubna 2016 Katedra poˇ c ıtaˇ c u, FEL, ˇ CVUT

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

KOMPLEXNÍ ČÍSLA INVESTICE DO ROZVOJE VZDĚLÁVÁNÍ. Tento projekt je spolufinancován Evropským sociálním fondem a státním rozpočtem České republiky

VYBRANÉ PARTIE Z NUMERICKÉ MATEMATIKY

Matematika (CŽV Kadaň) aneb Úvod do lineární algebry Matice a soustavy rovnic

Lineární algebra : Násobení matic a inverzní matice

Maturitní téma: Programovací jazyk JAVA

Kolekce ArrayList. Deklarace proměnných. Import. Vytvoření prázdné kolekce. napsal Pajclín

FP - SEMINÁŘ Z NUMERICKÉ MATEMATIKY. Katedra matematiky a didaktiky matematiky Technická univerzita v Liberci

Vektory a matice. Obsah. Aplikovaná matematika I. Carl Friedrich Gauss. Základní pojmy a operace

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

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

Přehled učiva matematiky 7. ročník ZŠ

Lineární algebra Operace s vektory a maticemi

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

[1] Determinant. det A = 0 pro singulární matici, det A 0 pro regulární matici

Vztah teorie vyčíslitelnosti a teorie složitosti. IB102 Automaty, gramatiky a složitost, /31

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

Teorie informace a kódování (KMI/TIK) Reed-Mullerovy kódy

Kombinatorický předpis

Ukážeme si lineární algoritmus, který pro pevné k rozhodne, zda vstupní. stromový rozklad. Poznamenejme, že je-li k součástí vstupu, pak rozhodnout

Jednoduché cykly

Algoritmus pro hledání nejkratší cesty orientovaným grafem

Matematika I: Aplikované úlohy

Úvod do informatiky. Miroslav Kolařík

PROGRAMOVÁNÍ. Cílem předmětu Programování je seznámit posluchače se způsoby, jak algoritmizovat základní programátorské techniky.

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

A4B33ALG 2010/05 ALG 07. Selection sort (Select sort) Insertion sort (Insert sort) Bubble sort deprecated. Quicksort.

0.1 Úvod do lineární algebry

předmětu MATEMATIKA B 1

Kolik existuje různých stromů na pevně dané n-prvkové množině vrcholů?

Algoritmy I, složitost

8. Posloupnosti, vektory a matice

opravdu považovat za lepší aproximaci. Snížení odchylky o necelá dvě procenta

28.ročník. Milý řešiteli!

Soustavy lineárních rovnic

4. Lineární nerovnice a jejich soustavy

Zadání projektů z BPC2 pro letní semestr 2007/2008

Transkript:

13. Třídící algoritmy a násobení matic Minulou přednášku jsme probírali QuickSort, jeden z historicky prvních třídících algoritmů, které překonaly kvadratickou složitost aspoň v průměrném případě. Proč se dodnes používá, když známe algoritmy, které mají složitost Θ(n log n) i v nejhorším případě? Protože QuickSort se k paměti chová téměř sekvenčně, takže na dnešních počítačích běží rychle. Podívejme se na pár nápadů pro skutečné naprogramování tohoto algoritmu. Určitě nám vadí překopírovávat z a do pomocných polí. Naštěstí můžeme přerovnávat přímo v původním poli. Zleva budeme dávat prvky menší než pivot, zprava většínežpivot.natotostačíudržovatsidvaindexy aab,kteréznačí,jakdaleko vlevo(vpravo) už jsou správné prvky. Rekurzivní programy mají zbytečně velkou režii. Proto implementujme vlastní zásobník na hranice úseků, které zbývá setřídit. Vždy větší interval vložíme na zásobník a menší rovnou zpracujeme. Na zásobníku proto bude maximálně log n položek. Malé podproblémy dotřídíme nějakým triviálním algoritmem například Insert- Sortem.Odhadempro n=10jetoprodnešnípočítačevýhodné(zjišťujeseexperimentálně). Zoo třídících algoritmů Porovnejme nyní známé třídící algoritmy. Definice: Stabilní třídění říkáme takovému, které u prvků se stejnou hodnotou klíče zachová jejich vzájemné pořadí, v jakém byly na vstupu.(to se hodí například při lexikografickém třídění, kde se napřed třídí podle nejméně významné složky a pak podle významějších.) Definice: Pokud třídíme prvky na místě (tedy vstup dostaneme zadaný v poli a v tomtéž poli pak vracíme výstup), za pomocnou paměť třídícího algoritmu prohlásíme veškerou využitou paměť mimo vstupní pole. Čas Pomocná paměť Stabilní InsertSort Θ(n 2 ) Θ(1) + MergeSort Θ(n log n) Θ(n) + HeapSort Θ(n log n) Θ(1) QuickSort Θ(n log n) Θ(log n) Poznámky k tabulce: QuickSort má jen průměrnou časovou složitost Θ(n log n). Můžeme ale říct, že porovnáváme průměrné časové složitosti, protože u ostatních algoritmů vyjdou stejně jako jejich časové složitosti v nejhorším případě. HeapSort třídění pomocí haldy. Do haldy vložíme všechny prvky a pakjevybereme.celkemθ(n)operacíshaldou,každázaθ(logn). Navíctutohaldumohustavětirozebíratvpoli,vekterémdostanu vstup. 1 2011-07-31

MergeSort jde implementovat s konstantní pomocnou pamětí za cenu konstantního zpomalení, ovšem konstanta je neprakticky velká. MergeSort je stabilní, když dělím pole na poloviny. Není při třídění spojových seznamů s rozdělováním prvků na sudé a liché. QuickSort se dá naprogramovat stabilně, ale potřebuje lineárně pomocné paměti. ŽádnýalgoritmusvtabulcenetřídilrychlejinežΘ(nlogn).Tonenínáhoda následujícívětanámříká,žetonejde: Věta: Každý deterministický třídící algoritmus, který tříděné prvky pouze porovnává a kopíruje, má časovou složitost Ω(n log n). (O průměrné časové složitosti pravděpodobnostních třídících algoritmů se dá dokázat podobná věta.) Důkaz: Dokážeme, že každý porovnávací třídící algoritmus potřebuje v nejhorším případě provést Ω(n log n) porovnání, což dává přirozený dolní odhad časové složitosti. Přesněji řečeno, dokážeme, že pro každý algoritmus existuje vstup libovolné délky n, na němž algoritmus provede Ω(n log n) porovnání. Bez újmy na obecnosti sebudemezabývatpouzevstupy,kteréjsoupermutacemimnožiny {1,...,n}.(Stačí námnajítjeden těžký vstup,pokudhonajdememezipermutacemi,úkoljsme splnili.) Mějme tedy deterministický algoritmus a nějaké pevné n. Sledujme, jak algoritmus porovnává u každého porovnání zaznamenáme polohy porovnávaných prvků tak, jak byly na vstupu. Jelikož algoritmus je deterministický, porovná na začátku vždy tutéž dvojici prvků. Toto porovnání mohlo dopadnout třemi různými způsoby (větší, menší, rovno). Pro každý z nich je opět jednoznačně určeno, které prvky algoritmus porovná, a tak dále. Po provedení posledního porovnání algoritmus vydá jako výstup nějakou jednoznačně určenou permutaci vstupu. Chování algoritmu proto můžeme popsat rozhodovacím stromem. Vnitřní vrcholy stromu odpovídají porovnáním prvků, listy odpovídají vydaným permutacím. Ze stromu vynecháme větve, které nemohou nastat(například pokud už víme, že x 1 < x 3 a x 3 < x 6,apřijdenařaduporovnání x 1 s x 6,užjejasné,jakdopadne). Počet porovnání v nejhorším případě je roven hloubce stromu. Jak ji spočítat? Všimneme si, že pro každou z možných permutací na vstupu musí chod algoritmu skončit v jiném listu(jinak by existovaly dvě různé permutace, které lze setřídit týmiž prohozeními, což není možné). Strom tedy musí mít alespoň n! různých listů. Hloubka rozhodovacího stromu odpovídá počtu porovnání. My chceme dokázat, žeporovnánímusíbýtaspoňω(nlogn). Lemmátko:Ternárnístromhloubky kmánejvýše3 k listů. Důkazík: Uvažme ternární strom hloubky k s maximálním počtem listů. V takovém stromu budou všechny listy určitě ležet na poslední hladině (kdyby neležely, můžeme pod některý list na vyšší hladině přidat další dvavrcholyazískattak listnatější stromstejnéhloubky).jelikožna i-téhladinějenejvýše3 i vrcholů,všechlistůjenejvýše3 k. 2 2011-07-31

Ztohotolemmátkaplyne,žerozhodovacístrommusíbýthlubokýalespoňlog 3 n!. Zbytek už je snadné cvičení z diskrétní matematiky: Lemmátko: n! n n/2. Důkazík:n!= (n!) 2 = 1(n 1) 2(n 2)... n 1,cožmůžemetaké zapsatjako 1(n 1) 2(n 2)... n 1.Přitomprokaždé1 k n jek(n+1 k)=kn+k k 2 = n+(k 1)n+k(1 k)=n+(k 1)(n k) n. Protojekaždázodmocninvětšíneborovnan 1/2 a n! (n 1/2 ) n = n n/2. Hloubkastromutedyčiníminimálnělog 3 n! log 3 (n n/2 )=n/2 log 3 n=ω(nlogn), což jsme chtěli dokázat. Ukázalijsmesitříděnívčase O(NlogN)atakédokázali,želíptovobecném případě nejde. Naše třídící algoritmy jsou tedy optimální(až na multiplikativní konstantu). Opravdu? Překvapivě můžeme třídit i rychleji věta omezuje pouze třídění pomocí porovnávaní.cokdyžovstupuvímevíc,třebažejetvořenčíslyzomezenéhorozsahu. Counting sort Counting sort je algoritmus pro třídění N celých čísel s maximálním rozsahem hodnot R.TřídívčaseΘ(N+R)spaměťovounáročnostíΘ(R). Algoritmus postupně prochází vstup a počítá si ke každému prvku z rozsahu, kolikrát jej viděl. Poté až projde celý vstup, projde počítadla a postupně vypíše všechna čísla z rozsahu ve správném počtu kopií. Algoritmus:(tříděníposloupnosti x 1,...,x N {1,...,R}pomocíCountingsortu) 1.Pro i=1...ropakujeme: 2. p i 0 3.Pro i=1...nopakujeme: 4. p xi p xi +1 5. j 1 6.Pro i=1...ropakujeme: 7. Pokud p i 0: 8. v j i 9. j j+1 10.Vrátímevýsledek v 1,...,v N. Přihrádkové třídění Counting sort nám moc nepomůže, pokud chceme třídit ne přímo celá čísla, nýbrž záznamy s celočíselnými klíči. Na ty se bude hodit přihrádkové třídění neboli Bucket-sort( kbelíkovétřídění ). Uvažujmeopět N prvkůsklíčivrozsahu1,...,r.pořídímesi Rpřihrádek P 1,...,P R,prvkydonichroztřídímeapakpostupněvypíšemeobsahpřihrádek v pořadí podle klíčů. PotřebujemektomučasΘ(N+ R)apaměťΘ(N+ R).Navícsejednáostabilní algoritmus. 3 2011-07-31

Algoritmus:(tříděníprvků x 1,...,x n sklíči c 1,...,c n {1,...,R}pomocíbucketsort u) 1. P 1...P R 2.Pro i=1...n: 3. Vložíme x i do P ci. 4.Pro j=1...r 5. Vypišemeobsah P j. Lexikografické třídění k-tic Mějme nuspořádanýchk-ticprvkůzmnožiny{1...r} k.úkolzníseřaditk-tice slovníkově(lexikograficky). Můžeme použít metodu rozděl a panuj, takže prvky setřídíme nejprve podle první souřadnice k-tic a pak se rekurzivně zavoláme na každou přihrádku a třídíme podle následující souřadnice. Nebo můžeme využít toho, že bucket-sort je stabilní a třídit takto: Algoritmus: (třídění k-tic x 1,...,x n lexikografickypomocíbucket-sortu) 1. S x 1,...,x n. 2.Pro i=kaž1opakujeme: 3. S bucket-sort S podle i-té souřadnice. 4. Vydáme výsledek S. Propřehlednostvnásledujícímpozorováníoznačme l=k i+1,cožpřesně odpovídá tomu, v kolikátém průchodu cyklu jsme. Pozorování: Po l-tém průchodu cyklem jsou prvky uspořádány lexikograficky podle i-té až k-té souřadnice. Důkaz: Indukcí podle l: Pro l=1jsouprvkyuspořádánypodleposlednísouřadnice. Po l průchodech již máme prvky setříděny lexikograficky podle i- téaž k-tésouřadniceaspouštíme(l+1)-níprůchod,tj.budeme třídit podle(i 1)-ní souřadnice. Protože bucket-sort třídí stabilně, zůstanou prvky se stejnou(i 1)-ní souřadnicí vůči sobě seřazeny tak,jakbylyseřazenynavstupu.ziptamvšakbylyseřazeny lexikograficky podle i-té až k-té souřadnice. Tudíž po(l + 1)-ním průchodu jsou prvky seřazeny podle(i 1)-ní až k-té souřadnice. ČasovásložitostjeΘ(k (n+r)),cožjelineárnísdélkouvstupu(k n)pro pevné ka R;paměťovásložitostčiníΘ(n+R). Tříděníčísel1...Rpodruhé(Radixsort) Zvolíme základ Z a čísla zapíšeme v soustavě o základu Z, čímž získáme ( log z R +1)-tice,nakteréspustímepředcházejícíalgoritmus.DíkytomubudemetříditvčaseΘ( logr logz (n+z)).jakzvolitvhodné Z? Pokud bychom zvolili Z konstantní, časová složitost bude Θ(log R n), což může být nlognneboivíc.zvolíme-li Z= n,dostávámeθ( logr logn n),cožpro R nα znamená O(αn). Polynomiálně velká celá čísla jde tedy třídit v lineárním čase. 4 2011-07-31

Třídění řetězců (Na přednášce letos nebylo, ale pro úplnost uvádíme.) Mějme nřetězců r 1,r 2...r n dlouhých l 1,l 2...l n Označmesi L=max 1 i n l i délku nejdelšího řetězce a R počet znaků abecedy. Problémje,žeřetězcenemusíbýtstejnědlouhé(pokudbybyly,lzesenařetězce dívat jako na k-tice, které už třídit umíme). S tím se můžeme pokusit vypořádat doplněním řetězců mezerami tak, aby měly všechny stejnou délku, a spustit na něj algoritmus pro k-tice. Tím dostaneme algoritmus, který bude mít časovou složitost O(Ln), což bohužel může být až kvadratické vzhledem k velikosti vstupu. Příklad:navstupumějmekřetězců,kdeprvníchk 1znichbudemítdélku1a poslednířetězecbudedlouhýpřesněk.vstupmátedycelkovoudélku2k 1amyteď doplníme prvních k 1 řetězců mezerami. Vidíme, že algoritmus teď bude pracovat v čase O(k 2 ).To,conámnejvícezpůsobovaloproblémyupředchozíhopříkladu,bylo velké množství času zabraného porovnáváním doplněných mezer. Zkusíme proto řešit náš problem trochu chytřeji a koncové mezery do řetězů vůbec přidávat nebudeme. Nejprveroztřídímebucket-sortemřetězcedopřihrádek(množin)P i podlejejich délek,kde iznačídélkuřetězcůvdanépřihrádce,nebolidefinujme P i = {r j l j = i}. Dále si zavedeme seznam setříděných řetězců S takový, že v něm po k-tém průchodu třídícím cyklem budou řetězce s délkou alespoň L k+1(označme l) a zároveň v něm tyto řetězce budou setříděny lexikograficky od l-tého znaku po L-tý. Z definice tohoto seznamu je patrné, že po L krocích třídícího cyklu bude tento seznam obsahovat všechny řetězce a tyto řetězce v něm budou lexikograficky seřazeny. Zbýváužjenpopsat,jaktentocykluspracuje.Nejprvevezme l-toumnožinu P l ajejířetězceroztřídídopřihrádek Q j (kdeindex jznačíj-týznakabecedy)podle jejich l-tého(neboli posledního) znaku. Dále vezme seznam S a jeho řetězce přidá opětpodlejejich l-téhoznakudostejnýchpřihrádek Q j zajiždřívepřidanéřetězce z P l.nazávěrpostupněprojdevšechnypřihrádky Q j ařetězcevnichpřesunedo seznamu S.Protožeřetězcezpřihrádek Q j budebrátvestejnémpořadí,vjakém donichbylyumístěny,aprotožezeseznamu S,kterýjesetřízenýpodle(l+1)-ního znaku po L-tý, bude také brát řetězce postupně, bude seznam S po k-tém průchodu přesně takový, jaký jsme chtěli(indukcí bychom dokázali, že cyklus pracuje skutečně správně). Zároveň z popisu algoritmu je jasné, že během třídění každý znak každého řetězce použijeme právě jednou, tudíž algoritmus bude lineární s délkou vstupu (pro úplnost dodejme, že popsaný algoritmus funguje v případech, kdy abeceda má pevnou velikost). Algoritmus:(třídění řetězců) 1. L max(l 1,l 2,...,l n ) 2.Pro i 1do Lopakuj: 3. P i 4.Pro i 1do nopakuj: 5. pridej(p li,r i ) 6. S 7.Pro i Ldo1opakuj: 5 2011-07-31

8. Pro j 1do Ropakuj: 9. Q j 10. Pro j 1dovelikost(P i )opakuj: 11. vezmi(p i,r) 12. pridej(q r[i],r) 13. Pro j 1dovelikost(S)opakuj: 14. vezmi(s, r) 15. pridej(q r[i],r) 16. S 17. Pro j 1do Ropakuj: 18. Pro k 1dovelikost(Q j )opakuj: 19. vezmi(q j,r) 20. pridej(s, r) 21. výsledek S Časovásložitosttohotoalgoritmutedybude O(RN),kde Njedélkavstupua R počet znaků abecedy. Zoo třídících algoritmů podruhé Doplňme tedy naši tabulku: Čas Pomocná paměť Stabilní InsertSort Θ(n 2 ) Θ(1) + MergeSort Θ(n log n) Θ(n) + HeapSort Θ(n log n) Θ(1) QuickSort Θ(n log n) Θ(log n) BucketSort Θ(n + R) Θ(n + R) + k-tice Θ(k(n + R)) Θ(n + R) + RadixSort Θ(nlog n R) Θ(n) + K čemu je vlastně třídění dobré? Díky němu můžeme rychle vyhledávat prvky v množině, konkrétně v čase O(log n) např. pomocí půlení intervalů. Dalším problémem, na který se hodí použít třídění, je zjištění, zda se v posloupnosti nějaké její hodnoty opakují. Dá se dokázat, že tuto úlohu nelze vyřešit lépe(rychleji), než tak, že hodnoty nejprve setřídíme a poté setříděnou posloupnost projdeme. Násobení matic n n a Strassenův algoritmus Nejdříve si připomeneme definici násobení dvou čtvercových matic typu n n. Platí,žeprvekvi-témřádkuaj-témsloupcivýslednématice Z serovnástandardnímu skalárnímu součinu i-tého řádku první matice X a j-tého sloupce druhé matice Y. Formálně zapsáno: Z ij = n X ik Y kj. k=1 6 2011-07-31

_ j _i X = ( i,j) X Y Z Násobení matic Algoritmus, který by násobil matice podle této definice, by měl časovou složitost Θ(n 3 ),protožepočetprvkůvevýslednématicije n 2 ajedenskalárnísoučinvektorů dimenze n vyžaduje lineární počet operací. My se s touto časovou složitostí ovšem nespokojíme a budeme postupovat podobně jako při vylepšování algoritmu na násobení velkých čísel. Bez újmy na obecnostipředpokládejme,žebudemenásobitdvěmaticetypu n n,kde n=2 k,k Æ. Obě tyto matice rozdělíme na čtvrtiny a tyto části postupně označíme u matice X písmeny A, B, Ca D,umatice Y písmeny P, Q, RaS.Zdefinicenásobenímatic zjistíme, že čtvrtiny výsledné matice Z můžeme zapsat pomocí součinů částí násobených matic. Levá horní čtvrtina bude odpovídat výsledku operací AP + BR, pravá horníčtvrtinabude AQ+BS,levádolní CP+DRazbylá CQ+DS(vizobrázek). A B P Q AP+BR AQ+BS X = C D R S CP+DR X Y Z Násobení rozčtvrcených matic CQ+DS Převedli jsme tedy problém násobení čtvercových matic řádu n na násobení čtvercových matic řádu n/2. Tímto rozdělováním bychom mohli pokračovat, dokud bychom se nedostali na matice řádu 1, jejichž vynásobení je triviální. Dostali jsme tedy klasický algoritmus typu rozděl a panuj. Pomohli jsme si ale nějak? V každém kroku provádíme 8 násobení matic polovičního řádu a navíc konstantní počet operací na n 2 prvcích.dostávámetedyrekurentnízápisčasovésložitosti: ( n T(n)=8T +Θ(n 2) 2 ). PoužitímMasterTheoremulehcedojdemekzávěru,žesložitostjestáleΘ(n 3 ), tedy stejná jako při násobení matic z definice. Zdánlivě jsme si tedy nepomohli, ale stejně jako tomu bylo u násobení velkých čísel, i teď můžeme zredukovat počet násobení matic polovičního řádu, které nejvíce ovlivňuje časovou složitost algoritmu. Není to bohužel nic triviálního, a proto si raději rovnou řekneme správné řešení. 7 2011-07-31

Jedná se o Strassenův algoritmus, který redukuje potřebný počet násobení na 7, aještěpředtím,nežsiukážeme,jakfunguje,dokážemesi,jaknámtosčasovou složitostí vlastně pomůže: T(n)=7T ( n 2) +Θ(n 2 )= Θ(n log 2 7 )=O(n 2.808 ). VýslednásložitostStrassenovaalgoritmujetedy O(n 2.808 ),cožjesicemalé,ale pro velké matice znatelné zlepšení oproti algoritmu vycházejícímu přímo z definice. Lemma:(vzorce pro násobení blokových matic ve Strassenově algoritmu) ( ) ( ) ( ) A B P Q T1 +T 4 T 5 +T 7 T 3 +T 5 =, C D R S T 2 +T 4 T 1 T 2 +T 3 +T 6 kde: T 1 =(A+D) (P+S) T 5 =(A+B) S T 2 =(C+D) P T 3 = A (Q S) T 4 = D (R P) T 6 =(C A) (P+Q) T 7 =(B D) (R+S) Důkaz:Dočtverců4 4sinapíšemeznaky+nebo podletoho,jestlisepřivýpočtu dané matice přičítá nebo odečítá příslušný součin dvou matic. Řádky znamenají matice A, B, Ca Dasloupceznačímatice P, Q, RaS.Pokudsetedyvprvním řádku a prvním sloupci vyskytuje znak +, znamená to že přičteme součin matic AaP.Nejdřívesispočítámepomocnématice T 1 až T 7 aznichpakdopočítáme,co bude na příslušných místech ve výsledné matici. T 1 = + + + + T 2 = + + T 3 = + - T 4 = - + T 5 = + + T 6 = - - ++ T 7 = ++ - - 8 2011-07-31

T 1 +T 4 T 5 +T 7 = + + = AP+BR T 3 +T 5 = + + = AQ+BS T 2 +T 4 = + + = CP+DR T 1 T 2 +T 3 +T 6 = + = CQ+DS + Jak je vidět, výsledná matice je tvořena stejnými částmi jako při obyčejném násobení. Touto kapitolou jsme tedy dokázali následující větu: Věta: Strassenův algoritmus pro násobení matic n n má časovou složitost v nejhoršímpřípadě O(n 2.808 ). Poznámka:Zatímnejlepšídokázanýalgoritmusmáčasovousložitost O(n 2.376 ),leč s velkou multiplikativní konstantou. Dosažitelnost v grafech pomocí Strassenova algoritmu Matice mohou souviset s mnoha na první pohled nesouvisejícími problémy. Lemma:NechťAjematicesousednostigrafu,nechťS (k) z,j označímepočetsledůdélkyk zvrcholu jdovrcholu i.pak S (k) = A k. Důkaz: Indukcí podle k: S (1) = A S (k+1) i,j = z:(i,z) E(G) S(k) z,j = n z=1 A i,zs (k) z,j =(AS(k) ) i,j Přidáním smyček do matice A zjistíme dostupnost vrcholů po cestách dlouhých k nebo kratších. Stačítedyspočítatmatici B=(A+E) k prolibovolné k n(ejejednotková matice).pak B i,j 0právěkdyžexistujecestazvrcholu idovrcholu j. ProvypočítáníBnámstačí logn umocněnímaticenadruhou,cožjespeciální případnásobenímatic.časovásložitostceléhoalgoritmutedyčiní O(n log 7 logn). 2 Musíme však dávat pozor a normovat čísla(nulu necháme, nenulová nahradíme při každém násobení jedničkou), aby nám nepřerostla přes hlavu a hlavně přes maximální integer. 9 2011-07-31