Vytvořit vyvážený binární vyhledávací strom z proudu celých čísel

hlasů
10

Právě jsem dokončil pohovor a já se potýká s touto otázkou, která se mi zdá jako velmi těžká otázka pro dávat na 15 minut rozhovor.

Otázka zněla: Napište funkci, která daný proud čísel (neuspořádané), buduje vyvážený vyhledávací strom. Nyní, nemůžete čekat na vstup do konce (to je potok), takže je třeba vyvážit strom v reálném čase.

Moje první odpověď byla k použití Red-Black strom, což samozřejmě dělá svou práci, ale musím předpokládat, že nečekal, že mi realizovat červeno-černý strom za 15 minut.

Takže, existuje nějaká jednoduché řešení tohoto problému si nejsem vědom?

Dík,

Dave

Položena 29/08/2011 v 22:25
zdroj uživatelem
V jiných jazycích...                            


3 odpovědí

hlasů
3

AA Stromy jsou o něco jednodušší než Red-Black stromy, ale nemohl jsem se realizovat jeden z vrcholu mé hlavy.

Odpovězeno 29/08/2011 v 22:28
zdroj uživatelem

hlasů
9

Já osobně si myslím, že nejlepší způsob, jak to udělat, je jít na randomizované binárního vyhledávacího stromu jako treap . To však není zcela zaručeno, že strom bude dáno, ale s vysokou pravděpodobností strom bude mít dobrou rovnováhu faktor. Treap pracuje tak, že každý prvek rozšiřovat stromu s rovnoměrně náhodné číslo, pak zajistí, že strom je binární vyhledávací strom vzhledem ke klíči a hromadu s ohledem na jednotné náhodné hodnoty. Vložení do treap je velmi jednoduchá:

  1. Vyzvednout náhodné číslo přiřadit nově přidaného prvku.
  2. Vložte prvek do BST pomocí standardního vložení BST.
  3. Zatímco klíč nově zajíždí prvku je větší než klíč své mateřské společnosti, provést rotaci stromu přinést nový prvek nad jeho rodiče.

Že poslední krok je jen opravdu těžký, ale pokud jste měli nějaký čas přijít na to na tabuli Jsem si jistý, že byste mohli realizovat tento on-the-fly v rozhovoru.

Další možností, která by mohla fungovat by bylo použít splay strom . Je to jiný typ rychlého BST, který může být realizován za předpokladu, že máte standardní funkce BST vložkou a schopnost dělat strom rotace. Důležité je, že splay strom jsou extrémně rychle v praxi, a je známo, že jsou (až do konstantní faktor) alespoň stejně dobrý jako kterýkoli jiný statický binárního vyhledávacího stromu.

V závislosti na tom, co se rozumí pod pojmem „vyhledávacího stromu,“ můžete také zvážit ukládání celých čísel v některých struktuře optimalizované pro vyhledávání celých čísel. Například, můžete použít bitovou trie pro uložení celých čísel, která podporuje vyhledávání v čase úměrném počtu bitů ve slově stroje. To může být provedena docela pěkně pomocí rekurzivní funkce, aby se podívali na kousky, a nevyžaduje žádný druh rotací. Pokud jste potřebovali k výbuchu mimo implementaci za patnáct minut, a v případě, že tazatel umožňuje odchýlit od standardních binárních vyhledávacích stromů, pak by to mohlo být skvělé řešení.

Snad to pomůže!

Odpovězeno 29/08/2011 v 22:33
zdroj uživatelem

hlasů
1

Jedním z nejjednodušších vyváženého binárního vyhledávacího stromu je BB (α) -tree. Vyber konstantní a, který říká, kolik nevyvážený může strom dostat. Po celou dobu, #descendants(child) <= (1-α) × #descendants(node)musí mít. Budete brát to jako normální binární vyhledávací strom, ale když vzorec se nevztahuje na nějaký uzel už, stačí obnovit tuto část stromu od nuly, takže je perfektně vyvážená.

Amortizovaná časová náročnost pro vložení nebo odstranění je stále O (log n), stejně jako s dalšími vyvážených binárních stromů.

Odpovězeno 29/08/2011 v 22:49
zdroj uživatelem

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