Lag et balansert binært søketre fra en strøm av heltall

stemmer
10

Jeg har nettopp avsluttet en jobb intervju, og jeg strevde med dette spørsmålet, noe som virker for meg som en veldig vanskelig spørsmål for å gi en 15 minutters intervju.

Spørsmålet var: Skriv en funksjon, som har gitt en strøm av heltall (unordered), bygger et balansert søketre. Nå kan du ikke vente for innspill til slutt (det er en strøm), så du trenger å balansere treet på fly.

Mitt første svar var å bruke en rød-svart tre, noe som selvfølgelig gjør jobben, men jeg må anta at de ikke forventer at jeg skal gjennomføre en rød svart tre på 15 minutter.

Så, er det noen enkel løsning på dette problemet er jeg ikke klar over?

Takk,

Dave

Publisert på 29/08/2011 klokken 21:25
kilden bruker
På andre språk...                            


3 svar

stemmer
3

AA Trees er litt enklere enn rød-svart trær, men jeg kunne ikke gjennomføre en av toppen av hodet mitt.

Svarte 29/08/2011 kl. 21:28
kilden bruker

stemmer
9

Jeg personlig tror at den beste måten å gjøre dette ville være å gå for en randomisert binært søketre som en treap . Dette betyr ikke absolutt garantere at treet skal være balansert, men med stor sannsynlighet vil treet ha en god balanse faktor. En treap virker ved å forsterke hvert element av treet med en ensartet tilfeldig tall, da slik at treet er et binært søk treet med hensyn til tastene og en haug med hensyn til de ensartede tilfeldige verdier. Innsetting i en treap er svært enkelt:

  1. Plukk en tilfeldig tall tilordne til nyopprettede element.
  2. Sett elementet inn i BST ved hjelp av standard BST innsetting.
  3. Mens den nylig innsatt lementets nøkkel er større enn styrings av moder, utføre en tre rotasjon for å bringe det nye elementet over dens forelder.

Det siste trinnet er det bare veldig vanskelig en, men hvis du hadde litt tid til å finne ut av det på en tavle jeg er ganske sikker på at du kan implementere dette on-the-fly i et intervju.

Et annet alternativ som kan fungere ville være å bruke en spriker tre . Det er en annen type fast BST som kan iverksettes forutsatt at du har en standard BST innsats funksjon og evnen til å gjøre tre rotasjoner. Viktigere, sprikende trær er ekstremt rask i praksis, og det er kjent at de er (til innenfor en konstant faktor) minst like godt som alle andre statisk binært søketre.

Avhengig av hva som menes med "søketre," du kan også vurdere å lagre heltall i noen struktur optimalisert for oppslag av heltall. For eksempel kan du bruke en bitvis trie å lagre heltall, som støtter oppslag i tid proporsjonal med antall bits i en maskin ord. Dette kan gjennomføres ganske fint å bruke en rekursiv funksjon for å se over de biter, og krever ikke noen form for rotasjoner. Hvis du trenger å sprenge ut en implementering i femten minutter, og hvis intervjueren gjør det mulig å avvike fra standard binære søketrær, så dette kan være en god løsning.

Håper dette hjelper!

Svarte 29/08/2011 kl. 21:33
kilden bruker

stemmer
1

En av de enkleste balansert binært søketre er BB (α) -tre. Du velger konstant α, som sier hvor mye ubalansert kan treet få. Til alle tider, #descendants(child) <= (1-α) × #descendants(node)må holde. Du behandle det som vanlig binært søketre, men når formelen ikke gjelder for noen node lenger, du bare gjenoppbygge den delen av treet fra bunnen av, slik at den er perfekt balansert.

Den amortisert tid kompleksitet for innsetning eller delesjon er fremdeles O (log N), på samme måte som med andre balanserte binære trær.

Svarte 29/08/2011 kl. 21:49
kilden bruker

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