Avantajele binare de căutare Arbori peste mese Hash

voturi
81

Care sunt avantajele de arbori de căutare binare peste tabele de dispersie?

tabele de dispersie pot căuta orice element din Theta (1) timp și este la fel de ușor pentru a adăuga un element .... dar eu nu sunt sigur de avantajele care merg invers.

Întrebat 08/11/2010 la 23:06
sursa de către utilizator
În alte limbi...                            


20 răspunsuri

voturi
70

Un „avantaj“ al unui arbore binar este că acesta poate fi deplasată pentru a lista pe toate elementele în ordine. Acest lucru nu este imposibil cu un tabel hash, dar nu este o operație normală de un desen sau model într-o structură trunchiată.

Publicat 08/11/2010 la 23:11
sursa de către utilizator

voturi
9

Un hashtable ar ocupa mai mult spațiu atunci când este creat pentru prima dată - va avea sloturi disponibile pentru elementele care sunt încă să fie introdus (indiferent dacă acestea sunt sau nu introduse vreodată), un arbore binar de căutare va fi doar la fel de mare ca aceasta trebuie să fi. De asemenea, atunci când un tabel hash are nevoie de mai mult spațiu, extinderea la o altă structură ar putea fi consumatoare de timp, dar care ar putea depinde de punerea în aplicare.

Publicat 08/11/2010 la 23:11
sursa de către utilizator

voturi
76

Amintiți-vă că binar de căutare Arbori (pe bază de referință) sunt eficiente de memorie. Ei nu rezervă mai multă memorie decât au nevoie.

De exemplu, în cazul în care o funcție hash are un interval R(h) = 0...100, atunci trebuie să aloce o serie de elemente 100 (pointer-to), chiar dacă sunt doar hashing 20 de elemente. Dacă ar fi să utilizați un arbore binar de căutare pentru a stoca aceleași informații, v - ar aloca doar cât mai mult spațiu ai nevoie, precum și unele metadate despre link - uri.

Publicat 08/11/2010 la 23:11
sursa de către utilizator

voturi
6

Un arbore binar este mai lent pentru a căuta și de a insera în, dar are caracteristica foarte frumos din traversal infix, ceea ce înseamnă, în esență, că puteți itera prin nodurile arborelui într-o ordine sortată.

Iterarea prin intrările unui tabel hash pur și simplu nu face o mulțime de sens, deoarece acestea sunt toate împrăștiate în memorie.

Publicat 08/11/2010 la 23:13
sursa de către utilizator

voturi
8

Un arbore binar de căutare poate fi implementată cu o persistentă interfață, în cazul în care un nou copac este returnat , dar copacul continuă să existe. Pus în aplicare cu atenție, acțiunile copaci vechi și noi , cele mai multe dintre nodurile lor. Nu poți face acest lucru cu un tabel hash standard de .

Publicat 08/11/2010 la 23:19
sursa de către utilizator

voturi
23

Principalele avantaje ale unui arbore binar într-un tabel hash este faptul că arborele binar vă oferă două operații suplimentare pe care nu se poate face (ușor, rapid), cu un tabel hash

  • găsi elementul cel mai apropiat (nu neapărat egal cu) o anumită valoare-cheie arbitrară (sau cel mai apropiat de mai sus / jos)

  • itera prin conținutul de copac în ordine sortata

Cele două sunt conectate - arborele binar păstrează conținutul său într-o ordine sortată, deci lucrurile care cer ca ordine sortată sunt ușor de făcut.

Publicat 08/11/2010 la 23:25
sursa de către utilizator

voturi
14

A (echilibrată) arbore binar de căutare are de asemenea avantajul că complexitatea sa asimptotică este de fapt o limită superioară, în timp ce de ori „constant“ pentru tabelele hash sunt ori amortizate: Dacă aveți o funcție hash nepotrivit, ai putea ajunge degradant în timp liniar , mai degrabă decât constantă.

Publicat 08/11/2010 la 23:29
sursa de către utilizator

voturi
1

Dacă doriți să acceseze datele într - un mod sortat, apoi o listă sortată trebuie să fie menținută în paralel cu tabela hash. Un bun exemplu este în dicționar .Net. (vezi http://msdn.microsoft.com/en-us/library/3fcwy8h6.aspx ).

Acest lucru are efect secundar al inserturi nu numai încetinind, dar consumă o cantitate mai mare de memorie decât un b-arbore.

Mai mult, din moment ce un b-arbore este sortat, este simplu de a găsi game de rezultate, sau de a efectua uniuni sau îmbinări.

Publicat 08/11/2010 la 23:34
sursa de către utilizator

voturi
48

În plus față de toate celelalte comentarii bune:

Tabele de dispersie , în general , au un comportament mai bun cache care necesită mai puțină memorie reads în comparație cu un arbore binar. Pentru un tabel hash în mod normal , suporta doar o singură citire înainte de a avea acces la o referință care deține datele. Arborele binar, dacă este o variantă echilibrată, necesită ceva în ordinea de k * lg (n) memorie citește pentru unele constantă k.

Pe de altă parte, în cazul în care un inamic cunoaște dvs. hash funcție de inamic poate pune în aplicare tabelul de hash pentru a face coliziuni, împiedică foarte mult performanțele sale. Soluție este de a alege hash-funcția aleatoriu dintr-o familie, dar un BST nu are acest dezavantaj. De asemenea, atunci când presiunea tabel hash creste prea mult, de multe ori tind să enlargen și realoce tabelul hash, care poate fi o operație costisitoare. BST are un comportament mai simplu aici și nu tinde să aloce brusc o mulțime de date și de a face o operație de rehashing.

Copacii tind să fie final structura medie a datelor. Ele pot acționa ca liste, pot fi ușor scindată pentru funcționarea în paralel, au îndepărtare rapidă, inserare și căutare pe ordinea de O (lg n) . Ei nu fac nimic deosebit de bine, dar ei nu au nici un comportament excesiv de rău , fie.

În cele din urmă, BSTs sunt mult mai ușor de implementat în (pur) limbaje funcționale comparativ cu hash-tabele și nu necesită actualizări distructive pentru a fi puse în aplicare (The persistență argumentul Pascal de mai sus).

Publicat 09/11/2010 la 01:01
sursa de către utilizator

voturi
-1

Principalul avantaj al tabelului hash este că face aproape toate ops în ~ = O (1). Și ei foarte ușor de înțeles și de a pune în aplicare. Aceasta nu rezolva multe probleme „interviu“ eficient. Deci, dacă u nevoie pentru a sparge un interviu de codificare, face cei mai buni prieteni cu masă hash ;-)

Publicat 05/04/2011 la 00:45
sursa de către utilizator

voturi
4

BSTs oferă, de asemenea, „findPredecessor“ și operații „findSuccessor“ (pentru a găsi următorul mai mici și cele mai mari elemente următoare) în O (logn) timp, care ar putea fi, de asemenea operații foarte la îndemână. Tabelul Hash nu poate oferi în acest timp eficiența.

Publicat 20/09/2012 la 18:55
sursa de către utilizator

voturi
1

Aceasta depinde și de utilizarea, Hash permite să localizeze potrivirea exactă. Dacă doriți să interogați pentru o gamă, atunci BST este alegerea. Să presupunem că aveți o mulțime de date e1, e2, e3 ..... ro.

Cu tabelul hash puteți localiza orice element în timp constant.

Dacă doriți să găsiți intervalul de valori mai mari decât E41 și mai puțin de E8, BST pot găsi rapid că.

Lucrul cel mai important este funcția hash utilizată pentru a evita o coliziune. Desigur, nu putem evita in totalitate o coliziune, în cazul în care se apelează la înlănțuire sau alte metode. Acest lucru face ca nu mai este de recuperare constantă de timp, în cel mai rău caz.

Odată completă, masa de hash trebuie să crească dimensiunea găleată și copia toate elementele din nou. Acesta este un cost suplimentar nu este prezent peste BST.

Publicat 29/01/2013 la 15:54
sursa de către utilizator

voturi
94

Un avantaj pe care nimeni altcineva nu a subliniat faptul că este binar arbore de căutare vă permite să faceți căutări gama eficient.

Pentru a ilustra ideea mea, vreau să fac un caz extrem. Să presupunem că doriți să obțineți toate elementele ale căror chei sunt cuprinse între 0 la 5000. Și de fapt, există doar un singur astfel de element și alte 10000 de elemente ale căror chei nu sunt în gama. BST pot face căutări interval destul de eficient, deoarece nu caută un subarbore care este imposibil de a avea răspunsul.

În timp ce, cum se poate face căutări interval într-un tabel hash? Ori trebuie să itera fiecare spațiu găleată, care este O (n), sau trebuie să caute dacă fiecare dintre 1,2,3,4 ... până la 5000 există. (Ce despre cheile între 0 și 5000 sunt un set infinit? De exemplu, chei pot fi zecimale)

Publicat 11/11/2013 la 01:05
sursa de către utilizator

voturi
0

Un tabel hash este o structură de date neordonate, La proiectarea unui telefon mobil, pe care doriți să păstrați cât mai multe date posibil disponibile pentru stocarea datelor. Un tabel hash este o structură de date neordonată - ceea ce înseamnă că nu păstrează elementele sale în orice ordine. Deci, dacă utilizați un tabel hash pentru o agenda de telefon mobil, atunci ai avea nevoie de memorie suplimentară pentru a sorta valorile pentru că ar trebui cu siguranță pentru a afișa valorile în ordine alfabetică - este o carte de adrese, după toate. Deci, prin utilizarea unui tabel hash trebuie să pună deoparte de memorie pentru a sorta elementele care ar fi altfel să fie folosite ca spatiu de depozitare. Dar binar copac de căutare este o serie de date triate structure.Because un arbore binar de căutare este deja sortate, nu va mai fi nevoie să deșeuri de memorie sau de timp de procesare sortarea înregistrărilor într-un telefon mobil. Așa cum am menționat mai devreme, face o căutare sau o inserție pe un arbore binar este mai lent decât a face cu un tabel hash, dar o agenda de telefon mobil aproape niciodată nu va avea mai mult de 5.000 de intrări. Cu un astfel de număr mic de intrări, Oa căutare arbore binar (log (n)) va fi cu siguranță suficient de repede. Deci, având în vedere toate aceste informații, un arbore binar de căutare este structura de date pe care ar trebui să utilizați în acest scenariu, deoarece este o alegere mai bună decât un tabel hash.

Publicat 26/12/2013 la 17:40
sursa de către utilizator

voturi
0

Tabelele Hash nu sunt bune pentru indexare. Când sunteți în căutarea pentru o gamă, BSTs sunt mai bune. Acesta este motivul pentru care cei mai mulți indici utilizați baza de date + arbori B în loc de mese Hash

Publicat 05/04/2015 la 17:34
sursa de către utilizator

voturi
4

Din Cracking Interviu codificare a mărfurilor, ediția a 6 -

Putem pune în aplicare tabel hash cu un arbore echilibrat binar de căutare (BST). Acest lucru ne dă un O (log n) timp de căutare. Avantajul acestui potențial este folosind mai puțin spațiu, din moment ce nu mai aloca o gama larga. Putem repeta, de asemenea, prin intermediul tastelor în ordine, care pot fi utile uneori.

Publicat 29/05/2016 la 18:47
sursa de către utilizator

voturi
-1

Clasele HashSet și masă sunt colecții neordonate. Nu este evident din interfața (și ar putea fi altfel) , dar tabele de dispersie au fost puse în aplicare cu ajutorul AVL Copaci. Acest lucru înseamnă că codul hash nu este redusă prin modulo unei matrice (mai puțin coliziuni) și înseamnă , de asemenea , că nu există nici o rehashing de o matrice care urmează să fie făcut (performanță lină). Faptul că acestea sunt colecții neordonate înseamnă că vă furnizează doar un egal cu funcția și o funcție hashCode - nu un Comparer plin ca pentru copaci. Deci , dacă utilizați un tabel hash tabel <K, T> sau un arbore binar copac <K, T> depinde de clasa K - fie că este pe deplin comparabil sau doar egalitatea comparabilă.

Sunt ocazii când tipul de date este în același timp comparabile și egalitatea comparabile - cum ar fi String. Acest lucru înseamnă că HashSet <String> Set și <String> sunt ambele posibile. Căutări pe un set de hash siruri de caractere tind să fie de aproximativ 10 ori mai rapid decât căutările efectuate pe un set ordonat de siruri de caractere. În cazul în care un comparator este scump, atunci copaci încetini în comparație cu HashTables. În cazul în care un comparator este rapid, (cum ar fi pentru numere întregi și plutește), atunci copaci vor rula mai repede decât tabele de dispersie.

Publicat 19/08/2017 la 03:24
sursa de către utilizator

voturi
0

Un HashMap este un tablou asociativ set. Deci, gama dvs. de valori de intrare devine comasate în găleți. Într-o schemă de adresare deschisă, aveți un pointer la o găleată, și de fiecare dată când adăugați o nouă valoare într-o găleată, să aflați unde în găleată, există spații libere. Există câteva modalități de a face this- începe de la începutul cupei și a incrementa indicatorul de fiecare dată și testa dacă au ocupat ei. Aceasta se numește liniar sondare. Apoi, puteți face o căutare binară, să adăugați, în cazul în care dublați diferența între începutul găleții și în cazul în care vă dublați sau înapoi în jos de fiecare dată când sunt în căutarea unui spațiu liber. Aceasta se numește pătratică sondare. O.K. Acum, problemele din ambele aceste metode este că, în cazul în care galeata se revarsă în următoarele găleți de adrese, apoi aveți nevoie de la-

  1. Dublu fiecare găleți malloc size- (N găleți) / schimba hash funcției- Timpul necesar: depinde de punerea în aplicare a malloc
  2. Transfer / Copiați fiecare dintre datele anterioare pistoane în noile date pistoane. Aceasta este o operație O (N) unde N reprezintă întreaga date

O.K. dar dacă utilizați un LinkedList nu ar trebui să fie o astfel de problemă nu? Da, în listele legate nu au această problemă. Luând în considerare fiecare compartiment pentru a începe cu o listă legată, iar dacă aveți 100 de elemente într-o găleată vă cere să traverseze cele 100 de elemente pentru a ajunge la sfârșitul LinkedList, prin urmare, List.add (elementul E) va lua timp la-

  1. Hash elementul unui normal ca în toate Cazane-implementările
  2. Fa-ti timp pentru a găsi ultimul element din O Cazane-(N), operația menționată.

Avantajul implementării LinkedList este că nu aveți nevoie de operația de alocare a memoriei și O (N) de transfer / copie a tuturor găleți ca și în cazul punerii în aplicare abordarea deschisă.

Deci, modul de a minimiza O (N) operațiunea este de a converti punerea în aplicare cu cea a unui binar de căutare copac în cazul în care găsesc operații sunt O (log (N)) și adăugați elementul în poziția sa bazat pe valoarea acestuia. Caracteristica adăugată a unui BST este ca vine sortate!

Publicat 20/08/2017 la 23:24
sursa de către utilizator

voturi
0

arbori de căutare binare sunt alegere bună pentru a pune în aplicare dicționarul în cazul în care cheile au unele ordine totală (chei sunt comparabile) definite pe ele și doriți să păstrați informațiile despre comandă.

După cum BST păstrează informațiile despre comandă, acesta vă oferă patru operații set dinamic suplimentare, care nu pot fi efectuate (eficient) folosind tabele de dispersie. Aceste operațiuni sunt:

  1. Maxim
  2. Minim
  3. Succesor
  4. Predecesor

Toate aceste operații ca fiecare operațiune BST au timp complexitatea O (H). În plus, toate cheile stocate rămân sortate în BST permițându-vă astfel, pentru a obține secvența de chei sortate doar traversand copac în-ordine.

În rezumat, dacă tot ce doriți este operațiile de inserare, ștergere și elimina apoi tabel hash este imbatabil (cele mai multe ori), în performanță. Dar, dacă doriți oricare sau toate operațiunile enumerate mai sus, ar trebui să utilizați un BST, de preferință, un BST auto-echilibrare.

Publicat 19/05/2018 la 16:46
sursa de către utilizator

voturi
0

copaci binar de căutare poate fi mai rapid atunci când este utilizat cu ajutorul tastelor șir. Mai ales atunci când sunt lungi siruri de caractere.

arbori de căutare binare utilizând comparații pentru mai puțin / mai mare, care sunt rapide pentru siruri de caractere (atunci când acestea nu sunt egale). Deci, un BST poate răspunde rapid atunci când un șir de caractere nu este găsit. Când este găsit că va trebui să facă doar o comparație completă.

Într-un tabel hash. Ai nevoie pentru a calcula hash șir și acest lucru înseamnă că trebuie să treacă prin toate bytes cel puțin o dată pentru a calcula hash. Apoi, din nou, atunci când se constată o intrare de potrivire.

Publicat 13/10/2018 la 11:32
sursa de către utilizator

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more