Algoritmi i strukture podataka Algoritmi i strukture podataka Dr. Goran Aritonović...

207
12/24/2018 1 Algoritmi i strukture podataka Dr. Goran Aritonović [email protected] kabinet 211 Pojam algoritama i struktura podataka Niklaus Wirth : Algorithms + Data Structures = Programs Tvorac programskog jezika Pascal 1975 napisao kljigu algoritmi + struktura podataka = programi Struktura podataka – opis načina organizacije podataka Algoritam – opis načina obrade podataka 2

Transcript of Algoritmi i strukture podataka Algoritmi i strukture podataka Dr. Goran Aritonović...

12/24/2018

1

Algoritmi i strukture podataka

Dr. Goran Aritonović

[email protected]

kabinet 211

Pojam algoritama i struktura podataka

• Niklaus Wirth : Algorithms + Data Structures = Programs• Tvorac programskog jezika Pascal

• 1975 napisao kljigu algoritmi + struktura podataka = programi

• Struktura podataka – opis načina organizacije podataka

• Algoritam – opis načina obrade podataka

2

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

74

Cilj igre

147

Hanojske kule – 3 diska

2 31

2

1

3

148

12/24/2018

75

Hanojske kule – 3 diska

2 31

Premeštanje 1: Premešten disk sa stuba 1 na stub 3

123

149

Hanojske kule – 3 diska

2 31

Premeštanje 2: Premešten disk sa stuba 1 na stub 2

2 13

150

12/24/2018

76

Hanojske kule – 3 diska

3

2 31

Premeštanje 3: Premešten disk sa stuba 3 na stub 2

2

1

3

151

Hanojske kule – 3 diska

Premeštanje 4: Premešten disk sa stuba 1 na stub 3

2 31

2

1

3

152

12/24/2018

77

Hanojske kule – 3 diska

Premeštanje 5: Premešten disk sa stuba 2 na stub 1

2 31

21 3

153

Hanojske kule – 3 diska

Premeštanje 6: Premešten disk sa stuba 2 na stub 3

2 31

21 3

154

12/24/2018

78

Hanojske kule – 3 diska

Premeštanje 7: Premešten disk sa stuba 1 na stub 3

2 31

2

1

3

155

Ukupan broj premeštanja je: 23-1

𝑛 𝑑𝑖𝑠𝑘𝑜𝑣𝑎: 𝑏𝑟𝑜𝑗 𝑝𝑟𝑒𝑚𝑒š𝑡𝑎𝑛𝑗𝑎 𝑗𝑒 2𝑛-1

Algoritam

156

• Prebaci(n,sa,na,pom) - prebaci n diskova sa stuba sa na stub na korišćenjem pomoćnog diska pom• Prebaci(n-1,sa,pom,na)• prebaci disk sa stuba sa na stub na• Prebaci(n-1,pom,na,sa)

• Prebaci(3,1,3,2) - prebaci 3 diska sa stuba 1 na stub 3 korišćenjem pomoćnog diska 2• Prebaci(2,1,2,3) - prebaci 2 diska sa stuba 1 na stub 2, pomoćni disk je 3• Prebaci disk sa stuba 1 na stub 3• Prebaci(2,2,3,1) - prebaci 2 diska sa stuba 2 na stub 3 korišćenjem pomoćnog diska 1

12/24/2018

79

Realizacija algoritma

157

static void Prebaci(int n, int sa, int na, int pom){

if (n>0){

Prebaci(n - 1, sa, pom, na);Console.WriteLine($"Premešten disk sa stuba {sa} na stub {na} ");Prebaci(n - 1, pom, na, sa);

}}

Testiranje algoritma

158

static void Main(string[] args){

Console.WriteLine("Unesi broj diskova");int n = int.Parse(Console.ReadLine());Prebaci(n, 1, 3, 2);Console.ReadLine();

}

12/24/2018

80

Pitanje 1

159

Dvodimenzionalni niz koji podatke čuva u 3 vrste i 5 kolona instancira se na sledeći način:

a. int[,] x = new int[3, 5];b. int[x] = new int(3,5);c. int x[] = new int[3,5];

Odgovor: a

Pitanje 2

160

Šta se dobija izvršavanjem sledećeg koda:static void Main(string[] args){

int[,] x = {{1,2,3,4},{2,3,4,5},{3,4,5,6}

};

Console.WriteLine(x[0, 3]);Console.ReadLine();

}

a. 2b. 3c. 4

Odgovor: c

12/24/2018

81

Pitanje 3

161

Rekurzivna funkcija je funkcija kojaa. Poziva neku drugu funkcijub. Poziva samu sebec. Poziva isključivo iz Main() funkcije

Odgovor: b

Pitanje 4

162

Data je sledeća rekurzivna funkcija:

static int Fun1(int n){

if (n == 4){

return n;}else{

return 2 * Fun1(n + 1);}

}

Koliko je Fun1(2) ?a. 6b. 16c. 24 Odgovor: b

12/24/2018

82

Pitanje 5

163

Fibonačije niz je:a. 1,2,3,5,8...b. 1,1,2,3,5,...c. 1,3,5,7,9,...

Odgovor: b

Pitanje 6

164

Prema Euklidovom algoritmu za pronalaženje NZD dva pozitivna cela broja tačno je tvrđenje:a. NZD(12,18) = NZD(6,12)b. NZD(12,18) = NZD(30,12)c. NZD(12,18) = NZD(2,12)

Odgovor: a

12/24/2018

83

Pitanje 7

165

Minimalni broj premeštanja diskova kod igre Hanojska kula je:a. 2n-1b. 2n-1c. 2n+1

Odgovor: b

Analiza efikasnosti algoritma

12/24/2018

84

Merenje vremena izvršavanje algoritma

• Broj ulaznih podataka - veličine n• npr. sortiranje niza od n članova

• Traži se vreme izvršavanja u zavisnosti od veličine ulaza, odnosno kako se vreme izvršavanja algoritma povećava sa povećavanjem broja ulaznih podataka

• Manja veličina ulaza daće i manje vreme izvršavanja algoritma

• Veća veličina ulaza daje veće vreme izvršavanja algoritma

• Povećava se veličina ulaza, vreme izvršavanja se takođe povečava

• Ako se ulaz u algoritam duplira• vreme izvršavanja se može duplirati• vreme izvršavanja se može uvećati 4 puta• vreme izvršavanja se može uvečati 100 puta

167

Merenje vremena izvršavanje algoritma

• Ekperimentalna metoda• Implementacija algoritma u programskom jeziku• Izvršavanje algoritama korišćenjem različitih ulaza• Beleženje vremena izvršavanja algoritma• Zavisi od softvera i hardvera• Konačan broj ulaza u algoritam

• Analitička metoda• Analiza vremena izvršavanja algoritma bazirana na veličini ulaza• Asimptotska analiza• Nezavisna od softvera i hardvera• Razmatra sve moguće ulaze u algoritam

168

12/24/2018

85

Klasa Stopwatch

• Biblioteka System.Diagnostics

• Konstruktor: Stopwatch t = new Stopwatch();

• Metoda Start() startuje merenje vremenskog interval

• Metoda Stop() zaustavlja merenje vremenskog interval

• Metoda Reset() služi za reetovanje tajmera

• Svojstvo Elapsed vraća TimeSpan strukturu koja sadrži proteklo vreme

• Svojstvo ElapsedMilliseconds vraća broj milisekundi (ne koristiti ako je vreme kraće od ms)

169

Stopwatch t = new Stopwatch();t.Start();TestMetoda(1000);t.Stop();Console.WriteLine(t.ElapsedMilliseconds);

Primer merenja vremena izvršavanja algoritma -1

170

static int[] KreirajNiz(int n){

Random rnd = new Random();int[] x = new int[n];for (int i = 0; i < n; i++){

x[i] = rnd.Next(1,101); // od 1 do 100}return x;

}

static void PisiNiz(int[] x){

for (int i = 0; i < x.Length; i++){

Console.Write(x[i] + "\t");}Console.WriteLine();

}

12/24/2018

86

Primer merenja vremena izvršavanja algoritma -2

171

static void Main(string[] args){

// menjaj velicinu ulaza n =10, 100, 1000int[] x = KreirajNiz(1000);

Stopwatch t = new Stopwatch();

double[] vremena = new double[10];for (int i = 0; i < 10; i++){

// merim vreme 10 puta zbog preciznijeg rezultatat.Start();PisiNiz(x);t.Stop();Linija(100);vremena[i] = t.ElapsedMilliseconds;t.Reset();

}

double ukupnoVreme = 0;foreach (double vr in vremena){

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

114

Peti prolazak

227

temp = 12

Šesti prolazak

228

temp = 66

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

182

Preorder prolaz -1

363

Preorder prolaz -2

364

12/24/2018

183

Preorder prolaz -3

365

Preorder prolaz -4

366

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

185

Inorder prolaz kroz binarno stablo

369

Primer inorder prolaska kroz stablo

370

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

187

Postorder prolazak kroz stablo

373

Postorder prolazak - primer

374

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

194

Primer BST stabla

387

Preorder prolaz

388

12/24/2018

195

Inorder prolaz

389

Elementi se sortiraju u rastućem poretku

Postorder prolaz

390

12/24/2018

196

Klasa koja predstavlja čvor BST stabla

391

class CvorStabla{

public int Podatak { get; set; }public CvorStabla Levo { get; set; }

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

12/24/2018

207

Pitanje 6

Postorder prolaskom kroz stablo na slici dobija se sekvenca:

a. 50 35 40 75 89 70 80b. 70 40 35 50 80 75 89c. 35 50 40 75 89 80 70

Odgovor: c

413