Jaké jsou výhody binárních vyhledávacích stromů nad stoly mřížky?
Hashovací tabulky můžete vyhledat jakýkoli prvek v Theta (1) čas, a to je stejně snadné přidat prvek .... ale nejsem si jistý, z výhod jít opačně.
Jaké jsou výhody binárních vyhledávacích stromů nad stoly mřížky?
Hashovací tabulky můžete vyhledat jakýkoli prvek v Theta (1) čas, a to je stejně snadné přidat prvek .... ale nejsem si jistý, z výhod jít opačně.
One „výhoda“ binárního stromu je, že to může být překročen na seznam vypnutí všech prvků v pořadí. To není možné s hash tabulky, ale není normální provoz jednoho provedení do struktury hash.
HashTable by zabírají více místa, když je nejprve vytvořen - to bude mít k dispozici sloty pro prvky, které ještě musí být vloženy (ať už jsou nebo nejsou vůbec vložena), binární vyhledávací strom bude pouze tak velký, jak to potřebuje být. Také, když hash-table potřebuje více prostoru, rozšiřuje na jinou strukturu mohlo být časově náročné, ale to může záviset na realizaci.
Uvědomte si, že binární vyhledávací stromy (reference-based) jsou paměť efektivní. Nemají vyhradit více paměti, než je třeba.
Například, pokud hash funkce má rozsah R(h) = 0...100, pak je třeba přidělit matici 100 (ukazatelů-do) prvků, a to i když jste právě hash 20 prvků. Pokud byste měli používat binární vyhledávací strom pro uložení stejné informace, měli byste přidělit jen tolik prostoru, kolik potřebuje, stejně jako nějaká metadata o odkazy.
Binární strom je pomalejší vyhledávat a vložit do, ale má velmi pěkný rys Infix průchod, který v podstatě znamená, že můžete iterovat uzly stromu v seřazeném pořadí.
Iterace zápisů hashovací tabulky prostě nedává velký smysl, protože všichni jsou rozptýleny v paměti.
Binární vyhledávací strom může být realizován s přetrvávající rozhraní, kde je vrácena nový strom, ale ten starý strom pokračuje existovat. Prováděny velice pečlivě, staré a nové stromy sdílí většina z jejich uzlů. Můžete to udělat pomocí standardního tabulky hash.
Mezi hlavní výhody binárního stromu přes hash tabulky je, že binární strom nabízí dvě další operace nemůžete dělat (jednoduše, rychle) s hash tabulky
najít prvek nejblíže k (ne nutně rovno) nějaké libovolné hodnoty klíče (nebo nejblíže nad / pod)
iterovat obsah stromu v seřazeném pořadí
Ti dva jsou propojeny - binární strom udržuje jeho obsah v seřazeném pořadí, takže věci, které vyžadují, aby seřazeném pořadí je snadné dělat.
A (symetrický) binární vyhledávací strom má také tu výhodu, že jeho asymptotická složitost je ve skutečnosti horní hranici, zatímco „konstanta“ časy stoly mřížky jsou rozpouštěny doba: Máte-li nevhodné hash funkce, můžete skončit ponižující lineárního času , spíše než konstantní.
Pokud chcete přístup k datům v seřazeném způsobem, pak seřazený seznam musí být udržován v paralelním k hash tabulky. Dobrým příkladem je Dictionary v .Net. (viz http://msdn.microsoft.com/en-us/library/3fcwy8h6.aspx ).
To má vedlejší účinek nejen zpomalení vložky, ale spotřebovává větší množství paměti, než B-stromu.
Dále, protože je řazen a b-strom, je to jednoduché najít rozsahy výsledků, nebo provádět odbory nebo sloučení.
Kromě všech ostatních dobrých ohlasů:
Hash stoly mají obecně lepší chování mezipaměti vyžaduje méně paměti čte ve srovnání s binárního stromu. Pro tabulky hash obvykle pouze vynakládat jediné čtení, než budete mít přístup k odkazu drží svá data. Binární strom, pokud se jedná o vyvážený varianta vyžaduje něco v pořadí k * lg (n) paměti přečte pro nějakou konstantu k.
Na druhou stranu, pokud nepřítel zná vaši hashovací funkci vnitřní nepřítel může prosadit svou hash tabulky, aby se kolize, což výrazně brzdí jeho výkon. Řešením je zvolit hash-funkci náhodně z rodiny, ale BST nemá tuto nevýhodu mají. Také, když tlak hash tabulka roste příliš mnoho, často tendenci enlargen a přerozdělit hash tabulku, která může být nákladná záležitost. BST je jednodušší chování tady a nemá tendenci se náhle přidělit velké množství dat a provést operaci omílání.
Stromy mají tendenci být konečný průměr datová struktura. Mohou působit jako seznamy, může být snadno rozdělena na paralelní provoz, mají rychlé odstranění, vložení a vyhledávání v řádu O (LG n) . Dělají nic zvlášť dobře, ale nemají žádnou příliš špatné chování jeden.
A konečně, BSTs jsou mnohem snadněji proveditelný (čisté) funkcionální jazyky ve srovnání s hash-tabulek a nevyžadují destruktivní aktualizace mají být prováděna (dále jen persistence argument Pascal výše).
Hlavní výhodou hash tabulky je to, že téměř všechny panely v ~ = O (1). A jeho velmi snadné pochopit a realizovat. Děje se vyřešit mnoho problémů, „rozhovor“ efektivně. Takže pokud u chtít rozlousknout kódovací rozhovor, aby nejlepší přátelé s hash tabulky ;-)
BSTs také poskytují „findPredecessor“ a „findSuccessor“ operace (Chcete-li najít další nejmenší a další největší prvky) v O (LOGN) času, což může být také velmi užitečné operace. Hash Table nemohou poskytovat v té době účinnosti.
Záleží také na použití, Hash umožňuje najít přesnou shodu. Chcete-li dotaz na řadě pak BST je volba. Předpokládejme, že máte spoustu dat E1, E2, E3 ..... en.
S hashovací tabulky můžete najít libovolný prvek v konstantním čase.
Chcete-li zjistit rozsah hodnot větší než E41 a méně než E8, BST můžete rychle najít to.
Klíčovou věcí je hash funkce použita, aby nedošlo ke kolizi. Samozřejmě, nemůžeme zcela vyhnout kolizi, přičemž v tomto případě jsme se uchýlit k řetězení nebo jinými metodami. To dělá načítání již konstantní čas v nejhorším případě.
Jakmile plné, hash tabulka opět zvýšit svou velikost lopaty a kopírovat přes všechny prvky. Jedná se o dodatečné náklady nepředstavují více než BST.
Jednou z výhod, které nikdo jiný poukázal na to, že binární vyhledávací strom umožňuje provádět hledání pomocí efektivně.
Pro ilustraci můj nápad, já chci, aby se extrémní případ. Řekněme, že chcete, aby všechny prvky, jejichž klíčů jsou mezi 0 až 5000. A ve skutečnosti je tam jen jeden takový prvek a 10000 dalších prvků, jejichž klíče nejsou v rozsahu. BST lze provést hledání pomocí velmi efektivně, protože nevyhledává podstromu, který je nemožné mít odpověď.
I když, jak si můžete udělat vyhledávání doletu v hash tabulky? Buď je třeba opakovat každý kbelík prostor, který je O (n), nebo budete muset hledat, zda každá z 1,2,3,4 ... až 5000 existuje. (Co klíčů mezi 0 a 5000 jsou nekonečná množina? Pro příklad klíče mohou být desetinná místa)
Hash tabulka je neuspořádané datová struktura, Při navrhování mobilní telefon, chcete zachovat co nejvíce údajů k dispozici pro ukládání dat. Hashovací tabulka je neuspořádané struktura dat, - což znamená, že se neudrží na jeho prvky, v libovolném pořadí. Takže, pokud použijete hash tabulky pro adresáře mobilního telefonu, pak budete potřebovat další paměť pro řazení hodnot, protože byste určitě potřebovat k zobrazení hodnoty v abecedním pořadí - to je adresář po všem. Takže pomocí hash tabulky budete muset vyčlenit paměť třídit elementy, které by jinak mohly být použity jako úložný prostor. Ale strom binárního vyhledávání je seřazený údaje structure.Because binární vyhledávací strom je již řazeno, nebude třeba ztrácet paměť nebo doba zpracování třídění záznamů v mobilním telefonu. Jak jsme již zmínili, že dělá vyhledávání nebo vložku na binární strom je pomalejší, než dělat to s hash tabulky, ale mobilní telefon adresář bude téměř nikdy mít více než 5000 položek. S takovým malým počtem přihlášek, binární vyhledávací strom je O (log (n)) bude určitě dost rychle. Takže vzhledem k tomu, že všechny informace, binární vyhledávací strom je datová struktura, která byste měli použít v tomto případě, protože je lepší volbou než hashovací tabulky.
Hash tabulky nejsou dobré pro indexování. Když hledáte rozsahu, BSTs jsou lepší. To je důvod, proč většina databázové indexy používat B + stromů namísto hashovací tabulky
Z popraskání Kódování rozhovor, 6. vydání
Můžeme realizovat hash tabulku s vyváženým binárního vyhledávacího stromu (BST). To nám dává O (log n) vyhledávání času. Výhodou toho je potenciálně používat méně prostoru, protože jsme již přidělit velké pole. Můžeme také iterovat klíče v pořadí, které mohou být užitečné, někdy.
Třídy HashSet a tabulka jsou sbírkou. Je to zřejmé z rozhraní (a mohlo být jinak), ale hashovací tabulky byly provedeny pomocí AVL stromy. To znamená, že hash kód není snížena o modulo pole (méně kolizí), a to také znamená, že neexistuje žádný omílání pole je třeba udělat (hladší výkon). Skutečnost, že jsou sbírkou znamená, že jste jen dodat rovná funkci a funkci hashCode - ne úplný Comparer jako u stromů. Takže ať už pomocí hash table tabulka <K, T> nebo binární strom Strom <K, T> závisí na třídě K - ať už je plně srovnatelná nebo jen rovnost srovnatelné.
Existují případy, kdy datový typ je tak srovnatelná a rovnost srovnatelné - jako řetězec. To znamená, že HashSet <String> a nastavte <String> jsou obě možné. Vyhledává na hash sady strun mají tendenci být asi 10 krát rychlejší než vyhledávání na objednané sady strun. Je-li komparátor je dražší než stromy zpomalit ve srovnání s HashTables. Je-li komparátor je velmi jednoduché, (stejně jako pro celá čísla a plováky), pak stromy poběží rychleji než hash tabulek.
HashMap je sada asociativní pole. Takže vaše pole vstupních hodnot dostane sloučeny do kbelíků. V otevřeném schématu adresování, budete mít ukazatel na kbelík, a pokaždé, když přidáte novou hodnotu do kbelíku, je zjistit, kde v kbelíku jsou volné prostory. Existuje několik způsobů, jak tohle začnete na začátku kbelíku a zvyšovat ukazatelem každý čas a otestovat, zda jeho obsazené. To se nazývá lineární sondování. Potom můžete provést binární hledání, jako doplňku, kde je dvojnásobek rozdílu mezi začátkem kbelíku a kam zdvojnásobit nebo dolů pokaždé, když se hledal volného prostoru. Tento jev se nazývá kvadratický sondování. OK. Právě problémy v obou těchto metod je, že v případě, že kbelík přeteče do příštích kbelíky řešení, pak je třeba to-
OK. ale pokud budete používat lineární seznam by neměl být takový problém ne? Ano, v provázané seznamy nemáte tento problém. Vzhledem k tomu, každý kbelík začít s propojeného seznamu, a pokud budete mít 100 prvků v kbelíku to vyžaduje, abyste procházet těch 100 prvků pro dosažení konce lineární seznam proto List.add (Element E) bude mít čas to-
Výhodou provádění lineární seznam je, že nepotřebujete operaci přidělování paměti a O (N) pro přenos / kopie všech kbelíků jako v případě otevřeného adresování realizaci.
Takže způsob, jak minimalizovat O operaci (n) je převést provádění k tomu Binární vyhledávací strom, kde najdete operace jsou O (log (N)) a přidejte prvek v jeho poloze na základě je to hodnota. Přidaná rysem BST je to, že přichází řazeny!
Binární vyhledávací stromy jsou dobrou volbou pro implementaci slovníku v případě, že klávesy mají nějaké celkové pořadí (klávesy jsou srovnatelné) definované na ně a chcete zachovat informace objednávky.
Jako BST zachovává informace o objednávky, to vám poskytne čtyři další dynamický set operací, které nemohou být provedeny (efektivně) za použití hash tabulky. Tyto operace jsou:
Všechny tyto operace, jako každé BST provozu mají časovou složitost O (H). Navíc všechny uložené klíče zůstávají řazeny v BST tím, že umožňuje získat seřazené sekvence kláves jen tím, že křížení strom na in-pořadí.
Stručně řečeno, pokud vše, co chci, je operace vložit, odstranit a odstranit pak hash tabulky je nepřekonatelný (většinu času) ve výkonu. Ale chcete-li některé nebo všechny činnosti uvedené výše byste měli používat BST, s výhodou samovyvažující BST.
Binární vyhledávací stromy může být rychlejší při použití s klíči řetězce. Zvlášť, když řetězce jsou dlouhé.
Binární vyhledávací stromy pomocí srovnání menší / větší, které jsou velmi jednoduché pro smyčce (pokud nejsou stejné). Takže BST může rychle odpovědět, když se řetězec nebyl nalezen. Když to zjistil, že bude třeba provést pouze jeden úplný srovnání.
V hashovací tabulce. Musíte počítat hash řetězce, a to znamená, že musíte projít všechny byty alespoň jednou spočítat hash. Na druhou stranu, když je nalezen odpovídající záznam.