Wat zijn de voordelen van binary search bomen over hash tables?
Hash tables kan opzoeken elk element in Theta (1) tijd en het is net zo eenvoudig om een element toe te voegen .... maar ik ben niet zeker van de voordelen gaan andersom.
Wat zijn de voordelen van binary search bomen over hash tables?
Hash tables kan opzoeken elk element in Theta (1) tijd en het is net zo eenvoudig om een element toe te voegen .... maar ik ben niet zeker van de voordelen gaan andersom.
Een "voordeel" van een binaire boom is dat het kan worden verplaatst naar de lijst uit alle elementen in orde is. Dit is niet onmogelijk een Hash tafel, maar geen normale werking een ontwerp in een gehashte structuur.
Een hash zou nemen meer ruimte toen het eerst wordt gemaakt - het zal beschikbaar slots voor de elementen die nog moeten worden gestoken hebben (ongeacht of ze ooit zijn geplaatst), een binaire zoekboom slechts zo groot is als het moet zijn worden. Ook wanneer een hash-tabel meer ruimte nodig heeft, uit te breiden naar andere structuur kan tijdrovend zijn, maar dat zou kunnen afhangen van de implementatie.
Vergeet niet dat Binary Search Trees (-referentie-gebaseerde) zijn geheugen-efficiënt. Ze hoeven niet meer geheugen reserveren dan ze nodig hebben om.
Bijvoorbeeld, wanneer een hash-functie een bereik R(h) = 0...100, dan moet je een array van 100 (verwijzingen naar) elementen toe te wijzen, zelfs als je gewoon hashing 20 elementen. Als je aan een binaire zoekboom gebruiken om dezelfde informatie op te slaan, zou u alleen toewijzen zoveel ruimte als je nodig had, evenals een aantal metadata over koppelingen.
Een binaire boom is langzamer te zoeken en in te voegen in, maar heeft het erg leuke feature van de infix traversal die in wezen betekent dat u kunt herhalen door de knooppunten van de boom in een gesorteerde volgorde.
Itereren door de vermeldingen van een hash tabel gewoon niet veel zin te maken, omdat ze allemaal zijn verspreid in het geheugen.
Een binaire zoekboom kan worden geïmplementeerd met een aanhoudende -interface, waar een nieuwe boom wordt geretourneerd, maar de oude boom blijft bestaan. Zorgvuldig geïmplementeerd, is de oude en nieuwe bomen aandelen het grootste deel van hun knooppunten. U kunt dit niet doen met een standaard hash-tabel.
De belangrijkste voordelen van een binaire boom over een hash-tabel is dat de binaire boom geeft je twee extra bewerkingen die u niet kunt doen (eenvoudig, snel) met een hash table
vind het element het dichtst bij (niet noodzakelijk gelijk aan) een willekeurige sleutelwaarde (of zo dicht mogelijk boven / onder)
doorlopen van de inhoud van de boom in gesorteerde volgorde
De twee zijn aangesloten - de binaire boom houdt de inhoud ervan in een gesorteerde volgorde, dus dingen dat gesorteerde volgorde nodig zijn makkelijk te maken.
A (gebalanceerd) binaire zoekboom heeft ook het voordeel dat de asymptotische complexiteit is eigenlijk een bovengrens, terwijl de "constant" tijden voor hash tables zijn afgeschreven keer: Als u een ongeschikte hash-functie, je zou kunnen komen vernederend voor lineaire tijd in plaats van constant.
Als u wilt toegang tot de gegevens in een gesorteerde wijze, dan moet een gesorteerde lijst parallel aan de hash-tabel worden gehandhaafd. Een goed voorbeeld is Dictionary in .Net. (zie http://msdn.microsoft.com/en-us/library/3fcwy8h6.aspx ).
Dit heeft als neveneffect niet alleen vertragen inserts, maar verbruikt meer geheugen dan een B-structuur.
Verder, aangezien een b-tree wordt gesorteerd, is het eenvoudig te bereiken van resultaten te vinden, of om vakbonden of samenvoegingen uit te voeren.
In aanvulling op alle andere goede opmerkingen:
Hash tabellen in het algemeen een betere cache gedrag vereist minder geheugen leest in vergelijking met een binaire boom. Voor een hash tabel die u normaal alleen oplopen één te lezen voordat je toegang tot een referentie houden van uw gegevens. De binaire boom, als het een evenwichtige variant vereist iets in de orde van k * lg (n) geheugen leest voor sommige k.
Aan de andere kant, als een vijand kent uw hash-functie kan de vijand je hash tafel af te dwingen om botsingen te maken, sterk belemmert de prestaties. De oplossing is om de hash-functie willekeurig kiezen uit een familie, maar een BST heeft dit nadeel niet. Ook wanneer de hash tabel druk te veel groeit, je vaak de neiging om enlargen en herverdelen de hash-tabel, die een dure operatie kunnen zijn. De BST heeft eenvoudiger gedrag hier en niet de neiging om plotseling te wijzen een grote hoeveelheid gegevens en doe een herkauwen operatie.
Bomen neiging om de uiteindelijke gemiddelde datastructuur. Ze kunnen fungeren als lijsten kunnen gemakkelijk worden gesplitst voor parallelle werking, hebben een snelle verwijdering, insertie en opzoeken in de orde van O (lg n) . Ze doen niets bijzonder goed, maar ze hebben geen overdreven slecht gedrag ofwel.
Tenslotte BSTS zijn veel gemakkelijker te implementeren in (zuivere) functionele talen in vergelijking met hash-tafels en ze niet destructief updates uit te voeren (de eisen persistentie argument door Pascal hierboven).
hoofdvoordeel van hashtabel is dat het bijna alle ops ~ = O (1). En het is zeer gemakkelijk te begrijpen en uit te voeren. Het doet lossen veel "interview problemen" efficiënt. Dus als u wilt een codering interview te kraken, maken de beste vrienden met hash table ;-)
BSTS bieden ook de "findPredecessor" en "findSuccessor" operaties (Om de volgende kleinste en de op een na grootste elementen vinden) in O (logn) tijd, die ook erg handig operaties zou kunnen zijn. Hashtabel kan geen doordat tijdefficiency.
Het hangt ook af van het gebruik, Hash maakt het mogelijk om exacte match te vinden. Wilt u op te vragen voor een reeks dan BST is de keuze. Stel je hebt een veel data E1, E2, E3 ..... en.
Met hash tabel kunt u elk element in constante tijd te lokaliseren.
Als u wilt om het bereik waarden hoger dan E41 en minder dan E8, kunt BST snel merken dat.
Het belangrijkste is de hash-functie gebruikt om een botsing te voorkomen. Natuurlijk kunnen we niet helemaal voorkomen dat er een botsing, in welk geval we toevlucht nemen tot chaining of andere methoden. Dit maakt het ophalen van niet meer constante tijd in het ergste geval.
Zodra de volledige, hash tabel moet de emmer grootte van meer dan alle elementen opnieuw te verhogen en te kopiëren. Dit is een extra vergoeding niet aanwezig op BST.
Een voordeel dat niemand anders heeft erop gewezen is dat binaire zoekboom stelt u in staat om het bereik zoekopdrachten efficiënt uit te voeren.
Om mijn idee te illustreren, wil ik een extreem geval te maken. Stel dat je wilt naar alle elementen, waarvan de toetsen zijn tussen 0 tot 5000. En eigenlijk is er maar één zo'n element en 10000 andere elementen waarvan de toetsen zijn niet in het bereik te krijgen. BST kan range zoekopdrachten heel efficiënt doen omdat het niet een sub-boom die onmogelijk is om het antwoord te zoeken.
Hoewel, hoe kun je doen range zoekopdrachten in een hash-tabel? Of je moet elke emmer ruimte, die is O (n) te herhalen, of je moet kijken naar de vraag of elk van 1,2,3,4 ... tot 5000 bestaat. (Hoe zit het met de toetsen tussen 0 en 5000 zijn een oneindige verzameling? Bijvoorbeeld sleutels kunnen worden decimalen)
Een hash-tabel is een ongeordende datastructuur, Bij het ontwerpen van een mobiele telefoon, wil je zo veel mogelijk gegevens beschikbaar zijn voor data-opslag te houden. Een hash-tabel is een ongeordende datastructuur - wat betekent dat het zijn elementen in een bepaalde volgorde bijhoudt. Dus, als je een hash tabel te gebruiken voor een mobiele telefoon adresboek, dan zou je extra geheugen nodig om de waarden te sorteren, want je zou zeker moeten de waarden in alfabetische volgorde weer te geven - het is een adresboek na alles. Dus, met behulp van een hash tabel die u opzij moeten zetten geheugen om elementen die anders worden gebruikt als opslagruimte sorteren. Maar binaire zoekboom is een gesorteerde data structure.Because een binaire zoekboom is al gesorteerd, zal er geen noodzaak om geheugen of verwerkingstijd sorteren van records te verspillen in een mobiele telefoon. Zoals we eerder vermeld, het doen van een lookup of een insert op een binaire boom is langzamer dan doet het met een hash-tabel, maar een mobiele telefoon adresboek zal vrijwel nooit meer dan 5.000 inzendingen. Met een dergelijk klein aantal inzendingen, een binary search boom O (log (n)) zal zeker snel genoeg zijn. Dus, gezien al die informatie, een binary search boom is de datastructuur die u gebruikt in dit scenario, want het is een betere keuze dan een hash tabel.
Hash Tables zijn niet goed voor indexering. Wanneer u op zoek bent naar een range, BSTS zijn beter. Dat is de reden waarom de meeste database-indexen B + bomen in plaats van Hash Tables
Van Cracking the Coding Interview, 6th Edition
We kunnen de hash tabel te voeren met een evenwichtige binaire zoekboom (BST). Dit geeft ons een O (log n) opzoeken tijd. Het voordeel hiervan is mogelijk met minder ruimte, aangezien we niet langer een groot scala wijzen. We kunnen ook doorlopen sleutels om, wat soms nuttig kan zijn.
De lessen HashSet en tabel zijn ongeordende collecties. Het is niet duidelijk uit de interface (en anders zou zijn), maar hash tabellen zijn uitgevoerd met behulp van AVL Bomen. Dit betekent dat de hash-code niet wordt verminderd door de modulo van een array (minder botsingen) en het betekent ook dat er geen herkauwen van een array gebeuren (gladder performance). Het feit dat ze zijn ongeordende verzamelingen betekent dat u alleen leveren een gelijk functie en een hashCode functie - niet een volledige vergelijker als voor bomen. Dus of u nu een hash tabel <K, T> of een binaire boom Boom <K, T> is afhankelijk van de klasse K te gebruiken - of het nu volledig vergelijkbaar of slechts gelijkheid vergelijkbaar.
Er zijn situaties waarin het datatype is zowel vergelijkbaar en gelijkheid vergelijkbare - zoals String. Dit betekent dat HashSet <string> en stel <string> beide mogelijk. Zoekopdrachten op een hash set snaren hebben de neiging om ongeveer 10 keer sneller dan zoekopdrachten op een geordende set snaren. Als de vergelijker is duurder dan bomen vertragen in vergelijking met hashtables. Als de vergelijker is snel, (zoals voor gehele getallen en praalwagens), dan bomen zullen sneller dan hash tables werken.
Een HashMap is een set associatieve array. Dus, uw array van ingevoerde waarden wordt samengevoegd in emmers. In een open adressering regeling, heb je een pointer naar een emmer, en elke keer dat u een nieuwe waarde toe te voegen in een emmer, kom je erachter waar in de emmer zijn er vrije plaatsen. Er zijn een paar manieren om dit- u beginnen bij het begin van de emmer te doen en verhogen de aanwijzer elke keer en te testen of zijn bezet. Dit is de zogenaamde lineaire indringende. Vervolgens kunt u een binary search zoals add, waar u het verschil tussen het begin van de emmer en waar u verdubbelen of terug naar beneden elke keer dat u op zoek bent naar een vrije ruimte te verdubbelen doen. Dit is kwadratisch heet indringende. OK. Nu de problemen in deze beide methoden is dat als de emmer overloopt naar de volgende emmers aan te pakken, dan moet je to- nodig
OK. maar als je een LinkedList gebruiken zou er niet zo'n probleem toch? Ja, In gelinkte lijsten je dit probleem niet hebben. Gezien elke bak te beginnen met een gekoppelde lijst, en als je 100 elementen in een emmer het vereist dat u om die 100 elementen doorlopen tot aan het einde van de LinkedList vandaar de List.add (Element E) te bereiken zal tijd to- nemen
Het voordeel van de LinkedList implementatie is dat je niet de geheugentoewijzing werking en O (N) overdracht / kopie van alle emmers nodig zoals in het geval van de open aanpak van de uitvoering.
Dus, de weg naar de O (N) te minimaliseren is om de implementatie te zetten naar die van een binaire zoekboom waar vluchten O (log (N)) en je het element toe te voegen in zijn positie gebaseerd op zijn waarde te vinden. De toegevoegde eigenschap van een BST is dat het komt naargelang!
Binaire zoekboom zijn een goede keus aan woordenboek toe te passen indien de sleutels hebben een aantal totale order (toetsen zijn vergelijkbaar) gedefinieerd op hen en u wilt de bestelling informatie te bewaren.
Zoals BST behoudt de orde informatie, het biedt u met vier extra dynamische set functies die niet kunnen worden uitgevoerd (efficiënt) met behulp van hash tables. Deze handelingen zijn:
Al deze bewerkingen zoals elke BST operatie tijdcomplexiteit O (H). Daarnaast alle opgeslagen sleutels blijven gesorteerd in de BST dus u in staat te stellen de gesorteerde volgorde van de sleutels te krijgen alleen door de boom doorkruisen in in-order.
Samengevat als alles wat je wilt is operaties voegen, te verwijderen en verwijder vervolgens hash-tabel is onovertroffen (het grootste deel van de tijd) in de prestaties. Maar als je wilt een of meer van de boven je vermeld moet een BST, bij voorkeur een zelfbalancerende BST gebruiken operaties.
Binaire zoekboom kan sneller zijn bij gebruik met een touwtje toetsen. Vooral wanneer strings zijn lang.
Binaire zoekboom met behulp van vergelijkingen voor minder / meer, die zijn snel voor strijkers (als ze niet gelijk zijn). Dus een BST kan snel beantwoorden wanneer een string niet wordt gevonden. Als het vond het nodig om slechts een volledige vergelijking te doen.
In een hashtabel. U moet de hash van de string te berekenen en dit betekent dat je nodig hebt om te gaan door alle bytes ten minste een keer om de hash te berekenen. Daartegenover, wanneer een overeenstemmende invoer wordt gevonden.