5
(a) Napiši funkcijo Vstavi(a, x)
, ki dobi urejeno tabelo a
(vsi njeni elementi so cela števila) in vanjo vrine celo število x
tako, da tabela tudi po tem ostane urejena. Pri tem ne uporabljaj že obstoječih funkcij za urejanje (npr. sort
) ali pythonove funkcije za vrivanje elementa v tabelo (insert
). Primer: če imamo a = [10, 20, 30]
, mora po vrnitvi iz klica Vstavi(a, 25)
tabela a
biti enaka [10, 20, 25, 30]
.
(b) Kakšna je časovna zahtevnost funkcije Vstavi
?
(c) Recimo, da poleg tabele a
dobimo tudi tabelo b
, ki je tudi sama urejena naraščajoče, in da bi radi obe tabeli združili v novo tabelo, ki bo vsebovala elemente obeh vhodnih tabel in bo tudi sama urejena naraščajoče. To lahko naredimo takole:
Recimo, da je tabela a
dolga n elementov, tabela b
pa m elementov. Kakšna je (v najslabšem primeru) časovna zahtevnost funkcije Zdruzi
? Kakšni morata biti tabeli a
in b
(pri danih n in m), da funkcija doseže to najslabšo možno časovno zahtevnost?
(d) Kakšna pa je najmanjša možna poraba časa funkcije Zdruzi
pri danih n in m? Kakšni morata biti tabeli a
in b
(pri danih n in m), da funkcija doseže to najboljšo možno časovno zahtevnost?
6
Problem združevanja dveh urejenih tabel iz prejšnje naloge lahko rešimo tudi učinkoviteje, s postopkom, ki se imenuje zlivanje. Najprej se postavimo na začetek tabel a
in b
ter pogledamo, katera ima na tem mestu manjši element; ta element dodamo v izhodno tabelo in se pomaknemo za eno mesto naprej po tabeli, iz katere izhaja ta element. To zdaj ponavljamo, dokler ne pridemo do konca obeh tabel:
(a) Preizkusi to funkcijo na nekaj primerih tabel a
in b
in se prepričaj, da res deluje (in kako deluje).
(b) Kakšna je njena časovna zahtevnost v odvisnosti od n in m? Kako je ta zahtevnost odvisna od konkretne vsebine tabel a
in b
?