Crearea unui arbore echilibrat binar de căutare dintr-un flux de numere întregi

voturi
10

Am terminat doar un interviu de locuri de muncă și am fost luptă cu această întrebare, care mi se pare ca o întrebare foarte greu pentru a da un interviu de 15 minute.

Întrebarea a fost: scrie o funcție, care a dat un flux de numere întregi (neordonate), construiește un arbore de căutare echilibrat. Acum, nu vă puteți aștepta pentru intrare la capăt (este un flux), deci trebuie să echilibru copac pe zbor.

Primul meu răspuns a fost de a utiliza un arbore rosu-negru, care, desigur, face treaba, dar trebuie să-și asume că nu se așteaptă ca eu să pună în aplicare un copac negru roșu în 15 minute.

Deci, există nici o soluție simplă pentru această problemă eu nu sunt conștienți?

Mulțumiri,

Dave

Întrebat 29/08/2011 la 22:25
sursa de către utilizator
În alte limbi...                            


3 răspunsuri

voturi
3

Copacii AA sunt un pic mai simplu decât merii rosu-negru, dar nu am putut pune în aplicare unul pe partea de sus a capului meu.

Publicat 29/08/2011 la 22:28
sursa de către utilizator

voturi
9

Eu personal cred că cel mai bun mod de a face acest lucru ar fi pentru a merge pentru un arbore binar de căutare randomizat ca un treap . Acest lucru nu garantează în mod absolut că pomul va fi echilibrat, dar cu mare probabilitate copac va avea un factor de echilibru bun. Un treap funcționează prin augmentarea fiecare element al arborelui cu un număr uniform aleator, apoi asigurându -se că arborele este un arbore binar de căutare cu privire la cheile și o grămadă în ceea ce privește valorile aleatoare uniforme. Inserarea într - un treap este extrem de simplu:

  1. Alegeți un număr aleator pentru a atribui elementul nou adăugat.
  2. Se introduce elementul în BST folosind standardul de inserare BST.
  3. În timp ce tasta elementul nou introdus este mai mare decât cheia părintelui său, efectuează o rotație copac pentru a aduce noul element de mai sus mamă.

Acest ultim pas este singurul foarte greu, dar dacă ai avut ceva timp să-l lucreze pe o tablă Sunt destul de sigur că ai putea pune în aplicare acest lucru pe-the-fly într-un interviu.

O altă opțiune care ar putea lucra ar fi de a utiliza un arbore splay . Este un alt tip de BST rapid , care poate fi pus în aplicare presupunând că aveți o funcție standard , inserați BST și capacitatea de a face rotații de copac. Foarte important, arborii splay sunt extrem de rapid în practică, și este cunoscut faptul că acestea sunt (a într - un factor constant) , cel puțin la fel de bun ca orice alt arbore binar de căutare statică.

În funcție de ceea ce se înțelege prin „arborele de căutare,“ ați putea lua în considerare , de asemenea , stocarea numerelor întregi , în unele structuri optimizate pentru căutare de numere întregi. De exemplu, ați putea utiliza un trie bitwise pentru a stoca numere întregi, care sprijină de căutare în timp proporțional cu numărul de biți într - un cuvânt mașină. Acest lucru poate fi pus în aplicare destul de bine , folosind o funcție recursivă să se uite peste biți, și nu necesită nici un fel de rotații. Dacă este necesar să suflu dintr - o punere în aplicare în cincisprezece minute, iar în cazul în care intervievatorul vă permite să se abată de la arborii standard de căutare binare, atunci acest lucru ar putea fi o soluție.

Sper că acest lucru vă ajută!

Publicat 29/08/2011 la 22:33
sursa de către utilizator

voturi
1

Una dintre cele mai simple arbore echilibrat binar de căutare este BB (α) -tree. Tu alegi grupa a constantă, care spune cât de mult dezechilibrată poate copac obține. În orice moment, #descendants(child) <= (1-α) × #descendants(node)trebuie să dețină. Ai trata ca arbore binar de căutare normală, dar atunci când formula nu se mai aplică la unele nod, vă reconstrui doar acea parte a arborelui de la zero, astfel încât este perfect echilibrat.

Complexitatea de timp amortizat pentru inserare sau ștergere este încă O (log N), la fel ca și cu alți arbori binari echilibrate.

Publicat 29/08/2011 la 22:49
sursa de către utilizator

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