Cunoaște Intuit, curs, tipuri abstracte de date

Rezumat: de bază tipuri de date abstracte, cum ar fi stive și cozi, precum și punerea în aplicare cu ajutorul structurilor de date de bază.

Dezvoltarea de modele și metode de prelucrare a datelor a datelor abstracte este o componentă critică în procesul de rezolvare a problemelor cu un calculator. Exemple de acest lucru putem vedea și la un nivel scăzut în programarea de zi cu zi (de exemplu, folosind tablouri si liste legate, discutate în „structuri de date elementare“), și la un nivel ridicat în rezolvarea problemelor aplicate (ca și în rezolvarea problemei de conectivitate cu ajutorul Uniunii-găsi pădure în „Introducere“). Acest curs discută despre tipuri de date abstracte (abstracte tip de date. În plus ADT), care permite de a crea un program folosind abstractii de nivel înalt. Tipuri de date abstracte permit abstracte de conversie separat (conceptuală), care operează programe pe date de la orice reprezentare specifică a structurilor de date, precum și orice implementare particulară a algoritmului.

Toate sistemele informatice se bazează pe nivele de abstractizare: anumite proprietăți fizice ale siliciu și alte materiale fac posibilă pentru a lua un model abstract de biți, care poate lua valori binare de 0-1; apoi pe proprietățile dinamice ale valorilor anumitor biți de kit construit un model abstract al mașinii; În continuare, pe baza principiului de funcționare a mașinii sub controlul unui program în limbaj mașină construi un model abstract al unui limbaj de programare; și în cele din urmă construit un concept abstract al algoritmului, care este realizat sub forma unui program in C ++. Tipuri de date abstracte oferă o oportunitate de a continua acest proces în continuare și să dezvolte mecanisme abstracte pentru anumite sarcini de calcul la un nivel mai ridicat decât cel oferit de sistemul C ++, dezvolta mecanisme abstracte. orientate spre aplicații și potrivite pentru rezolvarea problemelor în multe domenii de aplicare, și de a crea mecanisme abstracte ale unui nivel superior, care folosesc aceste structuri de bază. Tipuri de date abstracte la dispozitie ajutorul setului de instrumente pe termen nelimitat extensibil pentru a rezolva mai multe probleme.

Pe de o parte, utilizarea de modele abstracte de grijile de liber punerea lor în aplicare detaliate; Pe de altă parte, în cazul în care performanța programului este importantă, este necesar să se cunoască costul realizării operațiunilor de bază. Noi folosim multe abstractizari de bază, care sunt construite în hardware-ul computerului și constituie baza instrucțiunilor mașinii; să pună în aplicare alte abstracțiuni în software-ul; și de a folosi abstractizare suplimentare furnizate în scris software-ul sistemului anterior. modele de nivel înalt abstracte sunt adesea create pe baza unor modele mai simple. La toate nivelurile, are unul și același principiu de bază: este necesar să se găsească cele mai importante operațiuni în programele și cele mai importante caracteristici ale datelor, și apoi indicați cele și altele la un nivel abstract și de a dezvolta mecanisme eficiente pentru punerea lor în aplicare specifice. În acest capitol, ne uităm la multe exemple ale acestui principiu.

Pentru a dezvolta un nou nivel de abstractizare este necesară pentru a (1) definesc obiectele abstracte care trebuie să fie manipulate și operațiuni. care urmează să fie efectuate asupra acestora; (2) prezintă datele într-o structură de date și să realizeze operația; (3) și (cel mai important), pentru a se asigura că aceste facilități au fost utile pentru aplicații. Aceste elemente se aplică tipurilor simple de date, astfel încât mecanismele de bază pentru a sprijini tipuri de date care au fost luate în considerare în „structurile de date elementare.“ Acesta poate fi adaptat pentru scopurile noastre. Cu toate acestea, ++ mecanismul de extensie a limbajului C oferă o importantă structură numită o clasă (clasa). Clasele sunt extrem de utile atunci când se creează un nivel de abstractizare și, prin urmare, sunt considerate ca fiind un instrument de bază utilizat în acest scop în restul cărții.

Definiția 4.1. Tipul de date abstracte (ADT) - acesta este tipul de date (un set de valori și un set de operații pentru aceste valori), care pot fi accesate doar prin intermediul interfeței. Un program care utilizează un ADT va apela clientul și programul care conține specificațiile acestui tip de date - realizare.

Acest cuvânt face numai tipul abstract de date: ADT în cazul programelor de clienți nu au acces la valorile datelor în orice alt mod, cu excepția operațiunilor descrise în interfața. Prezentarea acestor date și funcții care implementează aceste operațiuni. Ele trebuie să pună în aplicare și complet separate de interfața de client. Noi spunem că interfața nu este transparent: clientul nu poate vedea punerea în aplicare a interfeței.

Programele în C ++, această diferență se realizează de obicei un pic mai clar, ca cel mai simplu mod de a crea o interfață. includ prezentarea datelor. dar subliniind că software-ul client nu este permis accesul direct la date. Cu alte cuvinte, dezvoltatorii de aplicații client pot cunoaște reprezentarea datelor. dar în nici un fel nu se poate folosi.

Ca un exemplu, ia în considerare tipul de interfață de date pentru punctele (Programul 3.3) de la punctul 3.1, „elementare structuri de date.“ a declarat în mod explicit în interfața, că punctele sunt prezentate ca o structură formată dintr-o pereche de numere reale cu virgulă, x și y notate. O astfel de utilizare a tipurilor de date este comună în sistemele mari de software: vom dezvolta un set de acorduri de reprezentare a datelor (identifică, de asemenea, o serie de tranzacții conexe) și să facă aceste reguli disponibile pe interfața. astfel încât acestea să poată folosi programe client care fac parte dintr-un sistem mai mare. tipul de date oferă consistență în toate părțile sistemului principalelor structuri de date de performanță la nivel de sistem. Nu contează cât de bine poate fi o astfel de strategie, are un defect: dacă doriți să modificați datele de imagine. va trebui să se schimbe toate programele client. Programul 3.3 ne oferă din nou cu un exemplu simplu: unul dintre motivele pentru dezvoltarea acestui tip de date - gradul de utilizare a programelor client cu punctele, și ne așteptăm ca, dacă este necesar, clienții vor avea acces la coordonatele individuale ale punctului. Dar nu putem merge la o reprezentare diferită de date (de exemplu, în coordonate polare sau coordonate tridimensionale, sau chiar alte tipuri de date pentru coordonatele individuale), fără a schimba toate programele client.

Spre deosebire de aceasta, programul conține 4.1 de punere în aplicare de tip abstract de date, tipul de date al programelor corespunzătoare 3.3 dar folosind ++ clasa limbajul C, care odată identificate atât datele cât și activitățile conexe. Programul 4.2 este un program client care funcționează cu acest tip de date. Aceste două programe efectua aceleași calcule ca și programul de 3.3 și 3.8. Ele ilustrează unele dintre proprietățile de bază ale claselor, pe care le considerăm acum.

Când vom scrie un program ca definirea int i, vom specifica sistemul să rezerve o zonă de memorie pentru date (built-in) tip int. care pot fi accesate prin numele i. Limba C ++ este disponibil pentru un obiect similar pe termen entități. La înregistrarea în programul unei astfel de determinare, ca punct p, presupunem că creați un obiect al clasei punct. care pot fi accesate prin numele p. In acest exemplu, fiecare obiect conține două elemente de date, cu numele x și y. Ca și în cazul structurilor, acestea pot fi accesate prin nume ca P.Y.

Elementele de date ale x și y se numesc elementul de date de clasă. Clasa poate fi, de asemenea, definite funcțiile de membru care implementează operațiuni. asociate cu acest tip de date. De exemplu, clasa. definită în 4.1 Programul are două funcții de membru cu nume POINT și la distanță.

Programele client, cum ar fi Programul de 4.2, poate determina funcția de membru asociat cu obiectul, indicând numele lor, în același mod ca și aceste denumiri sunt în orice structură struct. De exemplu, expresia p.distance (q) calculează distanța dintre punctele p și q (aceeași distanță ar trebui să se întoarcă și q.distance (p) apel). PUNCTUL () funcție - prima funcție în cadrul programului 4.1 - este o funcție membru special numit un constructor: ea are același nume ca și clasă, și este numit atunci când doriți să creați un obiect al acestei clase.

Programul 4.1. PUNCTUL Clasa de punere în aplicare (punct)

Această clasă definește un tip de date. care constă dintr-un set de valori care reprezintă o „pereche de virgulă mobilă“ (se presupune că acestea sunt interpretate ca un punct pe un plan cartezian) precum și două funcții membre definite pentru toate instanțele clasei POINT. PUNCT () funcția. care este un constructor inițializează coordonate cu valori aleatoare de la 0 la 1, și funcția de distanță (POINT). calculează o distanță la un alt punct. Prezentarea datelor sunt păstrate privat (private), și se aplică numai pentru funcțiile de membru poate sau poate modifica-l. functii membre Sami sunt publice (publice) și sunt disponibile pentru orice client. Puteți salva codul, de exemplu, într-un fișier numit .cxx PUNCT.

Programul 4.2. Software-ul client pentru punctul de clasă (găsirea cel mai apropiat punct)

Această versiune 3.8 este un client care utilizează ADT punct. definite în programul 4.3. Operațiunea nou [] matrice de obiecte creează punct (POINT apelarea constructorului () să inițializeze fiecare obiect aleatoriu valori de coordonate). Exprimarea unei [i] .distance (a [j]) pentru obiectul unei cauze [i] -distance funcția membru cu un argument al unui [j].

Determinarea punctului p în rezultatele programului client în eliberarea zonei de memorie pentru noul obiect și apoi (prin PUNCT () funcție) pentru atribuirea fiecărui două dintre elementele sale valori date aleatoare variind de la 0 la 1.

Acest stil de programare, care este uneori numit de programare orientat-obiect, un limbaj complet acceptat clasa de design C ++. Clasa poate fi considerată o extensie a conceptului de structură, care reunește nu numai datele, dar, de asemenea, să definească operațiunile pe aceste date. Pot exista mai multe obiecte diferite care aparțin aceleiași clase, dar ele sunt toate similare în faptul că membrii lor de date pot lua același set de valori, iar aceste date pe care o putem rula același set de operații - în general copii ea de același tip de date. În programarea orientată pe obiecte, obiectele sunt proiectate să se ocupe de membrii săi de date (față de utilizarea funcțiilor independente pentru procesarea datelor stocate în obiecte).

Considerăm exemplul unei clase mici, descris mai sus, doar pentru a face cunoștință cu caracteristicile de bază ale claselor; deci este departe de a fi completă. Codul real pentru punctul de clasă vom avea mult mai multe operații. De exemplu, în program nu există nici măcar 4.1 operație. permițând valori de învățare Coordonatele x și y. După cum vom vedea, adăugarea acestor și alte operațiuni - destul de o sarcină simplă. În partea 5, vom lua o privire mai atentă la clasele de puncte și alte abstracții geometrice, de exemplu, linii și poligoane.

In C ++ (dar nu și C) au structurile pot fi, de asemenea, funcții conexe. Diferența esențială dintre clasele și structurile asociate cu accesul la informație, care este caracterizată de către public privat și de cuvinte cheie. La privat membru al clasei (privat) pot fi accesate numai în cadrul clasei, precum și elementul (public) public al unei clase poate fi accesata de orice client. Membrii private pot fi atât date și funcții în program sunt doar 4,1 date private, dar vom continua să vedem multe exemple de clase, care sunt, de asemenea, funcțiile de membru privat. În mod implicit, membrii clasei sunt private și membri ai structurilor - la dispoziția publicului.

De exemplu, programul client care utilizează clasa POINT. Nu puteți referi la membrii de date p.x, p.y etc. cum se poate face structura PUNCT. în calitate de membri ai clasei x și y sunt private. Pentru procesarea punctelor pot lua doar profita de funcțiile membre disponibile în mod public. Astfel de funcții au acces direct la datele membre ale unui obiect al clasei sale. De exemplu, apelarea p.distance (q) funcția distanță numele programului x 4.1 în operatorul dx = x - ax se referă la x-membru din punctul p (deoarece funcția distanță a fost invocată ca funcție -Membru exemplu p), iar axul nume se referă la x-membru din punctul q (deoarece q. - parametru real oficial parametru un corespondent). ar putea fi scris dx = this-> x-A.x pentru a exclude posibilitatea de ambiguitate sau confuzie - acest cuvânt cheie este un pointer la obiectul. pentru care funcția este numit -Membru.

Atunci când datele-membrii utilizează cuvântul cheie static. Acest lucru, la fel ca în cazul membrilor obișnuiți, înseamnă că există doar o singură copie a acestei variabile (referindu-se la o clasă), nu mai multe copii (legate de obiecte individuale). Această caracteristică este adesea folosit, de exemplu, pentru a urmări statisticile privind obiectele: puteți include în clasa POINT variabilă statică int N. Se adaugă N ++ constructor - si atunci va fi posibil să se cunoască numărul de puncte create.

Desigur, putem presupune că funcția. calcul distanța dintre două puncte care nu ar trebui să aibă un argument (două puncte), și la fel ca în punerea în aplicare anterioară, doi parametri (două puncte), care este mai natural. În C ++, această abordare poate fi pusă în aplicare prin definirea clasei POINT altă distanță definiția funcției:

Funcția -Membru statică poate accesa membrii clasei, dar nu ar trebui să fie invocat pentru un anumit obiect.

articole similare