1-os paskaitos skaidrės (Atsiskaitymo tvarka ir reikalavimai)

Download Report

Transcript 1-os paskaitos skaidrės (Atsiskaitymo tvarka ir reikalavimai)

Algoritmai ir duomenų struktūros
(ADS)
1 paskaita
Saulius Ragaišis, VU MIF
[email protected]
2012-02-06
Informatikos perlaikymas
Vasario 15 d. (trečiadienį) 312 aud.:
- nuo 18 val. privalomo minimumo
perlaikymas
- nuo 19 val. egzamino perlaikymas (tik
išlaikiusiems privalomą minimumą)
Dalyko sandas
Dalyko sando
pavadinimas
Algoritmai ir duomenų struktūros
Dalyko sando
tikslai ir
numatomi
gebėjimai
Kurso tikslas pateikti studentams klasikines
duomenų struktūras ir jų apdorojimo
algoritmus. Nagrinėjamas algoritmų
formalizavimas ir jų sudėtingumo įvertinimas,
palyginimas.
Išklausę kursą studentai turi sugebėti
sprendžiamam uždaviniui parinkti duomenų
struktūras ir algoritmą, įvertinti jų tinkamumą.
Dalyko sandas
(2)
Pagrindinės literatūros
sąrašas
1.Michael Main, Walter Savitch, Data Structures and Other Objects, A
Second Course in Computer Science (Turbo Pascal Edition), The
Benjamin/Cummings Publishing Company, 1995
2.Michael Main, Walter Savitch, Data Structures and Other Objects
Using C++, Addison Wesley The Benjamin/Cummings Publishing
Company, 2001
3.Paul Helman, Robert Veroff, Frank R. Carrano, Intermediate
Problem Solving and Data Structures, Walls and Mirrors, The
Benjamin/Cummings Publishing Company, 1991
4.Daniel D. McCracken. A second course in Computer Science With
Pascal. John Wesley & Sons, 1987
5.Algimantas Juozapavičius. Duomenų struktūros ir algoritmai.
Vilniaus universiteto leidykla, 1997.
pilna kurso informacija internete
Papildomos literatūros
sąrašas
1.Michael T. Goodrich, Roberto Tamassia, Algorithm Design:
Foundations, Analysis, and Internet Examples, John Wiley & Sons,
2002
2.Weiss M.A. Data Structures and Algorithm Analysis. 1992
Dalyko sandas
(3)
Mokymo metodai
Paskaitos, 4 laboratorinių darbų užduotys ir užduotėlės,
atliekamos laboratorinių darbų metu.
Lankomumo
reikalavimai
Egzaminą leidžiama laikyti tik semestro metu laiku
atsiskaičius ne mažiau kaip 3 laboratorinius darbus.
Atsiskaitymo
reikalavimai
Egzaminai, atsakymai į klausimus raštu.
Vertinimo būdas
Vertinimas susideda iš laboratorinių darbų vertinimo
(kiekvienas laiku ir nepriekaištingai atliktas laboratorinis
darbas vertinamas 1 balu; už laboratorinių darbų metu per
semestrą atliktas užduotėles studentas gali papildomai
surinkti 1 balą) ir atsakymų į klausimus vertinimo (iki 6
balų).
Užsiėmimų tvarkaraštis
Savaitė
1
2
3
4
5
6
7
8
Velykų atostogos
9
10
11
12
13
14
15
16
I
02.06
02.13
02.20
02.27
03.05
03.12
03.19
03.26
II
02.07
02.14
02.21
02.28
03.06
03.13
03.20
03.27
III
02.08
02.15
02.22
02.29
03.07
03.14
03.21
03.28
04.16
04.23
04.30
05.07
05.14
05.21
05.28
04.10
04.17
04.24
05.08
05.15
05.22
05.29
04.11
04.18
04.25
05.02
05.09
05.16
05.23
05.30
Užduočių atsiskaitymų tvarkaraštis
Pratybos
1
2
3
1 užd.
20
20
20
4
20
5
6
7
16
12
8
4
2
0
0
0
0
0
0
0
8
9
10
11
12
13
14
15
16
2 užd.
20
20
20
20
20
20
20
20
16
12
8
4
2
0
0
0
3 užd.
20
20
20
20
20
20
20
20
20
20
20
16
12
8
4
2
4 užd.
20
20
20
20
20
20
20
20
20
20
20
20
20
20
16
12
Užduočių atsiskaitymas ir vertinimas
Atsiskaitymai vyksta tik pratybų metu. Neakivaizdiniai
atsiskaitinėjimai (pvz., el. paštu) netoleruojami.
Kiekviena laiku ir be priekaištų atlikta užduotis vertinama
20 balų (už prasčiau atliktą užduotį rašomas mažesnis
balų skaičius).
Užduotis vertinama pagal maksimalų balų skaičių tos
datos, kai ji baigiama atsiskaityti.
Už išankstinį atsiskaitymą skiriami papildomi taškai: už 1
savaitę +1 taškas, už 2 ir daugiau savaičių +2 taškai.
Užduotis turėtų būti atsiskaityta ne daugiau kaip per 2
kartus. Už kiekvieną papildomą atsiskaitymą, pradedant
nuo 3-io, skiriamas -1 taškas.
Užduočių atsiskaitymas ir vertinimas (2)
Atsiskaitymo metu dėstytojui būtina įsitikinti, kad
studentas programą supranta ir sugeba ją pakeisti.
Studentai informuojami iš karto apie jo už užduoties
atsiskaitymą gautą balų skaičių.
Kita užduotis gali būti gauta, tik pradėjus atsiskaitinėti
ankstesnę užduotį. Maksimalus turimų neatsiskaitytų
užduočių skaičius 2.
Užduotys gali būti atsiskaitomos tik eilės tvarka (1-a, 2-a
ir t.t.)
Studentai gali daryti darbus Pascal ar bet kokia
programavimo kalba (C, Java ir t.t.), jei patenkinamos 2
sąlygos:
1) ta kalba yra priimtina pratybas vedančiam žmogui
2) yra galimybės pratybų metu peržiūrėti, pakeisti ir
įvykdyti programą
Užduočių planas
Pagrindinės užduotys:
ADT (būtina realizacija su rodyklėmis);
Perrinkimas;
Modeliavimas (būtina panaudoti du 1-oje užduotyje
sukurtus ADT, bent vienas jų turi būti sukurtas
kolegos);
Grafai.
Papildomos užduotėlės: neduodamos per pratybas, kai
baigiasi užduočių atsiskaitymo terminas; nebeduodamos per
15-16 pratybas. Viso 10.
Papildoma informacija dėl ADT
1-ą ir 3-ią užduotis rekomenduojame daryti Pascal
kalba, kad užtikrintume didesnę ADT pasiūlą (privalomi
reikalavimai pasirenkamai programavimo kalbai buvo
apibrėžti anksčiau)
Sukurti ADT perduodami pratybų dėstytojui jo
apibrėžtu būdu (pavyzdžiui, el. paštu)
1-oje užduotyje realizuoti ADT kaupiami dėstytojo
turimoje ir studentams pasiekiamoje disko vietoje.
ADT bus galima rinktis vieno dėstytojo kuruojamų
pogrupių apimtyje.
Papildoma informacija dėl ADT (2)
Už rastą klaidą kolegos ADT skiriamas +1 taškas (tik
pirmajam radusiam klaidą). Apie klaidą galima pranešti
iš karto ją radus (nebūtina laukti savo užduoties
atsiskaitymo).
Už neteisingai praneštą klaidą -0,5 taško
Už klaidą ADT autoriui -1 taškas (nesvarbu, kiek kartų
ta klaida buvo rasta).
Už be jokių nusiskundimų panaudotą ADT autoriui
skiriamas +1 taškas.
Abstraktus duomenų tipas (ADT)
Abstraktus duomenų tipas (ADT) yra duomenų
apibrėžimas, supakuotas (inkapsuliuotas) su
apibrėžimu visų tam duomenų tipui prasmingų
operacijų.
Supakavimas (inkapsuliavimas): Realizacija duomenų
tipo kartu su jo operacijomis taip, kad šis duomenų tipas
ir jo operacijos galėtų būti naudojamos, nežinant
realizacijos detalių.
Informacijos slėpimas: Metodas rodymo klientams
(programuotojams) tik to, ką reikia žinoti tam, kad
naudoti duomenų tipą ir operacijas, ir neatskleidimo
jiems realizacijos detalių.
Interfeisas vs. Realizacija
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.
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.
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.
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)
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.
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
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.
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 2o būdo operacijų realizacija).
kiekvienai nuorodai saugoti reikia daugiau atminties
(rodyklė užima daugiau atminties nei tipas, kuriuo
indeksuojama, pavyzdžiui, sveikų skaičių).
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").
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.
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).
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:
AB+C*
= (A + B) * C
523*+
=2*3+5
52*42/+ =5*2+4/2
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ą:
523*+
Klausimai
?