230 likes | 466 Views
IT Računalniško programiranje. Primeri algoritemskih programov (sortiranje, matrične operacije, geometrijske transformacije) Danijel Rebolj, FG 2007/2008. Literatura. D. Knuth: The art of computer programming, Addison Wesley Volume 1 - Fundamental Algorithms
E N D
ITRačunalniško programiranje Primeri algoritemskih programov (sortiranje, matrične operacije, geometrijske transformacije) Danijel Rebolj, FG 2007/2008
Literatura • D. Knuth: The art of computer programming, Addison Wesley • Volume 1 - Fundamental Algorithms • Volume 2 - Seminumerical Algorithms • Volume 3 - Sorting and Searching • Volume 4 – 7 v pripravi •
Časovna zahtevnost • Podatek o tem, koliko časa se bo algoritem pri danih vhodnih podatkih izvajal, preden bo vrnil rešitev • Čas običajno merimo v osnovnih operacijah stroja • Časovno zahtevnost podamo kot funkcijo velikosti vhodnih podatkov (npr. velikost seznama)
Časovna zahtevnost • O-notacija označuje red rasti problema • Primeri (n-velikost vhoda, c-konstanta): O (log n) O (n) O (n2) O (nc) O (cn)
Primeri algoritemskih programov • Zaporedja (primer: Fibonaccijevo) • Operacije z množicami točk • Rotacija kocke • Matrične operacije • Iskanje v seznamu (linearno, binarno) • Sortiranje (bubble sort, selektivno)
Operacije z množicami točk • Premik • Skaliranje • Zrcaljenje • Rotacija • Koordinatno okno • Obseg poligona
Rotacija kocke Private Type Tocka X As Double Y As Double Z As Double XP As Double YP As Double End Type Private Type Daljica p1 As Long p2 As Long End Type
Rotacija kocke Dim Ogl(8) As Tocka ‘Oglišča Dim Rob(12) As Daljica ‘robovi kocke Dim IndexOffset As Long ‘zamik indeksa Dim Odmik As Single ‘odmik Dim Ocisce As Single Dim KotRotacije As Single Dim IzrisObstaja As Boolean Dim Rotiraj As Boolean Dim Hitrost As Single
Rotacija kocke Sub Rotacija() If RotacijaX Then _ call RotirajKoordinateOkoliX_ (KotRotacije) If RotacijaY Then _ call RotirajKoordinateOkoliY_ (KotRotacije) If RotacijaZ Then _ call RotirajKoordinateOkoliZ_ (KotRotacije) End Sub
Rotacija kocke Sub RotirajKoordinateOkoliX(Kot As single) Dim i As Long, NovY As Single Dim NovZ As Single For i = 1 To 8 NovY = Ogl(i).Y * Cos(Kot) - _ Ogl(i).Z * Sin(Kot) NovZ = Ogl(i).Y * Sin(Kot) + _ Ogl(i).Z * Cos(Kot) Ogl(i).Y = NovY Ogl(i).Z = NovZ Next i End Sub
Rotacija kocke Sub IzracunajProjekcijeTock() Dim i As Long For i = 1 To 8 Ogl(i).XP = Ogl(i).X * Ocisce / _ (Ocisce + Ogl(i).Z) + Odmik Ogl(i).YP = Ogl(i).Y * Ocisce / _ (Ocisce + Ogl(i).Z) + Odmik Next i End Sub
Matrične operacije • Osnova je dvojna zanka: FOR i = 1 TO n FOR j = 1 to m Matrika (i,j) = 0 NEXT jNEXT i • seštevanje • množenje
Množenje matrik DIM M(iMmax,jMax),N(jMax,kMax),P(iMax,kMax) FOR i = 1 TO iMax FOR k = 1 TO kMax P (i, k) = 0 FOR j = 1 to jMax P (i,k) = P (i,k) + M (i,j)*N(j,k) NEXT j NEXT k NEXT i
Linearno iskanje v seznamu Strategija: • V neurejenem seznamu podatkov preverimo vsak element ali ustreza iskanemu podatku • Iskanje se konča, ko je iskani element najden ALI ko se senam konča
Binarno iskanje v seznamu • Zahteva urejen seznam elementov • Uporabno kadar mora biti iskanje hitro in se pogosto ponavlja • Temelji na primerjavi med elementom v sredini seznama in iskano vrednostjo • Implementacija je mogoča tudi v rekurzivni obliki
Sortiranje • Enostavno sortiranje ima časovno zahtevnost O (n2): • selektivno sortiranje, bubble sort • Manjša zahtevnost: QuickSort, Merge,... • Primerjava algoritmov • Podroben prikaz delovanja algoritma QuickSort
Selektivno sortiranje • Poiščemo najmanjši element v seznamu in ga zamenjamo s prvim (v primeru, ko želimo naraščajoče vrednosti) • Postopek ponavljamo za preostali del seznama dokler ni celoten seznam urejen
Selektivno sortiranje Sub SelektivniSort(n AS Long, seznam()) For i = 1 To n-1 smin = seznam(i): jmin = i For j = i + 1 To n If seznam(j) < smin Then smin = seznam(j): jmin = j endif Next j seznam(jmin) = seznam(i) seznam(i) = smin Next i End Sub
Bubble sort • Elemente v seznamu primerjamo v parih in ju zamenjamo, če je naslednik manjši od predhodnika • Največji element se po enem prehodu seznama znajde na zadnjem mestu (kot mehurček) • Postopek ponavljamo za preostali del seznama dokler ni celoten seznam urejen
Bubble sort Sub BubbleSort(n AS Long, seznam()) FOR i = 0 TO iMax Prvi = Seznam(i) FOR j = i+1 TO iMax Drugi = Seznam (j) if Drugi < Prvi then Seznam(i) = Drugi Seznam(j) = Prvi Prvi = Drugi endif NEXT j NEXT I End Sub