Structuri de date dinamice

Titlul lucrării: structuri de date dinamice. Stive, cozi. Liste. Copaci binari

Domeniu: Informatică, Cibernetică și Programare







Descriere: Atunci când creați un arbore, se numește o procedură recursivă de tipul următor: procedura Insertvr Root: TTree; X: T; <Дополнительная процедура создающая и инициализирующая новый узел> procedura CreteNodevr p: TTree; n: T; începe Newp; p ^ .Right: = capăt nul; încep dacă Root = nil Atunci CreteNodeRoot X <создаем новый узел дерева> altceva cu Root ^ nu începe dacă vlue X apoi InsertRight X altfel dacă vlue X Apoi InsertLeft X altceva <Действия производимые в случае повторного.

Mărime fișier: 178.5 KB

Lucrarea a fost descărcată: 82 de persoane.

Disciplina "Bazele de algoritmizare și programare" Structuri de date dinamice

Structuri de date dinamice.

Stive, cozi. Liste. Copaci binari.

[4] Copaci binari

Structuri de date dinamice # 150; acestea sunt structuri de date, memoria sub care este alocată și eliberată după cum este necesar.

Procedura de lucru cu structuri dinamice de date este următoarea:

  • creați (alocați spațiu în memoria dinamică);
  • lucrați cu un pointer;
  • îndepărtați (eliberați structura ocupată de structură).

Multe activități necesită utilizarea datelor în care configurația, mărimea și compoziția se pot modifica în timpul executării programului. Pentru a le reprezenta, utilizați structuri dinamice de informare. Astfel de structuri includ:

  • liste unidirecționale (pur și simplu conectate);
  • bidirecțional (dublu conectat) liste;
  • liste ciclice;
  • stiva;
  • decembrie;
  • loc;
  • copaci binari.

Ele diferă în modul în care ele leagă elementele individuale și / sau operațiunile admise. Structura dinamică poate ocupa zone non-contigue ale RAM.

Structurile dinamice sunt folosite pe scară largă pentru o lucrare mai eficientă cu date, dimensiunea cărora este cunoscută, în special pentru rezolvarea problemelor de sortare.

Apel structura de date coadă, pentru care operațiile de adăugare și îndepărtarea componentelor și a elementelor care sunt aranjate astfel încât îndepărtarea acestora va fi efectuată exact în aceeași ordine în care au avut loc adăugarea.

O coadă este o listă liniară de date care este accesată pe baza principiului "primul-în, primul-out" (uneori abreviat ca metoda de acces FIFO).

În viața de zi cu zi, cozile sunt adesea găsite. De exemplu, o coadă la o bancă sau o coadă în cantinele cu servicii rapide este o coadă în sensul descris mai sus (cu excepția cazului în care o persoană încearcă să scoată serviciul din coada de așteptare!).

Programat, această structură poate fi implementată în mai multe moduri. Cea mai simplă este implementarea cu o matrice și două indicatoare. Unul dintre indicatori determină locația matricei în care elementul va fi adăugat și se numește sfârșitul coadă (CC). Un alt pointer specifică locul matricei, de unde elementul va fi șters și se numește începutul coadă (UN). Condiția pentru prezența elementelor în coada de așteptare este inegalitatea indicilor ONU și CC. În acest caz, ordinea elementelor din coadă este definită astfel încât elementul cu un index mai mic a sosit mai devreme.

De exemplu, să presupunem că avem o coadă de trei elemente A, B, C, în care elementul A a fost plasat pentru prima dată, apoi # 151; elementul B și ultimul # 151; Element C. După îndepărtarea elementului și primul element este elementul B. în acest caz, elementul de coadă și restul din matrice în locul ei, dar nu mai este în coadă, ca un pointer la începutul liniei VH indică elementul B, t. e. următorul element al șirului . Dacă vom adăuga un nou element în coada de D. acesta va fi plasat în coada de așteptare definită de indicatorul final al Codului penal. În același timp, valoarea indicatorului CC ar trebui să se schimbe. Trebuie remarcat faptul că, în scopul de a elimina un element din coada C, trebuie să eliminați mai întâi elementul B. Coada în care nu un element este numit gol. În acest caz, ambele indicatoare indică același loc. Operațiuni de așteptare: Init # 151; creează o coadă goală; gol # 151; întoarce adevărat. dacă coada este goală și falsă altfel; Inserare # 151; adaugă un element la sfârșitul coadă; scoate # 151; elimină elementul de la începutul coadă.

Tip Queue = matrice [1..maxqueue] de integer;

Procedură Init (var q: Queue;

var gratuit, primul. întreg);

Cozi în programare sunt utilizate în multe cazuri, de exemplu, în modelare, în planificarea muncii (PERT sau Gatta), atunci când se tamponează I / O.

Structuri de date dinamice

O stivă este o structură de date pentru care sunt definite operațiunile de adăugare și eliminare a elementelor și ale căror elemente sunt organizate astfel încât ștergerea acestora să se efectueze exact în ordinea în care a fost adăugată.

Organizarea stivei într-un anumit sens este opusul organizării coadă, pentru că aici accesul este folosit în conformitate cu principiul "ultima a ieșit prima dată" (această metodă de acces este denumită uneori metoda LIFO). Imaginați-vă un teanc de plăci. Placa inferioară din această grămadă va fi utilizată ultima dată, iar placa superioară (care a fost instalată în ultima stivă) va fi utilizată mai întâi. Stivele sunt utilizate pe scară largă în software-ul de sistem, inclusiv compilatoare și interpreți.







stivă prezentate aici conține 6 membri, în care elementele din stivă au fost plasate în următoarea ordine: A, B, C, pentru a prelua de la DEF ei doar pot comanda C FED, B, A, și anume, pentru a elimina din elementul stivă .. C, trebuie să preluați mai întâi elementele F. E și D.

Operațiunile stivei și implementarea acestora: Init # 151; creează o stivă goală; gol # 151; întoarce adevărat. dacă stiva este goală și altfel falsă; împinge # 151; adaugă un element la stivă; Pop # 151; elimină un element din teanc. Din punct de vedere istoric, cele două operațiuni principale pentru stivă - pentru ao pune în stivă și a alege din stiva - au fost denumite respectiv "împinse" și "împinse".

Stack = Array [1..Maxstack] de integer;

Procedură Init (var s: Stack; var tos. Integer);

Pentru a vedea ce este în partea de sus a stivei, trebuie doar să introduceți un punct. Deși se efectuează operații aritmetice cu numere întregi numai, acesta poate fi ușor adaptat pentru numere în virgulă mobilă, schimbarea tipului de stivă de date și transformarea operatorului „div“ în operatorul diviziune pentru numere în virgulă mobilă.

2 2 2 * + 2 21 7 / * + 100 5 / + 12 -10 2 * + = 0

O listă este o secvență de elemente legate prin pointeri (link-uri).

În listă, elementele sunt conectate logic una cu cealaltă. Ordinea logică a elementelor din listă este determinată cu ajutorul indicatorilor. Ordinea logică a elementelor din listă poate să nu coincidă cu ordinea fizică a locației în memoria calculatorului. Fiecare element al listei (denumit adesea un nod) constă din două părți. Prima parte conține direct datele care aparțin elementului și este informativă. A doua parte conține un indicator și este o referință. Pointerul determină locația elementului de listă asociat acestui element.

Listele asociate sunt utilizate în două cazuri principale. În primul rând, atunci când se creează rețele care se află în memoria RAM și a căror dimensiune nu este cunoscută în prealabil. Dacă știți în avans ce dimensiune de memorie va fi necesară pentru a rezolva problema, atunci puteți utiliza o matrice simplă. Cu toate acestea, dacă dimensiunea reală a listei nu vă este cunoscută, atunci trebuie să aplicați lista asociată. În al doilea rând, listele legate sunt utilizate în bazele de date de pe discuri. O listă legată vă permite să inserați și să ștergeți rapid un element de date fără a reorganiza întregul fișier disc. Din aceste motive, listele legate sunt utilizate pe scară largă în programele de gestionare a bazelor de date.

Listele asociate pot avea legături simple sau duble. O listă cu o singură legătură conține elemente, fiecare dintre ele având o legătură cu următorul element de date. Într-o listă dublată, fiecare element are o relație atât cu elementul următor cât și cu elementul anterior. Tipul listei asociate este selectat în funcție de sarcina rezolvată.

Formarea unei liste goale. Am creat o matrice bidimensională în memorie. În Sp. i] stocăm elementul listei în sine, iar în Sp [2, i] # 151; Un pointer la următorul element din listă.

const maxspisok = 20;

Tip Spisok = matrice de [1..2, l..maxspisok] de intreg;

Procedură NewSpisok (var Sp: Spisok; var SUA, ONU: întreg;);

pentru i: = 1 până la Maxspisok-1 do Sp [2, i]: = i + 1;

Procedură InsSpisok (var Sp: Spisok; var SUA, UN: întreg;

var Cod: întreg; var x: întreg);

var US2: întreg;

2. Subtree dreapta

3. Rădăcina subtreei

O ordine directă de trecere înseamnă o accesare cu crawlere în direcția de sus în jos, când după vizitarea următoarei ramuri, trecerea spre interiorul copacului continuă până când toți descendenții nodului obținut au fost traversați. Din acest motiv, ordinea directă de trecere este deseori numită ordine descendentă sau trecere la adâncime.

Comanda directă este modul cel mai natural de enumerare a nodurilor de copaci sub formă de paranteze imbricate sau o listă de atribuire. Dacă excludeți toate parantezele și virgulele, secvența de noduri sub formă de paranteze imbricate va corespunde ordinii directe a trecerii copacului.

Pașii din lista de etape, reprezentând orice structură ierarhică, sunt, de asemenea, aranjați într-o ordine directă. În termeni genealogici, ordinea directă a trecerii copacilor reflectă ordinea dinastică a succesiunii, atunci când titlul este transmis descendentului superior.

În ordinea simetrică, copacul este traversat de la stânga la dreapta, generând o secvență comandată lexografic de chei de noduri. Din acest motiv, o ordine simetrică de trecere este adesea numită ordine lexicală. Simetria ordinii reflectate în faptul că, dacă un arbore binar pentru a reflecta axa verticală, inversând componentele stânga și dreapta, ordinea simetrică de trecere se înlocuiește cu leksigrafichesky opus.

Dacă utilizați procedura pentru trecerea la sfârșitul anului, se transformă în jurul copacului de jos în sus, atunci când timpul pe orice nod au fost deja trecut de toți descendenții săi, iar rădăcina copacului sunt în finală. Din cauza acestei particularități a eludării, ordinea terminală este deseori numită ascendentă sau inversă în raport cu direcția.

Dacă selectați o ordine specifică de trecere, procesarea funcțională necesară a fiecărui nod are loc după numărul corespunzător de vizite la acesta. Când mergeți de sus în jos, fiecare nod este procesat în timpul accesului inițial la acesta, cu o ordine simetrică de trecere - în al doilea și când se traversează de jos în sus - în cel de-al treilea.

O altă opțiune pentru ocolire este după niveluri: prima ieșire rădăcină, apoi toate nodurile primului nivel, urmate de nodurile celui de-al doilea nivel și așa mai departe.

Acest lucru se realizează prin această procedură:

procedura PrintByLevel (nivel: integer; var elemente: matrice TTree; count: integer);

var i, new_count: întreg;

dacă contează <> 0 atunci

pentru i: = 0 până la pre (count)

start_x: = GetMaxX Div 2;

print_node (Root, 1, 0, GetMaxX Div 2, GetMaxX);

Aplicarea copacilor binari

Organizarea de date cu ajutorul copacilor binari vă permite să reduceți în mod semnificativ timpul de căutare a elementului dorit. Căutarea unui element în structurile de date liniare este efectuată de obicei prin căutarea secvențială a tuturor elementelor prezente în structură. Căutarea unui copac nu necesită o căutare a tuturor elementelor, deci este nevoie de mult mai puțin timp. Numărul maxim de pași pentru căutarea unui copac este egal cu înălțimea acestui copac, adică numărul de niveluri din structura ierarhică a copacului.

Următorul modul conține funcțiile de bază pentru lucrul cu copaci binari.

Stânga, Dreapta: TTree;

introduceți procedura (var Root: TTree; X: T);

Procedură Eliminați (var Root: TTree; X: T);

funcția Găsiți (Root: TTree; X: T): TTree;

procedura Ștergere (rădăcină: TTree);

procedură LeafsCount (Root: TTree; var k: Integer);

funcția GetNode (Root: TTree): T;

procedură PrintDown (Root: TTree);

procedura PrintLex (Root: TTree);

procedura PrintUp (Root: TTree);

introduceți procedura (var Root: TTree; X: T);

procedura CreateNode (var p: TTree; n: T);

Instalarea destinată prelucrării hidrocracarea motorinei de vid, în prezența hidrogenului cu o recirculată procesare retransmitere catalizator alyumonikelmolibdenovom (reziduu coloană de fracționare cub) pentru a maximiza producția de motorină sau benzină.







Trimiteți-le prietenilor: