12/24/2018 1 Algoritmi i strukture podataka Dr. Goran Aritonović [email protected]kabinet 211 Pojam algoritama i struktura podataka • Niklaus Wirth : Algorithms + Data Structures = Programs • Tvorac programskog jezika Pascal • 1975 napisao kljigu algoritmi + struktura podataka = programi • Struktura podataka – opis načina organizacije podataka • Algoritam – opis načina obrade podataka 2
207
Embed
Algoritmi i strukture podataka Algoritmi i strukture podataka Dr. Goran Aritonović [email protected] kabinet 211 Pojam algoritama i struktura podataka •Niklaus Wirth :
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
• Rezultat logičkih operacija je bool promenljiva true ili false
• Operacija negacije je unarna i daje true ako je operand false
• Operacija konjukcije je binarna i daje true ako oba operanda imaju vrednost true
• Operacija disjunkcije je binarna i daje true ako je bar jedan od operanada ima vrednost true
• Imaju niži prioritet od operacija poređenja
• Najveći prioritet ima operacija negacije, zatim konjukcija i na kraju disjunkcija
43
Primer upotrebe logičkih operacija
44
static void Main(string[] args){
Console.WriteLine("unesi prvi realan broj");decimal d1 = decimal.Parse(Console.ReadLine());
Console.WriteLine("unesi drugi realan broj");decimal d2 = decimal.Parse(Console.ReadLine());
bool b1 = d1 > 5;bool b2 = d2 > 5;
bool b3 = b1 && b2;bool b4 = b1 || b2;
Console.WriteLine($"Oba uneta broja su veca od 5 : {b3}");Console.WriteLine($"Bar jedan od unetih brojeva je veci od 5 : {b4}");
Console.ReadLine();}
12/24/2018
23
Pitanje 1Promenljiva x ima vrednost 5. Koju će vrednost imati x nakon izvršavanja sledeće linije koda:x +=2;a. 3b. 7c. 10
Odgovor: b
45
Pitanje 2
Operator dodeljivanja se u C# programskom jeziku označava sa:a. =b. ==c. +=
Odgovor: a
46
12/24/2018
24
Pitanje 3
Rezultat izvršenja operacije poređenja dva operanda je promenljiva tipa:a. boolb. intc. float
Odgovor: a
47
Pitanje 4
Sufiksno inkrementiranje ima veći prioritet od operatora dodeljivanja:a. dab. ne
Odgovor: b
48
12/24/2018
25
Pitanje 5Šta se dobija kao rezultat izvršavanja sledećeg koda:static void Main(string[] args){
int x = 5;int y = 3;int z = x / y;Console.WriteLine(z);
}
a. 1,666667b. 1c. 2
Odgovor: b
49
Razgranate linijskealgoritamske šeme
12/24/2018
26
Razgranate linijske algoritamske šeme
• Svaki algoritamski korak se izvršava najviše jednom (znači jednom ili nijednom) i obavezno sadrži bar jedan uslovni algoritamski koraka
• Ako je uslov ispunjen, izlaz iz algoritamskog koraka biće označen sa 'DA', a ako uslov nije ispunjen izlaz će biti označen sa 'NE', ili će biti bez oznake
51
Naredba if
52
Naredba if sa blokom naredbi.
if (logIzraz){
naredba1;naredba2;
}
if (logizraz)naredba1;
logIzraz tačan
DA
naredba1naredba2
NE
12/24/2018
27
Primer upotrebe naredbe if
53
static void Main(string[] args)
{
Random rnd = new Random();
// -7 do 7
int a = rnd.Next(-7,8);
if (a > 0)
{
Console.WriteLine("Generisan je pozitivan broj");
}
Console.WriteLine($"a={a}");
Console.ReadLine();
}
a>0
Početak
a
Broj je pozitivan
DA
a
NE
Kraj
Naredba if-else
54
if (logizraz){
naredba1;naredba2;
}else{
naredba3;naredba4;
}
logIzraz tačan
DA
naredba1naredba2
NE
naredba3naredba4
12/24/2018
28
Primer upotrebe if-else naredbe
55
static void Main(string[] args)
{
Random rnd = new Random();
// -7 do 7
int a = rnd.Next(-7, 8);
if (a > 0)
{
Console.WriteLine("Generisan je pozitivan broj");
}
else
{
Console.WriteLine("Generisan je broj koji nije pozitivan");
}
Console.WriteLine($"a={a}");
Console.ReadLine();
}
if-else if
56
if (logizraz1){
naredba1;naredba2;
}else if (logizraz2){
naredba3;naredba4;
}else{
naredba5;naredba6;
}
logIzraz1 tačan
DA
naredba1naredba2
NE
logizraz2 tačan
DA
naredba 3naredba 4
NE
naredba 5naredba 6
12/24/2018
29
Primer upotrebe if-else if naredbe
57
static void Main(string[] args)
{
Random rnd = new Random();
// -7 do 7
int a = rnd.Next(-7, 8);
if (a > 0)
{
Console.WriteLine("Generisan je pozitivan broj");
}
else if (a == 0)
{
Console.WriteLine("Generisan je broj 0");
}
else
{
Console.WriteLine("Generisan je negativan broj");
}
Console.WriteLine($"a={a}");
Console.ReadLine();
}
Primer
58
static void Main(string[] args)
{
// Y = X1 + X2, ako je X1< X2
// Y = X1 - X2, ako je X1 >=X2
Console.WriteLine("Ucitaj X1");
double x1 = double.Parse(Console.ReadLine());
Console.WriteLine("Ucitaj X2");
double x2 = double.Parse(Console.ReadLine());
double y = 0;
if (x1 < x2)
{
y = x1 + x2;}
else
{
y = x1 - x2;
}
Console.WriteLine($"x1 = {x1}, x2 = {x2}, y = {y}");
Console.ReadLine();
}
Početak
X1, X2
X1 < X2
NE
Y = X1 – X2
DA Y = X1 + X2
Y
Kraj
Sastaviti algoritam za izračunavanje vrednosti Y po formuli:
Y= 𝑋1 + 𝑋2 , 𝑋1 < 𝑋2𝑋1 − 𝑋2, 𝑋1 ≥ 𝑋2
12/24/2018
30
Operator ?:
static void Main(string[] args)
{
Random rnd = new Random();
int a = rnd.Next(-3, 4);
int b = a >= 0 ? a : -a;
Console.WriteLine($"a={a}, |a| = {b}");
Console.WriteLine("Pritisni ENTER za izlazak");
Console.ReadLine();
}
59
Pitanje 1Šta je rezultat izvršavanja sledećeg koda:static void Main(string[] args){
int x = 2;if (x>1){
x = 1;}else{
x = 0;}Console.WriteLine(x);
}
a. 0b. 1c. 2
Odgovor: b60
12/24/2018
31
Pitanje 2
Šta je rezultat izvršavanja sledećeg koda:static void Main(string[] args){
float x = 3.14f;if (x>4){
x = 4.1f;}else if(x>3){
x = 3.5f;}else{
x = 0;}Console.WriteLine(x);
}
a. 4.1b. 3.5c. 0 Odgovor: b
61
Ciklične algoritamske šeme
12/24/2018
32
Definicija
• Ciklična algoritamska šema je ona šema kod koje se jedan ili više algoritamskih koraka može izvršavati više od jedanput u toku jednog izvršavanja algoritma
• Algoritamski koraci koji se ponavljaju čine ciklus
63
While petlja
64
while (logIzraz){
naredba_1;....naredba_n;
}
logIzraz
tačno
naredba_1naredba_2
...naredba_n
naredba ispod while petlje
12/24/2018
33
Brojanje unapred
65
static void Main(string[] args)
{
int brojac = 0;
while (brojac < 10)
{
Console.WriteLine(brojac);
brojac++;
}
Console.WriteLine(".........................");
Console.ReadLine();
}
Brojanje unazad
66
static void Main(string[] args)
{
int brojac = 9;
while (brojac >= 0)
{
Console.WriteLine(brojac);
brojac--;
}
Console.WriteLine(".........................");
Console.ReadLine();
}
12/24/2018
34
Primer beskonačne while petlje
67
static void Main(string[] args){
int brojac = 0;while (true){
Console.WriteLine(brojac);brojac++;
}}
Naredba break
68
static void Main(string[] args){
int brojac = 0;while (true){
Console.WriteLine(brojac);brojac++;
if (brojac > 9){
break;}
}
Console.ReadLine();}
12/24/2018
35
Suma brojeva od 1 do n
69
static void Main(string[] args){
// suma = 1 + 2 + 3 + .... + n
Console.WriteLine("Unesi pozitivan ceo broj");int n = int.Parse(Console.ReadLine());
Napisati program kojim se sa tastature učitavaju ceo broj a kao i stepen n. Program treba da izračuna
i prikaže n-ti stepen celog broja a primenom petlje for. Ne koristiti klasu Math.
static void Main(string[] args)
{
Console.WriteLine("Unesite ceo broj a:");
int a = int.Parse(Console.ReadLine());
Console.WriteLine("Unesite stepen n: ");
int n = int.Parse(Console.ReadLine());
int an = 1;
for (int i = 0; i < n; i++)
{
an *= a;
}
Console.WriteLine($"Broj {a} na stepen {n} je: {an}");
Console.ReadLine();
}
12/24/2018
38
Opšti oblik petlje do-while
75
do{
naredba_1;naredba_2;...naredba_n;
}while (logickiIzraz);
Telo petlje
Provera uslova
false
naredba iza petlje
true
Primer upotrebe do-while petlje
76
static void Main(string[] args)
{
string odgovor = "n";
do
{
Console.WriteLine("Unesite prvi broj");
int a = int.Parse(Console.ReadLine());
Console.WriteLine("Unesite drugi broj");
int b = int.Parse(Console.ReadLine());
Console.WriteLine($"{a} + {b} = {a + b}");
Console.WriteLine("Da li zelite novo racunanje d - Da, bilo koji drugi taster - Ne");
odgovor = Console.ReadLine();
} while (odgovor == "d" || odgovor == "D");
Console.WriteLine("ENTER za izlazak");
Console.ReadLine();
}
12/24/2018
39
Suma brojeva od 1 do n
77
static void Main(string[] args)
{
// suma = 1 + 2 + 3 + .... + n
int n;
do
{
Console.WriteLine("Unesi pozitivan ceo broj: ");
n = int.Parse(Console.ReadLine());
}
while (n <= 0);
int suma = 0;
for (int i = 1; i <= n; ++i)
{
suma += i; // suma = suma+i;
}
Console.WriteLine($"Zbir brojeva je: {suma}");
Console.ReadLine();
}
Faktorijel broja
78
static void Main(string[] args)
{
// faktorijel = 1 * 2 * 3 * .... * n
int n;
Console.WriteLine("Unesi pozitivan ceo broj: ");
n = int.Parse(Console.ReadLine());
if (n < 0)
{
Console.WriteLine("Ne postoji faktorijel negativnog broja");
}
else
{
long faktorijel = 1;
for (int i = 1; i <= n; ++i)
{
faktorijel *= i; // faktorijel = faktorijel*i;
}
Console.WriteLine($"faktorijel od {n} = {faktorijel}");
}
Console.ReadLine();
}
12/24/2018
40
Pitanje 1
Petlja while je petlja:a. Sa izlaskom na vrhub. Sa izlaskom na dnuc. Beskonačna petlja
Odgovor: a
79
Pitanje 2
Petlja do-while je petlja sa :a. Sa izlaskom na vrhub. Sa izlaskom na dnuc. Beskonačna petlja
Odgovor: b
80
12/24/2018
41
Pitanje 3Koliko se puta ispisuje tekst Zdravo primenom sledeće for petlje:
for (int i = 0; i < 5; i++){
Console.WriteLine("Zdravo");}
a.4b.5c.6
Odgovor: b
81
Jednodimenzionalni nizovi
12/24/2018
42
Nizovi
• Skup podataka istog tipa
• Nizovi su indeksirani
• Prvi element niza ima indeks nula
• Mogu biti jednodimenzionalni i višedimenzionalni
• Niz u C# je objekat i mora se instancirati
83
x[0] x[1] x[2] x[3] x[4] x[5] jednodimenzionalan niz
Deklarisanje i instanciranje niza-1static void Main(string[] args){
//deklaracija niza//int[] x;
//instanciranje niza:// x = new int[5];
// deklaracija i instanciranjeint[] x = new int[5];
//automatska inicijalizacija
for (int i = 0; i < x.Length; i++){
Console.WriteLine(x[i]);}Console.ReadLine();
}
84
12/24/2018
43
Inicijalizacija niza
//Kada se niz inicijalizuje ne mora ekplicitno da se instanciraint[] x = {1,3,5,7,9 };
85
// deklaracija instanciranje i inicijalizacija nizaint[] x = new int[5] {1,3,5,7,9 };
Primer upotrebe jednodimenzionalnog niza
86
static void Main(string[] args){
int[] x = { 1, 2, 5, 6, 7 };
x[0] = 10; // promena vrednosti prvog clana niza
int brojClanova = x.Length;
Console.WriteLine($"Niz ima {brojClanova} clanova");Console.WriteLine($"Prvi clan niza je {x[0]}");Console.WriteLine($"Treci clan niza je {x[2]}");Console.ReadLine();
}
12/24/2018
44
Naredba foreachstatic void Main(string[] args){
int[] x = { 1, 2, 5, 6, 7 };
for (int i = 0; i < x.Length; i++){
Console.WriteLine(x[i]);}Console.ReadLine();
}
static void Main(string[] args){
int[] x = { 1, 2, 5, 6, 7 };
foreach (int i in x){
Console.WriteLine(i);}Console.ReadLine();
} 87
Deklarisanje i instanciranje niza-2
88
static void Main(string[] args){
Random rnd = new Random();//Istovremeno deklarisanje i instanciranje nizadouble[] x = new double[20];
// inicijalizacija nizafor (int i = 0; i < 20; i++){
x[i] = 10 * rnd.NextDouble();}//stampanje nizaforeach (double d in x){
Console.WriteLine(d);}Console.ReadLine();
}
12/24/2018
45
Niz kao parametar funkcije, funkcija za štampanje članova niza na konzoli
Console.WriteLine($"Srednja vrednost niza je: {xSr}");
Console.ReadLine();
}
93
Maksimalna vrednost niza od n elemenata
94
static int MaksimalniClan(int[] x)
{
int xmax = x[0];
for (int i = 1; i < x.Length; i++)
{
if (x[i] > xmax)
{
xmax = x[i];
}
}
return xmax;
}
12/24/2018
48
Pronalaženje maksimalnog člana niza
95
int max = MaksimalniClan(x);
Console.WriteLine($"Najveci clan niza je: {max}");
Ciklično pomeranje niza za jedno mesto u levo
96
static void Levo1(int[] x)
{
int n = x.Length;
int pom = x[0];
for (int i = 0; i < n-1; i++)
{
x[i] = x[i+1];
}
x[n - 1] = pom;
}
x[0] x[1] x[2] x[3] x[4] x[5]
x[1] x[2] x[3] x[4] x[5] x[0]
12/24/2018
49
Pomoćna funkcija za iscrtavanje linije
97
static void Linija(int n)
{
//iscrtava liniju duzine n na konzoli
Console.WriteLine("".PadRight(n, '_'));
}
Poziv funkcije za ciklično pomeranje u levo
98
static void Main(string[] args){
Console.WriteLine("Unesi broj clanova niza:");int n = int.Parse(Console.ReadLine());int[] x = new int[n];CitajNiz(x);Linija(50);Console.WriteLine("Uneli ste sledeci niz:");PisiNiz(x);Linija(50);Levo1(x);Console.WriteLine("Rotirani niz je:");PisiNiz(x);Console.ReadLine();
}
12/24/2018
50
Ciklično rotiranje u levo
99
Ciklično pomeranje za m mesta u levo
100
static void LevoM(int[] x, int m)
{
for (int i = 0; i < m; i++)
{
Levo1(x);
}
}
12/24/2018
51
Primer - bacanje kocke
static void Main(string[] args){
int[] x = new int[20];Random rnd = new Random();
int br6 = 0;
for (int i = 0; i < 20; i++){
x[i] = rnd.Next(1, 7);
if (x[i] == 6){
br6++;}
}
foreach (int clan in x){
Console.WriteLine(clan);}
Console.WriteLine($"6 je baceno {br6} puta");Console.WriteLine("ENTER");Console.ReadLine();
} 101
Kocka se baca 20 puta. Izbrojati koliko puta je generisan broj 6.Odštampati sve generisane brojeve.
Pretraga niza
102
static int Pronadji(int[] x, int a)
{
for (int i = 0; i < x.Length; i++)
{
if (x[i] == a)
{
return i;
}
}
return -1;
}
Proveri da li u celobrojnom nizu x postoji ceo broj a. Ako postoji vrati indeks prvog pojavljivanja broja a.U protivnom vrati -1.
12/24/2018
52
Poziv funkcije za pretragu
103
Console.WriteLine("Unesi celobrojnu vrednost koju trazis");
int a = int.Parse(Console.ReadLine());
int i = Pronadji(x, a);
if (i > -1)
{
Console.WriteLine($"Pronadjen clan {a} na poziciji: {i}");
}
else
{
Console.WriteLine($"U nizu se ne nalazi clan {a}");
}
Rezultat pretrage
104
12/24/2018
53
Primer: loto kombinacija
105
static int[] GenerisiKombinaciju(Random rnd)
{
int[] x = new int[7];
int i = 0;
int a = 0;
while (i < 7)
{
a = rnd.Next(1, 40);
if (Pronadji(x,a) == -1)
{
x[i] = a;
i++;
}
}
return x;
}
Generisanje loto kombinacija
106
static void Main(string[] args)
{
// Generisi 3 loto kombinacije
Random rnd = new Random();
for (int i = 0; i < 3; i++)
{
int[] x = GenerisiKombinaciju(rnd);
PisiNiz(x);
}
Console.ReadLine();
}
12/24/2018
54
Klasa Array
• Nalazi su u biblioteci System
• Obezbeđuje metode za pretragu, sortiranje i manipulaciju nizovima
• Svojstvo Length daje ukupan broj elemenata u svim dimenzijama niza
• Svojstvo Rank daje broj dimenzija niza
• Statička metoda Copy(Array, Array, Int32), kopira elemente jednog niza u drugi niz počev od prvog člana, ukupno kopira specificirani broj elemenata
• Statička metoda IndexOf(Array, Object) pronalazi indeks specificiranog objekta u jednodimenzionalnom nizu
• Statička metoda Sort(Array) služi za sortiranje niza
107
Array.IndexOf() metoda
static void Main(string[] args){
int[] x = {1,3,6,8,9 };
int ind1 = Array.IndexOf(x, 6);int ind2 = Array.IndexOf(x, 2);
//iscrtava liniju duzine n na konzoliConsole.WriteLine("".PadRight(n, '_'));
}
12/24/2018
62
Učitavanje i štampanje matrice
123
static void Main(string[] args){
Console.WriteLine("Unesi broj redova matrice:");int n = int.Parse(Console.ReadLine());
Console.WriteLine("Unesi broj kolona matrice:");int m = int.Parse(Console.ReadLine());
int[,] x = new int[n, m];
Citaj2DNz(x);
Linija(50);
Pisi2DNiz(x);
Console.ReadLine();}
Metoda za štampanje jednodimenzionalnog niza
124
static void PisiNiz(int[] x){
foreach (int i in x){
Console.Write(i + "\t");}Console.WriteLine();
}
12/24/2018
63
Kreiranje 1D niza od reda 2D niza
125
static void Main(string[] args){
// matrica od 4 reda i 5 koloneint[,] x = new int[4, 5];
Random rnd = new Random();for (int i = 0; i < 4; i++){
for (int j = 0; j < 5; j++){
x[i, j] = rnd.Next(11);}
}Pisi2DNiz(x);Linija(50);
Console.WriteLine("Drugi red matrice je:");
int[] x1 = new int[5];for (int i = 0; i < 5; i++){
// prepisujemo drugi red u nizx1[i] = x[1, i];
}
PisiNiz(x1);Console.ReadLine();
}
Primer 1
126
Napisati program za prikazivanje na konzoli jedinične kvadratne matricije dimenzije nxn
static void Main(string[] args){
Console.WriteLine("Ucitaj dimenziju jedinicne kvadratne matrice");int n = int.Parse(Console.ReadLine());
int[,] x = new int[n, n];
for (int i = 0; i < n; i++){
for (int j = 0; j < n; j++){
if (i == j){
x[i, j] = 1;}else{
x[i, j] = 0;}
}}Linija(50);Pisi2DNiz(x);Console.ReadLine();
}
12/24/2018
64
Primer 2
127
Odreditu sumu elemenata na glavnoj dijagonali matrice dimenzija n x m .
static void Main(string[] args){
Console.WriteLine("Unesi broj redova matrice:");int n = int.Parse(Console.ReadLine());
Console.WriteLine("Unesi broj kolona matrice:");int m = int.Parse(Console.ReadLine());
int[,] x = new int[n, m];
Citaj2DNz(x);
Linija(50);Pisi2DNiz(x);Linija(50);
int suma = 0;for (int i = 0; i < n; i++){
for (int j = 0; j < m; j++){
if (i == j){
suma += x[i,j];}
}}
Console.WriteLine($"Suma elemenata na glavnoj dijagonali je: {suma}");Console.ReadLine();
}}
Rekurzivni algoritmi
12/24/2018
65
Iterativni i rekurzivni algoritmi
• Iterativni algoritam: ponavljanje tela petlje više puta
• Iteracija je postupak koji se primenjuje nad skupom naredbi
• Rekurzivni algoritam: ponavljanje samog algoritma više puta
• Rekurzija je proces koji se primenjuje nad funkcijom
• Rekurzivna funkcija je funkcija koja poziva sama sebe
• Iterativni algoritmi su brži od rekurzivnih algoritama
• Rekurzija smanjuje količinu koda i nekada su rekurzivni algoritmi intuitivniji od iterativnih algoritama
129
Memorijski zahtevi
• Lokalne promenljive svake funkcije (iterativne i rekurzivne) se smeštaju na stack memoriji
• Kada se pozove funkcija lokalne promenljive pozivajuće funkcije se smeštaju na stack
• Kada se poziv završi lokalne promenljive obnavljaju vrednosti sa steka
• Rekurzivnim rešenjima se formira niz primeraka funkcije sa svojim lokalnim promenljivama što zahteva više memorijskog prostora i vremena potrebnog za njihovo izvršavanje
130
12/24/2018
66
Iterativni algoritam za pronalažen n-tog stepena broja a
131
static decimal Stepen(decimal a, int n){
decimal rezultat = 1;for (int i = 0; i < n; i++){
rezultat *= a;}return rezultat;
}
𝑎𝑛= 𝑎 ∙ 𝑎 ∙ 𝑎 … .∙ 𝑎 n - množenja
Rekurzivni algoritam za pronalažen n-tog stepena broja a
132
𝑎𝑛 = 𝑎𝑛−1 ∙ 𝑎
𝑓 𝑛 = 𝑎𝑛
𝑓 𝑛 = 𝑓 𝑛 − 1 ∙ 𝑎
𝑎0=1 static decimal StepenR(decimal a, int n){
if (n == 0){
return 1;}else{
return StepenR(a, n - 1) * a;}
}
12/24/2018
67
Izvršavanje rekurzivnog algoritma
133
StepenR(4,3)
return 4*StepenR(4,2)
StepenR(4,2)
return 4 * StepenR(4,1)
StepenR(4,1)
return 4 * StepenR(4,0)
StepenR(4,0)
return 1
Rekurzivno računanje sume
134
Napisati rekurzivnu funkciju za izračunavanje sume prvih n prirodnih brojeva:
S(n-1) = 1 + 2 + ....+ (n-1)
S(n) = 1 + 2 + ..... + (n-1) + n = n + S(n-1)
S(2) = 2 + S(1)S(1) = 1 + S(0)S(0) = 0
static int Suma (int n){
if (n == 0){
return 0;}else{
return n + Suma(n - 1);}
}
12/24/2018
68
Poziv rekurzivne funkcije
135
Rekurzivno računanje kamate
136
Banka na početku svake godine ulagačima obračunava kamatu od p procenata na novčanu sumu koja je odležalaprethodne godine. Napisati program kojim se izračunava novčani iznos kojim raspolaže ulagač posle n godina,ako je početno ulaganje s.
a(0) = s početno ulaganjea(1) = a(0 )+ a(0 )* p/100 iznos posle prve godinea(2) = a(1) + a(1) * p/100 iznos posle druge godine
a(i) = a(i-1) + a(i-1) * p/100
a(i) = (1 + p/100) * a(i-1)
static decimal Iznos(int n, decimal s, decimal p){
if (n>0){
return (1+p/100)* Iznos(n - 1, s, p);}else{
return s;}
}
12/24/2018
69
Poziv rekurzivne funkcije za računanje kamate
137
Faktorijel broja
138
n! = 1 ako je n =1n! = (n-1)! * n, ako jen >1
static long Faktorijel(int n){
if (n > 1){
return n * Faktorijel(n - 1);}else{
return n;}
}
12/24/2018
70
Računanje faktorijela
139
static void Main(string[] args){
Console.WriteLine("n\t\tn!");Linija(50);for (int i = 1; i <= 10; i++){
Console.WriteLine($"{i}\t\t{Faktorijel(i)}");}
Console.ReadLine();}
Fibonačijev niz
140
Napisati rekurzivnu funkciju za izračunavanje n-tog člana Fibonačijevog niza:
Console.WriteLine("Unesi n:");int n = int.Parse(Console.ReadLine());int clan = Fibonaci(n);
Console.WriteLine($"F({n})={clan}");
Console.ReadLine();}
NZD dva broja
142
Najveći zajednički delilac NZD dva cela broja različita od nule je najveći ceo broj koji deli oba broja bez ostatka
static int Nzd1(int m, int n){
// manji od brojeva smestimo u dint d = m < n ? m : n;
while (n % d != 0 || m % d != 0){
d--;}return d;
}
12/24/2018
72
Računanje NZD dva broja
143
static void Main(string[] args){
Console.WriteLine("Unesi prvi ceo broj");int n = int.Parse(Console.ReadLine());
Console.WriteLine("Unesi drugi ceo broj");int m = int.Parse(Console.ReadLine());int nzd = Nzd1(n, m);Console.WriteLine($"NZD({n},{m}) ={nzd}");Console.ReadLine();
}
Euklidov algoritam za nalaženje NZD dva broja
144
NZD(m,n) = n, ako je m=0NZD(m,n) = NZD(n%m,m), ako je m<>0
Ako prvi broj nije manji od drugog, posle prvog poziva funkcije razmenjuju mesta
12/24/2018
73
Poziv Euklidovog algoritma
145
static void Main(string[] args){
Console.WriteLine("Unesi prvi ceo broj");int m = int.Parse(Console.ReadLine());
Console.WriteLine("Unesi drugi ceo broj");int n = int.Parse(Console.ReadLine());
int nzd = Euklid(m, n);Console.WriteLine($"NZD({m},{n}) ={nzd}");Console.ReadLine();
}
Igra Hanojska kula
146
Na stolu se nalaze 3 stuba. Na stubu 1 se nalazi n diskova čiji su poluprečnici opadajući kako se ideka vrhu. Napisati algoritam kojim se diskovi sa stuba 1 premeštaju na stub 3 uz korišćenje pomoćnog stuba 2,tako da se u jednom koraku premešta jedan disk. Nije dozvoljeno premeštanje većeg diska preko manjeg.
12/24/2018
74
Cilj igre
147
Hanojske kule – 3 diska
2 31
2
1
3
148
12/24/2018
75
Hanojske kule – 3 diska
2 31
Premeštanje 1: Premešten disk sa stuba 1 na stub 3
123
149
Hanojske kule – 3 diska
2 31
Premeštanje 2: Premešten disk sa stuba 1 na stub 2
2 13
150
12/24/2018
76
Hanojske kule – 3 diska
3
2 31
Premeštanje 3: Premešten disk sa stuba 3 na stub 2
2
1
3
151
Hanojske kule – 3 diska
Premeštanje 4: Premešten disk sa stuba 1 na stub 3
2 31
2
1
3
152
12/24/2018
77
Hanojske kule – 3 diska
Premeštanje 5: Premešten disk sa stuba 2 na stub 1
2 31
21 3
153
Hanojske kule – 3 diska
Premeštanje 6: Premešten disk sa stuba 2 na stub 3
2 31
21 3
154
12/24/2018
78
Hanojske kule – 3 diska
Premeštanje 7: Premešten disk sa stuba 1 na stub 3
2 31
2
1
3
155
Ukupan broj premeštanja je: 23-1
𝑛 𝑑𝑖𝑠𝑘𝑜𝑣𝑎: 𝑏𝑟𝑜𝑗 𝑝𝑟𝑒𝑚𝑒š𝑡𝑎𝑛𝑗𝑎 𝑗𝑒 2𝑛-1
Algoritam
156
• Prebaci(n,sa,na,pom) - prebaci n diskova sa stuba sa na stub na korišćenjem pomoćnog diska pom• Prebaci(n-1,sa,pom,na)• prebaci disk sa stuba sa na stub na• Prebaci(n-1,pom,na,sa)
• Prebaci(3,1,3,2) - prebaci 3 diska sa stuba 1 na stub 3 korišćenjem pomoćnog diska 2• Prebaci(2,1,2,3) - prebaci 2 diska sa stuba 1 na stub 2, pomoćni disk je 3• Prebaci disk sa stuba 1 na stub 3• Prebaci(2,2,3,1) - prebaci 2 diska sa stuba 2 na stub 3 korišćenjem pomoćnog diska 1
12/24/2018
79
Realizacija algoritma
157
static void Prebaci(int n, int sa, int na, int pom){
if (n>0){
Prebaci(n - 1, sa, pom, na);Console.WriteLine($"Premešten disk sa stuba {sa} na stub {na} ");Prebaci(n - 1, pom, na, sa);
}}
Testiranje algoritma
158
static void Main(string[] args){
Console.WriteLine("Unesi broj diskova");int n = int.Parse(Console.ReadLine());Prebaci(n, 1, 3, 2);Console.ReadLine();
}
12/24/2018
80
Pitanje 1
159
Dvodimenzionalni niz koji podatke čuva u 3 vrste i 5 kolona instancira se na sledeći način:
a. int[,] x = new int[3, 5];b. int[x] = new int(3,5);c. int x[] = new int[3,5];
Odgovor: a
Pitanje 2
160
Šta se dobija izvršavanjem sledećeg koda:static void Main(string[] args){
int[,] x = {{1,2,3,4},{2,3,4,5},{3,4,5,6}
};
Console.WriteLine(x[0, 3]);Console.ReadLine();
}
a. 2b. 3c. 4
Odgovor: c
12/24/2018
81
Pitanje 3
161
Rekurzivna funkcija je funkcija kojaa. Poziva neku drugu funkcijub. Poziva samu sebec. Poziva isključivo iz Main() funkcije
Odgovor: b
Pitanje 4
162
Data je sledeća rekurzivna funkcija:
static int Fun1(int n){
if (n == 4){
return n;}else{
return 2 * Fun1(n + 1);}
}
Koliko je Fun1(2) ?a. 6b. 16c. 24 Odgovor: b
12/24/2018
82
Pitanje 5
163
Fibonačije niz je:a. 1,2,3,5,8...b. 1,1,2,3,5,...c. 1,3,5,7,9,...
Odgovor: b
Pitanje 6
164
Prema Euklidovom algoritmu za pronalaženje NZD dva pozitivna cela broja tačno je tvrđenje:a. NZD(12,18) = NZD(6,12)b. NZD(12,18) = NZD(30,12)c. NZD(12,18) = NZD(2,12)
Odgovor: a
12/24/2018
83
Pitanje 7
165
Minimalni broj premeštanja diskova kod igre Hanojska kula je:a. 2n-1b. 2n-1c. 2n+1
Odgovor: b
Analiza efikasnosti algoritma
12/24/2018
84
Merenje vremena izvršavanje algoritma
• Broj ulaznih podataka - veličine n• npr. sortiranje niza od n članova
• Traži se vreme izvršavanja u zavisnosti od veličine ulaza, odnosno kako se vreme izvršavanja algoritma povećava sa povećavanjem broja ulaznih podataka
• Manja veličina ulaza daće i manje vreme izvršavanja algoritma
• Veća veličina ulaza daje veće vreme izvršavanja algoritma
• Povećava se veličina ulaza, vreme izvršavanja se takođe povečava
• Ako se ulaz u algoritam duplira• vreme izvršavanja se može duplirati• vreme izvršavanja se može uvećati 4 puta• vreme izvršavanja se može uvečati 100 puta
167
Merenje vremena izvršavanje algoritma
• Ekperimentalna metoda• Implementacija algoritma u programskom jeziku• Izvršavanje algoritama korišćenjem različitih ulaza• Beleženje vremena izvršavanja algoritma• Zavisi od softvera i hardvera• Konačan broj ulaza u algoritam
• Analitička metoda• Analiza vremena izvršavanja algoritma bazirana na veličini ulaza• Asimptotska analiza• Nezavisna od softvera i hardvera• Razmatra sve moguće ulaze u algoritam
168
12/24/2018
85
Klasa Stopwatch
• Biblioteka System.Diagnostics
• Konstruktor: Stopwatch t = new Stopwatch();
• Metoda Start() startuje merenje vremenskog interval
• Metoda Stop() zaustavlja merenje vremenskog interval
• Metoda Reset() služi za reetovanje tajmera
• Svojstvo Elapsed vraća TimeSpan strukturu koja sadrži proteklo vreme
• Svojstvo ElapsedMilliseconds vraća broj milisekundi (ne koristiti ako je vreme kraće od ms)
169
Stopwatch t = new Stopwatch();t.Start();TestMetoda(1000);t.Stop();Console.WriteLine(t.ElapsedMilliseconds);
Primer merenja vremena izvršavanja algoritma -1
170
static int[] KreirajNiz(int n){
Random rnd = new Random();int[] x = new int[n];for (int i = 0; i < n; i++){
x[i] = rnd.Next(1,101); // od 1 do 100}return x;
}
static void PisiNiz(int[] x){
for (int i = 0; i < x.Length; i++){
Console.Write(x[i] + "\t");}Console.WriteLine();
}
12/24/2018
86
Primer merenja vremena izvršavanja algoritma -2
171
static void Main(string[] args){
// menjaj velicinu ulaza n =10, 100, 1000int[] x = KreirajNiz(1000);
Stopwatch t = new Stopwatch();
double[] vremena = new double[10];for (int i = 0; i < 10; i++){
// merim vreme 10 puta zbog preciznijeg rezultatat.Start();PisiNiz(x);t.Stop();Linija(100);vremena[i] = t.ElapsedMilliseconds;t.Reset();
}
double ukupnoVreme = 0;foreach (double vr in vremena){
Rezultati merenja vremena izvršavanja metode PisiNiz()
Broj ulaznih parametara n
10 100 1000 10000
Vreme izvršavanja [ms]
0.1 10.3 117.2 1360.6
172
Napomena: Pri testiranju ne pokretati aplikaciju u debug modu nego sa CTRL + F5
12/24/2018
87
Analitičko određivanje vremena izvršavanja algoritma• Analizira se rad algoritma korak po korak i izvodi se vreme njegovog
izvršavanja
• Ne dobija se apsolutno precizna ocena vremena izvršavanja
• Ocena je dovoljno dobra da se stekne opšta slika o efikasnosti algoritma
• Vreme izvršavanja algoritma je funkcija veličine ulaznih podataka
• Za n ulaznih podataka definiše se funkcija T(n) koja daje broj vremenskih jedinica koliko traje izvršavanje algoritma
173
Jedinična instrukcija
• Jedinična instrukcija algoritma je osnovna računska operacija čije je vreme izvršavanja konstantno
• Pretpostavlja se da se sve osnovne instrukcije algoritma izvršavaju za jednu vremensku jedinicu
• Apsolutna vrednost vremenske jedinice nije bitna (ms, μs, ...)
• Tipične jedinične instrukcije algoritama su:• dodela vrednosti promenljivoj• poređenje vrednosti dve promenljive• aritmetičke operacije• logičke operacije• ulazno/izlazne operacije
174
12/24/2018
88
Vreme izvršavanja ugnježdenih petlji
for (int i = 0; i < n; i++) // izvrsava se n puta{
for (int j = 0; j < n; j++) // izvrsava se n puta{
if (i > j) // jedinicna instrukcija{
x[i, j] = 1; // jedinicna instrukcija}
}}
T(n) = n · n · (1 + 1) = 2n2
175
Primer 1 – indeks najmanjeg elementa niza
static int MinimalniClan(int[] x){1 int jmin = 0; // indeks minimalnog elementa2 int xmin = x[0];3 int i = 1;4 while (i < x.Length)
• O-zapis se koristi za precizno definisanje pojma da je neka funkcija manja od druge
• Za dve nenegativne funkcije 𝑓, 𝑔: 𝑁 → 𝑅+
kažemo da je 𝑓(𝑛) =𝑂(𝑔(𝑛)) ako postoje pozitivne konstane 𝑐 i 𝑛0 tako da je𝑓(𝑛) ≤ 𝑐 ∗ 𝑔(𝑛) za svako 𝑛 > 𝑛0
• Odnosno kažemo da funkcija 𝑔(𝑛) predstavlja asimptotsku granicu za funkciju 𝑓(𝑛)
179
O-zapis
180
𝑓(𝑛) ≤ 𝑐 ∗ 𝑔(𝑛) za svako 𝑛 > 𝑛0
f(n) vreme izvršavanja algoritma u zavisnosti od broja ulaza nVeliko O daje asimptotsku gornju granicu vremena izvršavanja algoritmag(n) je veliko O za f(n)
12/24/2018
91
Tipične funkcije složenosti poređane po rastućim brzinama rada
Funkcija Neformalno ime
1 konstantna funkcija
log n logaritamska funkcija
n linearna funkcija
n log n n log n
n2 kvadratna funkcija
n3 kubna funkcija
2n eksponencijalna funkcija
Veliko O za funkciju
• O(1) označava da je vreme izvršavanja algoritma ograničeno konstantom
• Za dovoljno veliko n važi:• O(1) < O(log n) < O(n) < O(nlog n) < O(n2) < O(n3) < ...< O(2n) < O(3n)<...< O(n!)
• O(n), O(nlog n), O(n2), O(n3),... su tzv. polinomska vremena izvršavanja algoritma
• O(2n) predstavlja eksponencijalno vreme izvršavanja algoritma tj. ne postoji polinom koji bi ga mogao ograniliti
• Algoritmi koji zahtevaju eksponencijalno vreme izvršavanja mogu biti nerešivi u realnom vremenu
182
12/24/2018
92
Pronalaženje velikog O
• Ako je 𝑓 𝑛 = 𝑐, 𝑓 𝑛 = 𝑂(1), veliko O za konstantnu funkciju je 1
• Ako je 𝑓 𝑛 = 𝑎𝑘𝑛𝑘 + 𝑎𝑘−1𝑛
𝑘−1 +⋯ .+𝑎0 onda je 𝑓 𝑛 = 𝑂(𝑛𝑘)• zadržava se najbrže rastuću član polinoma
• Koeficijenti se ignorišu 𝑓 𝑛 = 𝑘𝑔 𝑛 onda je 𝑓 𝑛 = 𝑂(𝑔 𝑛 )
• Baza logaritma je nebitna: 𝑓 𝑛 = 8 log2 𝑛, onda je 𝑓 𝑛 = 𝑂(𝑙𝑜𝑔𝑛)
Eksperimentalna metoda vremena izvršavanja algoritma:a. Ne zavisi od hardvera i softvera na kome se radi testiranjeb. Zavisi od hardvera i softvera na kome se radi testiranjec. Zavisi isključivo od broja ulaznih parametara
Odgovor: b
12/24/2018
95
Pitanje 2
189
Jedinična instrukcija algoritma ima:a. Promenljivo vreme izvršavanjab. Konstantno vreme izvršavanjac. Vreme izvršavanja koje zavisi od tipa algoritma
Odgovor: b
Pitanje 3
190
Ko asimptotske analize algoritma izračunava se tačno vreme izvršavanja algoritma:a. Dab. Ne
Odgovor: b
12/24/2018
96
Pitanje 4
191
Šta je veliko O za funkciju : 𝑓 𝑛 = 3𝑛2 + 5n + 18a. O(2n)b. O(n)c. O(n2)
Odgovor: c
Pitanje 5
192
Vremenska kompleksnost algoritma koji se izvršava za isto vreme bez obzira na broj ulaznih parametara je:a. O(1)b. O(n)c. O(logn)
Odgovor: a
12/24/2018
97
Pitanje 6
193
Koja je vremenska kompleksnost sledećeg koda:
for (int i = 0; i < n; i++){
a[i] = 0;}
a. O(n2)b. O(n)c. O(1)
Odgovor: b
Algoritmi sortiranja
12/24/2018
98
Problem sortiranja
• Ako je dat niz neuređenih brojeva, treba preurediti brojeve tog niza tako da oni obrazuju neopadajući niz
• a[0],a[1],....,a[n-1] inicijalni nesortirani niz
• a[0] <=a[1]<==,...<=a[n] sortirani niz
• Sortiranjem se postiže brže pronalaženje informacija nego u slučaju nesortiranog skupa podataka
195
Algoritam Selection Sort
• Prolazak 1• Pronađi najmanji od elemenata x[0], x[1],....,x[n-1]
• Pronađeni element razmeni sa x[0]
• Posle prvog prolaska x[0] će sadržati najmanju vrednost u nizu
196
n elemenata: x[0],x[1],....,x[n-2],x[n-1]
Niz x posle prvog prolaska
Niz x pre sortiranja
12/24/2018
99
Prolazak 2
• Pronađi najmanji od elemenata x[1], x[2],....,x[n-1]
• Pronađeni element razmeni sa x[1]
• Posle drugog prolaska x[1] će sadržati drugu najmanju vrednost u nizu
197
Niz x pre drugog prolaska
Prolazak 3
• Pronađi najmanji od elemenata x[2], x[3],....,x[n-1]
• Pronađeni element razmeni sa x[2]
• Posle trećeg prolaska x[2] će sadržati treću najmanju vrednost u nizu
Random rnd = new Random();int[] x = new int[n];for (int i = 0; i < n; i++){
x[i] = rnd.Next(1, 101); // od 1 do 100}return x;
}static void PisiNiz(int[] x){
for (int i = 0; i < x.Length; i++){
Console.Write(x[i] + "\t");}Console.WriteLine();
}
static void Linija(int n){
//iscrtava liniju duzine n na konzoliConsole.WriteLine("".PadRight(n, '_'));
}201
Poziv algoritma za sortiranjestatic void Main(string[] args){
int[] x = KreirajNiz(10);Console.WriteLine("Niz pre sortiranja");PisiNiz(x);Linija(80);SelectionSort(x);Console.WriteLine("Niz nakon sortiranja");PisiNiz(x);Console.ReadLine();
}
202
12/24/2018
102
Prikaz niza na kraju svakog prolazka
203
Analiza Selection Sort algoritma -1• Prolazak 1:
• x[0] se upoređuje sa x[1], x[2],....,x[n-1]
• ukupno (n-1) upoređivanja
• Prolazak 2:• x[1] se upoređuje sa x[2], x[3],....,x[n-1]
• ukupno (n-2) upoređivanja
• Prolazak n-2:• x[n-3] se upoređuje sa x[n-2],x[n-1]
• ukupno 2 upoređivanja
• Prolazak n-1:• x[n-2] se upoređuje sa x[n-1]
• ukupno 1 upoređivanje204
12/24/2018
103
Analiza Selection Sort algoritma -2
• Ukupno upoređivanja: 1 + 2 +⋯+ 𝑛 − 1 =𝑛
2(𝑛 − 1)
• Vremenska kompleksnost algoritma: 𝑂(𝑛2)
• Sortiranje nije osetljivo na podatke koji se sortiraju, podaci mogu biti sortirani u rastućem, opadajućem ili imati proizvoljan redosled
• U jednom prolasku samo jedna razmena• malo pomeranje podataka
205
Algoritam Bubble Sort• Susedni elementi se upoređuju i razmenjuju im se mesta ukoliko
redosled nije dobar
• Posle prvog prolaska najveći element niza dolazi na poslednju poziciju
206
12/24/2018
104
Prvi prolazak - Bubble Sort
• Upoređuje se x[0] i x[1] ako je x[0] > x[1] razmeni im mesta
• Upoređuje se x[1] i x[2] ako je x[1] > x[2] razmeni im mesta
• Upoređuje se x[n-3] i x[n-2] ako je x[n-3] > x[n-2] razmeni im mesta
• .....
• Upoređuje se x[n-2] i x[n-1] ako je x[n-2] > x[n-1] razmeni im mesta
207
Drugi prolazak - Bubble Sort
• Upoređuje se x[0] i x[1] ako je x[0] > x[1] razmeni im mesta
• Upoređuje se x[1] i x[2] ako je x[1] > x[2] razmeni im mesta
• Upoređuje se x[n-4] i x[n-3] ako je x[n-4] > x[n-3] razmeni im mesta
• .....
• Upoređuje se x[n-3] i x[n-2] ako je x[n-3] >x[n-2] razmeni im mesta
208
12/24/2018
105
Prolazak n-1
• Upoređuje se x[0] i x[1] ako je x[0] > x[1] razmeni im mesta
• Samo jedno poređenje
Posle prolaska n-2
Posle prolaska n-1
209
Primer Bubble Sort prolazak 1
45 > 23 razmeni im mesta
45 < 59, nema razmene
59 < 66, nema razmene
66 > 38, razmeni im mesta
66 > 12, razmeni im mesta
210
12/24/2018
106
Primer n=6, sortiranje niza od 6 brojeva
i=4, j=0,1,2,3,4
i=3, j=0,1,2,3
i=2, j=0,1,2
i=1, j=0,1
i=0, j=0
211
i je maksimalna vrednost za jupoređuje se x[j] i x[j+1]inicjalno i = n-2
Implementacija algoritma
static void BublleSort(int[] x){
int n = x.Length;int temp =0;for (int i = n-2; i >=0 ; i--){
• Niz x dužine 𝑛 se postupno sortira u 𝑛-1 prolazaka. U svakom prolasku se produžava levi - sortirani dio niza za jedan element
• U 𝑖-tom prolasku se umeće element x[i] na njegovo pravo mesto između prvih 𝑖 − 1 već uređenih elemenata u rastućem redosledu
• Element x[i] se smešta u promenljivu temp• temp = x[i]• Upoređuje se x[i-1] sa temp i ako je x[i-1]>temp, x[i-1] se pomera desno na poziciju x[i]• Upoređuje se x[i-2] sa temp i ako je x[i-2]>temp, x[i-2] se pomera desno na poziciju x[i-1]
217
niz x
Prolazak 1
• Sortirani deo x[0]
• Nesortirani deo x[1],x[2],...x[n-1]
• Element x[1] se ubacuje u sortirani deo
218
12/24/2018
110
Prolazak 2
• Sortirani deo x[0],x[1]
• Nesortirani deo x[2],x[3],...,x[n-1]
• Element x[2] ubacuje se u sortirani deo na odgovarajuću poziciju
219
Prolazak 3
• Sortirani deo x[0],x[1],x[2]
• Nesortirani deo x[3],x[4],...,x[n-1]
• Element x[3] ubacuje se u sortirani deo na odgovarajuću poziciju
220
12/24/2018
111
Prolazak n-1
• Sortirani deo x[0],x[1],...,x[n-2]
• Nesortirani deo x[n-1]
• Element x[n-1] ubacuje se u sortirani deo na odgovarajuću poziciju
221
Niz je sortiran
Primer rada Insertion Sort algoritma
222
12/24/2018
112
Prvi prolazak
223
temp = 23 x[0]=45 >temp45 pomeram desno, x[1] =45na staroj poziciji broja 45 upisujem vrednost smeštenu u temp, x[0] =temp
Drugi prolazak
224
temp = 32 x[1]=45 >temp45 pomeram desno, x[2] =45x[0]=23 <temp, ne pomeram ga desnona staroj poziciji broja 45 (koji je poslednji pomeren u desno)upisujem vrednost smeštenu u temp, x[1] =32
int[] x = { 45, 23, 32, 10,30,12, 66, 28 };Console.WriteLine("Niz pre sortiranja");PisiNiz(x);Linija(80);InsertionSort(x);Console.WriteLine("Niz nakon sortiranja");PisiNiz(x);Console.ReadLine();
}
Izvršavanje algoritma po koracima
232
12/24/2018
117
Karakteristike Insertion Sort algoritma • Podaci su sortirani u rastućem poretku
• Broj poređenja n-1
• Broj premeštanja 2(𝑛 − 1)
• Vremenska kompleksnost je 𝑂(𝑛)
• Podaci sortirani u opadajućem poretku
• Broj poređenja 𝑛 𝑛−1
2= 𝑂(𝑛2)
• Broj premeštanja 𝑛(𝑛−1)
2+ 2(𝑛 − 1) = 𝑂(𝑛2)
• Vremenska kompleksnost je 𝑂 𝑛2
• Podaci u proizvoljnom poretku• Broj poređenja 𝑂(𝑛2)
• Broj premeštanja 𝑂(𝑛2)
• Vremenska kompleksnost je 𝑂 𝑛2233
Pitanje 1
234
Za algoritam Selection Sort važi sledeće tvrđenje:a. Vremenska kompleksnost je najmanja kada su podaci sortirani u rastućem
poretkub. Vremenska kompleksnost je najmanja kada su podaci sortirani u rastućem
poretkuc. Vremenska kompleksnost ne zavisi od podataka
Odgovor: c
12/24/2018
118
Pitanje 2
235
Ako upoređujemo Bubble Sort i Selection Sort algoritam veći broj razmena vrednsti ima:a. Bubble Sortb. Selection Sort c. Broj razmena je podjednak
Odgovor: a
Pitanje 3
236
Ako se radi sortiranje niza dužine n, algoritam Selection Sort ima sledeći broj prolazaka:a. nb. n-1c. n2
Odgovor: b
12/24/2018
119
Pitanje 4
237
Kada se niz sortira korišćenjem Bubble Sort algoritma posle prvog prolaska:a. Najveći element se nalazi na kraju nizab. Najveći element se nalazi na početku nizac. Najmanji element se nalazi na kraju niza
Odgovor: a
Pitanje 5
238
Kada se niz sortira korišćenjem Insertion Sort algoritma posle svakog prolaska:a. Prvi element sortiranog dela ubacuje se u nesortirani deob. Prvi element nesortiranog dela ubacuje se u sortirani deoc. Poslednji element nesortiranog dela ubacuje se u sortirani deo
Odgovor: b
12/24/2018
120
Algoritmi sortiranja -2
Spajanje sortiranih nizova u novi sortirani niz
• Neka je a1[] sortirani niz dužine n1
• Neka je a2[] sortirani niz dužine n2
• Potrebno je kreirati novi niz temp[] dužine n1+n2 od elemenata niza a1[] i a2[] tako da bude sortiran
240
12/24/2018
121
Spajanje sortiranih nizova -1
241
Spajanje sortiranih nizova -2
a2[0] <a1[0]temp[0] = a2[0]j=1; inkrementira se brojač niza a2k=1
242
12/24/2018
122
Spajanje sortiranih nizova -3
a1[0]<a2[1]temp[1] = a1[0]i=1; inkrementira se brojač prvog nizak=2; inkrementira se brojač rezultujućeg niza
243
Funkcija Merge() koja spaja sortirane nizove
public static int[] Merge(int[] a1, int[] a2){
int n1 = a1.Length;int n2 = a2.Length;
int[] temp = new int[n1 + n2];
int i = 0, j = 0, k = 0;
while (i<n1 && j<n2){
if (a1[i] <a2[j]){
temp[k++] = a1[i++];}else{
temp[k++] = a2[j++];}
}//a2 se zavrsio kopiraj preostale elemente niza a1while (i<n1){
temp[k++] = a1[i++];}
//a1 se zavrsio kopiraj preostale elemente niza a2while (j<n2){
int[] a = KreirajNiz(10);PisiNiz(a);Linija(70);MergeSort(a);PisiNiz(a);Console.ReadLine();
}
12/24/2018
128
Analiza MergeSort algoritma
• Niz od n elemenata se iterativno deli na dva dela približno log2 𝑛 puta
• Nakon deljenja niza log2 𝑛 puta imamo n podnizova dužine 1
• Vremenska kompleksnost algoritma je O(nlogn)
255
Quick Sort algoritam
• Efikasan algoritam sortiranja
• Tehnika podeli pa vladaj
• Ceo niz a[] se deli na dve particije: levu i desnu
• Svi elementi leve particije su manji od elementa koji se zove pivot
• Svi elementi desne grupe su veći ili jednaki od pivot elementa
• Inicijalno se za pivot postavlja bilo koji element niza. npr prvi:pivot= a[0]
• Svakim prolaskom kroz algoritam određuje se tačna pozicija pivota
• Svakim prolaskom kroz algoritam razmeštaju se elementi niza da bi se kreirale particije
256
12/24/2018
129
Podela niza i podniza na particije
• Neka je levi, levi indeks podniza koji treba da se podeli na particije• Neka je desni, desni indeks podniza koji treba da se podeli na particije• Inicijalno levi = 0, desni = n-1, kada se od celog niza kreiraju dve particije• Da bi se ostvarila podela na grupe uvodi se:
• indeks i inicijalizovan na vrednost levi koji služi za kretanje kroz niz sa leva na desno• indeks j inicijalizovan na vrednost desni za kretanje kroz niz sa desne na levu stranu
• Funkcija vraća tačnu poziciju pivot elementa nakon podele niza na particije• Funkcija menja niz tako da su levo od tačne pozicije pivot elementa
vrednosti manje od njega, a desno veće od njega
257
static int Particija(int[] a, int levi, int desni)
Funkcionisanje Quick Sort algoritma
258
i=0
j=8
i=0
j=6
12/24/2018
130
Objasnjenje primera• Brojač i ide sa leva na desno (na slici odozgo na dole) a brojč j ide sa desna na levo (na slici odozdo na gore)
• Tačka 1. pivot = -11
• Tačka 1. Brojač j: Pokazuje na prvi element koji je manji od pivota(-11), a to je element sa vrednošću(-42)
• Tačka 2. Elementi sa vrednošću (-11) i (-42) menjaju mesto
• Tačka 2. Brojač i: Pokazuje na prvi element koji je veći od pivota a to je 12
• Tačka 3. (12) i (-11) -pivot menjaju mesto i pivot se pozicionira na pravu poziciju tj. poziciju 1
• Svi elementi levo od (-11) su manji od njega a desno su veći od njega
• Tačka 4. leva particija je sortirana tj. njen pivot (-42) je na pravom mestu
• Tačka 5. Pretpostavlja se da je 12 pivot desne particije
• Tačka 5. Brojač j: pokazuje na prvi element koji je manji od pivota tj.( -9)
• Tačka 6. Brojevi (-9) i pivot=12 menjaju mesta
• Tačka 6. Brojač i: pokazuje na prvi element koji je veći od pivota a to je 90
• Tačka 7. Brojevi 12 i 90 menjaju mesto a brojac j pokazuje na prvi broj koji je manji od pivota =12 a to je 6.
• itd
259
Funkcija za particionisanje niza
260
static int Particija(int[] a, int levi, int desni){
int i, j;i = levi;j = desni;int pivot = a[levi];while (true){
while (a[i] < pivot){
i++;}
while (a[j] > pivot){
j--;}
if (i < j){
if (a[i] == a[j]){
return j;}
int temp = a[i];a[i] = a[j];a[j] = temp;
}else{
return j;}
}}
12/24/2018
131
Quick Sort algoritam
• Niz se rearanžira tako da se pivot pozicionira na odgovarajuće mesto
• Levi podniz se sortira rekurzivno primenom quick sort algoritma
• Desni podniz se sortira rekurzivno primenom quick sort algoritma
• Rekurzija se završava kada podniz sadrži jedan element ili je prazan
261
Funkcija za rekurzivno sortiranje
262
static void Sort(int[] a, int levi, int desni){
if (levi >= desni){
return;}
int p = Particija(a, levi, desni);if (p>1){
Sort(a, levi, p - 1); // sortiraj levi podniz}
if (p+1 <desni){
Sort(a, p + 1, desni); // sortiraj desni podniz}
}
12/24/2018
132
Funkcija QuickSort()
263
static void QuickSort(int[] a){
int n = a.Length;Sort(a, 0, n - 1);
}
Poziv funkcije QuickSort()
264
static void Main(string[] args){
int[] a = KreirajNiz(10); PisiNiz(a);Linija(70);QuickSort(a);
Console.WriteLine("Sortirani niz");PisiNiz(a);
Console.ReadLine();}
12/24/2018
133
Karakteristike Quick Sort algoritma
• Kada se dobro implementira dvostruko je brži od Merge Sort algoritma
Tehnika podeli pa vladaj nije karakteristična za sledeći algoritam soriranja:a. Merge Sortb. Selection sortc. Quick sort
Odgovor: b
Pitanje 3
268
Prosečna vremenska kompleksnost Quick Sort algoritma je:a. O(n2)b. O(n)c. O(nlogn)
Odgovor: c
12/24/2018
135
Pitanje 4
269
Kod Quick Sort algoritma svi elementi desne particije su:a. veći od pivot elementab. manji od pivot elementac. mogu biti i veći i manji od pivot elementa
Odgovor: a
Algoritmi pretrage
12/24/2018
136
Linearna pretraga
• Naziva se još i sekvencijalna pretraga
• Počinje od početka niza
• Sekvencijalno se proveravaju element niza jedan po jedan
• Kraj pretrage• Pronađen željeni element - uspešna pretraga, vraćemo indeks prvog
pojavljivanja željenog elementa
• Nije pronađen željeni element - neuspešna pretraga, vraćamo rezultat -1
271
Implementacija algoritma za linearnu pretragu
static int LinSearch(int[] x, int a){
int n = x.Length;
1 for (int i = 0; i < n; i++){
2 if (x[i] == a){
3 return i;}
}4 return -1;
}
T(n) = 2n+1O(n) = n
Red 1 2 4
Vreme izvršavanja
n n 1
272
12/24/2018
137
Poziv algoritma za sekvencijalnu pretragustatic void Main(string[] args){
int[] x = KreirajNiz(10);PisiNiz(x);Linija(70);
Console.WriteLine("Unesi vrednost koju trzis");int a = int.Parse(Console.ReadLine());
int indeks = LinSearch(x, a);
if (indeks > -1){
Console.WriteLine($"Vrednost {a} pronadjena na poziciji {indeks}");}else{
Console.WriteLine($"Vrednost {a} ne postoji u nizu");}
Console.ReadLine();}
273
Prikaz rezultata pretrage
274
12/24/2018
138
Analiza linearne pretrage
• Najbolji slučaj: tražena vrednost se nalazi na početku niza• Samo jedno poređenje• Vremenska komplesnost 𝑂(1)
• Najgori slučaj: tražena vrednost nije u nizu• Broj poređenja je n• Vremenska kompleksnost je 𝑂(𝑛)
• Prosečan slučaj: tražena vrednost se nalazi na poziciji i• Broj poređenja i
• Prosečan broj poređenja je 𝑃 =1
𝑛(1 + 2 + 3 + … .+𝑛) =
1
𝑛
𝑛
2(𝑛 + 1)=
𝑛+1
2• Vremenska kompleksnost je T n = 𝑂(𝑛)
275
Linearna pretraga korišćenjem stražara (sentinel)• Čuvamo poslednji element niza u pomoćnoj promenljivoj
• Vrednost koju tražimo ubacijemo u poslednji element niza
• Petljom while se proverava indeks prvog elementa u listi koji je jednak traženom elementu
• Ponovo se na poslednje mesto niza vraća originalni element
• Proverava se da li je nadjeni indeks manji od (n-1) ili je vrednost elementa na poziciji nađenog indeksa jednaka poslednjem elementu
• Smanjuje se broj poređenja sa kojima radi algoritam na n +2 u najgorem slučaju
276
12/24/2018
139
Linearna pretraga korišćenjem stražara -implementacijastatic int LinSearchSentinel(int[] x, int a){
int n = x.Length;int poslednji = x[n - 1];x[n - 1] = a; int i = 0;while (x[i] != a){
i++;}x[n - 1] = poslednji;
if ((i < n - 1) || (a == x[n - 1])){
return i;}else{
return -1;}
}277
Esperimentalno upoređivanje algoritama za linearnu pretragustatic void Main(string[] args){
Console.WriteLine("Unesi broj clanova niza: ");int n = int.Parse(Console.ReadLine());int[] x = KreirajNiz(n);PisiNiz(x);Linija(70);
Console.WriteLine("Unesi vrednost koju trzis");int a = int.Parse(Console.ReadLine());
Algoritam za linearnu pretragu sortiranog niza• Poboljšava vreme pretrage kada se vrednost koju tražimo
ne nalazi u nizu• Ne mora se pretražiti ceo niz kao u slučaju nesortiranog
niza.
static int LinSearchSort(int[] x, int a){
int i =0;int n = x.Length;for ( i = 0; i < n; i++){
if (x[i] >=a){
break;}
}
if (x[i] == a){
return i;}else{
return -1;}
} 280
12/24/2018
141
Binarna pretraga -1traži se broj a=31
Niz sa kojim radimo mora biti sortiran.
donja =0;gornja =9sredina = (donja + gornja)/2 = (9+0)/2 = 4 - zaokružujemo na manju vrednost
x[4] =27 < a
ako je a == x[sredina], pronađena vrednost, kraj pretrageako je a>x[sredina] , pretražuje se desni podnizako je a<x[sredina], pretražuje se levi podniz
281
Binarna pretraga -2
traži se broj a=31
sredina =4; // stara vrednostdonja =sredina +1 =5; // kada se pretražuje desni podnizgornja =9sredina = (donja + gornja)/2 = (5+9)/2 = 7
x[7] =35 > a
282
12/24/2018
142
Binarna pretraga -3
traži se broj a=31
sredina =7; // stara vrednostdonja = 5;gornja =sredina -1 =6 // kada se pretražuje levi podnizsredina = (donja + gornja)/2 = (5+6)/2 = 5
x[5] =31 = a
283
Implementacija algoritmastatic int BinSearch(int[] x, int a){
int n = x.Length;int gornja = n - 1;int donja = 0;int sredina;
while (donja <= gornja){
sredina = (donja + gornja) / 2;
if (a == x[sredina]){
return sredina;}else if (a < x[sredina]){
// pretrazujem levi podnizgornja = sredina - 1;
}else{
// pretrazujem desni podnizdonja = sredina + 1;
}}return -1;
} 284
12/24/2018
143
Analiza algoritma binarne pretrage -1
• Na početku 1. iteracije, dužina oblasti pretrage iznosi 𝑛
• Na početku 2. iteracije, dužina oblasti pretrage iznosi približno 𝑛
2
• Na početku 3. iteracije, dužina oblasti pretrage iznosi približno 𝑛
2
2=
𝑛
4
• Na početku poslednje 𝑚-te iteracije, dužina oblasti pretrage iznosi približno
𝑛
2𝑚−1
285
Analiza algoritma binarne pretrage -2
𝑛
2𝑚−1=1
𝑚− 1 = log2 𝑛
𝑚 = log2 𝑛+1
𝑇 𝑛 ≈ 𝑚 = log2 𝑛za n =1000 broj poređenja nije veći od 10
Vremenska kompleksnost algoritma binarne pretrage je 𝑻(𝒏) = 𝑶(𝒍𝒐𝒈𝒏)286
Pronalaženje elementa liste na osnovu vrednostipublic int PronadjiVrednost(int x){
Node p = start;int pozicija = 0;
while (p != null){
if (p.info == x){
break;}p = p.link;pozicija++;
}
if (p == null){
return -1;}else{
return pozicija;}
}
304
12/24/2018
153
Pretraga vrednosti
//Pronadji vrednostConsole.WriteLine("Pretraga vrednosti 30");int ind= lista1.PronadjiVrednost(30);Console.WriteLine($"Pozicija: {ind}");
305
Referenca na poslednji čvor liste
public Node PronadjiPoslednji(){
Node p = start;while (p.link !=null){
p = p.link;}return p;
}
306
12/24/2018
154
Prikaz poslednjeg elementa liste
Console.WriteLine("Poslednji element");Node p = lista1.PronadjiPoslednji();Console.WriteLine("Info u poslednjem elementu je: " + p.info);
307
Referenca na predposlednji čvor liste
public Node PronadjiPredPoslednji(){
Node p = start;while (p.link.link != null){
p = p.link;}return p;
}
308
12/24/2018
155
Prikaz predposlednjeg elementa liste
p = lista1.PronadjiPredPoslednji();Console.WriteLine("Info u predposlednjem elementu je: " + p.info);
309
Pronalaženje prethodnog elementa
Pronalaženje elementa čiji sledeći element ima vrednost x=30
310
12/24/2018
156
Pronalaženje prethodnog elementa
public Node PronadjiPrethodni(int x){
Node p = start;while (p.link != null){
if (p.link.info == x){
break;}p = p.link;
}if (p.link == null){
return null;}return p;
} 311
Pronalaženje prethodnog elementa
Console.WriteLine("Pronadji prethodni element za element koji sadrzi vrednost 30");p = lista1.PronadjiPrethodni(30);Console.WriteLine("Info u prethodnom elementu je: " + p.info);
312
12/24/2018
157
Pronalaženje elementa na poziciji
0 1 2 3 4
index: 2
313
Pronalaženje elementa na pozicijipublic Node Pronadji(int index){
Node p = start;for (int i = 0; i < index && p != null; i++){
Node temp = new Node(info);temp.link = start; start = temp; // novi cvor postaje pocetni element
}
316
12/24/2018
159
Dodavanje na početak liste
317
Console.WriteLine("Dodaj 1 na pocetak liste");lista1.DodajNaPocetak(1);lista1.PrikaziListu();Linija(100);Console.WriteLine("Dodaj 2 na pocetak liste");lista1.DodajNaPocetak(2);lista1.PrikaziListu();
Ubacivanje čvora na poziciju
318
• Ubacujem čvor na poziciju index=4
• Ubačeni čvor pokazuje na čvor na koga je pokazivao čvor na poziciji index-1=3
• Čvor koji je na poziciji index-1 = 3 pokazuje na čvor koji ubacujemo
temp.link = p.linkp.link = temp
12/24/2018
160
Ubacivanje čvora na poziciju - kodpublic void DodajNaPoziciju(int index, int info){
Node temp = new Node(info);
if (index == 0){
DodajNaPocetak(info);}else{
Node p = start;for (int i = 0; i < index - 1; i++){
p = p.link; } //p je sada cvor na poziciji index-1temp.link = p.link; p.link = temp;
• p.link.link je sledeći element koji dolazi iza elementa koga brišemo
• p.link = p.link.link – uklanja element koji dolazi posle elementa p
321
Brisanje elementa sa pozicije
322
public void ObrisiCvor(int index){
//prazna listaif (start == null){
return;} // brise se pocetak listeif (index == 0){
start = start.link; return;
}Node p = start;// Nadji prethodni cvor cvora koga brisemofor (int i = 0; i < index - 1; i++){
p = p.link;}
// Nadji element koji sledi iza elementa koga brisemoNode sledeci = p.link.link;
p.link = sledeci;
}
12/24/2018
162
Brisanje elementa sa pozicije
323
lista1.DodajNaKraj(10);lista1.DodajNaKraj(20);lista1.DodajNaKraj(30);lista1.DodajNaKraj(40);lista1.DodajNaKraj(50);lista1.PrikaziListu();Linija(100);Console.WriteLine("Obrisi cvor sa pozicije 1");lista1.ObrisiCvor(1);lista1.PrikaziListu();
Pitanje 1
324
Dat je sledeći kod:
Node p = start;while (p != null){p = p.link;
}
Nakon izvršavanja koda p će biti:a. Referenca na poslednji čvor listeb. Referenca na prvi čvor listec. Null referenca
Odgovor: a
12/24/2018
163
Pitanje 2
325
Unos novog čvora temp na početak liste čije je prvi element start vrši se sledećim linijama koda:
a. start = temp; temp.link = start;
b. temp.link = start; start = temp;
c. temp.link = start; temp= start;
Odgovor: b
Pitanje 3
326
Brisanje čvora koji dolazi posle čvora p iz liste vrši se sledećim kodom:a. p.link=null; b. p.link=p;c. p.link = p.link.link;
Odgovor: c
12/24/2018
164
Pitanje 4
327
Čvorovi jednostruko povezane liste čuvaju se u uzastopnim memorijskim lokacijama:a. Dab. Ne
Odgovor: b
Stekovi i redovi
12/24/2018
165
Stack
329
Generički stekovi Stack<T>
• Biblioteka System.Collection.Generics
• Klasa Stack<T>, gde je T tip podataka u steku• Stack<int> je stek celih brojeva
• Stack je LIFO(Last-in, first-out) struktura
• Metoda Push(T) stavlja objekat na stek
• Metoda Pop() skida objekat sa vrha steak (koji je posledni stavljen na stek)
• Metoda Peek() vraća element koji je na vrhu steka ali ga ne uklanja
• Metoda Clear() uklanja sve objekte iz steka Stack<T>
• Svojstvo Count daje broj elemenata u steku
• Metoda Contains(T) utvrđuje da li se element nalazi u steku
330
12/24/2018
166
Štampanje elemenata steka
331
Stack<int> celobrojniStek = new Stack<int>();
static void Stampaj(){
if (celobrojniStek.Count > 0){
Linija(100);Console.Write("Vrh-->");foreach (int i in celobrojniStek){
Console.WriteLine("Odaberite operaciju:");Console.WriteLine("1 -> dodaj element na vrh steka");Console.WriteLine("2 -> ukloni element sa vrha steka");Console.WriteLine("3 -> prikazi vrh steka");Console.WriteLine("4 -> izadji");Linija(100);izbor = Console.ReadLine();
Generički stek Stack<T> kada se instancira predstavlja:a. FIFO strukturub. LIFO strukturuc. LILO strukturu
Odgovor: b
347
Pitanje 2
Stavljanje elementa a na vrh steka st vrši se korišćenjem naredbe:a. st.Push(a);b. st.Pop(a);c. st.Push =a;
Odgovor: a
348
12/24/2018
175
Pitanje 3
Neka je definisan celobrojni red: private Queue<int> celobrojniRed = new Queue<int>();Linijom koda:celobrojniRed.Dequeue();a. dodaje se element na kraj redab. uklanja se element sa kraja redac. uklanja se element sa početka reda
Odgovor: c
349
Stabla
12/24/2018
176
Pojam stabla
• Stabla su nelinearne strukture podataka
• Njihov naziv implicira vezu sa stablima (drvećem) u prirodi ili porodičnim stablima
• Odnos između elemenata nije linearan
• Imaju razgranatu ili hijerarhijsku strukturu elemenata
351
Grafička predstava stabla
Nivo 0
Nivo 1
Nivo 2
Nivo 3
Nivo 4
352Stablo ima visinu 5
12/24/2018
177
Definicije
• Stablo se sastoji od čvorova
• Čvor koji nema roditeljski čvor (parent) naziva se koreni čvor (root)
• Čvor može imati više dece (child čvorova)
• Ako dva čvora imaju isti roditeljski čvor nazivaju se braća (siblings )
• Svaki deo stabla se naziva podstablo
• Čvor se naziva list ako nema decu čvorove
353
Podstabla
354
12/24/2018
178
Definicije
• Nivo čvora je udaljenost čvora od korena
• Visina stabla je ukupan broj nivoa u stablu
• Vrednost koja se čuva u čvoru stabla naziva se ključ
• Putanja je sekvenca čvorova 𝑁1 , 𝑁2,...,𝑁𝑥 pri čemu je svaki čvor 𝑁𝑖roditelj čvora 𝑁𝑖+1, 1 ≤ 𝑖 < 𝑥
355
Binarno stablo
• Svaki čvor binarnog stabla može imati maksimalno dva deteta
• Čvor binarnog stabla ima dvoje dece: levo i desno
• Čvor binarnog stabla ima jedno dete levo ili desno
• Čvor binarnog stabla koji nema decu naziva se list
356
12/24/2018
179
Binarno stablo
357
Maksimalni broj čvorova u i-tom nivou binarnog stabla je 2i
koren = new Cvor('P');Cvor CvorQ = new Cvor('Q');Cvor CvorR = new Cvor('R');koren.Levo = CvorQ;koren.Desno = CvorR;
CvorQ.Levo = new Cvor('A');CvorQ.Desno = new Cvor('B');
CvorR.Levo = new Cvor('X');
}
12/24/2018
190
Main() metoda
379
static void Main(string[] args){
Bstablo stablo = new Bstablo();stablo.KreirajStablo();Linija(50);Console.WriteLine("Preorder");stablo.PreorderProlaz();Linija(50);Console.WriteLine("Inorder");stablo.InorderProlaz();Linija(50);Console.WriteLine("Postorder");stablo.PostorderProlaz();
Console.ReadLine();}
Prolazak kroz binarno stablo
380
12/24/2018
191
Pitanje 1
Maksimalni broj čvorova na 6-tom nivou binarnog stabla je:(0 je nivo korena stabla):a. 8b. 12c. 64
Odgovor: c
381
Pitanje 2
Minimalni broj čvorova na 6-tom nivou binarnog stabla je: (0je nivo korena stabla):a. 1b. 6c. 12
Odgovor: a
382
12/24/2018
192
Pitanje 3
Kod postorder prolaska kroz binarno stablo, poslednji čvor je:a. krajnji levi element poslednjeg nivoab. krajnji desni čvor poslednjeg nivoac. koreni čvor
Odgovor: c
383
Pitanje 4
384
Koja od navedenih struktura podataka nije linearna:a. binarno stablob. redc. stek
Odgovor: a
12/24/2018
193
Binarno stablo pretrage (BST)
Binarno stablo pretrage (BST)
• Binary Search Tree
• BST je binarno stablo koje zadovoljava sledeće zahteve
• Svi ključevi u levom podstablu u odnosu na koren su manji od ključa u korenu
• Svi ključevi u desnom podstablu u odnosu na koren su veći od ključa u korenu
• Levo i desno podstablo korena su takođe BST stabla
386
12/24/2018
194
Primer BST stabla
387
Preorder prolaz
388
12/24/2018
195
Inorder prolaz
389
Elementi se sortiraju u rastućem poretku
Postorder prolaz
390
12/24/2018
196
Klasa koja predstavlja čvor BST stabla
391
class CvorStabla{
public int Podatak { get; set; }public CvorStabla Levo { get; set; }
// ubacivanje u Desno podstabloUbaci(k.Desno, podatak);
}
else{
// ubacuje se kao desno detek.Desno = new CvorStabla(podatak);
}
}else{
Console.WriteLine("Ne moze se ubaciti u BST");}
}}
k –pokazivač na tekući čvorpodatak – vrednost koja se ubacuje u levo ilidesno podstablo čvora k
12/24/2018
200
Metoda za ubacivanje čvora u BST stablo
399
public void Ubaci(int podatak){
Ubaci(koren, podatak);}
Realizacija stabla sa slike
400
static void Main(string[] args){
BstStablo stablo = new BstStablo();stablo.Ubaci(70);stablo.Ubaci(40);stablo.Ubaci(80);stablo.Ubaci(35);stablo.Ubaci(50);stablo.Ubaci(75);stablo.Ubaci(89);stablo.Ubaci(30);stablo.Ubaci(37);stablo.Ubaci(55);stablo.Ubaci(82);stablo.Ubaci(93);
Console.WriteLine("Trenutni broj elemenata: " + stablo.BrojElemenata());Linija(50);
Pronalaženje elementa u BST stablu
404
public CvorStabla Pronadji(int podatak){
CvorStabla tekuci = koren;while (tekuci != null){
if (tekuci.Podatak == podatak){
return tekuci;}
if (tekuci.Podatak < podatak){
tekuci = tekuci.Desno;}else{
tekuci = tekuci.Levo;}
}
return null;}
12/24/2018
203
Pronalaženje elementa u BST stablu
405
Console.WriteLine("Pronadji element 89 i stampaj podatak u njegovom levom potomku");CvorStabla c = stablo.Pronadji(89);if (c != null){
Console.WriteLine(c.Levo.Podatak);}
Čvor sa maksimalnom vrednošću ključa
406
private CvorStabla MaxCvor(CvorStabla tekuci){
while (tekuci.Desno != null){
tekuci = tekuci.Desno;}return tekuci;
}
public CvorStabla MaxCvor(){
return MaxCvor(koren);}
12/24/2018
204
Pronalaženje maksimalnog elementa
407
Console.WriteLine("Maksimalni element BST stabla: ");CvorStabla c2 = stablo.MaxCvor();Console.WriteLine(c2.Podatak);
Pitanje 1
Sortiranje elemenata BST stabla vrši se:a. preorder prolaskomb. inorder prolaskomc. postorder prolaskom
Odgovor: b
408
12/24/2018
205
Pitanje 2
Kod BST stabla poslednji čvor krajnje desne putanje koja polazi iz korenog čvora je čvor koji ima:a. najveći ključb. najmanji ključc. ključ proizvoljne vrednosti
Odgovor: a
409
Pitanje 3
Kod BST stabla poslednji čvor krajnje leve putanje koja polazi iz korenog čvora je čvor koji ima:a. najveći ključb. najmanji ključc. ključ proizvoljne vrednosti
Odgovor: b
410
12/24/2018
206
Pitanje 4
Preorder prolaskom kroz stablo na slici dobija se sekvenca: