Professional Documents
Culture Documents
Predavanja, Baza Podataka, Algoritmi
Predavanja, Baza Podataka, Algoritmi
Akademska godina 2012/13 Sa!a Ceci Institut Ru!er Bo"kovi# Zavod za eksperimentalnu fiziku 2. CK krilo, soba 02 Email: sasa.ceci@gmail.hr Telefon: 099 2357 111 http://goo.gl/XcIBi
dva sata predavanja, dva sata vje!bi tjedno (ponedjeljak, od 13h do 17h, u 107) redovito poha"anje predavanja i vje!bi je uvjet za dobivanje potpisa zavr#na ocjena na ispitu: ! kombinacija rezultata kolokvija i usmenog dijela ispita kolokviji: ! 2 kolokvija, ! djelomi$no rije#eni zadaci donose bodove, ! za prolaz treba rije#iti barem 50 posto na oba (bez toga nema potpisa) ! tko ne pro"e, ima jo# jednu #ansu tjedan dana kasnije usmeni ispit: ! prema dogovoru s predava$em u terminima slu!benih ispitnih rokova, ! usmeni (2 x sije$anj/velja$a, 1 x travanj, 2 x lipanj, 2 x rujan) ! precizniji termini i vi#e detalja o sadr!aju kolokvija i usmenog ispita sljede%i put
konzultacije: po dogovoru
Op#enito o predmetu
! !
Sadr!aj kolegija: Uvod: Pojam tipa, apstraktnog tipa i struktura podataka. Elementi od kojih se gradi struktura: polje, zapis, pokaziva$ (pointer), kursor. Pojam algoritma, zapisivanje i analiziranje algoritama. Pregled raznih apstraktnih tipova: Lista, stog (stack), red, ure"eno stablo, binarno stablo, skup, rje$nik, prioritetni red, preslikavanje. Pregled raznih struktura podataka: Vezana lista i druge vezane strukture, tablica rasipanja (hash), binarno stablo tra!enja, hrpa (heap). Algoritmi za obavljanje osnovnih operacija nad strukturama: Ubacivanje i izbacivanje podataka, pretra!ivanje, ispis sadr!aja i sli$no Primjena opisanih struktura u slo"enijim algoritmima: Sortiranje niza podataka, izvrednjavanje aritmeti$kih izraza, razni rekurzivni postupci. Op#enite tehnike (strategije) za konstrukciju algoritama: podijeli pa vladaj, dinami$ko programiranje, pohlepni pristup, "backtracking"
3
Osnovni pojmovi
! ! ! !
Strukture podataka stati$ki aspekt programa ono sa $ime se radi Algoritmi dinami$ki aspekt programa ono #to se radi me"usobno su povezani i utje$u jedno na drugo Pojmovi koji se $esto koriste: ! tip podataka: skup vrijednosti koje neki podatak mo!e poprimiti ! apstraktni tip podataka: zadan jedan ili vi#e tipova podataka, te jedne ili vi#e operacija (funkcija) operandi i rezultati operacija su podaci danog tipa ! Struktura podataka: skupina varijabli u programu i veza me"u njima ! Algoritam: kona$ni niz instrukcija od kojih svaka ima jasno zna$enje i mo!e biti izvr#ena u kona$nom vremenu. Za bilo koje vrijednosti ulaznih podataka algoritam mora zavr#avati nakon kona$nog broja koraka. ! Implementacija apstraktnog tipa podataka: konkretna realizacija ATP u programu, sastoji se od definicije za strukturu podataka (prikaz podataka iz ATP) i od potprograma (izvedba operacija iz ATP pomo%u odabranih algoritama). Za isti ATP mogu%e razli$ite implementacije.
4
Algoritam
!
! !
! !
! !
Pojam algoritma je uveden prvo u matematici, danas se $esto rabi u ra$unalnim znanostima Precizno opisan na$in rje#enja nekog problema Jednozna$no odre"uje #to treba napraviti, svaki korak algoritma mora biti nedvosmislena, rigorozno definirana operacija - DEFINITNOST Moraju biti definirani po$etni objekti koji pripadaju nekoj klasi objekata na kojima se obavljaju operacije - ULAZ Kao ishod algoritma pojave se zavr#ni objekt(i) ili rezultat(i) - IZLAZ Kona$ni broj koraka; svaki korak opisan instrukcijom, daje rezultat u kona$nom vremenu i kona$nom broju koraka KONA&NOST Mora se mo%i izvesti samo uz pomo% olovke i papira u kona$nom vremenu EFEKTIVNOST Postupak za rje#avanje nekog masovnog problema op%enito pitanje na koje je potrebno na%i odgovor, a koje ima parametre koji ostaju neodre"eni prilikom zadavanja problema Specificiranjem svih parametara masovnog problema dobiva se instanca problema algoritam rje#ava masovni problem ako rje#ava svaku pojedinu instancu problema
5
(a + ib) (c + id) = (ac bd) + i (ad + bc) kod ve%ine kompjutera mno!enje je mnogo sporiji proces od zbrajanja, pa %e se krajnji rezultat dobiti br!e upotrebom izraza (a + ib) (c + id) = (ac - bd) + i [(a+b) (c+d) ac bd] gdje se obavlja 3 mno!enja, 2 zbrajanja i 3 oduzimanja
7
Procedura
!
Postupak koji ima sva svojstva kao i algoritam, ali ne mora zavr#iti u kona$nom broju koraka jest ra$unalna procedura. U jeziku C to mo!e biti void funkcija Primjeri za proceduru: ! Operacijski sustav ra$unala ! Ure"iva$ teksta
! !
Trajanje izvo"enja algoritma mora biti "razumno" Primjer: ! Algoritam koji bi izabirao potez igra$a #aha tako da ispita sve mogu%e posljedice poteza, zahtijevao bi milijarde godina na najbr!em zamislivom ra$unalu. ! Dobar primjer za doma%u zada%u?
Algoritmi i programi
!
! !
Program - Opis algoritma koji u nekom programskom jeziku jednozna$no odre"uje #to ra$unalo treba napraviti. Programiranje - nau$iti sintaksu nekog proceduralnog jezika i ste%i osnovna intuitivna znanja o algoritmizaciji problema opisanog rije$ima. Programiranje: razvijanje struktura podataka i razvijanje algoritama Algoritmi + strukture podataka = PROGRAMI ! kako osmisliti algoritme ! kako strukturirati podatke ! kako formulirati algoritme ! kako verificirati korektnost algoritama ! kako analizirati algoritme procjena vremena izvr#avanja (broja operacija) algoritma ! kako provjeriti (testirati) programe Postupci izrade algoritama nisu jednozna$ni te zahtijevaju i kreativnost. Ina$e bi ve% postojali generatori algoritama. Zna$i da se (za sada?) gradivo ovog predmeta ne mo!e u potpunosti algoritmizirati. Koristit %e se programski jezik C. Za sa!eti opis slo!enijih algoritama mo!e se koristiti pseudokod.
9
Manje cjeline se udru!uju u ve%e i me"usobno su vezane Uvode se posebni nazivi za cjeline, na$ine udru!ivanja i na$ine povezivanja 'elija (cell): varijabla koju promatramo kao zasebnu cjelinu; svaka ima svoj tip i adresu Polje (array): mehanizam udru!ivanja manjih dijelova strukture u ve%e. Polje $ini vi#e %elija istog tipa (element polja) pohranjeno na uzastopnim adresama; broj %elija zadan i nepromjenljiv Zapis slog: mehanizam udru!ivanja manjih dijelova strukture u ve%e. 'elije (komponente zapisa) ne moraju biti istog tipa, ali su pohranjene na uzastopnim adresama. Broj, redoslijed i tip %elija su zadani i nepromjenljivi. Pokaziva$ (pointer): uspostavlja vezu izme"u dijelova struktura, %elija koja pokazuje neku drugu %eliju; njen sadr!aj je adresa druge %elije Kursor: uspostavlja vezu izme"u dijelova struktura, %elija koja pokazuje na element nekog polja
10
znakovni tip (1 By) cjelobrojni tip (standardno 4 By) realni tip (4 By) realni tip u dvostrukoj preciznosti (8 By)
Razlika izme"u preciznosti (precision) i to$nosti (accuracy). ! Preciznost se iskazuje brojem prvih va!e%ih to$nih znamenki, a to$nost je bliskost stvarnoj (nepoznatoj) vrijednosti. ! Za dovoljnu to$nost potrebna je adekvatna preciznost, ali preciznost ne implicira automatski to$nost jer su iskazane znamenke mogle nastati na temelju npr. pogre#nog mjerenja. Prefiksi ili kvalifikatori: odnose se na cijele brojeve. Duljina ovisi o procesoru. short - smanuje raspon vrijednosti (2 By) long - eksplicitno definira duljinu od 4 By signed unsigned - dozvoljava pridru!ivanje pozitivnih i negativnih vrijednosti - dozvoljava pridru!ivanje samo pozitivnih vrijednosti
11
! ! ! ! !
Memorijske klase
!
memorijska_klasa utvr"uje postojanost (trajnost) i podru$je va!enja varijabla u memoriji ovisno o mjestu deklaracije u programu. Postoje 4 memorijske klase: ! auto! automatska (vrijedi lokalno unutar funkcije) ! ! ! extern static register vanjska (vrijedi globalno unutar programa) stati$ka (vrijedi lokalno unutar funkcije ili modula)
registarska (vrijedi lokalno unutar funkcije, ali koristi CPU registre) Obi$no se klju$na rije$ auto ne navodi, te su sve lokalne varijable i polja definirani unutar neke funkcije automatske klase. Vanjska klasa ukazuje na varijable i polja koji su globalni (zajedni$ki) za sve funkcije unutar programa i obi$no se extern ne navodi jer polo!aj izvan funkcije ukazuje na to. Stati$ka klasa se koristi onda kada se vrijednost varijable ili $lanova polja treba zadr!ati nakon izlaska i ponovnog povratka u neku funkciju. U opisu algoritama izbjegavat %e se globalne varijable da bi se eksplicitno ukazalo na razmjenu informacija me"u funkcijama.
12
Niz znakova
Logi$ka vrijednost ! U nekim jezicima postoji poseban tip podataka LOGICAL. ! U C-u se svaki tip podatka mo!e koristiti kao logi$ki. #define TRUE 1 #define FALSE 0
13
Polje
! ! ! !
Polje je podatkovna struktura gdje isto ime dijeli vi#e podataka Svi podaci u nekom polju moraju biti istog tipa i iste memorijske klase Elementi ($lanovi) polja se identificiraju indeksom Indeks mo!e biti nenegativni cijeli broj (konstanta, varijabla, cjelobrojni izraz) x[0] x[9] x[n] x[MAX] x[n+1] x[k/m+5] Polje mo!e biti ! jednodimenzionalno (vektor) #define N 100 float x[N];
x[0]
x[1]
x[2]
...
x[n-2]
x[n-1]
14
redak 1
y[0][0]
y[0][1]
y[0][2]
y[0][n-2]
y[0][n-1]
redak 2 . . . redak m
y[1][0]
y[1][1]
y[1][2]
y[1][n-2]
y[1][n-1]
y[m-1][0]
y[m-1][1]
y[m-1][2]
y[m-1][n-2] y[m-1][n-1]
15
! trodimenzionalno i vi"edimenzionalno # define N 100 # define M 50 float z[3][M][N]; z[2][0][0] z[1][0][0] z[0][0][0] z[2][0][n-1]
z[0][m-1][0]
16
Pokaziva% (Pointer)
Memorija ra$unala:
4 GB
17
Varijable i pokaziva%i
! Deklaracijom varijabli rezervira se prostor u memoriji na slobodnim adresama, npr.: short a, b;
82560 82562
! Deklaracijom pokaziva$a rezervira se prostor u memoriji u duljini 4 bytea kako bi se pohranila bilo koja adresa u adresnom prostoru do 4GB: short *p; a b p
82560 82562 82564
18
p
82560
p
82560
a
7
p
82560
! Vrijednost pokaziva$a mo!e se postaviti i rezervacijom slobodne memorije main () { short int *p; p = (short int *) malloc (sizeof (short int)); *p = 7; } ! Valja razlikovati: p pokaziva$ veli$ine 4 bajta na broj tipa short int
*p
Aritmetika s pokaziva%ima
!
Aritmetika s pokaziva$ima podrazumijeva kori#tenje jedinica koje odgovaraju duljini (By) podatkovne strukture na koju pokaziva$ pokazuje. Uve%anje za 1 pokaziva$a na strukturu duga$ku 4 By zna$i da se njegova vrijednost uve%ava za 4. Ako je struktura duga$ka 8 By, uve%anje pokaziva$a za 1 pove%ava vrijednost pokaziva$a za 8 itd. ! Primjer: (long = 4 By, double = 8 By) long dugi; double dupli; long *pdugi; double *pdupli; pdugi = &dugi; pdupli = &dupli; ++pdugi; pdupli = pdupli + 2; pdugi ? 128560 128560 128564 128564 Vrijednosti pdupli ? ? 128564 128564 128580
21
Polja i pokaziva%i
#include <stdio.h> main () { int x[4] = {1,2,3,4}; printf ("%d %d\n", *x, *(x+1)); f (x); } void f (int *x) { ili void f (int x[]) { printf ("%d %d\n", *x, x[0]); ++x; printf ("%d %d %d\n", *x, x[0], *(x-1)); } Ispis na zaslonu: 1 2 1 1 x[0] x[1] x[2] x[3] 2 2 1 1 2 3 4
22
Zapisi (strukture)
!
Typedef deklaracija typedef stari_tip novi_tip; npr. typedef unsigned size_t; typedef int redni_broj; typedef short logical; redni_broj i, j; size_t velicina; logical da_ne;
Definiranje strukture ! Strukture podataka $iji se elementi razlikuju po tipu: struct ime_strukture { tip_elementa_1 ime_elementa_1; tip_elementa_2 ime_elementa_2; ... tip_elementa_n ime_elementa_n; };
23
! Primjer: struct osoba { char jmbg[13+1]; char prezime[40+1]; char ime[40+1]; int visina; float tezina; }; Ovime nije deklariran konkretan zapis, ve% je samo definirana struktura zapisa. Deklaracija konkretnih zapisa: struct ime_strukture zapis1, zapis2, ... , zapisN; npr. struct osoba o1, o2, zaposleni[500];
24
! Mogu%e je definiranje stati$ke podatkovne strukture proizvoljne slo!enosti jer pojedini element mo!e tako"er biti struct: struct student { int maticni_broj; struct osoba osobni_podaci; struct adresa adresa_roditelja; struct adresa adresa_u_Zagrebu; struct osoba otac; struct osoba majka; }; Alternativno, kori#tenjem naredbe typedef: typedef struct { char jmbg[13+1]; char prezime[40+1]; char ime[40+1]; int visina; float tezina; } osoba; osoba o1, o2, zaposleni[500];
25
typedef struct { int maticni_broj; osoba osobni_podaci; adresa adresa_roditelja; adresa adresa_u_Zagrebu; osoba otac; osoba majka; } student;
!
Referenciranje elemenata zapisa zapis.element = vrijednost; vrijednost = zapis.element; npr: student pero; pero.majka.tezina = 92.5;
26
Pokaziva% na strukturu
struct osoba *p; *p - zapis o osobi p - adresa zapisa o osobi ! Referenciranje na element strukture preko pokaziva$a p->prezime ili (*p).prezime
27
Procedure
!
Programi se sastoje od procedura. Prva pozvana procedura je glavni program. Kad glavni program zavr#i, slijedi povratak u operacijski sustav. Ina$e, povratak iz procedure je uvijek na onu proceduru koja ju je pozvala. Uobi$ajena je podjela na funkcije (function) koje imaju od nula do vi#e ulaznih argumenata i vra%aju jedan rezultat, te na op%enite potprograme (subroutine) koje rezultat predaju argumentima. U jeziku C sve procedure su funkcije koje daju rezultat nekog od tipova podataka, ali mogu mijenjati i vrijednost argumenata. Posebni slu$ajevi: ! Glavni program: ! Potprogram koji u imenu ne vra%a vrijednost:
main void
28
globalne varijable argumenti navedeni u zagradi, prenose se vrijednosti (call by value) za prijenos vrijednosti u pozivaju%u funkciju koriste se kod poziva funkcije kao argumenti adrese, a u definiciji funkcije argumenti su pokaziva$i (call by reference). Ako funkcija mora predati rezultat preko argumenata, nu!no se koristi call by reference. Ulazno-izlazne operacije: Za slijedno $itanje/pisanje preko standardnih ulazno-izlaznih jedinica koristit %e se odgovaraju%e C funkcije ili naredbe pseudokoda: ! ulaz (lista adresa argumenata) ! izlaz (lista argumenata) Kod $itanja je dakle nu!an call by reference, dok kod ispisa mo!e poslu!iti i call by value.
! !
29
Uspore"ivanje: ==, >, <, >=, <=, != Logi$ki operatori: &&, ||, !
30
Normalan programski slijed naredba_1 naredba_2 naredba_3 ... Bezuvjetni skok Pseudokod: idi na oznaka_naredbe Grananje ! S: Oznaka za jednu ili vi#e naredbi, odnosno programski odsje$ak ! Uvjetno obavljanje naredbi (jednostrana selekcija) Pseudokod: C: ako je (logi!ki_izraz) onda if (logi!ki_izraz){ |S S; } C: goto oznaka_naredbe;
31
! Grananje (dvostrana selekcija) Pseudokod: ako je (logi!ki_izraz) onda | S_1 ina$e | S_2 ! Vi#estruko grananje (vi#estrana selekcija) Pseudokod: ako je (logi!ki_izraz_1) onda | S_1 ina$e ako je (logi!ki_izraz_2) onda | S_2 ina$e ako je (logi!ki_izraz_3) onda | S_3 ... ina$e | S_0
C: if (logi!ki_izraz) { S_1; } else { S_2; } C: if (logi!ki_izraz_1) { S_1; } else if (logi!ki_izraz_2) { S_2; } else if (logi!ki_izraz_3) { S_3; ... } else { S_0; }
32
Skretnica Pseudokod: skretnica (vrijednost) slu$aj C1 | S_1 slu$aj C2 | S_2 ... slu$aj Cn | S_n ina$e | S_n+1
C: switch(cjelobrojna vrijednost){ case C1: S_1; break; case C2: S_2; break; ... case Cn: S_n; break; default: S_nplus1; }
33
! Ostvariti skretnicu naredbom if - else. if (vr == C1) { S1; } else if (vr == C2) { S2; } ... } else if (vr == Cn) { Sn; } else { S_nplus1; }
34
! Ako se iz skretnice izbace naredbe break, obavljaju se slijedno sve naredbe iza one gdje je prvi put zadovoljeno: vr == Ci ! Skretnica bez break kori#tenjem naredbe if. nadjen = 0; if (vr == C1) { S1; nadjen = 1; } if (vr == C2 || nadjen) { S2; nadjen = 1; } ... if (vr == Cn || nadjen) { Sn; } S_nplus1;
35
Programska petlja ! Petlja s ispitivanjem uvjeta ponavljanja na po$etku Pseudokod: dok je (logi!ki_izraz) $initi |S } ! Petlja s ispitivanjem uvjeta ponavljanja na kraju
C: while (logi!ki_izraz) { S;
dok je (logi!ki_izraz)
! Petlja s poznatim brojem ponavljanja Pseudokod: za i := poc do kraj (korak k) $initi C: for(i=poc;i<=kraj;i=i+k){
|S S; } Primjer: Realizacija istog odsje$ka petljom while: i = poc; while (i <= kraj) { S; // niz naredbi koje ne mijenjaju vrijednost za i i += k; } ili op%enitije: i = poc; while ((i - kraj) * k <= 0) { S; // niz naredbi koje ne mijenjaju vrijednost za i i += k; }
37
! Skok iz petlje Pseudokod: iza"i iz petlje sko$i na kraj petlje ! Beskona$na petlja Pseudokod: ponavljaj |S zauvijek
C: break; continue;
C: while(1) { S; }
U algoritmima ovakva petlja nije dopu#tena jer je u suprotnosti sa zahtjevom da postupak bude kona$an.
38
! U tijelu petlje mora postojati barem jednom ispitivanje uvjeta za izlazak iz petlje: while(1) { S1; if (logi!ki_izraz) break; S2; ... } while(1) { ili
S1; if (logi!ki_izraz) goto oznaka_naredbe; S2; ... } ! Naredbu goto treba izbjegavati ako je ikako mogu%e kako bi svaka programska cjelina (npr. petlja) imala samo jedan ulaz i jedan mogu%i izlaz, $ime se smanjuje mogu%nost pogre#ke i olak#ava testiranje programa
39
Osnovni naputci ! specifikacija ulaznih i izlaznih varijabli ( u C je to obavezno) ! definicija lokalnih varijabli ! tok programa prema dolje, osim petlji i neizbje!ne goto naredbe ! poravnati naredbe iste razine za pove%anje $itkosti ! dokumentacija kratka i smislena ! koristiti potprograme gdje je to mogu%e Izbor vrste petlje ! Primjer: &itati $lanove nekog skupa nenegativnih brojeva sve dok njihova suma ne prema#i neki predvi"eni iznos n. y = 0; y = 0; do { while (y <= n){ ulaz(&x); ulaz(&x); y += x; y += x;} } while (y <= n); Programi nisu funkcionalno identi$ni jer u prvom slu$aju se uvijek obavlja barem jedno $itanje, pa program ispravno radi samo za n!0. U drugom slu$aju, ako je n<0, smatra se da je bez $itanja ijednog podatka postupak zavr#en. 40
! Primjer: Pro$itati n vrijednosti i obraditi ih procedurom PROCES. Kori#tenjem petlje while: i = 0; while (i < n) { ulaz(&x); PROCES(x); i++; } S obzirom da je unaprijed poznat broj ponavljanja, primjerenije je koristiti petlju s poznatim brojem ponavljanja: for (i = 0; i < n; i++) { ulaz(&x); PROCES(x); } Ne radi se samo o manjem broju naredbi, nego se smanjuje i mogu%nost pogre#ke u pisanju programa.
41
! Primjer: Treba pro$itati i obraditi skup podataka sve dok ne nai"e oznaka kraja podataka (EOF). Realizacija petljom while: ulaz(&x); while (x != EOF) { PROCES(x); ulaz(&x); } Treba dakle pro$itati prvi podatak, obra"uje ga se samo ako postoji, a nakon obrade $ita se sljede%i podatak koji se obradi u idu%em prolasku kroz petlju. Bolje je rje#enje skokom iz petlje: while (1) { ulaz(&x); if (x == EOF) break; PROCES(x); } Ne naru#ava se !eljeni princip da iz jednog programskog bloka postoji samo jedan izlaz.
42
! Ako ima dva kriterija za zavr#etak petlje: kraj podataka ili da rezultat procedure PROCES, pohranjen u varijabli y bude nula: do { ulaz(&x); if (x == EOF) break; PROCES(x, &y); } while (y != 0); if (x != EOF) { ... } else { ... } Na izlasku iz programskog segmenta ne zna se zbog $ega je petlja zavr#ila pa se to mora ispitivati.
!
Kori#tenje naredbe case ! Uvijek se mo!e uporabiti elementarnija naredba if-else. Naredba case je u prednosti kad ima mnogo ravnopravnih grananja.
43
Kraj
!
Zasad...
44
45