Cum de a găsi indicele unui element din setul sortat?

voturi
4

Pot să găsesc un element dintr - un set sortat (susținută de BST) , în O(logN). Acum aș dori ca indicele acestui element. De exemplu, în set {1, 3, 4, 10}, indicele 4este 2și indicele 1este 0.

Evident, eu pot itera peste set, astfel încât soluția este banală O(N). Putem face mai bine , probabil , folosind proprietăți BST și / sau structuri de date auxiliare?

Întrebat 09/05/2011 la 11:46
sursa de către utilizator
În alte limbi...                            


1 răspunsuri

voturi
3

Cu un simplu BST în cazul în care ordinea de inserare a elementelor în mod aleatoriu, aveți o modalitate de a determina cât de multe elemente exact sunt mai mici decât un element dat, fără a mers pe jos de copac.

Dacă ați avut un arbore echilibrat, cum ar fi un copac roșu-negru, atunci ai putea pune cel puțin o limită inferioară și superioară pe index datorită limitelor pe înălțimea copacului. În cazul în care ordinea de inserare a elementelor unui BST este non-aleatoare, apoi din nou, ai putea spune ceva despre înălțimea de copac, fără a mers pe jos ea si sa dea o estimare a indicelui aproximative.

În ceea ce privește structurile de date auxiliare, ați putea crea un dicționar auxiliar care mapează elemente pentru indexul lor. Cu toate acestea, construirea de faptul că indicele ia O (N), iar indicele devine stătut atunci când adăugați elemente noi la BST, astfel încât aceasta funcționează numai bine pentru BSTs cu actualizări rare.

O altă soluție este de a extinde nodurile BST cu două proprietăți: indicele și conta. Indicele spune cât de multe elemente mai mici decât cea din acest nod sunt în copac. Numărătoarea spune cât de multe elemente au fost în BST când ultima actualizare a indexului nodului. Cu modificări relativ simple la inserare, ștergere și căutare pe BST, care nu afectează aceste operațiuni de bază dincolo de o constantă de timp, și se poate obține indicele elementului direct în O (1).

În esență, pe măsură ce se introduce un nou nod, pentru fiecare nod va trece pe calea ta în jos, în cazul în care noul element este mai mic (de exemplu, următorul pas este de a copilului stânga), incrementa atât indicele și numărul de acel nod. Când găsiți loc noul element, a vă da un număr bazat pe mamă, și un indice bazat pe părinte și copil stâng. Acest lucru lasă elementele mai mari decât unul nou cu un indice greșit, dar ai putea actualiza cu ușurință că pe măsură ce căuta un element prin referirea la valoarea numărului părintelui - diferența dintre numărul de părintelui și copilului vă spune cum multe inserții de elemente mai mici, sa întâmplat de la ultima actualizare indicele copilului, astfel încât pur și simplu adăugați această diferență la index.

Publicat 09/05/2011 la 13:13
sursa de către utilizator

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