Funnelsort - Funnelsort
![]() | Tento článek má několik problémů. Prosím pomozte vylepši to nebo diskutovat o těchto otázkách na internetu diskusní stránka. (Zjistěte, jak a kdy tyto zprávy ze šablony odebrat) (Zjistěte, jak a kdy odstranit tuto zprávu šablony)
|
Funnelsort je na základě srovnání třídicí algoritmus. Je to podobné jako Sloučit třídění, ale je to algoritmus bez paměti cache, určené pro nastavení, kde je počet prvků k třídění příliš velký, aby se vešel do a mezipaměti kde se operace provádějí. Představil ho Matteo Frigo, Charles Leiserson, Harald Prokop a Sridhar Ramachandran v roce 1999 v kontextu mezipaměť model.[1][2]
Matematické vlastnosti
V model externí paměti, počet přenosů paměti, které potřebuje k provedení položky na stroji s velikostí mezipaměti a délka mezipaměti je , za předpokladu vysoké mezipaměti . Ukázalo se, že tento počet přenosů paměti je asymptoticky optimální pro srovnávací druhy. Funnelsort také dosahuje asymptoticky optimální běhové složitosti .
Algoritmus
Základní přehled
Funnelsort pracuje na souvislé řadě elementy. Chcete-li seřadit prvky, provede následující:
- Rozdělte vstup na pole velikosti a rekurzivně třídit pole.
- Sloučit seřazené sekvence pomocí a -fúze. (Tento proces bude popsán podrobněji.)
Funnelsort je podobný Sloučit třídění v tom, že je rekurzivně seřazen určitý počet dílčích polí, po kterém spojovací krok spojí dílčí pole do jednoho seřazeného pole. Sloučení provádí zařízení zvané k-fúze, které je popsáno v následující části.
k-mergeri
A k-merger bere seřazené sekvence. Po jednom vyvolání k-fúze vydá první prvky seřazené sekvence získané sloučením vstupních sekvencí k.
Na nejvyšší úrovni používá funnelsort a -jděte na sekvence délky , a vyvolá toto sloučení jednou.
The k-merger je vytvořen rekurzivně z -mergeri. Skládá se z vstup -mergeri a jeden výstup -fúze .v k vstupy jsou rozděleny na sady každý vstup. Každá z těchto sad je vstupem do jedné ze vstupních fúzí. Výstup každého sloučení vstupu je připojen k vyrovnávací paměti, a FIFO fronta které vydrží elementy. Vyrovnávací paměti jsou implementovány jako kruhové fronty.Výstupy vyrovnávací paměti jsou připojeny ke vstupům výstupního sloučení . Nakonec výstup je výstup celé k-fúze.
V této konstrukci bude jakékoli vstupní sloučení pouze výstupy položky najednou, ale vyrovnávací paměť, do které se vydává, má dvojnásobný prostor. To se děje tak, že lze sloučení vstupu volat pouze tehdy, když jeho vyrovnávací paměť nemá dostatek položek, ale že když se volá, vydává spoustu položek najednou (jmenovitě z nich).
A k-merger pracuje rekurzivně následujícím způsobem. Výstup prvků, rekurzivně vyvolá své výstupní sloučení krát. Než však zavolá , zkontroluje všechny své vyrovnávací paměti a vyplní všechny z nich, které jsou méně než z poloviny plné. K vyplnění i-té vyrovnávací paměti rekurzivně vyvolá odpovídající vstupní fúzi jednou. Pokud to nelze provést (kvůli sloučení vstupů), je tento krok přeskočen. Protože toto volání vychází prvky, vyrovnávací paměť obsahuje alespoň elementy. Na konci všech těchto operací k-merger má výstup první jejích vstupních prvků v seřazeném pořadí.
Analýza
Většina analýzy tohoto algoritmu se točí kolem analýzy složitosti k-fúze v prostoru a mezipaměti.
První důležitá vazba je, že k-fúze může zapadat prostor. Abychom to viděli, nechali jsme to označuje prostor potřebný pro k-fúzi. Aby se vešly nárazníky velikosti bere prostor. Aby se vešly menší nárazníky trvá prostor. Prostor tedy uspokojuje opakování . Toto opakování má řešení .
Z toho vyplývá, že existuje pozitivní konstanta takové, že problém s velikostí nanejvýš zapadá zcela do mezipaměti, což znamená, že nevznikají žádné další chyby mezipaměti.
Pronájem označit počet zmeškaných mezipaměti vzniklých voláním k-fúze, lze to ukázat To se provádí indukčním argumentem. Má to jako základní případ. Pro větší k můžeme omezit počet a - volá se merger. Sloučení výstupu se nazývá přesně krát. Celkový počet hovorů při sloučení vstupů je maximálně . To dává celkovou hranici rekurzivní volání. Algoritmus navíc kontroluje každou vyrovnávací paměť, aby zjistil, zda je třeba ji vyplnit. To se děje vyrovnává každý krok pro kroky vedoucí k maximu chybí mezipaměť pro všechny kontroly.
To vede k opakování , u kterého lze prokázat výše uvedené řešení.
Nakonec celková mezipaměť chybí pro celý druh lze analyzovat. Uspokojuje opakování To může být prokázáno, že má řešení
Líný trychtýř
Líný trychtýř je modifikace trychtýře, kterou zavedl Gerth Stølting Brodal a Rolf Fagerberg v roce 2002.[3]Modifikace spočívá v tom, že když je vyvolána fúze, nemusí vyplnit každou ze svých vyrovnávacích pamětí. Místo toho líně vyplní vyrovnávací paměť, pouze když je prázdná. Tato modifikace má stejný asymptotický běh a přenosy paměti jako původní trychtýř, ale má aplikace v mezipaměťových algoritmech pro řešení problémů ve výpočetní geometrii metodou známou jako zametání distribuce.
Viz také
Reference
- ^ M. Frigo, C.E. Leiserson, H. Prokop a S. Ramachandran. Algoritmy bez zapamatování mezipaměti. v Proceedings of the 40. IEEE Symposium on Foundations of Computer Science (FOCS 99), str. 285-297. 1999. Rozšířený abstrakt na IEEE, ve společnosti Citeseer.
- ^ Harald Prokop. Cache-Oblivious Algorithms. Diplomová práce, MIT. 1999.
- ^ Brodal, Gerth Stølting; Fagerberg, Rolf (25. června 2002). "Cache Oblivious Distribution Sweeping". Automaty, jazyky a programování. Přednášky z informatiky. 2380. Springer. 426–438. CiteSeerX 10.1.1.117.6837. doi:10.1007/3-540-45465-9_37. ISBN 978-3-540-43864-9. Citovat má prázdný neznámý parametr:
|1=
(Pomoc). Viz také delší technická zpráva.