copaci binar de căutare

Definirea unui arbore binar de căutare (binar de căutare copac, BST)

copaci Red-negru (roșu-negru copac, RB-Tree)

Caracteristicile comparative ale vitezei diferitelor structuri de date

copaci binar de căutare

Definirea unui arbore binar de căutare (binar de căutare copac, BST)

Căutare binară copac (MDC), numită structura ale cărei noduri sunt aranjate astfel încât fiecare nod are cel mult doi copii (să le spunem stânga și la dreapta), și toate nodurile, cu excepția rădăcinii au un părinte. Top, care au fost descendenți, numite foi. Se înțelege că fiecare nod corespunde unui element sau mai multe elemente, cu anumite valori-cheie, denumite în continuare o cheie. De obicei, un nod corespunde unui element, astfel încât acești termeni sunt posibile fără pierderea sensului sinonime avute în vedere, cu toate că trebuie să ne amintim că acest lucru nu este atât în ​​unele implementări. În algoritmii de mai sus, se crede că un nod are doar un singur element. Prin urmare, vom folosi conceptul de sus și în partea de sus a datelor-cheie, ceea ce înseamnă cheia de date și elementul corespunzător al summit-ului. De asemenea, va fi înțeles prin inserarea în partea de sus a adăugării de sus cu valoarea specificată a elementului și atribuie semne părinte și descendenții de valori valide. Această cheie este utilizată în toate operațiunile elementelor de comparație. Elementul poate conține, de asemenea, date asociate cu tasta. În practică, partea de date a elementului poate fi folosit ca o cheie. Cheia poate fi, de asemenea, stocate ca o singură valoare. MDC se poate efectua următoarele operații:

  • Căutați în partea de sus a tastei.
  • Determinarea nodurile cu valoarea minimă și maximă a cheii.
  • Du-te la vârful anterior sau următor în tastele de ordine definite.
  • Introduceți partea de sus.
  • Scoaterea partea de sus.

arbore binar poate fi împărțită logic în niveluri. Rădăcina arborelui este nivelul zero, descendenții rădăcină - primul nivel, descendenții acestora - în al doilea rând, etc. Adâncimea arborelui este nivelul său maxim. Conceptul de adâncime poate fi descrisă în termeni de cale, adică adâncimea arborelui este lungimea celui mai lung drum de la rădăcină la frunză, dacă este urmată de nodul părinte la copil. Fiecare superior al arborelui poate fi văzută ca rădăcina subarborelui, care este determinată de un anumit nod și toți descendenții acestui nod, atât direct cât și indirect. Deci, arborele poate fi descris ca o structură recursivă. lemn eficiența de căutare este direct legată de echilibrul său, adică, cu o diferență maximă între adâncimea subramificații din stânga și din dreapta ale tuturor nodurilor. Există două cazuri extreme - un arbore binar echilibrat (în cazul în care fiecare nivel are un set complet de noduri) și un copac degenerat în cazul în care fiecare nivel este necesar, pe partea de sus a unuia. copac degenerate este echivalent cu lista legată. Executarea tuturor operațiunilor majore proporțional cu adâncimea de copac. Astfel, căutarea de mare viteză în specificațiile DCF pot varia de la O (log2 N) în cazul unui arbore complet la O (N) - în cazul unui degenerat.

DCF poate fi utilizat pentru punerea în aplicare a unor astfel de abstracțiuni ca o listă sortată, un dicționar (un set de corespondențelor „cheie-valoare“), coadă de prioritate, și așa mai departe.

Atunci când punerea în aplicare a unui copac în afară de valoarea cheii (cheie) și datele sunt stocate, de asemenea, trei indicii: la părintele (net), la stânga (stânga) și dreapta (dreapta) descendenți. În cazul în care părintele sau copilul nu, o valoare de magazine pointer la zero (NULL, NIL).

căutare binară proprietate arbore de comanda

Daca x - este un nod arbitrar în PDD și vertex y este în sus sub x stânga, apoi y.key <= x.key. Если x – это произвольная вершина ДДП, а вершина y находится в правом поддереве вершины x, то y.key>= X.key. Din proprietatea rezultă că, dacă y.key == x.key, atunci vârful y poate fi atât în ​​stânga și dreapta subramificație în raport cu vârful x.

Trebuie amintit faptul că prezența mai multor vârfuri cu aceleași valori cheie sunt unele algoritmi nu va funcționa corect. De exemplu, algoritmul de căutare va returna întotdeauna un pointer la un singur nod. Această problemă poate fi rezolvată prin stocarea elementelor cu aceleași chei, în același top într-o listă. În acest caz, vom păstra aceeași Vertex mai multe elemente, dar cazul nu este considerat în articol.

Acesta este un arbore binar de căutare:

rezolvări DCF

Există trei modalități de a lucra în jurul valorii de: directe (precomandă), Cross (inordine), Reverse (postordine).

  • ocolirea Direct: primul nod de cost dat, subarbore stânga al acestui nod, apoi subarborele din dreapta a acestui nod.
  • ocolirea Transversal: primul cost cu o schimbare din stânga subramificație a vârfurilor, atunci acest vârf, apoi subarborele din dreapta a acestui nod. Picuri la același lucru se va urmări în non-descrescătoare (cu chei cheie) ordine.
  • ocolirea inversă: primul cost cu o schimbare din stânga subramificație a vârfurilor, apoi la dreapta, atunci acest vârf.

În figura 3, vârful traversal ordinea specificată numere, se presupune că nodurile însele sunt aranjate astfel încât să formeze DCF.

Cele mai frecvent utilizate eco-rotund, ca și în toate celelalte moduri de a ocoli vârfuri succesive nu sunt obligate prin termenii relației.

Căutare blaturi în PDD

Caută Ideea este simplă. Algoritmul de căutare în PDD sunt în mod inerent recursiv. Descrierea sa este cel mai ușor de a utiliza conceptul de subramificație. Căutarea începe de la rădăcină, care este luată ca rădăcina subarborelui curent și cheia sa este comparată cu cea dorită. Dacă acestea sunt egale, este evident că de căutare este de peste. În cazul în care cheia este că suntem în căutarea, sa dovedit a fi mai mare decât curentul, este evident că vârful dorit este situat în subarborelui drept, în caz contrar - în partea stângă. În plus, această operație se repetă pentru subarbore stânga sau la dreapta. În codul convențional, acest lucru poate fi descrisă după cum urmează:

Căutați în partea de sus cu o valoare minimă și maximă pentru cheia

Top cu valoarea minimă și maximă poate fi găsit cheia, mersul pe jos în sus spre stânga (dreapta) semne de la rădăcină (până când vom ajunge la NIL). Valoarea de retur - un pointer la partea superioară a valorii minime (maxime) pentru cheia.

Găsirea vârfurile următoare și anterioare din PDD

Pentru a găsi nodul precedent și următor, este necesar, din nou, să-și amintească de proprietate prin care se dispune. Luați în considerare acest lucru, de exemplu, funcția TreeNext. Se consideră că cele două cazuri. În cazul în care subarborelui drept nu este gol, atunci vârful subarborelui drept cu valoarea minimă cheie și va fi următoarea. În cazul în care subarborelui drept este gol, atunci vom merge în sus până când vom găsi în partea de sus a, care este copilul stâng al părintelui său. Acest părinte (dacă există) și va fi următoarea sus. Valoarea de retur - un pointer la început cu următoarea valoare (anterioară) a unei chei sau NIL, în cazul în care un astfel de nod.

Adăugarea unui nod

Adăugarea unui nod în PDD este asociat cu unele probleme. După adăugarea DCF ar trebui să păstreze proprietatea ordine, ceea ce înseamnă că partea de sus, oriunde nu pot fi adăugate. De aceea, înainte de a introduce în partea de sus, aveți nevoie pentru a găsi un loc potrivit pentru ea, atunci există un loc, după introducerea în care arborele își va păstra proprietatea sa de comanda. Cu alte cuvinte, avem nevoie de un loc după partea superioară a cheii, cu cea mai mare dintre toate cea mai mică dintre.

Scoaterea partea de sus

Problemele apar atunci când îndepărtați. Noi trebuie să păstreze proprietatea prin care se dispune MDC. Atunci când sunt posibile eliminarea trei cazuri: am eliminat partea de sus nu are copii, au eliminat partea de sus este un descendent al îndepărtat și primii doi copii. În cazul în care copiii nu au, puteți elimina pur și simplu, în partea de sus. Dacă un copil singur, apoi eliminați din partea de sus, puteți „tăia“, arătând spre părinții ei ca un copil de numai disponibil descendent sus amovibil. Dacă sunt necesare descendenții doi pași suplimentari. Trebuie să găsim următoarele pentru eliminat (în ordinea cheilor) de sus, copiați conținutul său (cheia și de date) într-un top amovibil (acum ea nu va fi eliminat fizic, dar, în mod logic dispar), apoi scoateți partea de sus (ea nu va fi lăsat copilul). În primul rând TreeDelete căutări funcționale pentru cele mai populare pe care doriți să-l ștergeți, apoi nodeTemp variabila este atribuit un pointer la copilul existent lăsând în partea de sus (sau NIL, în cazul în care copiii nu au). Apoi, vârful este scos din copac, iar cazurile sunt tratate separat, atunci când copiii nu au și atunci când vârful amovibil - este rădăcina copacului. Valoarea de retur - un pointer la partea de sus a telecomenzii. Pe ea nu are nici o referință în copac, dar este încă nevoie de memorie. Timpul de eliminare real depinde de metodele de alocare de memorie utilizat.

NIL, NULL, și trucuri mici

Acum, peste tot în Ctree variabilă de clasă pot fi folosite treeNil. Avantajele sunt evidente. După ce a petrecut ceva doisprezece (3 * sizeof (Ctree *)) bytes de memorie, am simplificat și accelerat dezvoltarea programului.

Problema principală a folosind DCF

Problema principală a utilizării DCF este că inserarea și îndepărtarea nodurilor, asigurând păstrarea ordinii proprietății, nu este propice pentru optimizarea operațiunilor de bază ale MDC. De exemplu, dacă inserați în secvența PDD creștere sau o scădere a numărului, devine, de fapt, lista de dublu-legate, iar funcționarea de bază va lua timp proporțional cu numărul de noduri, mai degrabă decât logaritmul său.

Astfel, pentru O (log2 N) de ordinul nevoie de performanță în copac a avut cel mai mare echilibru posibil (de exemplu, a fost, probabil, mai mică înălțime). De obicei, mai multe tipuri de echilibru alocate. Soldul complet este atunci când în partea de sus a arborelui pentru fiecare numărul de noduri din subramificații stânga și dreapta diferă de cel mult 1. Din păcate, acest echilibru este dificil de realizat în practică. Prin urmare, în practică, se utilizează forme mai puțin stricte de echilibru. De exemplu, au fost elaborate matematicieni români GM Adelson-Belsky și principiile E.M.Landisom arbori AVL. Arborele AVL pentru fiecare nod ambele subarbori de adâncime copac nu diferă cu mai mult de 1. O altă perspectivă „avansat“ copac este așa-numitele copaci roșu-negru. arbori AVL oferă o mai mare echilibru al arborelui, dar costul menținerii lor de mai sus. Deoarece, în practică, diferența de echilibru între aceste două tipuri de arbori nu sunt mari, de multe ori folosite de copaci roșu-negru.

copaci Red-negru (roșu-negru copac, RB-Tree)

Deci, un mod de a rezolva principalele probleme ale utilizării DCF sunt copaci rosu-negru. Roșu și negru (numele este istoric asociat cu cărți de joc din cauza lor ușor de făcut modele simple) arbori (PSA) - un DCF, din care fiecare nod stochează o mai câmp logic suplimentar (culoare), indicând culoarea: roșu sau negru. De fapt, PSA este garantat faptul că nivelurile de oricare două frunze diferă cu mai mult de două ori. Această condiție este suficientă pentru a oferi o mare viteză de performanță de căutare aproape de O (log2 N). Când inserați / înlocuiți etapele suplimentare de echilibrare a arborelui, care nu poate încetini copac. Descriind algoritmii presupunem că NIL - un pointer la partea de sus a manechinului și operații (NIL) .left, (NIL) .right, (NIL) sens .color. Vom presupune, de asemenea, că fiecare nod are doi copii, și numai NIL nu are copii. Astfel, fiecare nod devine interior (având descendenți, deși fictive) și frunzele se vor dummy doar vertex NIL.

proprietăţi PSA

  1. Fiecare nod poate fi fie rosu sau negru. blaturi, sau blaturi incolore de o culoare diferită, nu poate fi.
  2. Fiecare frunză (NIL) este negru.
  3. În cazul în care nodul este de culoare roșie, atunci atât copiii săi - negru.
  4. Tot drumul de la rădăcină la frunzele conțin același număr de noduri negre.

Exemplul PSA având în vedere pozițiile noastre se arată în figura 4. Rețineți că primele 9 poate fi de culoare roșie, dar în viitor, vom lua în considerare numai arborii a căror rădăcină este negru. Vom face acest lucru, în scopul de a rădăcină descendenții ar putea avea orice culoare.

inserții și deleții de noduri in proprietatile PSA pot perturba PSA. Pentru a restaura aceste caracteristici, va trebui să vopsi niște noduri și de a schimba structura arborelui. Pentru a modifica structura operațiunilor utilizate, numita rotație. Revenind proprietăți PSA, de asemenea, de rotație a restabili echilibrul copac. Rotațiile sunt la stânga și la dreapta, acestea sunt prezentate în Figura 5.

După cum se poate observa, de rotație, se deplasează nodurile nu încalcă proprietățile de ordonare.

Procedura RBTLeftRotate presupune că node.right! = NIL. Procedura RBTRightRotate presupune că node.left! = NIL.

Tabelul 6. Eliminarea elementului cheie (chei aleatoare)

matrice în mod constant sortat

Nu matrice sortat

Array postsortirovkoy

Tabelul 7. Element Adăugarea (în creștere chei)

matrice în mod constant sortat

Nu matrice sortat

Array postsortirovkoy

Tabelul 8. Element de căutare (în creștere chei)

matrice în mod constant sortat

Nu matrice sortat

Array postsortirovkoy

Tabelul 9. Eliminarea elementului cheie (în creștere chei)

matrice în mod constant sortat

Nu matrice sortat

Array postsortirovkoy

Element Tabelul 10. Adăugarea (chei aleatoare)

matrice în mod constant sortat

Nu matrice sortat

Array postsortirovkoy

Element Tabelul 11. Căutare (chei aleatoare)

matrice în mod constant sortat

Nu matrice sortat

Array postsortirovkoy

TABELUL 12. Îndepărtarea elementului cheie (chei aleatoare)

Se vede clar că arborii de dimensiuni mai mari prinderea elementului, și chiar și matrice în mod semnificativ outperform. Astfel, este evident că alegerea structurilor de date este puternic dependentă de numărul estimat de elemente și dimensiunea lor. În cele din urmă, aș dori să spun că alegerea corectă a structurii de date este unul dintre principalele puncte care determină performanța programului. Prin urmare, în alegerea cu atenție, gândire prin toate posibile - după caz, cel mai probabil și mai rău.