Algoritmai ir duomenų struktūros ( AD S)

24
Algoritmai ir duomenų struktūros (ADS) 2 paskaita Saulius Ragaišis, VU MIF [email protected] 2008-02-14

description

Algoritmai ir duomenų struktūros ( AD S). 2 paskaita Saulius Ragaišis , VU MIF [email protected] 200 8 - 0 2- 14. Kurso eiga ir atsiskaitymai. - PowerPoint PPT Presentation

Transcript of Algoritmai ir duomenų struktūros ( AD S)

Page 1: Algoritmai ir duomenų struktūros ( AD S)

Algoritmai ir duomenų struktūros

(ADS)

2 paskaita

Saulius Ragaišis, VU [email protected]

2008-02-14

Page 2: Algoritmai ir duomenų struktūros ( AD S)

Kurso eiga ir atsiskaitymaiVilniaus universiteto studijų nuostatai

5.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).

Page 3: Algoritmai ir duomenų struktūros ( AD S)

Ko nesuspėjome pakalbėti praeitą semestrą – dar truputėlį apie parametrų perdavimą ir

rodyklesprogram 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?

Page 4: Algoritmai ir duomenų struktūros ( AD S)

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.

Page 5: Algoritmai ir duomenų struktūros ( AD S)

Rodyklės

pointer - netipizuotos rodyklės tipasnil - 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 Addr grąžina nurodyto objekto adresą (function Addr(X): pointer;). X kintamasis, funkcija arba procedūra; rezultatas – adresas, suderinamas su visais rodyklių tipais

Funkcija SizeOf grąžina parametro užimamą baitų skaičių (function SizeOf(X): integer;). X kintamasis arba tipas.

Page 6: Algoritmai ir duomenų struktūros ( AD S)

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;

Page 7: Algoritmai ir duomenų struktūros ( AD S)

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);

Page 8: Algoritmai ir duomenų struktūros ( AD S)

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.

Page 9: Algoritmai ir duomenų struktūros ( AD S)

“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.

Page 10: Algoritmai ir duomenų struktūros ( AD S)

“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.

Page 11: Algoritmai ir duomenų struktūros ( AD S)

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.

Page 12: Algoritmai ir duomenų struktūros ( AD S)

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.

Page 13: Algoritmai ir duomenų struktūros ( AD S)

Sąrašo operacijos

Sukurti tuščią sąrašąPatikrinti, ar sąrašas tuščiasPatikrinti, 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 elementusGauti 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.

Page 14: Algoritmai ir duomenų struktūros ( AD S)

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 pabaigojePanaikinti 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 duomenimisPereiti prie kito sąrašo elementoĮterpti naujus duomenis (naują elementą) prieš einamąjį elementąĮterpti naujus duomenis (naują elementą) po einamojo elementoSunaikinti sąrašą (sunaikinti visus sąrašo elementus)

Page 15: Algoritmai ir duomenų struktūros ( AD S)

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.

Page 16: Algoritmai ir duomenų struktūros ( AD S)

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ūrapaprasta operacijų realizacijalaikomi 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

Page 17: Algoritmai ir duomenų struktūros ( AD S)

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.

Page 18: Algoritmai ir duomenų struktūros ( AD S)

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ūkumaioperacijų 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ų).

Page 19: Algoritmai ir duomenų struktūros ( AD S)

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").

Page 20: Algoritmai ir duomenų struktūros ( AD S)

Operacijos

Sukurti tuščią stekąPatikrinti, ar stekas tuščiasPatikrinti, ar stekas pilnasĮdėti (angl. push) naują elementą į stekąIšimti (angl. pop) elementą iš stekoSunaikinti 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.

Page 21: Algoritmai ir duomenų struktūros ( AD S)

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).

Page 22: Algoritmai ir duomenų struktūros ( AD S)

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 + 55 2 * 4 2 / + = 5 * 2 + 4 / 2

Page 23: Algoritmai ir duomenų struktūros ( AD S)

Postfiksinės išraiškos skaičiavimo algoritmas

1. Išskirti eilinį elementą iš išraiškos2. 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 * +

Page 24: Algoritmai ir duomenų struktūros ( AD S)

Klausimai

?