Processing math: 100%

MPZI_predavanje_13

2369 days ago by fresl

Petlje (3)


 Petlja while


U pravilu se petlja while upotrebljava onda kada broj prolazaka kroz petlju nije poznat unaprijed, nego ovisi o ispunjenju nekog uvjeta.

Opći je oblik petlje while:

     while uvjet :

         tijelo petlje

Koraci petlje će se ponavljati tako dugo dok je uvjet ispunjen, tako da u tijelu petlje treba omogućiti promjenu vrijednostî o kojima ovisi ispunjenje uvjeta.

       
13 6
6 3
3 1
13 6
6 3
3 1

 

Metoda polovljenja


Metoda polovljenja jedan je od postupaka nalaženja nul–točke realne funkcije f realne varijable x u zadanom intervalu [xmin,xmax]

Pretpostavljamo da je funkcija na intervalu neprekinuta i da njezine vrijednosti u točkama xmin i xmax imaju različite predznake.  Ako su f(xmin) i f(xmax) različitih predznaka, onda je  f(xmin)f(xmax)<0

U tom slučaju graf funkcije f u intervalu [xmin,xmax] barem jednom siječe os x.  Vrijednost f(xmid) u polovištu intervala  xmid=xmin+xmax2  imat će predznak kao f(xmin) ili kao f(xmax).  Ako f(xmid) i f(xmin) imaju različite predznake (to jest, ako je  f(xmin)f(xmid)<0), onda je barem jedna nul–točka u intervalu [xmin,xmid].  I obratno, ako f(xmid) i f(xmax) imaju različite predznake (što znači da f(xmid) i f(xmin) imaju isti predznak), barem je jedna nul–točka u intervalu [xmid,xmax].  Na taj ćemo način u svakom koraku prepoloviti interval u kojemu tražimo nul–točku. 

Postupak prekidamo onda kada se duljina intervala smanji ispod unaprijed zadanoga praga τx, odnosno, koraci se ponavljaju tako dugo dok je duljina intervala veća od praga:

       dok je  xmaxxmin>τx  :

               xmid=xmin+xmax2

               ako je  f(xmin)f(xmid)<0 :

                       tražimo u intervalu [xmin,xmid], pa je xmid „novi” xmax

               inače :

                       tražimo u intervalu [xmid,xmax], pa je xmid „novi” xmin

       rezultat je polovište posljednjega intervala, kraćeg od praga

Budući da se u svakom koraku duljina intervala raspolavlja, jasno je da će se prije ili kasnije smanjiti ispod zadanoga praga.

       
       
x  x22
                                
                            

                                
       
       
1.41421356424689
5.29990096254096e-9
1.41421356424689
5.29990096254096e-9
       
-1.41421356145293
-2.60263344209477e-9
-1.41421356145293
-2.60263344209477e-9
       
1.41421356237308
-4.81836792687318e-14
1.41421356237308
-4.81836792687318e-14

 

Intermezzo o indeksiranju

 

       
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
       
13
13
       
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
       
13
13
       
6
6
       
[0, 1, 2, 3, 4, 5]
6
[7, 8, 9, 10, 11, 12]
[0, 1, 2, 3, 4, 5]
6
[7, 8, 9, 10, 11, 12]
       
3
3
       
[0, 1, 2]
3
[4, 5]
[0, 1, 2]
3
[4, 5]
       
4
4
       
[3]
4
[5]
[3]
4
[5]
       
9
9
       
[6, 7, 8]
9
[10, 11, 12]
[6, 7, 8]
9
[10, 11, 12]
       
7
7
       
[6]
7
[8]
[6]
7
[8]
       
6
6
       
[]
6
[]
[]
6
[]

 

Binarno pretraživanje


Binarno je pretraživanje algoritam koji omogućava razmjerno brzo nalaženje položaja odabrane vrijednosti u uređenom nizu, primjerice, u rastućemu ili u padajućem nizu brojeva ili u nizu riječi svrstanih po abecedi (kao u rječnicima)...  Funkcija koju ćemo napisati tražit će zadani broj k u rastućem nizu brojeva s mogućim ponavljanjima, nazvanom a.

Zamisao algoritma temelji se na intuitivnom načinu traženja riječi u rječniku, a neobično nalikuje na metodu polovljenja.

Umjesto da se, kao u takozvanu linearnom pretraživanju, zadani broj uspoređuje s brojevima niza redom, od njegova početka prema kraju, u algoritmu binarnoga pretraživanja broj se prvo uspoređuje s brojem u sredini niza.  Ako je zadani broj jednak „srednjemu” broju, pretraživanje je završeno — položaj je traženoga broja nađen (pritom, ako se broj ponavlja, možemo samo reći da smo ga našli, ali ne i jesmo li našli prvu, drugu ... ili zadnju njegovu pojavu u nizu).  Ako je pak zadani broj manji od „srednjega”, može se nalaziti samo u prvoj polovini niza, a ako je veći, samo u drugoj polovini.  U drugomu koraku s polovinom niza u kojoj se broj može nalaziti postupamo kao u prethodnu koraku s cijelim nizom: zadani broj uspoređujemo s brojem u sredini te polovine. Time smo interval u kojem ćemo (možda) morati nastaviti pretraživanje smanjili na četvrtinu nizu.  U sljedećemu ćemo ga koraku smanjiti na osminu nizu, pa na šesnaestinu, i tako dalje. 

Na početku je interval u kojemu tražimo cijeli niz, određen indeksima 0 i n, gdje je n broj brojeva u nizu.  Neka je s indeks broja u sredini niza ako je n neparan ili posljednjega broja u prvoj polovini niza ako je n paran. Ako je  as>k,  onda pretraživanje nastavljamo u intervalu određenu indeksima 0 i s, a ako je  as<k,  tražit ćemo u intervalu određenu indeksima  s+1  i  n.  I tako dalje.

Pretraživanje završava kad pronađemo traženi broj ili kad interval pretraživanja ostane prazan.  U prvom ćemo slučaju „izaći” ne samo iz petlje, nego i iz funkcije, vraćajući indeks položaja u nizu na kojemu se nalazi traženi broj.  U drugomu slučaju traženi broj nije u nizu — mogućnost da broj pronađemo postoji tako dugo dok interval pretraživanja sadrži barem jedan broj.  Ako broj nije u nizu, vratit ćemo vrijednost koja nije indeks broja u nizu, .

       
       
[-22,
 -22,
 -21,
 -20,
 -19,
 -18,
 -17,
 -17,
 -17,
 -15,
 -13,
 -13,
 -12,
 -10,
 -10,
 -6,
 -5,
 -4,
 -2,
 4,
 5,
 9,
 15,
 16,
 23]
[-22,
 -22,
 -21,
 -20,
 -19,
 -18,
 -17,
 -17,
 -17,
 -15,
 -13,
 -13,
 -12,
 -10,
 -10,
 -6,
 -5,
 -4,
 -2,
 4,
 5,
 9,
 15,
 16,
 23]
       
[(0, -22),
 (1, -22),
 (2, -21),
 (3, -20),
 (4, -19),
 (5, -18),
 (6, -17),
 (7, -17),
 (8, -17),
 (9, -15),
 (10, -13),
 (11, -13),
 (12, -12),
 (13, -10),
 (14, -10),
 (15, -6),
 (16, -5),
 (17, -4),
 (18, -2),
 (19, 4),
 (20, 5),
 (21, 9),
 (22, 15),
 (23, 16),
 (24, 23)]
[(0, -22),
 (1, -22),
 (2, -21),
 (3, -20),
 (4, -19),
 (5, -18),
 (6, -17),
 (7, -17),
 (8, -17),
 (9, -15),
 (10, -13),
 (11, -13),
 (12, -12),
 (13, -10),
 (14, -10),
 (15, -6),
 (16, -5),
 (17, -4),
 (18, -2),
 (19, 4),
 (20, 5),
 (21, 9),
 (22, 15),
 (23, 16),
 (24, 23)]
       
20
20
       
-Infinity
-Infinity
       
6
6
       
24
24
       
-Infinity
-Infinity
       
1
1
       
-Infinity
-Infinity

 

Varijacija na temu

 

U programsku funkciju za binarno pretraživanje unijet ćemo dvije promjene:

  1. Rezultat će biti indeks prvoga položaja u nizu na koji se traženi broj može umetnuti a da se uređaj niza ne naruši.  Ako se traženi broj nalazi u nizu, to je indeks jedne njegove pojave.  Ako pak broj nije u nizu, to je indeks prve pojave prvoga većeg broja: traženi se broj može umetnuti na to mjesto tako da se broj koji je bio na tom mjestu i svi brojevi iza njega „pomaknu” za jedno mjesto „udesno”.  Budući da vraćeni indeks sada označava položaj u nizu neovisno o tome je li broj pronađen ili ne, nakon poziva funkcije treba provjeriti nalazi li se traženi broj na tom mjestu.
  2. Unutar petlje ne treba ispitati je li „srednji” broj jednak traženom.  Zašto?
       
       
[-22,
 -22,
 -21,
 -20,
 -19,
 -18,
 -17,
 -17,
 -17,
 -15,
 -13,
 -13,
 -12,
 -10,
 -10,
 -6,
 -5,
 -4,
 -2,
 4,
 5,
 9,
 15,
 16,
 23]
[-22,
 -22,
 -21,
 -20,
 -19,
 -18,
 -17,
 -17,
 -17,
 -15,
 -13,
 -13,
 -12,
 -10,
 -10,
 -6,
 -5,
 -4,
 -2,
 4,
 5,
 9,
 15,
 16,
 23]
       
20
20
       
True
True
       
19
19
       
False
False
       
[-22,
 -22,
 -21,
 -20,
 -19,
 -18,
 -17,
 -17,
 -17,
 -15,
 -13,
 -13,
 -12,
 -10,
 -10,
 -6,
 -5,
 -4,
 -2,
 0,
 4,
 5,
 9,
 15,
 16,
 23]
[-22,
 -22,
 -21,
 -20,
 -19,
 -18,
 -17,
 -17,
 -17,
 -15,
 -13,
 -13,
 -12,
 -10,
 -10,
 -6,
 -5,
 -4,
 -2,
 0,
 4,
 5,
 9,
 15,
 16,
 23]
       
22
22
       
True
True
       
[-22,
 -22,
 -21,
 -20,
 -19,
 -18,
 -17,
 -17,
 -17,
 -15,
 -13,
 -13,
 -12,
 -10,
 -10,
 -6,
 -5,
 -4,
 -2,
 0,
 4,
 5,
 9,
 9,
 15,
 16,
 23]
[-22,
 -22,
 -21,
 -20,
 -19,
 -18,
 -17,
 -17,
 -17,
 -15,
 -13,
 -13,
 -12,
 -10,
 -10,
 -6,
 -5,
 -4,
 -2,
 0,
 4,
 5,
 9,
 9,
 15,
 16,
 23]
       
27
27
       
Traceback (click to the left of this block for traceback)
...
IndexError: list index out of range
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "_sage_input_87.py", line 10, in <module>
    exec compile(u'open("___code___.py","w").write("# -*- coding: utf-8 -*-\\n" + _support_.preparse_worksheet_cell(base64.b64decode("bFsyN10gPT0gMjU="),globals())+"\\n"); execfile(os.path.abspath("___code___.py"))
  File "", line 1, in <module>
    
  File "/tmp/tmpkaUCam/___code___.py", line 3, in <module>
    exec compile(u'l[_sage_const_27 ] == _sage_const_25 
  File "", line 1, in <module>
    
IndexError: list index out of range
       
izvan niza
izvan niza
       
[-22,
 -22,
 -21,
 -20,
 -19,
 -18,
 -17,
 -17,
 -17,
 -15,
 -13,
 -13,
 -12,
 -10,
 -10,
 -6,
 -5,
 -4,
 -2,
 0,
 4,
 5,
 9,
 9,
 15,
 16,
 23,
 25]
[-22,
 -22,
 -21,
 -20,
 -19,
 -18,
 -17,
 -17,
 -17,
 -15,
 -13,
 -13,
 -12,
 -10,
 -10,
 -6,
 -5,
 -4,
 -2,
 0,
 4,
 5,
 9,
 9,
 15,
 16,
 23,
 25]
       
0
0
       
True
True
       
0
0
       
False
False
       
[-23,
 -22,
 -22,
 -21,
 -20,
 -19,
 -18,
 -17,
 -17,
 -17,
 -15,
 -13,
 -13,
 -12,
 -10,
 -10,
 -6,
 -5,
 -4,
 -2,
 0,
 4,
 5,
 9,
 9,
 15,
 16,
 23,
 25]
[-23,
 -22,
 -22,
 -21,
 -20,
 -19,
 -18,
 -17,
 -17,
 -17,
 -15,
 -13,
 -13,
 -12,
 -10,
 -10,
 -6,
 -5,
 -4,
 -2,
 0,
 4,
 5,
 9,
 9,
 15,
 16,
 23,
 25]

 

Napomena na kraju:  for i while

 

Petlja for može se lako zamijeniti petljom while:

       
1 3 5 7 9 11
1 3 5 7 9 11
       
1 3 5 7 9 11
1 3 5 7 9 11