Care sunt principalele diferențe dintre o listă înlănțuită și un BinarySearchTree? Este BST doar o modalitate de a menține o LinkedList? Instructorul meu a vorbit despre LinkedList și apoi BST, dar did't le compara sau nu a spus când a prefera unul peste altul. Aceasta este, probabil, o chestiune de prost, dar eu sunt foarte confuz. Aș aprecia dacă cineva poate clarifica acest lucru într-un mod simplu.
Diferența între un LinkedList și un binar de căutare copac
Aș spune că principala diferență este că un arbore binar de căutare este sortat. Când inserați într-un arbore binar de căutare, în cazul în care aceste elemente ajung să fie stocate în memorie este o funcție de valoarea lor. Cu o listă legată, elementele sunt adăugate la lista orbește, indiferent de valoarea lor.
Imediat vă puteți unele compromisuri: liste legate păstra ordinea de inserare și inserarea este mai puțin costisitoare copaci binar de căutare sunt în general mai repede pentru a căuta
În informatică, un arbore binar de căutare (BST) este o structură de date binar arbore care are următoarele proprietăți:
- fiecare nod (element din arborele) are o valoare distinctă;
- atât subramificații stânga și dreapta trebuie să fie, de asemenea, arbori de căutare binare;
- subarborele stâng al unui nod conține doar valori mai mici decât valoarea nodului;
- subarborele drept al unui nod conține doar valori mai mare sau egală cu valoarea nodului.
În informatică, o listă legată este una dintre structurile de date fundamentale, și pot fi folosite pentru a pune în aplicare alte structuri de date.
Deci, un copac binar de căutare este un concept abstract, care poate fi pus în aplicare cu o listă înlănțuită sau o matrice. În timp ce lista legată este o structură de date fundamentale.
Listele legate și BSTs nu au prea multe în comun, cu excepția faptului că acestea sunt ambele structuri de date care acționează ca containere. Listele Linked practic vă permite să inserați și elimina elemente eficient la orice locație din listă, menținând în același timp ordonarea listei. Această listă este implementată folosind indicii de la un element la altul (și de multe ori anterior).
Un arbore binar de căutare pe de altă parte , este o structură de date a unei abstractizare mai mare ( de exemplu , nu este specificat modul în care acest lucru este pus în aplicare pe plan intern) , care permite căutări eficiente ( de exemplu , în scopul de a găsi un anumit element nu trebuie să se uite la toate elementele.
Observați că o listă legată poate fi gândită ca un arbore binar degenerat, adică un copac în cazul în care toate nodurile au doar un singur copil.
Lista Linked:
Item(1) -> Item(2) -> Item(3) -> Item(4) -> Item(5) -> Item(6) -> Item(7)
arbore binar:
Node(1)
/
Node(2)
/ \
/ Node(3)
RootNode(4)
\ Node(5)
\ /
Node(6)
\
Node(7)
Într-o listă legată, elementele sunt legate între ele printr-un singur indicator următor. Într-un arbore binar, fiecare nod poate avea 0, 1 sau 2 subnoduri, în cazul în care (în cazul unui arbore binar de căutare) cheia nodului din stânga este mai mică decât cheia nodului și cheia nodului dreapta este mai mult nodul. Atâta timp cât arborele este echilibrat, pentru fiecare element de cautare a este mult mai scurtă decât cea legată într-o listă.
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
------ ------ ------
Prin structuri mai mari calea de căutare medie devine semnificativ mai mică:
------ ------ ------
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
------ ------ ------
Un arbore binar de căutare poate fi implementat în orice mod, nu are nevoie să utilizați o listă legată.
O listă legată este pur și simplu o structură care conține noduri și indicii / referințele la alte noduri în interiorul unui nod. Având în nodul principal al unei liste, este posibil să navigați la oricare alt nod într-o listă legată. Listele legate au dublu două indicii / referințe: trimiterea normală la nodul următor, dar, de asemenea, o referință la nodul precedent. În cazul în care ultimul nod într-o listă dublu-legat face referire la primul nod din listă ca nod următor, iar primul nod face referire la ultimul nod ca nodul său anterior, se spune ca este o listă circulară.
Un arbore binar de căutare este un copac care împarte intrarea sa în două jumătăți aproximativ egal pe baza unui algoritm de comparare de căutare binară. Astfel, este nevoie doar foarte puține căutări pentru a găsi un element. De exemplu, dacă ați avea un copac cu 1-10 și ai nevoie pentru a căuta trei, mai întâi elementul de la partea de sus ar fi verificat, probabil, un 5 sau 6. Trei ar fi mai mult decât atât, astfel încât doar prima jumătate a copac ar fi apoi verificate. Dacă valoarea este următoarea 3, aveți, altfel, o comparație se face, etc, fie până când nu este găsit sau datele sale este returnat. Astfel, copacul este rapid pentru căutare, dar nu nessecarily rapid pentru inserare sau ștergere. Acestea sunt descrieri foarte aspre.
Linked Lista de wikipedia, și binar de căutare copac , de asemenea , de la wikipedia.
O listă legată este doar că ... o listă. Este liniară; fiecare nod are o referință la nodul următor (și anterior, dacă vorbesti unei liste dublu-legate). Un copac ramuri --- fiecare nod are o referință la diferite noduri copil. Un arbore binar este un caz special, în care fiecare nod are doar doi copii. Astfel, într-o listă legată, fiecare nod are un nod anterior și un nod următor, și într-un arbore binar, un nod are un copil stânga, dreapta copil și părinte.
Aceste relații pot fi bi-direcțională sau uni-direcțională, în funcție de modul în care trebuie să fie în măsură să traverseze structura.
Este de fapt destul de simplu. O listă este legată doar o grămadă de elemente legate împreună, în nici o ordine anume. Vă puteți gândi la ea ca un copac foarte slab, care nu ramuri:
1 -> 2 -> 5 -> 3 -> 9 -> 12 -> |i. (Ultima este o încercare de ascii-art, la un nul terminal)
Un binar de căutare copac este diferit în 2 moduri: partea binară înseamnă că fiecare nod are 2 copii, nu una, iar partea de căutare înseamnă că acei copii sunt aranjate pentru a mări viteza de căutare - numai elementele mai mici , la stânga, și numai pe cele mai mari la dreapta:
5
/ \
3 9
/ \ \
1 2 12
9 nu are nici un copil din stânga, și 1, 2 și 12 sunt „frunze“ - acestea nu au sucursale.
Are sens?
Pentru cele mai multe „căutare“ tipuri de utilizări, o BST este mai bine. Dar doar pentru „păstrarea o listă de lucruri pentru a face față mai târziu, primul-in-first-out sau ultima-In-First-out“ tipuri de lucruri, o listă legată ar putea să funcționeze bine.
Lista este legată de date liniare drepte cu noduri adiacente conectate unul cu celălalt exemplu A-> B-> C. Poti considera ca un gard drept.
BST este o structură ierarhică la fel ca un copac cu trunchiul principal conectat la sucursale și acele ramuri în girație conectate la alte ramuri și așa mai departe. Accesând „binar“ cuvânt aici înseamnă că fiecare ramură este conectat la maximum două ramuri.
Lista pe care le utilizați pentru a reprezenta date legate direct numai cu fiecare element conectat la maxim un element; întrucât puteți utiliza BST pentru a conecta un element la două elemente. Puteți utiliza BST pentru a reprezenta un date, cum ar fi arborele genealogic al familiei, dar care va deveni n-ary arbore de căutare ca pot exista mai mult de doi copii pentru fiecare persoană.
Ele sunt total diferite structuri de date.
O listă legată este o secvență de elemente în care fiecare element este legat de următorul, iar în cazul unei liste de două ori legat, cea anterioară.
Un arbore binar de căutare este ceva cu totul diferit. Acesta are un nod rădăcină, nodul rădăcină are până la două noduri copil, și fiecare nod copil poate avea până la două note de copil , etc , etc , este o structură de date destul de inteligent, dar ar fi oarecum obositor să - l explic aici. Check out artcle Wikipedia pe ea.
Problema cu o listă legată este căutarea în ea (fie pentru recuperare sau de a insera).
Pentru o singură listă legată, trebuie să înceapă de la cap și de căutare secvențial pentru a găsi elementul dorit. Pentru a evita necesitatea de a scana întreaga listă, aveți nevoie de referințe suplimentare la nodurile în cadrul listei, în care caz, nu mai este o simplă listă legată.
Un arbore binar permite căutarea mai rapidă și inserție fiind în mod inerent sortat si navigabil.
O alternativă pe care l-am folosit cu succes în trecut, este un SkipList. Acest lucru oferă ceva asemănător cu o listă legată, dar cu referințe suplimentare pentru a permite efectuarea de căutare comparabile cu un arbore binar.
O listă legată este un număr secvențial de „noduri“ legate între ele, și anume:
public class LinkedListNode
{
Object Data;
LinkedListNode NextNode;
}
Un binar de căutare copac utilizează o structură nod similar, dar în loc de a lega la nodul următor, se leagă la două noduri copil:
public class BSTNode
{
Object Data
BSTNode LeftNode;
BSTNode RightNode;
}
Urmand reguli specifice, atunci când adăugarea de noi noduri la un BST, puteți crea o structură de date care este foarte rapid pentru a traversa. Alte raspunsuri aici au aceste reguli detaliate, am vrut doar să arăt la nivel de cod diferența dintre clase nod.
Este important să rețineți că, dacă inserați date triate într-un BST, vei termina cu o listă legată, și veți pierde avantajul de a folosi un copac.
Din această cauză, o LinkedList este o structură de date parcurgeri O (N), în timp ce un BST este O (N) în structura de date parcurgeri cel mai rău caz, și un O (log N), în cel mai bun caz.
Un binar de căutare arbore este un arbore binar în care fiecare nod intern x stochează un element astfel încât elementul stocat în subarborele stâng al x sunt mai mici sau egale cu x și elementele stocate în subarborele drept de x sunt mai mari decât sau egală cu x .
![]()
Acum , o lista inlantuita constă dintr - o secvență de noduri, fiecare conținând valori arbitrare și una sau două referințe indică spre următorul și / sau nodurile anterioare.
![]()
Ei nu au similitudini, dar principala diferență este că un binar de căutare copac este conceput pentru a sprijini căutarea eficientă pentru un element, sau „cheie“.
Un arbore binar de căutare, cum ar fi o listă dublu-legate, spre celelalte două elemente în structura. Cu toate acestea, atunci când adăugarea de elemente la structura, mai degrabă decât doar le adăugarea la sfârșitul listei, arborele binar este reorganizat, astfel încât elementele legate de nodul „stânga“ sunt mai mici decât nodul curent și elementele legate de „dreapta“ nod sunt mai mari decât nodul curent.
Într-o implementare simplă, noul element este comparat cu primul element al structurii (rădăcina copacului). Dacă este mai puțin, ramura „stânga“ este luată, în caz contrar ramura „dreapta“ este examinat. Acest lucru continuă cu fiecare nod, până când o ramură se dovedește a fi gol; noul element umple acea poziție.
Cu această abordare simplă, în cazul în care elementele sunt adăugate în ordine, va termina cu o listă legată (cu aceeași performanță). Diferite algoritmi există pentru a menține o anumită măsură de echilibru în copac, prin rearanjarea noduri. De exemplu, arborii AVL face cea mai lucrare de a păstra copac cât mai echilibrat, oferind cele mai bune momente de căutare. copaci rosu-negru nu păstrează copac ca echilibrat, care rezultă în căutări ușor mai lent, dar nu mai puțin de lucru, în medie, după cum sunt inserate sau eliminate chei.













