Upload
trantruc
View
215
Download
0
Embed Size (px)
Citation preview
[email protected]‐lj.sišt. leto 2012/13 doc.dr. Matevž Dolenc
Algoritmi
[email protected]‐lj.siAlgoritmi | št. leto 2012/13
Kaj je algoritem
‣ Algoritem je opis reševanja dane naloge, po katerem jo lahko izvajalec algoritma reši.
‣ Algoritem določa zaporedje izvedljivih korakov za rešitev dane naloge.
‣ LastnosH-‐ Algoritem izvede izvajalec algoritma.
-‐ Če izvajalec upošteva algoritem, reši dano nalogo.
-‐ Algoritem lahko uporabimo večkrat.
-‐ Za enako nalogo da algoritem vedno enak rezultat.
[email protected]‐lj.siAlgoritmi | št. leto 2012/13
Izračun povprečne vrednosH podanih realnih števil
‣ Izračunaj povprečno vrednost pv danega niza n realnih števil s1, s2, ... , sn
vsota = 0
Za i=1,2 ... n ponavljaj vsota = vsota + siDo sem
pv = vsota / n
Konec
Psevdokoda Diagram poteka
[email protected]‐lj.siAlgoritmi | št. leto 2012/13
Algoritem za računalniški program
‣ Programiranje je praviloma zahtevno delo.
‣ Zapletenost programov obvladamo z razdelitvijo naloge P na podnaloge P1, P2, ... .
‣ Rešitev naloge in podnalog najprej zapišemo v obliki algoritmov, nato pa jih zapišemo v programskem jeziku.
[email protected]‐lj.siAlgoritmi | št. leto 2012/13
Primer računalniškega programa
Sub main() Dim i As Integer, n As Integer Dim s(50) As Integer Dim vsota As Single, pv As Single
n = InputBox("Podaj n")
For i=1 To n s[i] = InputBox("Podaj s(" & i & ")") Next i
For i=1 To n vsota = vsota + s(i) pv = vsota / n Next i MsgBox "Povprečna vrednost : " & pvEnd Sub
main() { int i, n, s[50], vsota, pv;
cout << "\nPodaj n"; cin >> n;
for( i=1; i<=n; i++ ) { cout << "\nPodaj s(" << i << "): "; cin >> s[i]; }
vsota = 0; for( i=1; i<=n; i++ ) vsota = vsota + s[i]; pv = vsota / n; cout << "\nPovprečna vrednost : " << pv;}
VisualBasic.NET C++
[email protected]‐lj.siAlgoritmi | št. leto 2012/13
Zakaj pri razvoju programov uporabljamo algoritme‣ Algoritem lažje in hitreje zapišemo kot programsko
kodo.
‣ Za zapis algoritmov ni strogih pravil.
‣ Algoritem je pogosto-‐ mešnica naravnega jezika,
-‐ matema>čnih izrazov in
-‐ kontrolnih ukazov.
‣ Za zapis potrebujemo samo-‐ svinčnik in papir, oziroma preprost urejevalnik besedil
(Notepad).
[email protected]‐lj.siAlgoritmi | št. leto 2012/13
Zakaj pri razvoju programov uporabljamo algoritme ‣ Lahko se predvsem posveHmo reševanju problema.
‣ Algoritem lahko napišemo na različnih nivojih.-‐ Najprej grobi, nato podrobnejši algoritem
‣ Izdelamo lahko več različic (variant) rešitev.
‣ Rešitev lažje razložimo sodelavcem, ki ne znajo programiraH.
‣ Računalniški algoritem lahko hitro preslikamo v računalniški program.
[email protected]‐lj.siAlgoritmi | št. leto 2012/13
Objavljeni algoritmi -‐ ponovna uporaba
‣ Mnogo algoritmov je objavljenih v strokovni literaturi.-‐ Članki v strokovnih revijah vsebujejo tudi algoritme.
Obstajajo zbirke algoritmov na določenem področju.
‣ Praviloma je bolje uporabiH že izdelan algoritem, kot pa ga razviH ponovno.-‐ Večja učinkovitost, popularni algoritmi so praviloma
pravilni, koncept ponovne uporabe.
‣ Primeri knjig z algoritmi:-‐ A. Binstock, J. Rex, Prac>cal Algorithms for Programmers,
Addison Wesley, 1995
-‐ G.H. Gonnet, Handbook of Algor>hms and data structures, Addison-‐Wesley, 1984
[email protected]‐lj.siAlgoritmi | št. leto 2012/13
Sestavni deli algoritma
‣ Osnovni deli-‐ Opis naloge.
-‐ Ime algoritma.
-‐ Seznam podatkov in seznam rezultatov.
-‐ Zapis korakov reševanja naloge -‐ postopek.
-‐ Izvajalec algoritma.
‣ Dodatni deli (neobvezni)-‐ Klic algoritma, opis rešitvenih idej, analiza učinkovitos>
algoritma, teore>čne osnove reševanja, sklicevanja (reference) na druge dokumente, ki se ukvarjajo s podobno nalogo, testni primeri, ...
[email protected]‐lj.siAlgoritmi | št. leto 2012/13
Izvajalec algoritma
‣ Izvajalec algoritma je lahko oseba, ki pozna problemsko domeno algoritma.-‐ Predpostavljamo, da zna izves> vse v algoritmu
uporabljene operacije.
‣ Izvajalca algoritma običajno ni potrebno posebej označiH.
‣ Izvajalec algoritma je lahko tudi računalnik. -‐ Algoritem je tedaj računalniški program.
-‐ Algoritem zapišemo v izbranem programskem jeziku.
[email protected]‐lj.siAlgoritmi | št. leto 2012/13
Osnovni elemenH računalniških algoritmov
‣ Spremenljivka. Ima ime. Simbolično predstavlja vrednost. VrednosH se lahko spreminjajo.
‣ Prirejanje vrednosH spremenljivkam-‐ n = n + 1
‣ AritmeHčne, primerjalne in logične operacije-‐ 2*(c/d -‐p)
-‐ a>b in c<d
‣ Ponavljalne in pogojne operacije
‣ MatemaHčne funkcije
[email protected]‐lj.siAlgoritmi | št. leto 2012/13
LastnosH algoritmov
‣ Izvedljivost: algoritem mora biH izvedljiv. VsebovaH sme samo operacije, ki jih pozna izvajalec algoritma.
‣ Pravilnost: algoritem mora rešiH dano nalogo in ne kake druge.
‣ Ponovljivost: pri enakih nalogah moramo z enakimi podatki dobiH enake rezultate.
‣ Končnost izvedbe: izvajanje algoritma se mora končaH, sicer naloga ni nikoli rešena.
‣ Popolnost: izvajalec algoritma ne potrebuje nobenih dodatnih informacij za razumevanje algoritma, po katerem reši nalogo.
[email protected]‐lj.siAlgoritmi | št. leto 2012/13
EsteHka v algoritmih
‣ Algoritem je pogosto izvirno avtorsko delo. -‐ Ima nekatere lastnos> umetniškega dela.
‣ Uspešna izdelava algoritmov zahteva-‐ izkušnje, širok pogled, poznavanje domene problema,
dobre miselne tehnike, izvirne ideje
‣ Avtorji algoritmov se zato pogosto potrudijo, -‐ da v originalnih algoritmih ni motečih elementov, ki jih
včasih lahko zaznamo le z este>ko
‣ Pogosto so elegantni algoritmi tudi zelo razumljivi in učinkoviH.-‐ Rekurzivni algoritmi so praviloma zelo elegantni.
[email protected]‐lj.siAlgoritmi | št. leto 2012/13
TesHranje algoritmov
‣ Namen tesHranja-‐ je odpravljanje napak v algoritmu
-‐ in ne dokazovanje pravilnos> algoritma.
-‐ Dokazovanje pravilnos> algoritmov je zapletena naloga (tudi za matema>ke)
‣ IzvesH je treba več testnih primerov. -‐ Testni primer določa konkretne vhodne podatke.
-‐ Testni primeri morajo preskusi> vse dele algoritma.
-‐ Posebej moramo pripravi> tesne primere za mejne vrednos> podatkov.
[email protected]‐lj.siAlgoritmi | št. leto 2012/13
Kako tesHramo algoritme
‣ Algoritem tesHramo peš -‐ Korak za korakom izvajamo algoritem (izračunamo vsak
korak) in si beležimo stanje tekočih podatkov in rezultatov algoritma, ki jih uredimo v ustrezne tabele.
‣ Pogosto tesHramo po algoritmu izdelan računalniški program. -‐ Pri preslikavi algoritma v program pogosto pride do
dodatnih napak.
[email protected]‐lj.siAlgoritmi | št. leto 2012/13
Abstraktni nivoji algoritmov
‣ Pogosto predstavimo isto nalogo z več algoritmi na različnih nivojih abstrakcije. -‐ Uporabimo proces abstrakcije, pri katerem odstranimo
nepotrebne podrobnos> (abstrahira> = odstrani>)
-‐ Grobi algoritem je vedno krajši in razumljivejši od bolj podrobnega.
‣ Če je namen algoritma izdelava programa, mora biH končni algoritem tako podroben, da lahko po njem zanesljivo napišemo računalniški program.
‣ Z algoritmi ne smemo preHravaH.-‐ Za trivialne naloge ne pišemo algoritmov.
[email protected]‐lj.siAlgoritmi | št. leto 2012/13
Učinkovitost algoritmov
‣ Učinkovitost-‐ Učinkovitost algoritmov določajo viri, ki so potrebni za
rešitev naloge.
‣ Med pomembne vire štejemo -‐ čas reševanja in
-‐ prostor v pomnilniku za shranjevanje podatkov in vmesnih rezultatov.
‣ Obravnavamo -‐ časovno zahtevnost in
-‐ prostorsko zahtevnost algoritmov.
[email protected]‐lj.siAlgoritmi | št. leto 2012/13
Časovna učinkovitost algoritmov
‣ Merimo s številom osnovnih operacij potrebnih za rešitev naloge.
‣ Zelo pogosto so osnovne operacije aritmeHčne in logične operacije, ki jih izvaja procesor računalnika.
‣ Pogosto študiramo odvisnost števila operacij od velikosH problema.-‐ Izračun korenov kvadratne enačbe ax2 + bx + c =
0, zahteva konstantno število operacij.
-‐ Pri določanju največjega števila izmed n podanih števil je število primerjanj n-1.
-‐ Število operacij pri reševanju sistema linearnih enačb reda n po Gaussovem postopku je sorazmerno z n3.
[email protected]‐lj.siAlgoritmi | št. leto 2012/13
Kako ustvarimo algoritem
‣ Splošnega algoritma za izdelavo algoritmov ni.
‣ Če imamo idejo, kako rešiH nalogo, pogosto algoritma ni zelo težko zapisaH.
‣ Najprej določimo ustrezne simbole za podatke in rezultate, ki nastopajo v nalogi.
‣ Nato predstavimo rešitev kot zaporedje dobro definiranih korakov.
‣ V zapisu upoštevamo zmogljivosH programskega jezika, ki ga nameravamo uporabiH.
[email protected]‐lj.siAlgoritmi | št. leto 2012/13
Zapis algoritma ni preprost, tudi če imamo rešitvene ideje‣ Obstajajo naloge, ki jih znamo rešiH, pa jih je kljub
temu težko zapisaH v obliki algoritma.
‣ DoločiH moramo model ali predstavitev (reprezentacijo) naloge-‐ V modelu izločimo vse nepotrebne detajle, ki za rešitev
naloge niso pomembni (abstrakcija).
-‐ Pogosto lahko izbiramo med različnimi modeli, ki ne dajo enako dobrih algoritmov.
‣ Pri računalniških algoritmih upoštevamo ciljni programski jezik.
‣ Postopoma razvijamo algoritem (z vrha navzdol).
[email protected]‐lj.siAlgoritmi | št. leto 2012/13
Ali lahko zapišemo algoritem naloge, ki jo ne znamo rešiH‣ Nemogoče. Tedaj algoritma ne moremo zapisaH.-‐ Algoritem je zapis poteka reševanja naloge.
‣ Najprej moramo poznaH osnutek, zamisel, koncept, zasnovo, idejo rešitve naloge, potem se lahko šele loHmo zapisa algoritma.
‣ Brez rešitvenih idej algoritma ni mogoče zapisaH.
‣ Bolj podroben algoritem želimo zapisaH, več moramo vedeH o reševanju anloge.
[email protected]‐lj.siAlgoritmi | št. leto 2012/13
Kako dobimo rešitvene ideje
‣ Kako dobimo rešitvene ideje? MožnosH je več.-‐ Do njih pridemo s premišljevanjem.
-‐ Najdemo jih v literaturi.
-‐ Zvemo jih od sodelavcev.
‣ Rešitvena ideja se lahko pojavi v naših možganih, če dovolj premišljujejo o nalogi.-‐ O nalogi premišljujejo na različne načine.
[email protected]‐lj.siAlgoritmi | št. leto 2012/13
Kako povečamo verjetnost, da se pojavijo prave rešitvene ideje‣ Nalogo podrobno analiziramo ali razčlenimo.-‐ Izdelamo tabelo podatkov in rezultatov.
-‐ Nalogo grafično predstavimo (narišemo).
-‐ Ukvarjamo se s širšo problema>ko naloge.
-‐ Iščemo zakonitos>, ki so povezane z nalogo.
‣ Uporabimo znane rešitvene strategije, na primer:-‐ deli in vladaj.
‣ Uporabimo znano rešitev podobne naloge.
‣ Rešujemo splošnejšo nalogo.
[email protected]‐lj.siAlgoritmi | št. leto 2012/13
Naloga: ugotovi, ali je podana točka znotraj mnogokotnika!
Primer: točka znotraj mnogokotnika
[email protected]‐lj.siAlgoritmi | št. leto 2012/13
Naloga: ugotovi, ali je podana točka znotraj mnogokotnika!
Študiramo presečišča poltraka iz dane točke z mnogokotnikom.
Liho število presešišč (3)
Sodo število presešišč (6)
Primer: točka znotraj mnogokotnika
[email protected]‐lj.siAlgoritmi | št. leto 2012/13
Klic algoritma -‐ ponovna uporaba algoritmov‣ Že izdelan algoritem pokličemo.
‣ Algoritem mora imeH ime in in dobro definirane podatke in rezultate.
‣ Pogosto ga pokličemo podobno kot funkcijo ali proceduro (podprogram) v programskem jeziku.-‐ Klic izvedemo v obliki procedure z:
• Ime( podatki, rezulta> )
-‐ ali v obliki funkcije z• rezultat = Ime( podatki )
‣ Klic algoritma določimo v samem zapisu algoritma.
[email protected]‐lj.siAlgoritmi | št. leto 2012/13
Način zapisa algoritma
‣ Za zapis operacij lahko uporabimo različne notacije: -‐ naravni jezik,
-‐ psevdokodo,
-‐ diagram poteka,
-‐ programski jezik (C, C++, Visual Basic, Java, fortran... ).
‣ Pogosto zapišemo algoritem z računalniškimi orodji za pisanje dokumentov-‐ Tak zapis lažje popravljamo in spreminjamo.
-‐ Word, Notepad, ...
[email protected]‐lj.siAlgoritmi | št. leto 2012/13
Zapis algoritma v naravnem jeziku
‣ Naravni jezik lahko uporabimo za zapis algoritma.-‐ Izkaže se, da tak zapis ni dovolj jedrnat in razumljiv.
‣ Zapis skrajšamo z: -‐ z uporabo simbolov, ki predstavljajo elemente v nalogi,
-‐ z uporabo matema>čnih simbolov in izrazov.
‣ Algoritem pogosto razdelimo na oštevilčene korake. -‐ 1. korak
-‐ 2. korak ...
[email protected]‐lj.siAlgoritmi | št. leto 2012/13
Zapis algoritma z diagramom poteka
‣ Pri diagramu poteka -‐ posamezne dele algoritma narišemo grafično in jih
povežemo s puščicami.
-‐ Diagram poteka je običajno zelo razumljiv.
-‐ Pogosto ga uporabimo pri grobih algoritmih.
-‐ Vendar je risanje algoritma bolj zahtevna operacija od pisanja običajnega besedila.
[email protected]‐lj.siAlgoritmi | št. leto 2012/13
Primer: diagram poteka
[email protected]‐lj.siAlgoritmi | št. leto 2012/13
PrednosH in slabosH diagramov poteka
‣ PrednosH diagramov poteka so: -‐ hitro dojemanje toka izvedbe,
-‐ uporaba standarnih simbolov,
-‐ hitro učenje.
‣ SlabosH diagramov poteka so:-‐ težja uporaba računalnikov (potrebujemo posebne
programe za risanje algoritmov),
-‐ slaba izkoriščenost prostora,
-‐ nepreglednost pri podrobnejših algoritmih,
-‐ potrebne so risarske sposobnos>.
[email protected]‐lj.siAlgoritmi | št. leto 2012/13
Zapis algoritmov v psevdokodi
‣ Psevdokoda je-‐ kombinacija naravnega jezika, matema>čnih izrazov in
posebnih kontrolnih konstruktov, ki so podobni kontrolnim strukturam programskih jezikov.
‣ Spremenljivke v pseudokodi so simbolično predstavljani podatki, ki se smejo spremeniH-‐ n = n + 1
‣ PogosH kontrolni konstrukH so: -‐ pogojno izvajanje operacij,
-‐ izbiranje operacij,
-‐ ponavljanje operacij (zanke).
[email protected]‐lj.siAlgoritmi | št. leto 2012/13
Psevdokoda
‣ LastnosH-‐ V psevdokodi uporabljamo znane matema>čne simbole in
operacije.
-‐ Obvezno je zamikanje operacij, ki nastopajo znotraj kontrolnih konstruktov.
-‐ Dovoljeno je gnezdenje kontrolnih kontruktov, kar moramo upošteva> tudi pri zamikanju.
-‐ Doda> smemo tudi komentarje, ki dodatno razlagajo pomen operacij.
[email protected]‐lj.siAlgoritmi | št. leto 2012/13
LastnosH psevdokoda
‣ Dobre lastnosH-‐ Lahko jo zapišemo z računalnikom (z urejevalnikom
besedil).
-‐ Psevdokoda je uporabna tudi pri podrobnih algoritmih.
-‐ Predelava v programski jezik je enostavna.
-‐ Določa jo tekstovni zapis.
‣ Slabe lastnosH-‐ V zapisu ni grafičnih elementov.
-‐ Standardni kontrolni konstruk> ne obstajajo.
-‐ Sami jih moramo določi>.
[email protected]‐lj.siAlgoritmi | št. leto 2012/13
Primer uporabe psevdokode
‣ Naloga: -‐ Določi največji element izmed podanih n števil e1, e2, ...,
en
‣ Podatki:-‐ n, e1, e2, ..., en
‣ RezultaH:-‐ emax
‣ Klic:- emax = Največji_element(n, e)
[email protected]‐lj.siAlgoritmi | št. leto 2012/13
Primer uporabe psevdokode
‣ Naloga: -‐ Določi največji element izmed podanih n števil e1, e2, ...,
en
‣ Podatki:-‐ n, e1, e2, ..., en
‣ RezultaH:-‐ emax
‣ Klic:- emax = Največji_element(n, e)
eMax = e1Za i=2,3 ... n ponavljaj Če je ei > eMax potem eMax = ei Do semDo semKonec
[email protected]‐lj.siAlgoritmi | št. leto 2012/13
Primer uporabe psevdokode
‣ Naloga: -‐ Določi vsoto n števil e1, e2, ..., en
‣ Podatki:-‐ n, e1, e2, ..., en
‣ RezultaH:-‐ vsota
‣ Klic:- vsota = Določi_vsoto(n, e)
[email protected]‐lj.siAlgoritmi | št. leto 2012/13
Primer uporabe psevdokode
‣ Naloga: -‐ Določi vsoto n števil e1, e2, ..., en
‣ Podatki:-‐ n, e1, e2, ..., en
‣ RezultaH:-‐ vsota
‣ Klic:- vsota = Določi_vsoto(n, e)
vsota = 0Za i=1,2,... n ponavljaj vsota = vsota + eiDo semKonec