Jaké jsou hlavní rozdíly mezi spojový seznam a BinarySearchTree? Je BST jen způsob, jak udržet lineární seznam? Můj instruktor mluvil o lineární seznam a poté BST ale did't porovnat je nebo neřekl, kdy se raději jeden přes druhého. To je asi hloupá otázka, ale já jsem opravdu zmatený. Ocenil bych, kdyby někdo může objasnit to jednoduchým způsobem.
Rozdíl mezi lineární seznam a binární vyhledávací strom
Řekl bych, že hlavní rozdíl je, že je řazen binární vyhledávací strom. Vložíte-li do binárního vyhledávacího stromu, kde tyto prvky skončí, budou uloženy v paměti je závislá na jejich hodnoty. S propojeného seznamu prvky jsou slepě přidány do seznamu bez ohledu na jejich hodnotu.
Hned můžete některé obchodní off: Propojené seznamy zachovat objednávky vložení a vložení je levnější Binární vyhledávací stromy jsou obecně rychlejší vyhledávání
Ve vědě o počítačích, binární vyhledávací strom (BST) je binární strom, datová struktura, která má následující vlastnosti:
- každý uzel (položka ve stromu) má zřetelný hodnotu;
- oba levý a pravý podstromy musí být také binární vyhledávací stromy;
- levý podstrom uzlu obsahuje pouze hodnoty menší než hodnota uzlu;
- právo podstrom uzlu obsahuje pouze hodnoty větší než nebo rovný hodnotě uzlu.
Ve vědě o počítačích, spojový seznam je jedním ze základních datových struktur, a mohou být použity k provedení dalších datových struktur.
Takže Binary Search strom je abstraktní pojem, který může být realizován pomocí propojeného seznamu nebo matice. Zatímco spojový seznam je základní datová struktura.
Propojené seznamy a BSTs opravdu nemají mnoho společného, kromě toho, že oba jsou datové struktury, které fungují jako kontejnery. Spojové seznamy v podstatě umožňují vložit a efektivně odstranit prvky, na libovolném místě v seznamu, při zachování pořadí v seznamu. Tento seznam je implementován pomocí ukazatele z jednoho prvku do druhého (a často i předchozí).
Binární vyhledávací strom na druhé straně je datová struktura vyššího abstrakce (tj to není uvedeno , jak je to realizováno interně), který umožňuje efektivní vyhledávání (tedy s cílem nalézt konkrétní prvek, nemusíte se dívat na všechny elementy.
Všimněte si, že spojový seznam může být myšlenka jako degenerované binárního stromu, tedy stromu, kde všechny uzly mají jen jedno dítě.
Spojový seznam:
Item(1) -> Item(2) -> Item(3) -> Item(4) -> Item(5) -> Item(6) -> Item(7)
Binární strom:
Node(1)
/
Node(2)
/ \
/ Node(3)
RootNode(4)
\ Node(5)
\ /
Node(6)
\
Node(7)
V propojeném seznamu, položky jsou spojeny dohromady prostřednictvím jediného další ukazatele. V binárním stromu, každý uzel může mít 0, 1 nebo 2 poduzlů, kde (v případě binární vyhledávací strom) klíč levého uzlu je menší, než je klíčový uzlu a klíčem pravého uzlu, více než uzel. Dokud je strom je vyvážená se SearchPath ke každé položce je mnohem kratší než v propojeném seznamu.
Searchpaths:
------ ------ ------
key List Tree
------ ------ ------
1 1 3
2 2 2
3 3 3
4 4 1
5 5 3
6 6 2
7 7 3
------ ------ ------
avg 4 2.43
------ ------ ------
Větších staveb průměrná cesta pro vyhledávání se stává významným menší:
------ ------ ------
items List Tree
------ ------ ------
1 1 1
3 2 1.67
7 4 2.43
15 8 3.29
31 16 4.16
63 32 5.09
------ ------ ------
Binární vyhledávací strom může být implementován v jakékoli podobě, není nutné používat propojeného seznamu.
Spojový seznam je jednoduše struktura, která obsahuje uzly a odkazy / odkazy na jiné uzly uvnitř uzlu. Vzhledem k uzlu na seznamu, můžete procházet do jiného uzlu v propojeném seznamu. Dvojitě spojové seznamy mají dva ukazatele / Reference: normální referenční do dalšího uzlu, ale také odkazem na předchozí uzlu. Pokud je poslední uzel v dvojitě spojový seznam odkazuje na první uzel v seznamu jako další uzel, a první uzel odkazuje poslední uzel jako jeho předchozí uzel, se říká, že je kruhová seznam.
Binární vyhledávací strom je strom, který rozděluje svůj vstup na dvě přibližně stejné poloviny, na bázi binární porovnávání vyhledávání algoritmu. Tak, to potřebuje jen velmi málo vyhledávání najít element. Například, pokud jste měli strom s 1-10 a potřebné hledat tři, první prvek v horní části bude kontrolovat, asi 5 nebo 6. Three by být menší než to, takže pouze první polovina strom pak bude kontrolovat. V případě, že další hodnota je 3, máte to, jinak se srovnání provádí, atd, dokud buď není nalezen nebo jeho data vrácena. Tak strom je velmi jednoduché pro vyhledávání, ale ne nessecarily rychle pro vložení nebo odstranění. Jedná se o velmi hrubý popis.
Souvisí List z Wikipedie, a binární vyhledávací strom , rovněž z wikipedie.
Propojený seznam je jen ... seznam. To je lineární; každý uzel má odkaz na další uzel (a předchozí, pokud mluvíte o dvojitě spojový seznam). A větve --- každý uzel má odkaz na různých podřízených uzlů. Binární strom je zvláštní případ, ve kterém každý uzel má pouze dvě děti. Tak, v propojeném seznamu, každý uzel má předchozí uzel a další uzel a v binárním stromu uzel má levé dítě, pravý dítě a rodiče.
Tyto vztahy mohou být obousměrný nebo jednosměrný, v závislosti na tom, jak je třeba, aby bylo možné procházet strukturu.
Je to vlastně docela jednoduché. Propojený seznam je jen banda předmětů připoutaný společně, v žádném konkrétním pořadí. Můžete si ji představit jako opravdu hubená strom, který nikdy větve:
1 -> 2 -> 5 -> 3 -> 9 -> 12 -> |i. (Který je poslední pokus o ASCII-art na zakončovacím null)
Binární vyhledávací strom se liší ve 2 způsoby: binární část znamená, že každý uzel má 2 děti, ne jeden, a hledání část znamená, že tyto děti jsou uspořádány tak, aby urychlila vyhledávání - pouze menší předměty na levé straně, a ty jen větší doprava:
5
/ \
3 9
/ \ \
1 2 12
9 nemá levé dítě a 1, 2, a 12 „listy“ - nemají žádné větve.
Dávat smysl?
U většiny „vyhledávací“ druhy využití, je BST je lepší. Ale jen za „vedení seznamu věcí, které se zabývají pozdější First-In-First-Out nebo poslední-In-First-Out“ druhy věcí, propojené seznam by mohl dobře fungovat.
Spojový seznam je rovný lineární dat se sousedními uzly vzájemně spojeny např A-> B> C. Můžete je považovat za přímého plot.
BST je hierarchická struktura, stejně jako strom s hlavním kmeni připojen na pobočky a tyto pobočky v otáčení připojit na dalších oborů a tak dále. Dále jen „Binary“ slovo zde znamená, že každá větev je spojena s maximálně dvěma větvemi.
Použijete seznamu souvisí s přímou údaje pouze s každou položkou připojenou na maximálně jednu položku; vzhledem k tomu můžete použít BST připojit položku do dvou kusů. Můžete použít BST k reprezentaci dat, jako jsou rodokmenu, ale to bude stát n-ary vyhledávací strom protože tam může být více než dvě děti, pro každou osobu.
Jsou to naprosto odlišné datové struktury.
Spojový seznam je sekvence prvku, ve kterém je každý prvek spojen s další, a v případě dvojitě spojový seznam, předchozí.
Binární vyhledávací strom je něco úplně jiného. To má kořenový uzel kořenový uzel má až dva podřízené uzly a každý podřízený uzel může mít až dvě podřízené poznámky atd atd. Je to docela chytrá datová struktura, ale to by bylo poněkud zdlouhavé vysvětlit to tady. Podívejte se na Wikipedii artcle na něm.
Problém s propojeného seznamu je vyhledávání v ní (ať už pro vyhledávání nebo vložení).
Pro jeden vázaný seznam, budete muset začít u hlavy a následně hledat najít požadovaný prvek. Aby se zabránilo, že je nutné snímat celý seznam, budete potřebovat další odkazy na uzly v seznamu, v tomto případě je to už není jednoduchý spojový seznam.
Binární strom umožňuje rychlejší vyhledávání a vložení tím, že je ve své podstatě tříděného i splavné.
Alternativou, kterou jsem úspěšně použit v minulosti je SkipList. To poskytuje něco podobného propojeného seznamu, ale s extra odkazy umožňující vyhledávání výkon srovnatelný s binárního stromu.
Propojený seznam je pořadové číslo „uzlů“, spojených k sobě navzájem, a to:
public class LinkedListNode
{
Object Data;
LinkedListNode NextNode;
}
Binární vyhledávací strom používá podobnou strukturu uzlu, ale místo toho odkazují na další uzel, spojuje dva podřízené uzly:
public class BSTNode
{
Object Data
BSTNode LeftNode;
BSTNode RightNode;
}
Dodržováním určitých pravidel při přidávání nových uzlů na BST, můžete vytvořit datovou strukturu, která je velmi rychle přejít. Jiné odpovědi zde mají k dispozici podrobné těchto pravidel, jen jsem chtěl ukázat na úrovni kódu rozdíl mezi uzlu tříd.
Je důležité si uvědomit, že pokud vložíte tříděných dat do BST, budete skončit s propojeného seznamu, a ztratíte výhody pomocí stromu.
Z tohoto důvodu, je lineární seznam je O (N) struktura průchod dat, zatímco BST je O (N) struktura průchod dat v nejhorším případě, a O (log n), v nejlepším případě.
Binární vyhledávací strom je binární strom, ve kterém každý vnitřní uzel x ukládá element tak, že se prvek uložen v levém podstromu x je menší než nebo rovné x, a prvků, uložených v pravém podstromu x je větší než nebo rovno x .
![]()
Nyní spojový seznam se skládá ze sekvence uzlů, z nichž každá obsahuje libovolných hodnot a jeden nebo dva odkazy ukazující na další a / nebo předchozí uzly.
![]()
Mají podobnosti, ale hlavní rozdíl je, že binární vyhledávací strom je navržen pro podporu efektivního vyhledávání pro element, nebo „klíč“.
Binární vyhledávací strom, jako dvojitě propojeném seznamu, odkazuje na dva další prvky ve struktuře. Nicméně, při přidávání prvků do struktury, spíše než jen jejich připojením ke konci seznamu, binární strom se reorganizuje tak, že prvky spojené se „levý“ uzlu jsou nižší než aktuální uzel a prvky spojené se „pravý“ uzel je větší než aktuální uzel.
V jednoduchém provedení, nový prvek je ve srovnání s prvním prvkem struktury (kořen stromu). Pokud je to méně, „odešel“ větev je přijata, v opačném případě je pobočka „right“ zkoumal. Tento postup se opakuje s každým uzlem, dokud není nalezen větev být prázdný; nový prvek plní tuto pozici.
Pomocí tohoto jednoduchého přístupu, pokud prvky jsou přidány v pořadí, můžete skončit s propojeného seznamu (se stejným výkonem). Různé algoritmy existují pro udržení určitou míru rovnováhy ve stromu, tím, že přeskupí uzly. Například, AVL stromy udělat nejvíce práce, aby strom jako vyrovnaný, jak je to možné, dává ty nejlepší časy vyhledávání. Červeno-černé stromy nevedou strom jako vyrovnaný, což má za následek mírně pomalejší vyhledávání, ale dělat méně práce v průměru jako klíče jsou vloženy nebo odstraněny.













