algoritmi - media.matevzdolenc.commedia.matevzdolenc.com/ul-fgg/ri-2011/algoritmi-0809.pdf ·...
TRANSCRIPT
Univerza v Ljubljani Fakulteta za gradbeništvo in geodezijo
http://kgi.fgg.uni-lj.si/pouk/racinfdoc.dr. Matevž Dolenc
Algoritmi
http://kgi.fgg.uni-lj.si/pouk/racinfNaslov: Algoritmi
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.
‣ Lastnosti- 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.
http://kgi.fgg.uni-lj.si/pouk/racinfNaslov: Algoritmi
Izračun povprečne vrednosti 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 sempv = vsota / n
Konec
Psevdokoda Diagram poteka
http://kgi.fgg.uni-lj.si/pouk/racinfNaslov: Algoritmi
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.
http://kgi.fgg.uni-lj.si/pouk/racinfNaslov: Algoritmi
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++
http://kgi.fgg.uni-lj.si/pouk/racinfNaslov: Algoritmi
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,- matematičnih izrazov in- kontrolnih ukazov.
‣ Za zapis potrebujemo samo- svinčnik in papir,
- oziroma preprost urejevalnik besedil (Notepad).
http://kgi.fgg.uni-lj.si/pouk/racinfNaslov: Algoritmi
Zakaj pri razvoju programov uporabljamo algoritme
‣ Lahko se predvsem posvetimo 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 programirati.
‣ Računalniški algoritem lahko hitro preslikamo v računalniški program.
http://kgi.fgg.uni-lj.si/pouk/racinfNaslov: Algoritmi
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 uporabiti že izdelan algoritem, kot pa ga razviti ponovno.
- Večja učinkovitost, popularni algoritmi so praviloma pravilni, koncept ponovne uporabe.
‣ Primeri knjig z algoritmi:- A. Binstock, J. Rex, Practical Algorithms for Programmers,
Addison Wesley, 1995- G.H. Gonnet, Handbook of Algortihms and data structures,
Addison-Wesley, 1984
http://kgi.fgg.uni-lj.si/pouk/racinfNaslov: Algoritmi
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činkovitosti
algoritma, teoretične osnove reševanja, sklicevanja (reference) na druge dokumente, ki se ukvarjajo s podobno nalogo, testni primeri, ...
http://kgi.fgg.uni-lj.si/pouk/racinfNaslov: Algoritmi
Izvajalec algoritma
‣ Izvajalec algoritma je lahko oseba, ki pozna problemsko domeno algoritma.
- Predpostavljamo, da zna izvesti vse v algoritmu uporabljene operacije.
‣ Izvajalca algoritma običajno ni potrebno posebej označiti.
‣ Izvajalec algoritma je lahko tudi računalnik. - Algoritem je tedaj računalniški program. - Algoritem zapišemo v izbranem programskem jeziku.
http://kgi.fgg.uni-lj.si/pouk/racinfNaslov: Algoritmi
Osnovni elementi računalniških algoritmov
‣ Spremenljivka. Ima ime. Simbolično predstavlja vrednost. Vrednosti se lahko spreminjajo.
‣ Prirejanje vrednosti spremenljivkam- n = n + 1
‣ Aritmetične, primerjalne in logične operacije- 2*(c/d -p)- a>b in c<d
‣ Ponavljalne in pogojne operacije
‣ Matematične funkcije
‣ Vhodno-izhodne operacije
http://kgi.fgg.uni-lj.si/pouk/racinfNaslov: Algoritmi
Lastnosti algoritmov
‣ Izvedljivost: algoritem mora biti izvedljiv. Vsebovati sme samo operacije, ki jih pozna izvajalec algoritma.
‣ Pravilnost: algoritem mora rešiti dano nalogo in ne kake druge.
‣ Ponovljivost: pri enakih nalogah moramo z enakimi podatki dobiti enake rezultate.
‣ Končnost izvedbe: izvajanje algoritma se mora končati, sicer naloga ni nikoli rešena.
‣ Popolnost: izvajalec algoritma ne potrebuje nobenih dodatnih informacij za razumevanje algoritma, po katerem reši nalogo.
http://kgi.fgg.uni-lj.si/pouk/racinfNaslov: Algoritmi
Estetika v algoritmih
‣ Algoritem je pogosto izvirno avtorsko delo. - Ima nekatere lastnosti 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 estetiko
‣ Pogosto so elegantni algoritmi tudi zelo razumljivi in učinkoviti.
- Rekurzivni algoritmi so praviloma zelo elegantni.
http://kgi.fgg.uni-lj.si/pouk/racinfNaslov: Algoritmi
Testiranje algoritmov
‣ Namen testiranja- je odpravljanje napak v algoritmu - in ne dokazovanje pravilnosti algoritma.- Dokazovanje pravilnosti algoritmov je zapletena naloga (tudi za
matematike)
‣ Izvesti je treba več testnih primerov. - Testni primer določa konkretne vhodne podatke.- Testni primeri morajo preskusiti vse dele algoritma. - Posebej moramo pripraviti tesne primere za mejne vrednosti
podatkov.
http://kgi.fgg.uni-lj.si/pouk/racinfNaslov: Algoritmi
Kako testiramo algoritme
‣ Algoritem testiramo 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 testiramo po algoritmu izdelan računalniški program.
- Pri preslikavi algoritma v program pogosto pride do dodatnih napak.
http://kgi.fgg.uni-lj.si/pouk/racinfNaslov: Algoritmi
Abstraktni nivoji algoritmov
‣ Pogosto predstavimo isto nalogo z več algoritmi na različnih nivojih abstrakcije.
- Uporabimo proces abstrakcije, pri katerem odstranimo nepotrebne podrobnosti (abstrahirati = odstraniti)
- Grobi algoritem je vedno krajši in razumljivejši od bolj podrobnega.
‣ Če je namen algoritma izdelava programa, mora biti končni algoritem tako podroben, da lahko po njem zanesljivo napišemo računalniški program.
‣ Z algoritmi ne smemo pretiravati.- Za trivialne naloge ne pišemo algoritmov.
http://kgi.fgg.uni-lj.si/pouk/racinfNaslov: Algoritmi
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.
http://kgi.fgg.uni-lj.si/pouk/racinfNaslov: Algoritmi
Časovna učinkovitost algoritmov
‣ Merimo s številom osnovnih operacij potrebnih za rešitev naloge.
‣ Zelo pogosto so osnovne operacije aritmetične in logične operacije, ki jih izvaja procesor računalnika.
‣ Pogosto študiramo odvisnost števila operacij od velikosti 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.
http://kgi.fgg.uni-lj.si/pouk/racinfNaslov: Algoritmi
Kako ustvarimo algoritem
‣ Splošnega algoritma za izdelavo algoritmov ni.
‣ Če imamo idejo, kako rešiti nalogo, pogosto algoritma ni zelo težko zapisati.
‣ 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 zmogljivosti programskega jezika, ki ga nameravamo uporabiti.
http://kgi.fgg.uni-lj.si/pouk/racinfNaslov: Algoritmi
Zapis algoritma ni preprost, tudi če imamo rešitvene ideje
‣ Obstajajo naloge, ki jih znamo rešiti, pa jih je kljub temu težko zapisati v obliki algoritma.
‣ Določiti 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).
http://kgi.fgg.uni-lj.si/pouk/racinfNaslov: Algoritmi
Ali lahko zapišemo algoritem naloge, ki jo ne znamo rešiti
‣ Nemogoče. Tedaj algoritma ne moremo zapisati.- Algoritem je zapis poteka reševanja naloge.
‣ Najprej moramo poznati osnutek, zamisel, koncept, zasnovo, idejo rešitve naloge, potem se lahko šele lotimo zapisa algoritma.
‣ Brez rešitvenih idej algoritma ni mogoče zapisati.
‣ Bolj podroben algoritem želimo zapisati, več moramo vedeti o reševanju anloge.
http://kgi.fgg.uni-lj.si/pouk/racinfNaslov: Algoritmi
Kako dobimo rešitvene ideje
‣ Kako dobimo rešitvene ideje? Možnosti 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.
http://kgi.fgg.uni-lj.si/pouk/racinfNaslov: Algoritmi
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 problematiko naloge.- Iščemo zakonitosti, 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.
dr. Matevž Dolenc, [email protected], 18.4.2008Naslov: Algoritmi
Primer: točka znotraj mnogokotnika
Naloga: ugotovi, ali je podana točka znotraj mnogokotnika!
dr. Matevž Dolenc, [email protected], 18.4.2008Naslov: Algoritmi
Primer: točka znotraj mnogokotnika
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)
http://kgi.fgg.uni-lj.si/pouk/racinfNaslov: Algoritmi
Klic algoritma - ponovna uporaba algoritmov
‣ Že izdelan algoritem pokličemo.
‣ Algoritem mora imeti 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, rezultati )
- ali v obliki funkcije z• rezultat = Ime( podatki )
‣ Klic algoritma določimo v samem zapisu algoritma.
http://kgi.fgg.uni-lj.si/pouk/racinfNaslov: Algoritmi
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, ...
http://kgi.fgg.uni-lj.si/pouk/racinfNaslov: Algoritmi
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 matematičnih simbolov in izrazov.
‣ Algoritem pogosto razdelimo na oštevilčene korake. - 1. korak
- 2. korak ...
‣ Vrstni red izvajanja lahko predpišemo s tipičnim stavkom:- Nadaljuj na koraku k.
http://kgi.fgg.uni-lj.si/pouk/racinfNaslov: Algoritmi
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.
‣ Gradniki diagramov poteka
dr. Matevž Dolenc, [email protected], 18.4.2008Naslov: Algoritmi
Primer: diagram poteka
http://kgi.fgg.uni-lj.si/pouk/racinfNaslov: Algoritmi
Prednosti in slabosti diagramov poteka
‣ Prednosti diagramov poteka so: - hitro dojemanje toka izvedbe,- uporaba standarnih simbolov, - hitro učenje.
‣ Slabosti 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 sposobnosti.
http://kgi.fgg.uni-lj.si/pouk/racinfNaslov: Algoritmi
Zapis algoritmov v psevdokodi
‣ Psevdokoda je- kombinacija naravnega jezika, matematičnih izrazov in
posebnih kontrolnih konstruktov, ki so podobni kontrolnim strukturam programskih jezikov.
‣ Spremenljivke v pseudokodi so simbolično predstavljani podatki, ki se smejo spremeniti
- n = n + 1
‣ Pogosti kontrolni konstrukti so: - pogojno izvajanje operacij, - izbiranje operacij, - ponavljanje operacij (zanke).
http://kgi.fgg.uni-lj.si/pouk/racinfNaslov: Algoritmi
Psevdokoda
‣ Lastnosti- V psevdokodi uporabljamo znane matematične simbole in
operacije. - Obvezno je zamikanje operacij, ki nastopajo znotraj kontrolnih
konstruktov.
- Dovoljeno je gnezdenje kontrolnih kontruktov, kar moramo upoštevati tudi pri zamikanju.
- Dodati smemo tudi komentarje, ki dodatno razlagajo pomen operacij.
http://kgi.fgg.uni-lj.si/pouk/racinfNaslov: Algoritmi
Lastnosti psevdokoda
‣ Dobre lastnosti- 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 lastnosti- V zapisu ni grafičnih elementov.- Standardni kontrolni konstrukti ne obstajajo.- Sami jih moramo določiti. - Skrbeti moramo za zamikanje, sicer zapis ni čitljiv.
http://kgi.fgg.uni-lj.si/pouk/racinfNaslov: Algoritmi
Primer uporabe psevdokode
‣ Naloga: - Določi največji element izmed podanih n števil e1, e2, ..., en
‣ Podatki:- n, e1, e2, ..., en
‣ Rezultati:- emax
‣ Klic:- emax = Največji_element(n, e)
http://kgi.fgg.uni-lj.si/pouk/racinfNaslov: Algoritmi
Primer uporabe psevdokode
‣ Naloga: - Določi največji element izmed podanih n števil e1, e2, ..., en
‣ Podatki:- n, e1, e2, ..., en
‣ Rezultati:- 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
http://kgi.fgg.uni-lj.si/pouk/racinfNaslov: Algoritmi
Primer uporabe psevdokode
‣ Naloga: - Določi vsoto n števil e1, e2, ..., en
‣ Podatki:- n, e1, e2, ..., en
‣ Rezultati:- vsota
‣ Klic:- vsota = Določi_vsoto(n, e)
http://kgi.fgg.uni-lj.si/pouk/racinfNaslov: Algoritmi
Primer uporabe psevdokode
‣ Naloga: - Določi vsoto n števil e1, e2, ..., en
‣ Podatki:- n, e1, e2, ..., en
‣ Rezultati:- vsota
‣ Klic:- vsota = Določi_vsoto(n, e)
vsota = 0Za i=1,2,... n ponavljaj vsota = vsota + eiDo semKonec