Maak een evenwichtige binaire zoekboom uit een stroom van gehele getallen

stemmen
10

Ik ben net klaar met een sollicitatiegesprek en ik was worstelen met deze vraag, die lijkt mij als een zeer moeilijke vraag voor het geven van een 15 minuten gesprek.

De vraag was: Schrijf een functie, die een stroom van integers (ongeordende) gegeven, bouwt een evenwichtige zoekboom. Nu kun je niet wachten tot de ingang tot het einde (het is een stream), dus je moet de boom balanceren op de vlieg.

Mijn eerste antwoord was om een ​​rood-zwarte boom, die natuurlijk doet het werk gebruiken, maar ik moet aannemen dat ze niet verwachten dat ik een rode zwarte boom uit te voeren in 15 minuten.

Dus, is er een eenvoudige oplossing voor dit probleem dat ik ben niet bewust van?

Bedankt,

Dave

De vraag is gesteld op 29/08/2011 om 22:25
bron van user
In andere talen...                            


3 antwoorden

stemmen
3

AA Bomen zijn een beetje eenvoudiger dan rood-zwarte bomen, maar ik kon niet uit te voeren een uit de top van mijn hoofd.

antwoordde op 29/08/2011 om 22:28
bron van user

stemmen
9

Ik denk persoonlijk dat de beste manier om dit te doen zou zijn om te gaan voor een gerandomiseerde binaire zoekboom als een treap . Dit betekent niet absoluut garanderen dat de boom zal worden afgewogen, maar met een hoge waarschijnlijkheid zal de boom een goede balans factor hebben. Een treap werkt door het verhogen van ieder element van de structuur met een uniform willekeurig getal vervolgens voor te zorgen dat de boom is een binaire zoekboom opzichte van de sleutels en een heap met betrekking tot het uniforme willekeurige waarden. Het inbrengen in een treap is zeer eenvoudig:

  1. Kies een willekeurig getal toewijzen aan de nieuw toegevoegde element.
  2. Plaats het element in de BST behulp van standaard BST inbrengen.
  3. Terwijl de sleutel van de nieuw gestoken element groter is dan de sleutel van haar moedermaatschappij, het uitvoeren van een boom rotatie naar het nieuwe element boven zijn ouders te brengen.

Die laatste stap is het enige echt moeilijk, maar als je wat tijd om het uit te werken op een whiteboard Ik ben er vrij zeker van dat u dit zou kunnen implementeren van on-the-fly in een interview gehad.

Een andere optie die zou kunnen werken zou zijn om een te gebruiken splayboom . Het is een andere vorm van fast BST die kunnen worden toegepast ervan uitgaande dat je een standaard BST insert-functie en de mogelijkheid tot boom rotaties te doen. Belangrijk is splayboom zijn zeer snel in de praktijk, en het is bekend dat zij (tot binnen een constante factor) minstens zo goed als elke andere statische binary search boom.

Afhankelijk van wat er bedoeld wordt met "zoekboom," je zou ook kunnen overwegen het opslaan van de gehele getallen in enige structuur geoptimaliseerd voor het opzoeken van gehele getallen. Bijvoorbeeld, kan een gebruik bitsgewijze trie de integers, welke lookup ondersteunt in de tijd evenredig met het aantal bits in een machinewoord. Dit kan worden geïmplementeerd heel mooi met behulp van een recursieve functie om te kijken over de bits, en geen enkele vorm van rotaties vereisen. Als u die nodig zijn om uit te blazen een implementatie in vijftien minuten, en als de interviewer stelt u in staat om af te wijken van de standaard binary search bomen, dan kan dit een geweldige oplossing zijn.

Ik hoop dat dit helpt!

antwoordde op 29/08/2011 om 22:33
bron van user

stemmen
1

Een van de eenvoudigste evenwichtige binaire zoekboom is BB (α) -boom. Je pakt de constante α, waarin staat hoeveel onevenwichtig kan de boom te krijgen. Te allen tijde #descendants(child) <= (1-α) × #descendants(node)moet houden. U behandelen als normale binaire zoekboom, maar als de formule niet meer van toepassing op een aantal knooppunt, je gewoon weer op te bouwen dat een deel van de boom van de grond af, zodat het perfect in balans.

De afgeschreven tijdcomplexiteit voor insertie of deletie nog O (log N), net als bij andere gebalanceerde binaire bomen.

antwoordde op 29/08/2011 om 22:49
bron van user

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