View
41
Download
1
Category
Preview:
Citation preview
12/24/2018
1
Algoritmi i strukture podataka
Dr. Goran Aritonović
goran.aritonovic@bbs.edu.rs
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
12/24/2018
2
Šta je algoritam?
• Algoritam je skup pravila za rešavanje nekog problema
• Algoritam se sastoji iz konačnog skupa algoritamskih koraka
• Mora biti nedvosmisleno određen svaki sledeći korak za izvršavanje
• Moraju biti definisani početni objekti nad kojima se obavljaju operacije
• Ishod algoritma su završni objekti ili rezultati
• Za bilo koje vrednosti ulaznih podataka algoritam mora da završi rad nakon konačnog broja koraka
• Algoritmi se kreiraju nezavisno od jezika u kome će biti implementirani
3
Pojednostavljena slika algoritma
4
12/24/2018
3
Algoritamski problemi
• Primer: problem sortiranja
• Dat je niz brojeva koji imaju proizvoljni redosled, ovaj niz treba preurediti u rastući redosled
• Ulaz: niz a od n brojeva a1, a2, … , an
• Izlaz: niz istih brojeva permutovanih u niz ai1, ai2, ai3, ..., ain tako da je ai1 ≤ ai2 ≤ ai3 ≤ ... ≤ ain
Instanca problema sortiranja: 23, 17, 8, 15, 20, 15
Rešenje ove instance: 8, 15, 15, 17, 20, 23
5
Dizajn i analiza algoritama
• Dizajn algoritma - pisanje niza naredbi koje sačinjavaju algoritam za rešavanje datog problema
• Analiza algoritama - određivanje koliko algoritam zauzima resurse računara (vreme, memoriju, …)
• Dizajn i analiza algoritama nisu nezavisni već se prožimaju
6
12/24/2018
4
Zapis algoritama
• Komplikovane ideje algoritma treba izraziti na što jednostavniji način
• Treba koristiti notacija primerena za ljude, a ne za mašine
• Jedan od načina zapisivanja algoritma je dijagram toka - algoritamska šema
• zahtevaju dosta prostora
• Uglavnom se za zapisivanje algoritama koriste: prirodan jezik, pseudojezik i pravi programski jezik
• Pseudo jezik: mešavina prirodnog i programskih jezika (Java, Pascal, C, …)
7
Algoritmi i programi
• Program je opis algoritma koji u nekom programskom jeziku jednoznačno određuje šta računar treba da odradi
• Programiranje – proces prevođenja opšteg rešenja problema u računarski čitljiv oblik
8
12/24/2018
5
Grafički simboli u dijagramu toka -1
9
Početak
Kraj
Definiše početak algoritma
Definiše kraj algoritma
Ulazni podaci
Ulazne veličine algoritma
X>YUslovni algoritamski korak
X, Y
Grafički simboli u dijagramu toka -2
10
Z = X + Y Obrada podataka
Izlazni podaci
Izlazne veličine algoritma
Z
12/24/2018
6
Vrste algoritamskih šema
• Linijske algoritamske šeme• proste
• razgranate
• Ciklične algoritamske šeme
• Složene algoritamske šeme
11
Proste linijske algoritamske šeme
• Svaki algoritamski korak izvršava tačno jednom u toku jednog izvršavanja algoritma
• Sastoji se od algoritamskih koraka ulaza, obrade i izlaza
12
12/24/2018
7
Primer proste linijske šeme
13
Sastaviti algoritamsku šemu za izračunavanje vrednosti Y po sledećoj formuli:Y = X1 * (X2 – 3*X3),
tako da u jednom algoritamskom koraku može biti samo jedna aritmetička operacija.
Početak
X1, X2, X3
Y1 = 3 * X3
Y2 = X2 – Y1
Y = X1 * Y2
Y
Kraj
Realizacija algoritma u C# jeziku
14
static void Main(string[] args)
{
// Y = X1 * (X2 – 3*X3),
Console.WriteLine("Ucitaj X1");
double x1 = double.Parse(Console.ReadLine());
Console.WriteLine("Ucitaj X2");
double x2 = double.Parse(Console.ReadLine());
Console.WriteLine("Ucitaj X3");
double x3 = double.Parse(Console.ReadLine());
double y1 = 3 * x3;
double y2 = x2 - y1;
double y = x1 * y2;
Console.WriteLine($"Rezultat je: {y}");
Console.ReadLine();
}
12/24/2018
8
Osnove C# jezika
Formatiranje C# koda
• Program je skup instrukcija – naredbi
• Naredba se završava oznakom ;
• Iako je moguće pisati više naredbi u istoj liniji, dobra je praksa da se u svakoj liniji piše samo po jedna naredba
• Prazan prostor u editoru koda se ignoriše od strane kompajlera
• Grupisanje naredbi (kreiranje bloka naredbi) vrši se korišćenjem vitičastih zagrada {…}
16
{ // pocetak bloka naredbi naredba1; naredba2; // kraj bloka naredbi}
12/24/2018
9
Identifikatori
• Imena ili identifikatori se koriste za označavanje osnovnih objekta jezika: konstanti, promenljivih, funkcija i tipova podataka
• Ime može sadržati slovo, cifru i znak podvlačenja _
• Ime ne sme počinjati cifrom
• U svojstvu imena ne smeju se koristiti rezervisane reči jezika
• Velika i mala slova se razlikuju (x i X su dve različite promenljive)
17
Ugrađeni tipovi podataka
• Ugrađeni tipovi podataka su oni koje obezbeđuje C# i .NET framework
• Tipovi se koriste za deklarisanje promenljivih i konstanti
• Promenljive se moraju deklarisati pre nego što mogu da se koriste
• Promenljive čuvaju različite tipove podataka
• Moguće je definisati sopstvene tipove podataka
18
12/24/2018
10
Tipovi podataka
19
C# tip Veličina u bitovima Sistemski tip
sbyte 8 System.SByte
short 16 System.Int16
int 32 System.Int32
long 64 System.Int64
byte 8 System.Byte
ushort 16 System.UInt16
uint 32 System.UInt32
ulong 64 System.UInt64
char 16 System.Char
bool 8 System.Boolean
float 32 System.Single
double 64 System.Double
decimal 128 System.Decimal
string nije raspoloživo System.String
object nije raspoloživo System.Object
dynamic nije raspoloživo System.Object
Celobrojni tipovi podataka
20
Type Range Size .NET Framework type
int -2,147,483,648 to 2,147,483,647 Signed 32-bit integer System.Int32
Type Range Size .NET Framework type
short -32,768 to 32,767 Signed 16-bit integer System.Int16
Type Range Size .NET Framework type
long–9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
Signed 64-bit integer System.Int64
Type Range Size .NET Framework type
uint 0 to 4,294,967,295 Unsigned 32-bit integer System.UInt32
12/24/2018
11
Deklarisanje i inicijalizacija celobrojnihpromenljivih
21
// dodeljivanje vrednosti promenljivamabrojStudenata = 85;brojGrupa = 5;
// deklarisanje celobrojnih promenljivihint brojStudenata;int brojGrupa;
int brojStudenata = 85;int brojGrupa = 5;
Realni tipovi
22
Type Approximate Range
Precision .NET Framework type
decimal±1.0 × 10−28 to ±7.9 × 1028
28-29 significant digits
System.Decimal
Type Approximate range
Precision .NET Framework type
float±1.5 × 10−45 to ±3.4 × 1038 7 digits System.Single
Type Approximate range
Precision .NET Framework type
double±5.0 × 10−324 to ±1.7 × 10308 15-16 digits System.Double
12/24/2018
12
Primeri definisanja realnih promenljivih
23
Broj sa decimalnom tačkom podrazumevano je tipa double
double x = 3.14; //3.14d 3.14Dfloat y = 2.51f; //2.51Fdecimal z = 4.23m;//4.23M
decimal stanjeNaRacunu = 3433.20; // greška !!!
decimal stanjeNaRacunu = 3433.20M;
Implicitna i eksplicitna konverzija
24
static void Main(string[] args){
int a = 4;float b = a; // implicitna konverzijaConsole.WriteLine(b);Console.WriteLine("a={0}, b= {1}",a,b);Console.WriteLine($"a={a}, b= {b}");
b = 4.5f;int c = (int)b; // eksplicitna konverzija, kastovanjeConsole.WriteLine($"b={b}, c={c}");
Console.ReadLine();}
12/24/2018
13
Tip char
25
Type Range Size .NET Framework type
charU+0000 to U+ffff
Unicode 16-bit character
System.Char
static void Main(string[] args){
char c1 = 'X';char c2 = '\x0058';char c3 = (char)88;char c4 = '\u0058';Console.WriteLine($"{c1}{c2}{c3}{c4}");
}
Escape karakteri
26
Escape sekvenca Proizvedeni karakter Unicode vrednost karaktera
\' jednostruku znak navoda 0x0027
\ " dvostruki znak navoda 0x0022
\\ Backslash
(obrnuta kosa crta)
0x005C
\0 Null 0x0000
\a zvuk zvona 0x0007
\b Backspace 0x0008
\f Form feed 0x000C
\n nova linija 0x000A
\r Carriage return 0x000D
\t Horizontal tab 0x0009
\v Vertical tab 0x000B
char jednostrukiNavodnik = '\'';
12/24/2018
14
Deklaracija stringova
27
static void Main(string[] args){
string s1 = "Pozdrav svima";Console.WriteLine(s1);
string s2 = "Pozdrav\t\tsvima";Console.WriteLine(s2);
string s3 = "Pozdrav\nsvima";Console.WriteLine(s3);
Console.ReadLine();}
Upotreba karaktera @ ispred stringa
28
static void Main(string[] args){
string s1 = @"Pozdrav \ svima";Console.WriteLine(s1);
string s2 = "Pozdrav \\ svima";Console.WriteLine(s2);
string s3 = @"Pozdrav\t\tsvima";Console.WriteLine(s3);
string s4 = @"Pozdrav\nsvima";Console.WriteLine(s4);
Console.ReadLine();}
12/24/2018
15
Pitanje 1
Koji se od navedenih tipova podataka može koristiti isključivo za čuvanje celih brojeva:a. floatb. doublec. int
Odgovor: c
29
Pitanje 2
Sistemski C# tip koji odgovara tipu podataka float je:a. Doubleb. Singlec. Decimal
Odgovor: b
30
12/24/2018
16
Pitanje 3
Svaka naredba u C# završava se oznakom:a. ;b. :c. \\
Odgovor: a
31
Pitanje 4
Ako želimo najveću preciznost u radu sa realnim brojevima koristićemotip podataka:a. floatb. doublec. decimal
Odgovor: c
32
12/24/2018
17
Operatori
Osnovni operator dodeljivanja
• Izraz je sekvenca operatora i operanada
• Konstante ili promenljive koje učestvuju u izrazima nazivaju se operandi
• Operator je simbol koji precizira koju akciju treba izvršiti nad operandima
• Operacije nad jednim operandom nazivaju se unarne operacije, a operacije nad dva operanda nazivaju se binarne operacije
• Osnovni operator dodeljivanja je binarni i predstavlja se simbolom =
• Osnovni operator dodeljivanja ( = ) prouzrokuje da se vrednost operanda na desnoj strani dodeli operandu na levoj strani
• Operatori dodeljivanja imaju najniži prioritet
34
12/24/2018
18
Primeri upotrebe osnovnog operatora dodeljivanja
35
x = 10; Promenljivoj x se dodeljuje vrednost 10
y = x; Promenljivoj y se dodeljuje vrednost promenljive x
x = x + 1;Promenljivoj x se dodeljuje stara vrednost promenljive x uvećana za broj 1
Pregled operatora
• Aritmetički operatori
• Inkrementiranje i dekrementiranje
• Operatori poređenja
• Logički operatori
36
12/24/2018
19
Aritmetički operatori
• Aritmetičke operacije su:• Množenje (*)
• Deljenje (/)
• Celobrojni ostatak (%)
• Sabiranje i oduzimanje (+, -)
• Najveći prioritet ima unarni minus, zatim multiplikativne operacije i na kraju su aditivne operacije
37
Primer upotrebe aritmetičkih operatora
38
static void Main(string[] args){
Console.WriteLine("Unesite ceo broj a");string sa = Console.ReadLine();int a = int.Parse(sa);
Console.WriteLine("Unesite ceo broj b");string sb = Console.ReadLine();int b = int.Parse(sb);
int suma = a + b;int razlika = a - b;
Console.WriteLine($"{a} + {b} = {suma}, {a} - {b} = {razlika}");Console.ReadLine();
}
12/24/2018
20
Inkrementiranje i dekrementiranje
• Operacija inkrementiranja (++)
• Operacija dekrementiranja (--)
• Obe operacije mogu imati prefiksni oblik tj. nalaze se ispred promenljive i sufiksni oblik tj. nalaze se iza promenljive
• Većeg su prioriteta od aritmetičkih operatora
39
y = ++x;x =x+1;
y =x;
y = x++;y =x;
x =x+1;
Operatori složenog dodeljivanja
40
x += 2; // x = x+2;x *= 2; // x = x*2;x -= 2; // x = x-2;x /= 2; // x = x/2;x %= 2; // x = x%2;;
12/24/2018
21
Operatori poređenja
• Operacije poređenja su:
• Veće (>)
• Veće ili jednako (>=)
• Manje (<)
• Manje ili jednako (<=)
• Jednako (==)
• Različito (!=)
• Rezultat izvršavanja operacije je logička vrednost true ako je uslov ispunjen, u suprotnom je false.
• Manjeg su prioriteta od aritmetičkih operatora
41
Primer upotrebe operatora poređenja
42
static void Main(string[] args){
Console.WriteLine("Unesi prvi realan broj");float f1 = float.Parse(Console.ReadLine());
Console.WriteLine("Unesi drugi realan broj");float f2 = float.Parse(Console.ReadLine());
bool a = f1 > f2;bool b = f1 < f2;bool c = f1 == f2;bool d = f1 != f2;
Console.WriteLine($"{f1}>{f2}={a}\n" +$"{f1}<{f2}={b}\n" +$"{f1}=={f2}={c}\n" +$"{f1}!={f2}={d}\n");
Console.ReadLine();}
}
12/24/2018
22
Logičke operacije
• Negacija (!)
• Konjukcija – logičko I (&&)
• Disjunkcija- logičko ILI (||)
• 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());
int i = 1;double suma = 0;while (i <= n){
suma += i;i++;
}
Console.WriteLine($"Zbir brojeva je: {suma}");Console.ReadLine();
}
Petlja for
70
for (inicijalizacija; provera_uslova; korekcija){
naredba_1;naredba_2;.....naredba_n;
}
Inicijalizacija
Provera uslova true Telo forpetlje
Korekcija
false
Izlaz for petlje
naredba iza for petlje
12/24/2018
36
Primeri upotrebe for petlje
71
static void Main(string[] args){
for (int i = 0; i < 10; i++){
Console.WriteLine(i);}
Console.WriteLine("..............................");
for (int i = 9; i >= 0; i--){
Console.WriteLine(i);}
Console.ReadLine();}
Specijalni slučajevi ciklusa for
72
static void Main(string[] args){
int i = 0;for (;i < 10; ){
Console.WriteLine(i);i++;
}Console.ReadLine();
}
12/24/2018
37
Beskonačna for petlja
73
static void Main(string[] args)
{
int i = 0;
for (;;)
{
Console.WriteLine(i);
i++;
if (i > 9)
{
break;
}
}
Console.ReadLine();
}
Stepen celog broja
74
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
89
static void PisiNiz(int[] x){
foreach (int i in x){
Console.Write(i + "\t");}Console.WriteLine();
}
static void Main(string[] args){
int[] x1 = new int[10];
Random rnd = new Random();
for (int i = 0; i < 10; i++){
x1[i] = rnd.Next(21);}PisiNiz(x1);Console.ReadLine();
}
Funkcija za učitavanje niza preko konzole
static void CitajNiz(int[] x){
for (int i = 0; i < x.Length; i++){
Console.Write($"x[{i}]= ");x[i] = int.Parse(Console.ReadLine());
}}
90
12/24/2018
46
Primer učitavanja i štampanja niza
static void Main(string[] args)
{
Console.WriteLine("Unesi broj clanova niza:");
int n = int.Parse(Console.ReadLine());
int[] x = new int[n];
CitajNiz(x);
Console.WriteLine("Uneli ste sledeci niz:");
PisiNiz(x);
Console.ReadLine();
}
91
Srednja vrednost niza
static double SrednjaVrednost(int[] x){
int zbir = 0;foreach (int i in x){
zbir += i;}return (double)zbir / x.Length;
}
92
12/24/2018
47
Nalaženje srednje vrednosti niza
static void Main(string[] args)
{
Console.WriteLine("Unesi broj clanova niza:");
int n = int.Parse(Console.ReadLine());
int[] x = new int[n];
CitajNiz(x);
Console.WriteLine("Uneli ste sledeci niz:");
PisiNiz(x);
double xSr = SrednjaVrednost(x);
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);
Console.WriteLine($"{ind1},{ind2}");Console.ReadLine();
}
108
12/24/2018
55
Upotreba metoda klase Array
109
static void Main(string[] args){
string[] imena = { "Laza", "Pera", "Mika", "Aca" };string[] kopija = new string[imena.Length];
Array.Copy(imena, kopija, imena.Length);Array.Sort(imena);
foreach (string ime in kopija){
Console.WriteLine(ime);}Console.WriteLine(".........................");
foreach (string ime in imena){
Console.WriteLine(ime);}
Console.ReadLine();}
Pitanje 1
Ukoliko se C# niz inicijalizuje pri deklarisanju a. obavezno je izvršiti i njegovo instanciranjeb. generiše se greška jer to nije dozvoljeno
c. nije potrebno izvršiti njegovo eksplicitno instanciranje
Odgovor: c
110
12/24/2018
56
Pitanje 2
Celobrojni niz koji koji može da čuva 5 celih brojeva instancira se kao:a. int[] x = new int[5];b. int[x] = new int(5);c. int x = new int[5];
Odgovor: a
111
Pitanje 3
112
Koji je indeks poslednjeg elementa C# niza od 10 elemenata?a. 9b. 8c. 0d. 10
Odgovor: a
12/24/2018
57
Pitanje 4
113
Klasa u C# programskom jeziku koja omogućava manipulaciju sa nizovima je?a. Arrayb. Objectc. List
Odgovor: a
Dvodimenzionalni nizovi
12/24/2018
58
Dvodimenzionalni nizovi (matrice)
115
int[,] x = new int[3, 4];// deklaracija I instanciranje 2D niza od tri vrste i četiri kolone
x[0,0] x[0,1] x[0,2] x[0,3]
x[1,0] x[1,1] x[1,2] x[1,3]
x[2,0] x[2,1] x[2,2] x[2,3]
i=0,1,2
j=0,1,2,3
x[i,j] – u preseku i-te vrste i j-te kolone matrice
Dvodimenzionalan niz
116
static void Main(string[] args){
int[,] x = new int[3, 4];
for (int i = 0; i < 3; i++){
for (int j = 0; j < 4; j++){
Console.Write(x[i,j] + "\t");}Console.WriteLine();
}Console.ReadLine();
}
12/24/2018
59
Inicijalizacija 2D niza
117
static void Main(string[] args){
//int[,] x = new int[3, 4];int[,] x = {
{1,2,3,4},{2,3,4,5},{3,4,5,6}
};
for (int i = 0; i < 3; i++){
for (int j = 0; j < 4; j++){
Console.Write(x[i, j] + "\t");}Console.WriteLine();
}Console.ReadLine();
}
Dimenzije 2D niza
118
static void Main(string[] args){
int[,] x = {{1,2,3,4},{2,3,4,5},{3,4,5,6}
};
int brojVrsta = x.GetLength(0);int brojKolona = x.GetLength(1);
Console.WriteLine($"Vrsta: {brojVrsta}");Console.WriteLine($"Kolona: {brojKolona}");
Console.ReadLine();}
12/24/2018
60
Štampanje članova 2D niza
119
static void Pisi2DNiz(int[,] x){
int brojVrsta = x.GetLength(0);int brojKolona = x.GetLength(1);
for (int i = 0; i < brojVrsta; i++){
for (int j = 0; j < brojKolona; j++){
Console.Write(x[i, j] + "\t");
}Console.WriteLine();
}}
Poziv metode za štampanje
120
static void Main(string[] args){
int[,] x1 = {{ 1, 2, 3, 4, 5 },{ 6, 7, 8, 9, 10 }
};Pisi2DNiz(x1);Console.ReadLine();
}
12/24/2018
61
Metoda za učitavanje 2D niza
121
static void Citaj2DNz(int[,] x){
int brojVrsta = x.GetLength(0);int brojKolona = x.GetLength(1);
for (int i = 0; i < brojVrsta; i++){
for (int j = 0; j < brojKolona; j++){
Console.WriteLine($"x[{i},{j}]=?");x[i, j] = int.Parse(Console.ReadLine());
}}
}
Iscrtavanje linije na konzoli
122
static void Linija(int n){
//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:
f(1) =1, f(2) =1f(3) = f(1) + f(2) = 2f(4) = f(2) + f(3) = 1 + 2 = 3
f(n) = f(n-2) + f(n-1), za n >2
static int Fibonaci(int n){
if (n<3){
return 1;}else{
return Fibonaci(n - 2) + Fibonaci(n - 1);}
}
12/24/2018
71
Računanje n-tog člana Fibonačijevog niza
141
static void Main(string[] args){
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
NZD(30,18) = NZD(18%30,30) = NZD(18,30) = NZD(30%18,18) = NZD(12,18) = NZD(18%12,12) =NZD(6,12) = NZD(12 %6, 6) = NZD(0,6) = 6
public static int Euklid(int m, int n){
if (m == 0){
return n;}else{
return Euklid(n%m,m);}
}
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
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){
ukupnoVreme += vr;}
Console.WriteLine($"Proteklo vreme: { ukupnoVreme/10} ms");Console.ReadLine();
}
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)
{5 if (x[i] < xmin)
{6 xmin = x[i];7 jmin = i;
}8 i++;
}9 return jmin;
}
Red 1 2 3 4567
8 9
Vreme izvršavanja 1 1 1 n-1 3 1 1
T(n) = 1 + 1 + 1 + (n-1)(3 + 1) + 1 = 4 + 4(n-1) T(n) = 4n
n - broj clanova niza x.Length
176
12/24/2018
89
Zadatak 1 – odrediti vreme izvršavanja algoritma
Red 1 2 3
Vreme izvršavanja
1 n 1
T(n) = 1 + n·1
T(n) = 1 + n
1 if (x == 0){2 for (int i = 0; i < n; i++)
{3 a[i] = i;
}}
177
Zadatak 2 – odrediti vreme izvršavanja algoritma
Red 125
3 4
Vreme izvršavanja 1 n-1 1 1
1 int i = 1;2 do
{3 a[i] = b[i] + c[i];4 i++;
}5 while (i < n);
T(n) = 1 + (n-1)(1 + 1)
T(n) = 2n - 1
178
12/24/2018
90
O-zapis
• 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 𝑓 𝑛 = 𝑂(𝑙𝑜𝑔𝑛)
183
Primeri određivanja velikog O
184
12/24/2018
93
Primeri nalaženja gornje granice
185
𝑓 𝑛 = 3𝑛 + 83𝑛 + 8 ≤ 4𝑛, 𝑛 ≥ 8
𝑓 𝑛 = 𝑂 𝑛 , 𝑐 = 4, 𝑛0 = 8
𝑓 𝑛 = 𝑛2 + 1 ≤ 2𝑛2, 𝑛 ≥ 1𝑓 𝑛 = 𝑂 𝑛2 , 𝑐 = 2, 𝑛0 =1
𝑓 𝑛 = 2𝑛3 −2𝑛2 ≤ 2 𝑛3, 𝑧𝑎 𝑛 ≥ 1𝑓 𝑛 = 𝑂(𝑛3), 𝑐 = 2, 𝑛0 =1
Asimptotsko vreme izvršavanja algoritama
186
for (int i = 0; i < n; i++){
for (int j = 0; j < n; j++){
a[i, j] = 0;}
}
for (int i = 0; i < n; i++){
a[i, i] = 1;}
T(n) = n2 + n
T(n) = O(n2)
za veliko n dominira kvadratni član
12/24/2018
94
Asimptotsko vreme izvršavanja algoritama
187
for (int i = 0; i < n; i++){
for (int j = 0; j < n; j++){
if (i ==j){
a[i, j] = 1;}else{
a[i, j] = 0;}
}}
T(n) = n2
T(n) = O(n2)
Pitanje 1
188
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
198
Niz x pre trećeg prolaska
Niz x posle trećeg prolaska
12/24/2018
100
Prolazak n-1
• Nađi najmanji od elemenata x[n-2] i x[n-1]
• Pronađeni element razmeni sa x[n-2]
• Posle prolaska n-1 niz će biti sortiran
199
Niz x pre prolaska n-1
Niz x posle prolaska n-1Niz je sortiran
Algoritam Selection Sortstatic void SelectionSort(int[] x){
int n = x.Length;int temp = 0;int minIndex = 0;for (int i = 0; i < n - 1; i++){
minIndex = i;for (int j = i + 1; j < n; j++){
if (x[j]<x[minIndex]){
minIndex = j;}
}
if (i != minIndex){
temp = x[i];x[i] = x[minIndex];x[minIndex] = temp;
}
//Console.Write($"Prolazak: {i + 1}\t ");//PisiNiz(x);//Linija(80);
}} 200
12/24/2018
101
Pomoćne funkcijestatic 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();
}
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--){
for (int j = 0; j <= i; j++){
if (x[j] > x[j+1]){
temp = x[j];x[j] = x[j + 1];x[j + 1] = temp;
}}//Console.Write($"Prolazak: {n-i-1}\t ");//PisiNiz(x);//Linija(70);
}} 212
12/24/2018
107
Sortiranje primenom Bubble Sort algoritma
213
Poboljšani Bubble Sort algoritamstatic void BublleSortPoboljsani(int[] x){
int n = x.Length;int temp = 0;int brojRazmena = 0;for (int i = n - 2; i >= 0; i--){
brojRazmena = 0;for (int j = 0; j <= i; j++){
if (x[j] > x[j + 1]){
temp = x[j];x[j] = x[j + 1];x[j + 1] = temp;brojRazmena++;
}}Console.Write($"Prolazak: {n - i - 1}\t ");PisiNiz(x);Linija(70);
if (brojRazmena == 0){
break;}
}} 214
12/24/2018
108
Analiza Bubble Sort algoritma -1
• Ako je niz već sortiran• Samo jedan prolazak
• Ukupno n-1 poređenja
• 0 razmena
• Vremenska kompleksnost O(n)
• Ako je niz sortiran u opadajućem poretku• n-1 prolazak
• Poređenja: (𝑛 − 1) + (𝑛 − 2) + ⋯ .+ 2 + 1 = (𝑛 − 1)𝑛/2
• Razmena: (𝑛 − 1)𝑛/2
• Vremenska kompleksnost 𝑂(𝑛2)
1 + 2 + 3 +⋯+ 𝑛 = 𝑛/2(𝑛 + 1) - suma aritmetičkog niza215
Analiza Bubble Sort algoritma -2
• Podaci su slučajno raspoređeni
• Broj poređenja u i-tom prolasku je n-i
• Neka je p ukupan broj prolazaka 𝑝 ≤ 𝑛 − 1
• Broj poređenja: 𝑛 − 1 + 𝑛 − 2 +⋯+ 𝑛 − 𝑝 = 𝑛𝑝 −𝑝
2𝑝 + 1
• Vremenska kompleksnost 𝑂(𝑛2)
216
12/24/2018
109
Algoritam Insertion Sort
• 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
12/24/2018
113
Treći prolazak
225
temp = 10 x[2]=45 >temp45 pomeram desno, x[3] =45x[1] = 32 > temp32 pomeram desno x[2] =32x[0]=23 >temp pomeram desno x[1]=23
na staroj poziciji broja 23 (koji je poslednji pomeren u desno)upisujem vrednost smeštenu u temp, x[0] =10
Četvrti prolazak
226
temp = 30
12/24/2018
115
Sedmi prolazak
229
temp = 28
Implementacija algoritma
230
static void InsertionSort(int[] x){
int n = x.Length;int temp = 0;int j = 0;for (int i = 1; i < n; i++){
temp = x[i]; j = i;while (j > 0 && x[j - 1] >= temp){
x[j] = x[j - 1];j--;
}x[j] = temp;//Console.Write($"Prolazak: {i}\t ");//PisiNiz(x);//Linija(80);
}}
12/24/2018
116
Poziv algoritma
231
static void Main(string[] args){
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){
temp[k++] = a2[j++];}
return temp;} 244
12/24/2018
123
Pomoćne funkcijestatic int[] KreirajSortiraniNiz(int n){
int[] x = new int[n];for (int i = 0; i < n; i++){
x[i] = rnd.Next(1, 101); // od 1 do 100}Array.Sort(x);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, '_'));
}
public static Random rnd = new Random();// Generator je staticko polje klase Program
245
Poziv funkcije za spajanje nizova
static void Main(string[] args){
int[] a1 = KreirajSortiraniNiz(4);int[] a2 = KreirajSortiraniNiz(5);
int[] temp = Merge(a1,a2);
PisiNiz(a1);Linija(70);PisiNiz(a2);Linija(70);
PisiNiz(temp);
Console.ReadLine();}
246
12/24/2018
124
Rezultat spajanja nizova
247
Algoritam Merge Sort
• Niz se rekurzivno deli na dva dela, sve dok dužina niza ne postane 1
• Nizovi dužine 1 mogu se smatrati sortiranim nizovima i spajaju se u novi sortirani niz
• Nastavlja se spajanje sortiranih nizova sve dok se ne dobije ceo niz
248
12/24/2018
125
Algoritam Merge Sort
249
Adaptirana funkcija Merge()
public static void Merge(int[] a, int[] temp, int low1, int up1, int low2, int up2){
int i = low1;int j = low2;int k = low1;
while (i<=up1 && j<=up2){
if (a[i] <a[j]){
temp[k++] = a[i++];}else{
temp[k++] = a[j++];}
}
while (i <=up1){
temp[k++] = a[i++];}
while (j <=up2){
temp[k++] = a[j++];}
}
• Od niza a kreira se niz temp• low1, up1 – granice prvog podniza niza a• low2, up2 –granice drugog podniza niza a
250
12/24/2018
126
Funkcija za kopiranje dela niza temp[] u deo niza a[]
251
public static void Copy(int[] a, int[] temp, int low, int up){
for (int i = low; i <= up; i++){
a[i] = temp[i];}
}
Rekurzivna funkcija Sort sa parametrima
252
public static void Sort(int[] a, int[] temp, int low, int up){
if (low == up){
// samo jedan elementreturn;
}
int mid = (low + up) / 2;
Sort(a, temp, low, mid);Sort(a, temp, mid + 1, up);
Merge(a, temp, low, mid, mid + 1, up);Copy(a, temp, low, up);
}
12/24/2018
127
Funkcija MergeSort()
253
public static void MergeSort(int[] a){
int n = a.Length;
int[] temp = new int[n];
Sort(a, temp, 0, n - 1);}
Poziv funkcije MergeSort()
254
static void Main(string[] args){
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
• Prosečna vremenska kompleksnost je O(nlogn)
265
Pitanje 1
266
Algoritam Quick Sort je:a. iterativni algoritamb. rekurzivni algoritam
Odgovor: b
12/24/2018
134
Pitanje 2
267
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());
Stopwatch t1 = new Stopwatch();t1.Start();int indeks1 = LinSearch(x, a);t1.Stop();TimeSpan vreme1 = t1.Elapsed;t1.Reset();
t1.Start(); int indeks2 = LinSearchSentinel(x, a); t1.Stop();
TimeSpan vreme2 = t1.Elapsed;
Console.WriteLine($"LinSearch:{vreme1}");Console.WriteLine($"LinSearchSentinel:{vreme2}");
Console.WriteLine($"Indeks1: {indeks1}, Indeks2: {indeks2}");
Console.ReadLine();}
278
12/24/2018
140
Rezultat eksperimenta
279
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
12/24/2018
144
Pitanje 1
287
Vremenska kompleksnost algoritma linearnog pretraživanja je:a. O(n)b. O(log n)c. O(n2)
Odgovor: a
Pitanje 2
288
Vremenska kompleksnost algoritma binarnog pretraživanja je:a. O(n)b. O(log n)c. O(n2)
Odgovor: b
12/24/2018
145
Pitanje 3
289
Algoritam binarnog pretraživanja:a. zahteva da podaci prethodno budu sortiranib. ne zahteva da podaci prethodno budu sortirani
Odgovor: a
Liste
12/24/2018
146
Linearne strukture podataka
• Svakom element linearne strukture osim prvog prethodi tačno jedan element
• Svakom element linearne strukture osim poslednjeg sledi tačno jedan element
• Primeri linearnih struktura:• Liste
• Stekovi
• Redovi
291
Linerana
struktura
Prvi Poslednji
Liste
• Dinamička struktura podataka sačinjena od elemenata koji se nazivaju čvorovi
• Podaci se ne čuvaju u uzastopnim memorijskim lokacijama
• Veličina niza se unapred definiše dok veličina liste dinamički raste
• Unos i brisanje elemenata su manje kompleksne operacije nego kod nizova
• Nije moguć direktni pristup elementu liste, već se elementu pristupa sekvencijalno
• Liste zahhtevaju dodatni prostor za čuvanje pointera na sledeći član liste
292
12/24/2018
147
Jednostruko povezana lista
• Jednostruko povezana lista je skup čvorova povezanih pokazivačima u jednom smeru
• Svaki element liste osim poslednjeg ima jednog sledbenika
• Krajnji čvor liste ne pokazuje na neki čvor, odnosno sadrži NULL pokazivač
• Čvor liste se sastoji iz dva dela:• informacionog dela, gde se nalaze podaci
• link deo koji pokazuje na sledeći čvor
293
Primer jednostruko povezane liste
294
12/24/2018
148
Klasa Node
public class Node{
public int info;public Node link;
public Node(int info){
this.info = info;link = null;
}}
295
Klasa LinkedList
public class LinkedList{
private Node start;
public LinkedList(){
start= null;}
}
296
12/24/2018
149
Dodavanje čvora na kraj liste
297
Dodavanje čvora na kraj liste
public void DodajNaKraj(int info){
//kreiranje novog objekta klase NodeNode temp = new Node(info);
//ako je lista praznaif (start == null){
start = temp; // kreirani cvor je prvi element liste} else{
Node p = start;
while (p.link != null){
p = p.link; } p.link = temp;
}}
298
12/24/2018
150
Prolazak kroz listu
public void PrikaziListu(){
Node p = start;
if (p == null){
Console.WriteLine("Lista je prazna");}while (p != null){
Console.Write(p.info + "\t");p = p.link;
}Console.WriteLine();
}299
Kreiranje listestatic void Main(string[] args){
LinkedList lista1 = new LinkedList();
lista1.DodajNaKraj(10);lista1.DodajNaKraj(20);lista1.DodajNaKraj(30);lista1.DodajNaKraj(40);lista1.DodajNaKraj(50);lista1.PrikaziListu(); Console.ReadLine();
}
300
12/24/2018
151
Brojanje čvorova
public int BrojCvorova(){
int n = 0;Node p = start;
while (p != null){
n++;p = p.link;
}return n;
}
301
Brojanje čvorova
static void Main(string[] args){
LinkedList lista1 = new LinkedList();
lista1.DodajNaKraj(10);lista1.DodajNaKraj(20);lista1.DodajNaKraj(30);lista1.DodajNaKraj(40);lista1.DodajNaKraj(50);lista1.PrikaziListu();Linija(100);
Console.WriteLine("Broj cvorova:" + lista1.BrojCvorova());Console.ReadLine();
}
302
12/24/2018
152
Pronalaženje elementa liste na osnovu vrednosti
303
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++){
p = p.link; }return p;
}
314
12/24/2018
158
Pronalaženje elementa na pozicijiConsole.WriteLine("Pretraga pozicije 2");p = lista1.Pronadji(2);if (p != null){
Console.WriteLine(p.info);}else{
Console.WriteLine("Ne postoji");}
315
Ubacivanje novog čvora na početak liste
public void DodajNaPocetak(int info){
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;
}}
319
Ubacivanje čvora na poziciju
320
LinkedList lista1 = new LinkedList();
lista1.DodajNaKraj(10);lista1.DodajNaKraj(20);lista1.DodajNaKraj(30);lista1.DodajNaKraj(40);lista1.DodajNaKraj(50);lista1.PrikaziListu();Linija(100);Console.WriteLine("Na poziciju 2 ubacujem 25");lista1.DodajNaPoziciju(2, 25);lista1.PrikaziListu();
12/24/2018
161
Uklanjanje elementa iz liste
• p je prethodni element elementa koga brišemo
• 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.Write($" {i} |");}Console.WriteLine("--Dno");Linija(100);
}else{
Console.WriteLine("Stek je prazan");}
}
static void Linija(int n){
Console.WriteLine("".PadRight(n,'_'));}
Korisnički interfejs
332
do{
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();
if (izbor == "1"){
//1}else if (izbor == "2"){
//2 }else if (izbor == "3"){
//3}else if (izbor == "4"){
break;}else{
Console.WriteLine("Neispravan unos");novaOperacija = "d";continue;
}
Console.WriteLine("Da li zelite novu operaciju? ");Console.WriteLine("Da -> Pritisni taster d");Console.WriteLine("Ne -> Pritisni taster n");Linija(100);
novaOperacija = Console.ReadLine();} while (novaOperacija == "d" || novaOperacija == "D");
static void Main(string[] args){
celobrojniStek.Push(10);celobrojniStek.Push(20);celobrojniStek.Push(30);celobrojniStek.Push(50);Stampaj();string novaOperacija = "";string izbor;// do-while petlja
}
12/24/2018
167
Stavljanje elementa na stek//1while (true){
Console.Write("Unesite ceo broj: ");if (int.TryParse(Console.ReadLine(), out int temp)){
celobrojniStek.Push(temp);Stampaj();break;
}else{
Console.WriteLine("Neispravan unos");Linija(100);
}}
333
Stavljanje elementa na stek
334
12/24/2018
168
Skidanje elementa sa steka
335
//2if (celobrojniStek.Count >0){
celobrojniStek.Pop();Stampaj();
}else{
Console.WriteLine("Stek je prazan");}
Skidanje elementa sa steka
336
12/24/2018
169
Pregled vrha steka
337
//3Console.WriteLine("Vrh steka: " + celobrojniStek.Peek());Linija(100);
Red
338
12/24/2018
170
Klasa Queue<T>
• Queue<T> predstavlja FIFO kolekciju objekata (first –in, first-out)
• Metoda Enqueue(T) dodaje objekat na kraj reda
• Metoda Dequeue() uklanja prvi element iz reda
• Svojstvo Count daje broj elemenata uredu
• Metoda Contains(T) utvrđuje da li se element nalazi u redu
• Metoda Peek() vraća objekat sa početka reda bez njegovog uklanjanja iz reda
• Metoda Clear() uklanja sve objekte iz reda Queue<T>
339
Štampanje reda
340
static Queue<int> celobrojniRed = new Queue<int>();
static void Stampaj(){
if (celobrojniRed.Count > 0){
Linija(100);Console.Write("Prvi <--");foreach (int i in celobrojniRed){
Console.Write($" {i} |");}Console.WriteLine("--Poslednji");Linija(100);
}else{
Console.WriteLine("Red je prazan");}
}
12/24/2018
171
Korisnički interfejs
341
Ubacivanje u redwhile (true){
Console.Write("Unesite ceo broj: ");if (int.TryParse(Console.ReadLine(), out int temp)){
celobrojniRed.Enqueue(temp);Stampaj();break;
}else{
Console.WriteLine("Neispravan unos");Linija(100);
}}
342
12/24/2018
172
Ubacivanje u red
343
Prvi element u redu
344
Console.WriteLine("Pocetak reda: " + celobrojniRed.Peek());Linija(100);
12/24/2018
173
Uklanjanje elementa sa početka reda
345
if (celobrojniRed.Count > 0){
celobrojniRed.Dequeue();Stampaj();
}else{
Console.WriteLine("Stek je prazan");}
Uklanjanje elementa sa početka reda
346
12/24/2018
174
Pitanje 1
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
Čvor binarnog stabla
358
class Cvor{
public char Podatak { get; set; }public Cvor Levo { get; set; }
public Cvor Desno { get; set; }
public Cvor(char podatak){
Podatak = podatak;Levo = null;Desno = null;
}}
12/24/2018
180
Klasa Bstablo
359
class Bstablo{
public Cvor koren;
public Bstablo(){
koren = null;}
public bool PraznoStablo(){
return koren == null;}
}
Prolazi kroz binarno stablo stablo
• Obići čvorove datog stabla a da se pri tome svaki čvor poseti tačno jednom
• Posećuje se koreni čvor N
• Prolazi se kroz levo podstablo L
• Prolazi se kroz desno podstablo R
• Tri su standardna načina• Preorder NLR (koren, levo podstablo, desno podstablo)
• Inorder LNR (levo podstablo, koren, desno podstablo)
• Postorder LRN (levo podstablo, desno podstablo, koren)
360
12/24/2018
181
Preorder prolaz
• Poseti se koreni čvor
• Poseti se levo podstablo L na preorder način
• Poseti se desno podstablo na preorder način
361
Preorder prolaz
362
private void PreorderProlaz(Cvor cvor){
if (cvor == null)return;
// ispisi koren (trenutni element)Console.Write(cvor.Podatak + " ");// obidji Levo podstabloPreorderProlaz(cvor.Levo);// obidji Desno podstabloPreorderProlaz(cvor.Desno);
}
public void PreorderProlaz(){
PreorderProlaz(koren);Console.WriteLine();
}
12/24/2018
184
Inorder prolaz kroz binarno stablo
• Poseti se levo podstablo na inorder način
• Poseti se koreni čvor
• Poseti se desno podstablo na inorder način
367
Inorder prolaz
368
private void InorderProlaz(Cvor cvor){
if (cvor == null)return;
// obidji Levo podstabloInorderProlaz(cvor.Levo);// ispisi koren (trenutni element)Console.Write(cvor.Podatak + " ");// obidji Desno podstabloInorderProlaz(cvor.Desno);
}
public void InorderProlaz(){
InorderProlaz(koren);Console.WriteLine();
}
12/24/2018
186
Postorder prolazak kroz stablo
• Prolazi se kroz levo podstablo na postorder način
• Prolazi se kroz desno podstablo na postorder način
• Posećuje se koreni čvor
371
Postorder prolazak kroz stablo
372
private void PostorderProlaz(Cvor cvor){
if (cvor == null){
return;}
PostorderProlaz(cvor.Levo);PostorderProlaz(cvor.Desno);Console.Write(cvor.Podatak + " ");
}
public void PostorderProlaz(){
PostorderProlaz(koren);Console.WriteLine();
}
12/24/2018
188
Visina binarnog stabla
• Visina praznog stabla je nula
• Visina stabla je h = 1 + max(hL,hR)• hL –visina levog podstabla
• hR-visina desnog podstabla
375
Visina binarnog stabla
376
12/24/2018
189
Visina binarnog stabla
377
private int Visina(Cvor cvor){
if (cvor == null){
return 0;}int hL = Visina(cvor.Levo);int hR = Visina(cvor.Desno);
if (hL > hR){
return hL + 1;}else{
return hR + 1;}
}
public int Visina(){
return Visina(koren);}
Kreiranje stabla
378
public void KreirajStablo(){
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
196
Klasa koja predstavlja čvor BST stabla
391
class CvorStabla{
public int Podatak { get; set; }public CvorStabla Levo { get; set; }
public CvorStabla Desno { get; set; }
public CvorStabla(int podatak){
Podatak = podatak;Levo = null;Desno = null;
}}
Klasa koja predstavlja BST stablo
392
class BstStablo{
// koreni cvorpublic CvorStabla koren;
public BstStablo(){
koren = null;}
public bool PraznoStablo(){
return koren == null;}
}
12/24/2018
197
Preorder prolaz kroz BST
393
private void PreorderProlaz(CvorStabla cvor){
if (cvor == null)return;
// ispisi koren (trenutni element)Console.Write(cvor.Podatak + " ");// obidji Levo podstabloPreorderProlaz(cvor.Levo);// obidji Desno podstabloPreorderProlaz(cvor.Desno);
}
public void PreorderProlaz(){
PreorderProlaz(koren);Console.WriteLine();
}
Inorder prolaz kroz BST
394
private void InorderProlaz(CvorStabla cvor){
if (cvor == null)return;
// obidji Levo podstabloInorderProlaz(cvor.Levo);// ispisi koren (trenutni element)Console.Write(cvor.Podatak + " ");// obidji Desno podstabloInorderProlaz(cvor.Desno);
}
public void InorderProlaz(){
InorderProlaz(koren);Console.WriteLine();
}
12/24/2018
198
Postorder prolaz kroz BST
395
private void PostorderProlaz(CvorStabla cvor){
if (cvor == null){
return;}
PostorderProlaz(cvor.Levo);PostorderProlaz(cvor.Desno);Console.Write(cvor.Podatak + " ");
}
public void PostorderProlaz(){
PostorderProlaz(koren);Console.WriteLine();
}
Ubacivanje u BST stablo
396
12/24/2018
199
Ubacivanje u BST stablo
397
398
private void Ubaci(CvorStabla k, int podatak){
if (PraznoStablo()){
koren = new CvorStabla(podatak);}else{
if (podatak < k.Podatak){
//Levo podstablo//Postoji levo deteif (k.Levo != null){
// ubacivanje u Levo podstabloUbaci(k.Levo, podatak);
}else{
//ubacuje se kao levo detek.Levo = new CvorStabla(podatak);
}
}else if (podatak > k.Podatak){
//desno podstablo//postoji desno deteif (k.Desno != null){
// 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);
}
12/24/2018
201
Prolazak kroz BST stablo
401
//PreorderConsole.WriteLine("Preorder");stablo.PreorderProlaz();Linija(50);
//Inorder traversalConsole.WriteLine("Inorder"); stablo.InorderProlaz();Linija(50);
//PostorderConsole.WriteLine("Postorder");stablo.PostorderProlaz();
Broj elemenata BST stabla
402
private int BrojElemenata(CvorStabla cvor){
if (cvor == null)return 0;
return 1 + BrojElemenata(cvor.Levo) + BrojElemenata(cvor.Desno);}
public int BrojElemenata(){
return BrojElemenata(koren);}
12/24/2018
202
Ubacivanje elemenata u stablo
403
Console.WriteLine("Trenutni broj elemenata: " + stablo.BrojElemenata());Linija(50);Console.WriteLine("U stablo ubacujem 36");stablo.Ubaci(36);
stablo.InorderProlaz();Linija(50);
Console.WriteLine("U stablo ubacujem 77");stablo.Ubaci(77);stablo.InorderProlaz();Linija(50);
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:
a. 35 40 50 70 75 80 89b. 70 40 35 50 80 75 89c. 35 40 50 70 75 89 80
Odgovor: b
411
Pitanje 5
Inorder prolaskom kroz stablo na slici dobija se sekvenca:
a. 35 40 50 70 75 80 89b. 70 40 35 50 80 75 89c. 35 40 50 70 75 89 80
Odgovor: a
412
Recommended