Milyen előnyei vannak a bináris keresés fák felett hash táblák?
Hash táblák lehet nézni bármely elemének Theta (1) idő, és ez csak olyan egyszerű, hogy adjunk egy elem .... de nem vagyok benne biztos előnye megy a másik irányba.
Milyen előnyei vannak a bináris keresés fák felett hash táblák?
Hash táblák lehet nézni bármely elemének Theta (1) idő, és ez csak olyan egyszerű, hogy adjunk egy elem .... de nem vagyok benne biztos előnye megy a másik irányba.
Egy „előnye” egy bináris fa az, hogy lehet áthaladni a listához ki az összes elemet érdekében. Ez nem lehetetlen egy hash tábla, de nem egy normális működését egy design-jének szerkezete.
A hash volna több helyet, amikor először jön létre - ez lesz a rendelkezésre álló résidők hogy az elemek, amelyek még ki (függetlenül attól, hogy valaha is ki), egy bináris keresési fa csak akkor lesz olyan nagy, mint azt kell lenni. Továbbá, ha a hash-tábla van szüksége több helyet, bővül a másik szerkezet is időigényes, de ez függhet végrehajtását.
Ne feledje, hogy a bináris keresés Fák (referencia-alapú) a memória hatékony. Nem foglalni több memóriát, mint amennyit kell.
Például, ha a hash függvény egy sor R(h) = 0...100, akkor meg kell kiosztani egy sor 100 (pointerek-ig) elemek, akkor is, ha csak tördeljük 20 elemekkel. Ha volt, hogy egy bináris keresési fa tárolására ugyanazt az információt, akkor csak akkor nyújtanak annyi helyet, amennyit csak szükség, valamint néhány metaadatokat linkeket.
A bináris fa lassabb keresni, és helyezze be, de az nagyon szép vonása az infix bejárás ami lényegében azt jelenti, hogy akkor végighaladni a fa csomópontjait egy rendezett sorrendben.
Az ismétlése révén a bejegyzéseket egy hash tábla csak nincs sok értelme, mert mind szétszórva a memóriában.
A bináris keresési fa lehet megvalósítani egy tartós felület, ahol egy új fát vissza, de az öreg fa továbbra is fennáll. Gondosan végrehajtják, a régi és az új fák részvények legtöbb csomópont. Ezt nem teheti ezt egy standard hash tábla.
A fő előnye egy bináris fa egy hash tábla, hogy a bináris fa ad két további műveleteket nem lehet csinálni (könnyen, gyorsan) egy hash tábla
megtalálni az elem legközelebb (nem feltétlenül egyenlő) néhány önkényes kulcs értékének (vagy az ahhoz legközelebb felett / alatt)
végiglépdelni tartalmát a fa sorba rendezett
A két csatlakoznak - a bináris fa megtartja tartalmát egy rendezetten, így a dolgok, amelyek megkövetelik, hogy rendezetten könnyű csinálni.
A (kiegyensúlyozott) bináris keresési fa is megvan az az előnye, hogy az aszimptotikus bonyolultsága valójában egy felső határ, míg a „konstans” idők hash táblák amortizált tartás: Ha van egy alkalmatlan hash függvény, akkor a végén lekezelő lineáris időt ahelyett, hogy állandó.
Ha el szeretné érni az adatokat egy rendezett módon, majd a rendezett listát kell tartani párhuzamosan a hash táblában. Jó példa erre szótár .Net. (lásd http://msdn.microsoft.com/en-us/library/3fcwy8h6.aspx ).
Ez a mellékhatás nem csak lassítja betétek, de fogyaszt nagyobb mennyiségű memóriát igényel, mint a B-fa.
Továbbá, mivel a B-fa rendezve, ez egyszerű megtalálni tartományok eredményeit, illetve, hogy végre a szakszervezetek vagy egyesítést.
Amellett, hogy az összes többi jó hozzászólás:
Hash táblák általában jobb cache viselkedést igénylő kevesebb memória olvasást, mint egy bináris fa. Egy hash tábla, amit általában csak merülnek egyetlen olvasási előtt van hozzáférése a referencia tartja az adatokat. A bináris fa, ha ez egy kiegyensúlyozott változata előírja, valamit a sorrendben k * lg (n) memória olvasás valamilyen állandó k.
Másrészt, ha az ellenség tudja a hash-függvény az ellenség is érvényesíteni a hash tábla, hogy az ütközések, nagyban akadályozza a teljesítményt. A megoldás az, hogy válassza ki a hash-függvény véletlenszerűen egy család, de a BST nem ezt a hátrányt. Továbbá, ha a hash tábla nyomás nő túl sokat, akkor gyakran hajlamosak enlargen és áthelyezni a hash tábla, amely lehet egy drága művelet. A BST van egyszerűbb viselkedés itt és nem hajlamos hirtelen kiosztani egy csomó adatot, és nem egy előhozakodás működését.
Fák általában, hogy a végső átlagos adatszerkezet. Úgy működhet listák, könnyen szét a párhuzamos működés, igen gyors eltávolítása, berakás és lookup nagyságrendű O (lg n) . Ők semmit sem különösen jól, de nincs túl rossz viselkedés sem.
Végül BSTs sokkal könnyebb megvalósítani (tiszta) funkcionális nyelvek, mint a hash-táblákat és azok nem igényelnek romboló frissítéseket kell végrehajtani (a perzisztencia érv Pascal fent).
fő előnye, hash tábla, hogy nem szinte minden ops ~ = O (1). És nagyon könnyű megérteni és végrehajtani. Ez nem oldja meg a sok „interjú problémák” hatékonyan. Tehát ha u akar feltörni egy kódoló interjú, hogy a legjobb barátja hash tábla ;-)
BSTs is biztosítja a „findPredecessor” és „findSuccessor” műveletek (Ahhoz, hogy megtalálja a következő legkisebb és legnagyobb elem mellett) O (logn) idő, amely esetleg szintén nagyon hasznos műveleteket. Hash Table nem tud abban az időben a hatékonyságot.
Ez attól is függ a használatát, Hash lehetővé teszi, hogy keresse meg a pontos egyezés. Ha azt szeretnénk, hogy a lekérdezés egy sor, akkor a BST a választás. Tegyük fel, hogy van egy csomó adat e1, e2, e3 ..... en.
A hash tábla akkor keresse bármely elemének folyamatos időben.
Ha azt szeretnénk, hogy megtalálják értéktartományokról nagyobb, mint az E41, és kevesebb, mint az E8, BST gyorsan megtalálja ezt.
A legfontosabb dolog a hash függvény, hogy elkerülje az ütközést. Természetesen nem tudjuk teljesen elkerülni az ütközést, amely esetben igénybe láncolás vagy más módszerekkel. Ez teszi lehívása nem konstans idő legrosszabb esetben.
Ha teli, hash tábla, hogy növelje a vödör mérete és másolja át az összes elemet újra. Ez olyan további költség nem közölt több BST.
Az egyik előnye, hogy senki más rámutatott, hogy a bináris keresési fa elvégzését teszi lehetővé a tartomány kereséseket hatékonyan.
Annak érdekében, hogy bemutassa az én ötletem, azt szeretnénk, hogy egy extrém eset. Azt szeretné, hogy az összes elem, amelynek gombok 0 5000. És tulajdonképpen csak egy van ilyen elem és 10000 egyéb elemek, amelyeknek kulcsok nem a tartományban. BST tehetünk tartomány kereséseket elég hatékonyan, mivel nem keresi részfa ami lehetetlen a választ.
Bár, hogyan lehet csinálni a tartomány kereséseket hash tábla? Akkor sem kell végighaladni minden vödröt a helyet, ami O (n), illetve meg kell keresni, hogy az egyes 1,2,3,4 ... 5000 létezik. (Mi lesz a kulcs 0 és 5000 végtelen sorozata? Például kulcs lehet tizedes)
A hash tábla egy rendezetlen adatszerkezet tervezésekor egy mobiltelefon, meg akarja tartani a lehető legtöbb adatot alkalmas adattárolásra. A hash tábla egy rendezetlen adatszerkezet - ami azt jelenti, hogy nem tartja annak elemei adott sorrendben. Tehát, ha egy hash tábla egy mobiltelefon címjegyzék, akkor lenne szükség további memóriát rendezni az értékek, mert akkor biztosan kell, hogy megjelenjen az értékeket alfabetikus sorrendben - ez egy címjegyzék után. Így, egy hash tábla van, hogy félre memória rendezni elemeket, amiket máskülönben használható tárhelyet. De bináris keresés fa egy rendezett adat structure.Because bináris kereső fába már rendezve van, nem lesz szükség a hulladék memória vagy a feldolgozási idő válogató rekordok egy mobiltelefon. Ahogy korábban említettük, csinál egy keresés vagy egy betétet egy bináris fa lassabb, mint csinálni egy hash tábla, de a mobiltelefon címjegyzék szinte soha nem több mint 5000 bejegyzést. Egy ilyen kis bejegyzések száma, egy bináris keresési fa O (log (n)) minden bizonnyal elég gyors. Tehát, mivel minden információt, egy bináris keresési fa az adatstruktúra, hogy meg kell használni ebben a helyzetben, hiszen ez egy jobb választás, mint egy hash táblát.
Hasító táblázatok nem jó indexelés. Ha keres egy sor, BSTs jobbak. Ez az oka annak, hogy a legtöbb adatbázis indexek használni B + fák helyett Hasító táblázatok
Honnan Repedés a Coding Interjú, 6. kiadás
Tudjuk végrehajtani a hash tábla kiegyensúlyozott bináris keresési fa (BST). Ez ad nekünk egy O (log n) lookup időt. Ennek az az előnye potenciálisan kevesebb helyet, mert már nem osztja egy nagy tömb. Azt is végighaladni a kulcsokat érdekében, ami hasznos lehet néha.
Az osztályok Hash-halmaz és táblázat a rendezetlen gyűjtemények. Ez nem egyértelmű a felület (és lehet más), de hash táblák kerültek megvalósítható AVL fák. Ez azt jelenti, hogy a hash kód nem csökken a modulo tömb (kevesebb ütközés), és ez azt is jelenti, hogy nincs előhozakodás tömb kell tenni (simább teljesítmény). Az a tény, hogy ezek a rendezetlen gyűjtemények azt jelenti, hogy csak a kínálat egyenlő funkcióval és egy kivonat funkció - nem a teljes összehasonlítóhoz mint a fák. Így akár egy hash tábla táblázat <K, T> vagy egy bináris fa fa <K, T> függ az osztály K - függetlenül attól, hogy teljes mértékben összehasonlíthatók, vagy csak az egyenlőség összehasonlítható.
Vannak alkalmak, amikor az adattípus egyaránt összehasonlítható és egyenlőség összehasonlítható - mint a String. Ez azt jelenti, hogy a Hash-halmaz <String> és a <String> egyaránt lehetséges. Keresések egy hash halmazának általában körülbelül 10-szer gyorsabb, mint a keresések rendezett halmaza szálakat. Ha az összehasonlító drága, akkor a fák lassítják képest HashTables. Ha az összehasonlító gyors, (mint egész és lebegőpontos számok), akkor a fák gyorsabban fut, mint a hash táblák.
A HashMap halmaza asszociatív tömb. Tehát a tömb bemeneti értékek lesz gyűjtöttük vödrök. Egy nyitott címzési rendszer, van egy mutató egy vödör, és minden egyes alkalommal, amikor egy új értéket egy vödörbe, ha megtudja, hol a tengerben vannak szabad helyek. Van néhány módja this- elkezdi az elején a vödörből, és növeljük a mutató minden egyes alkalommal, és vizsgálni kell, hogy az elfoglalt. Ez az úgynevezett lineáris tapintás. Ezután, meg tudod csinálni egy bináris keresést, mint kiegészítőt, ahol kettős a különbség az elején a vödröt, és hol duplázni vagy vissza minden alkalommal, amikor keres egy szabad hely. Ez az úgynevezett másodfokú tapintás. RENDBEN. Most a problémákat Mindkét esetben szükség van, hogy ha a vödör túlcsordul a következő kanalak foglalkozni, akkor meg kell to-
RENDBEN. de ha egy láncolt lista ne legyen ilyen probléma van? Igen, láncolt listák nem kell ezt a problémát. Figyelembe véve az egyes vödör kezdeni a láncolt lista, és ha van 100 elem egy vödör is megköveteli, hogy áthalad a 100 elem, hogy elérje a végén a láncolt lista így a List.add (Element E) időt vesz igénybe to-
Az előnye, hogy a láncolt lista megvalósítása az, hogy nem kell a memória kiosztás művelet és az O (N) átutalás / másolatát kanalak, mint abban az esetben a nyílt címzés végrehajtására.
Tehát, ahogy minimalizálása O (N) művelet átalakítani a végrehajtás, hogy a bináris kereső fába, ahol megtalálják a műveletek O (log (n)), és adja hozzá az elem a helyén alapján ez érték. A hozzáadott jellemzője BST az, hogy jön válogatni!
Bináris keresés fák jó választás, hogy végre szótárban, ha a kulcsokat valamilyen teljes megrendelést (billentyűk hasonló) definiált, és szeretné megőrizni a megrendelés adatait.
Mivel BST megőrzi a megrendelés adatait, biztosítja az Ön számára négy további dinamikus halmaz műveletek nem hajthatók végre (hatékonyan) alkalmazásával hash táblák. Ezek a műveletek a következők:
Mindezeket a műveleteket, mint minden BST működési időnk bonyolultsága O (H). Emellett az összes tárolt kulcsok maradnak rendezve a BST, így lehetővé téve, hogy a rendezett sorozata kulcsok csak mozgással a fa in-sorrendben.
Összefoglalva, ha az összes kívánt műveleteket beszúrni, törölni, és távolítsa el, majd a hash tábla egyedülálló (a legtöbb időt) a teljesítmény. De ha azt akarjuk, bármelyik vagy az összes felsorolt műveleteket fent akkor érdemes használni a BST, előnyösen önkiegyensúlyozó BST.
Bináris keresés fák gyorsabb lehet, ha használt zsineggel kulcsokat. Különösen akkor, ha húrok hosszú.
Binary keresési fák használata összehasonlításokat kevesebb / nagyobb amelyek gyorsan vonósokra (ha nem azonos). Tehát egy BST gyorsan válaszolni, ha egy karakterlánc nem található. Ha ez megtalálható lesz kell tennie csak egy teljes összehasonlítást.
Egy hash tábla. Be kell számítani a hash a húr, és ez azt jelenti, meg kell, hogy menjen át minden byte legalább egyszer, hogy kiszámolja a hash. Aztán megint, ha egy egyező bejegyzés.