← zpět

Analýza časové složitosti, binární vyhledávání

Lekce 5

Úlohy

Odmocnina

Spočítejte druhou odmocninu. Program na vstupu očekává celé číslo. Pokud je jeho odmocnina také celé číslo, vypíše ji. Jinak nevypíše nic. Nesmíte použít funkci math.sqrt, operátor ** a jiné.

Jde hlavně o nápad. Nejlepší možné řešení zvládne najít odmocninu ke $2^n$ na $n$ kroků. Až budete mít kód napsaný, proveďte jednoduchou analýzu časové složitosti. Jde mi o to, abyste si byli schopni uvědomit, jak dlouho program běží. Kód opatřete příslušnými komentáři.

Co jsme dnes probrali

Seznamy

Analýza časové složitosti

Analýza fast.py

Analýza slow.py

Binární vyhledávání

1seno = [1, 2, 4, 6, 8, 9, 11, 16, 26, 30]
2jehla = 10
3
4delka = len(seno)
5
6# Pouzijeme tzv. metodu dvou jezdcu. Jeden je na zacatku, druhy na konci pole.
7# Stred je prumer techto dvou jezdcu.
8levy = 0
9pravy = delka - 1
10stred = (pravy - levy) // 2
11
12# Vsimneme si, ze behem behu algoritmu se levy vzdy posouva doprava a pravy
13# doleva. Jakmile se prekryji, muzeme smycku ukoncit.
14while pravy > levy:
15 # Pri prohledavani muzou nastat tri pripady:
16
17 # Jehla je ve stredu, nasli jsme ji.
18 if jehla == seno[stred]:
19 print("cislo je v seznamu!")
20
21 # Ukoncime cyklus, protoze dal hledat nemusime.
22 break
23 elif jehla < seno[stred]:
24 # Pokud je jehla v leve polovine, pravy ukazatel nastavime na jednu
25 # pozici nalevo do stredu (nalevo, protoze budeme hledat v leve
26 # polovine).
27 pravy = stred - 1
28
29 # Levy ukazatel zustava na sve pozici, musime ale prepociat stred.
30 stred = (pravy + levy) // 2
31 else:
32 # Analogicky k predchozimu pripadu.
33 levy = stred + 1
34
35 stred = (pravy + levy) // 2