1 / 24

Algoritmai ir duomenų struktūros ( AD S)

Algoritmai ir duomenų struktūros ( AD S). 2 paskaita Saulius Ragaišis , VU MIF saulius.ragaisis@mif.vu.lt 200 8 - 0 2- 14. Kurso eiga ir atsiskaitymai.

noe
Download Presentation

Algoritmai ir duomenų struktūros ( AD S)

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Algoritmai ir duomenų struktūros(ADS) 2 paskaita Saulius Ragaišis, VU MIF saulius.ragaisis@mif.vu.lt 2008-02-14

  2. Kurso eiga ir atsiskaitymai Vilniaus universiteto studijų nuostatai5.4.2 Per pirmąją paskaitą dalyko dėstytojas studentus turi supažindinti su dalyko programa, darbo per semestrą tvarka ir atsiskaitymo reikalavimais. Daugelį metų VU diegtas principas: per pirmą paskaitą paskelbta tvarka negali būti keičiama semestro eigoje. Rezultatas: šį semestrą galios tvarka, paskelbta per pirmą paskaitą(jos skaidrės kurso puslapyje: http://www.mif.vu.lt/~ragaisis/ADS2008/ADS_1_paskaita.ppt).

  3. Ko nesuspėjome pakalbėti praeitą semestrą – dar truputėlį apie parametrų perdavimą ir rodykles program example; procedure sum (n, m : integer; var rez : integer); begin rez := n + m; end; var i : integer; begin sum(1, 2, i); writeln(i); end. Ar galima programuoti parametrus perduodant tik reikšme?

  4. Procedūra tik su parametrais reikšmėmis program example; type pint = ^integer; procedure sum (n, m : integer; rez : pint); begin rez^ := n + m; end; var i : integer; r : pint; begin r := @i; { r := addr(i); } sum(1, 2, r); writeln(i); end.

  5. Rodyklės • pointer- netipizuotos rodyklės tipas • nil- konstanta, suderinama su visais rodyklių tipais • @-rodyklės operacija; unarinė; operandas - kintamasis, funkcija arba procedūra; rezultatas rodyklė (adresas) suderinamas su visais rodyklių tipais • Funkcija Addrgrąžina nurodyto objekto adresą (function Addr(X): pointer;). X kintamasis, funkcija arba procedūra; rezultatas – adresas, suderinamas su visais rodyklių tipais • Funkcija SizeOfgrąžina parametro užimamą baitų skaičių (function SizeOf(X): integer;). X kintamasis arba tipas.

  6. Norimo atminties kiekio išskyrimas procedure GetMem(var p : pointer; size: word); type elem = …; var p : pointer; pe : ^elem; New(pe); tą patį rezultatą galima gauti ir tokiu būdu GetMem(p, SizeOf(elem)); pe := p;

  7. Kitos funkcijos/procedūros • procedure FreeMem(var p: pointer; size: word); • function MemAvail: longint; • function MaxAvail: longint; • procedure Release(var p: pointer); • procedure Mark(var p: pointer);

  8. Mark ir Release pavyzdys { Example for Mark and Release } var p : pointer; p1,p2,p3 : ^Integer; begin New(p1); { Allocate an Integer } Mark(p); { Save heap state } New(p2); { Allocate two more Integers } New(p3); Release(p); { Memory reserved for p2^ and p3^ has been released;p1^ may still be used } end.

  9. “Dinaminiai” masyvai program example; const MAX_ELEM = 15000; type ArrayType = array[1..MAX_ELEM] of integer; ArrayPtrType = ^ArrayType; var pArr1, pArr2, pArr3 : ArrayPtrType; begin new(pArr1); new(pArr2); new(pArr3); … pArr1^[1] := 13; pArr2^[1] := 3; pArr3^[1] := 4; … dispose(pArr1); dispose(pArr2); dispose(pArr3); end.

  10. “Dinaminio” dydžio masyvas program example; const MAX_ELEM = 5000; type ElemType = integer; ArrayType = array[1..MAX_ELEM] of ElemType; ArrayPtrType = ^ArrayType; var n : integer;p : pointer; pArr : ArrayPtrType; begin … GetMem(p, n * SizeOf(ElemType)); pArr := p; … pArr^[1] := … … FreeMem(p, n * SizeOf(ElemType)); end.

  11. Tiesinės duomenų struktūros Panagrinėsime keletą žinomų ir įvairiuose taikymuose naudojamų tiesinių duomenų struktūrų. Priklausomai nuo pasirinktos programavimo kalbos, joje gali būti atitinkamas duomenų tipas (pavyzdžiui, LISP kalboje yra duomenų tipas sąrašas) arba gali tekti konstruoti reikiamą duomenų struktūrą, naudojantis kitais programavimo kalbos pateikiamais duomenų tipais. Nagrinėdami duomenų struktūras, kartu apibrėšime ir darbui su jomis reikalingas operacijas bei keletą būdų, kaip tos duomenų struktūros gali būti realizuotos Pascal kalboje.

  12. Sąrašas Sąrašas arba tiesinis sąrašas (angl. list or linear list) yra sutvarkytas rinkinys (tiesinė seka) elementų, struktūrizuotų taip, kad kiekvienas elementas, išskyrus pirmą, turi vienintelį prieš jį einantį elementą ir kiekvienas elementas, išskyrus paskutinį, turi vienintelį po jo einantį elementą. Kiekvienas sąrašo elementas saugo tam tikrus duomenis. Sąrašo pradžia ir pabaiga dažnai dar vadinamos galva (angl. head) ir uodega (angl. tail) atitinkamai.

  13. Sąrašo operacijos • Sukurti tuščią sąrašą • Patikrinti, ar sąrašas tuščias • Patikrinti, ar sąrašas pilnas (teoriškai sąrašas gali būti bet kokio ilgio, bet praktinėse realizacijose sąrašo ilgis būna daugiau ar mažiau ribotas, priklausomai nuo pasirinkto sąrašo realizavimo būdo) • Suskaičiuoti sąrašo elementus • Gauti n-tojo sąrašo elemento duomenis • Įterpti naujus duomenis (naują elementą) prieš n-tąjį elementą • Panaikinti n-tąjį sąrašo elementą • Rasti sąrašo elemento numerį su nurodytais duomenimis. • Išvesti sąrašo elementus Tai nėra visos operacijos, kurias galima atlikti su sąrašu, bet šis rinkinys yra pakankamas, kad naudojantis šiomis operacijomis būtų galima atlikti bet kokius veiksmus su sąrašu.

  14. Galimos papildomos operacijos • Įterpti naujus duomenis (naują elementą) po n-tojo elemento • Įterpti naujus duomenis (naują elementą) sąrašo pradžioje • Įterpti naujus duomenis (naują elementą) sąrašo pabaigoje • Panaikinti pirmą sąrašo elementą • Panaikinti paskutinį sąrašo elementą • Prijungti kitą sąrašą duoto sąrašo pabaigoje • Įterpti naujus duomenis (naują elementą) prieš pirmą elementą su nurodytais duomenimis • Įterpti naujus duomenis (naują elementą) po pirmo elemento su nurodytais duomenimis • Pereiti prie kito sąrašo elemento • Įterpti naujus duomenis (naują elementą) prieš einamąjį elementą • Įterpti naujus duomenis (naują elementą) po einamojo elemento • Sunaikinti sąrašą (sunaikinti visus sąrašo elementus)

  15. Sąrašų “tipai” „Nusileidžiant“ arčiau realizacijos galima apibrėžti vienpusį ir dvipusį sąrašus. Vienpusis sąrašas – sąrašas, kurio kiekvienas elementas „žino" tik, koks elementas yra po jo. Dvipusis sąrašas – sąrašas, kurioje kiekvienas elementas „žino", koks elementas yra po jo ir koks prieš jį. Vienpusis ir dvipusis sąrašai yra apibendrintos duomenų struktūros sąrašas patikslinimai, jau dalinai nusakantys duomenų struktūros realizaciją: tiek pačią duomenų struktūrą (pavyzdžiui, kiek elementas turi nuorodų), tiek galimas operacijas (pavyzdžiui, operacija "Pereiti prie ankstesnio sąrašo elemento" pakankamai natūrali dvipusio sąrašo atveju; vienpusiam sąrašui tokią operaciją, žinoma, galima realizuoti, bet nėra tikslinga). Kai kuriuose taikymuose tikslinga naudoti specifinį sąrašo atvejį ciklinį sąrašą. Ciklinis sąrašas - sąrašas, kuriame po paskutinio elemento „seka“ pirmas sąrašo elementas. Savo ruožtu ciklinis sąrašas gali būti tiek vienpusis, tiek dvipusis.

  16. Realizacija (1) Masyvas, kurio elementai tokie patys kaip sąrašo elementai (t.y. elementuose nėra saugoma jokių papildomų nuorodų). Tokiu būdu galima vaizduoti tiek vienpusį, tiek dvipusį sąrašą, nes jokios išreikštinės nuorodos nesaugomos, einamasis, kitas ir ankstesnis elementai nustatomi pagal indeksus. Papildomai tereikia žinoti sąrašo elementų skaičių. Sąrašo pradžia yra pirmas masyvo elementas (jei sąrašas nėra tuščias, elementų skaičius daugiau už 0), sąrašo galas nustatomas pagal elementų skaičių (jei masyvas indeksuojamas nuo 1, tai paskutinis sąrašo elementas yra masyvo elementas su indeksu lygiu elementų skaičiui). Privalumai: • maksimaliai paprasta struktūra • paprasta operacijų realizacija • laikomi tik patys duomenys (nereikia papildomos atminties nuorodoms saugoti) Trūkumai: • masyvo dydis turi būti nusakytas iš anksto, todėl gali būti arba naudojama tik nedidelė jo dalis, arba pritrūkti vietos; • elemento įterpimo/naikinimo operacijos yra neefektyvios, nes reikia perstumti kitus elementus

  17. Realizacija (2) Du masyvai: pirmame saugomi duomenys (t.y. jo elementai tokie patys kaip sąrašo elementai), antro masyvo atitinkamame elemente (su tuo pačiu indeksu) saugoma nuoroda į po jo einantį elementą (jei vaizduojamas vienpusis sąrašas) arba nuorodos į po jo ir prieš jį einančius elementus (jei vaizduojamas dvipusis sąrašas). Kadangi Pascal kalboje yra duomenų tipas įrašas, tai galima naudoti ir vieną masyvą, kurio elementai bendru atveju būtų įrašo tipo - sudaryti iš sąrašo duomenų ir nuorodos(ų). (Atskiru atveju, jei sąrašo duomenų tipas sutampa su indeksų tipu, masyvo elementas galėtų būti masyvas arba galima būtų naudoti dvimatį masyvą). Papildomai būtina žinoti sąrašo pradžios (pirmo jo elemento) indeksą masyve (arba 0, jei sąrašas tuščias). Sąrašo galo nustatymui gali būti arba (1) saugomas sąrašo elementų skaičius, arba (2) paskutinio sąrašo elemento indeksas masyve, arba (3) sąrašo galas gali būti nustatomas pagal tai, kad elementas neturi nuorodos į po jo einantį elementą (nuorodos nebuvimas turi būti žymimas specialia reikšme, pavyzdžiui, 0, jei masyvas indeksuojamas nuo 1). Kad prireikus įterpti naujus duomenis, laisvo elemento paieška būtų efektyvesnė, tradiciškai nuorodų masyve saugomas ne tik užimtų elementų sąrašas, bet ir laisvų elementų sąrašas. Privalumai (lyginant su 1-u būdu): • elemento įterpimas/naikinimas pakankamai efektyvus, nes nereikia perstumti kitų elementų. Trūkumai (lyginant su 1-u būdu): • operacijų realizacija gerokai sudėtingesnė • reikia papildomos atminties nuorodoms saugoti. Trūkumai: • masyvo (tuo pačiu ir sąrašo) dydis turi būti nusakytas iš anksto, todėl gali būti arba naudojama tik nedidelė jo dalis, arba pritrūkti vietos.

  18. Realizacija (3) Dinaminis sąrašas: tokio sąrašo elementai būtų įrašo tipo, sudaryti iš sąrašo duomenų ir vienos (vienpusio sąrašo atveju) arba dviejų (dvipusio sąrašo atveju) rodyklių. Privalumai: • atmintis naudojama tik egzistuojantiems sąrašo elementas, t.y. nerezervuojama vieta potencialiems elementams; • elemento įterpimas/naikinimas pakankamai efektyvus. Trūkumai • operacijų realizacija sudėtingesnė (ji palyginama su 2-o būdo operacijų realizacija). • kiekvienai nuorodai saugoti reikia daugiau atminties (rodyklė užima daugiau atminties nei tipas, kuriuo indeksuojama, pavyzdžiui, sveikų skaičių).

  19. Stekas Stekas (angl. stack) yra sąrašas, kuriame elementai gali būti įterpiami/naikinami tik jo pradžioje, vadinamoje viršūne (angl. top). Taigi stekas yra specifinis sąrašas su apribotomis operacijomis. Tai LIFO (Last In First Out) duomenų struktūra, atitinkanti lietuvišką patarlę "kas pirmas į maišą, paskutinis iš maišo". Kiekvienas steko elementas saugo tam tikrus duomenis. Gyvenime steką atitiktų, pavyzdžiui, automato apkaba (rusiškai ir pati duomenų struktūra taip vadinama - "magazin").

  20. Operacijos • Sukurti tuščią steką • Patikrinti, ar stekas tuščias • Patikrinti, ar stekas pilnas • Įdėti (angl. push) naują elementą į steką • Išimti (angl. pop) elementą iš steko • Sunaikinti steką Pastebėkime, kad steko atveju elemento įterpiamo/naikinamo operacijos turi specifinius pavadinimus, labiau atitinkančius jų prasmę. Nagrinėjant apibendrintą steko realizaciją, pirmiausia pažymėkime, kad nėra prasmės jo vaizduoti kaip dvipusio sąrašo. Kadangi stekas yra atskiras sąrašo atvejis, jo realizacijai galėtų būti panaudoti visi bet kokio sąrašo realizavimo būdai aptarti anksčiau, tačiau naudoti du masyvus (arba masyvą papildytą nuorodomis) nėra prasmės, nes viduriniai steko elementai negali būti „liečiami". Trumpai aptarsime kitų dviejų būdų privalumus ir trūkumus steko atveju.

  21. Steko realizacijos 1. Masyvas, kurio elementai tokie patys kaip steko elementai. Steko viršūnė būtų paskutinis užpildytas masyvo elementas, t.y. užpildytas masyvo elementas su maksimaliu indeksu. Privalumai: • maksimaliai paprasta struktūra; • paprasta operacijų realizacija; • laikomi tik patys duomenys (nereikia papildomos atminties nuorodoms saugoti). Trūkumai: • masyvo (tuo pačiu ir steko) dydis turi būti nusakytas iš anksto, todėl gali būti arba naudojama tik nedidelė jo dalis, arba pritrūkti vietos. Reikia pastebėti, kad elemento įterpimo/naikinimo operacijos steko atveju efektyvios. 2. Dinaminis sąrašas. Privalumai: • atmintis naudojama tik egzistuojantiems steko elementams, t.y. nerezervuojama vieta potencialiems elementams. Trūkumai: • operacijų realizacija truputį sudėtingesnė (reikia mokėti dirbti su rodyklėmis); • reikia daugiau atminties, nes saugomi ne tik duomenys, bet ir nuorodos (rodyklės).

  22. Steko naudojimas Stekas taip pat gali būti naudojamas, pavyzdžiui, postfiksinių (angl. postfix) išraiškų skaičiavimui. Mes esame įpratę išraiškas rašyti tokia forma: (A + B) * C. Ji vadinama infiksine (angl. infix) forma, nes operacija yra tarp operandų (operandas operacija operandas). Galimos ir kitos išraiškų užrašymo formos: postfiksinė (angl. postfix), kurioje operacija eina po operandų (operandas operandas operacija), ir prefiksinė (angl. prefix), kurioje operacija eina prieš operandus (operacija operandas operandas). Pastarosios formos dar vadinamos lenkiška ir atvirkštine lenkiška forma. Jos ypatingos tuo, kad išraiškose nereikia skliaustų, todėl jas skaičiuoti žymiai paprasčiau. Postfiksinių išraiškų pavyzdžiai: A B + C * = (A + B) * C 5 2 3 * + = 2 * 3 + 5 5 2 * 4 2 / + = 5 * 2 + 4 / 2

  23. Postfiksinės išraiškos skaičiavimo algoritmas 1. Išskirti eilinį elementą iš išraiškos 2. Jei išskirtas elementas yra operandas, padėti jį į steką. 3. Jei išskirtas elementas yra operacija, ištraukti iš steko operandus, atlikti operaciją ir gautą rezultatą padėti į steką. (Pastaba: pirmuoju iš steko išimamas antras operandas, pavyzdžiui, jei operacija yra "/" ir stekas (2, 4), tai bus skaičiuojama išraiška 4 / 2.) 4. Jei išraiška baigta nagrinėti, rezultatas yra steke, priešingu atveju kartoti žingsnius 1-3. Panagrinėkime, kaip veikia algoritmas, skaičiuodamas išraišką: 5 2 3 * +

  24. Klausimai ?

More Related