Kurssiaiheen 4 tehtävät¶
Iteraatio vs rekursio¶
Iteratiiviset ongelmat voidaan vaihtaa rekursioon ja päinvastoin. Molempiin voidaan käyttää joko pala kerrallaan tai hajoita ja hallitse strategioita.
Tarkastele esimerkiksi alle olevia Search ja BinarySearch algoritmeja.
Search
1 2 3 4 5 6 7 | Search(Int a, Array N):
FOR elem IN N:
IF elem == a:
return true
END IF
END LOOP
return false
|
Binary search
1 2 3 4 5 6 7 8 9 10 11 12 13 | BinarySearch(A, left, right, value)
(A in ascending order)
if left = right then
if A[left] = value then
return true
else
return false
else
middle := ⌊(left+right)/2⌋
if value ≤ A[middle] then
return BinarySearch(A, left, middle, value)
else
return BinarySearch(A, middle+1, right, value)
|
Ensimmäinen käyttää iteraatiota, toinen rekursiota. Toinen ero näiden kahden algoritmin välillä on tehokkuus: logaritminen BinarySearch-algoritmi on asymptoottisesti tehokkaampi kuin lineaarinen Search-algoritmi. Toisaalta, Search-algoritmi ei aseta ennakkoehtoja järjestykselle, jossa alkiot ovat ennen hakua. BinarySearch-algoritmi käyttää hajoita ja hallitse -periaatetta, jonka hyödyt tulevat selvemmiksi, mitä enemmän aineistoa täytyy käydä läpi.
Etsi pienin puuttuva¶
Funktio searchSmallestMissingIteration()/searchSmallestMissing()
Tarkastellaan samanlaista ongelmaa, missä algoritmi etsii pienimmän puuttuvan arvon. Funktion syötteenä on taulukko uniikkeja kokonaislukuja kasvavassa järjestyksessä.
Esimerkiksi syötteellä [0, 1, 2, 3, 4, 5, 12, 23]
funktio palauttaa 6.
Jos yksikään arvo ei puutu, funktio palauttaa NO_VALUE_MISSING
.
Keksi kaksi ratkaisua!
- Sellainen, joka käyttää iteraatiota (
searchSmallestMissingIteration()
) - Toinen, joka käyttää rekursiota (
searchSmallestMissing()
)
Attention
Ennen kuin aloitat harjoituksen, varmista että sinulla on viimeisin versio harjoitusreposta:
git pull course-upstream main
Tässä harjoituksessa tarvittavat tiedostot löytyvät hakemistosta wk02_decrease_or_divide/missing
searchSmallestMissingIteration()¶
Toteuta algoritmi searchSmallestMissingIteration()
tiedostoon
wk02_decrease_or_divide/missing/missing.cc.
int searchSmallestMissingIteration(int* arr, int size) {
// returns the first missing number, or NO_VALUE_MISSING if not found
return NO_VALUE_MISSING;
}
Parametri arr
on taulukko, jota tarkastellaan, ja size
on tämän taulukon koko.
Kirjoita ratkaisusi funtiolle searchSmallestMissingIteration()
C++ -kielellä käyttäen pala kerrallaan strategiaa.
Hint
Ratkaisussa tulee käyttää iteraatiota, eli for- tai while-silmukkaa.
A+ esittää tässä kohdassa tehtävän palautuslomakkeen.
searchSmallestMissing()¶
Toteuta algoritmi searchSmallestMissing()
tiedostoon
wk02_decrease_or_divide/missing/missing2.cc.
int searchSmallestMissing(int* A, int left, int right) {
// returns the first missing number, or NO_VALUE_MISSING if not found
return NO_VALUE_MISSING;
}
Parametrit:
A
taulukko, jota tarkastellaanleft
vasemmanpuoleisin taulukon indeksi, alussa 0right
oikeanpuoleisin taulukon indeksi, alussasize-1
kunsize
on taulukon koko.
Kirjoita ratkaisusi funtiolle searchSmallestMissing()
C++ -kielellä käyttäen hajoita ja hallitse strategiaa.
Hint
Ratkaisussa tulee käyttää rekursiota, eli ÄLÄ KÄYTÄ for- tai while-silmukkaa!
A+ esittää tässä kohdassa tehtävän palautuslomakkeen.