Session activity¶
Aktiviteetit¶
Tehtävä 1 - Ternäärihaku¶
BINSEARCH-proseduuri etsii järjestetystä taulukosta A[1..n] numeroa key käyttäen binäärihakua. Binäärihaussa aloitustaulukko A[L..R] jaetaan kahdeksi lähes yhtä suureksi alitaulukoksi jokaisella iteraatiolla (tai rekursion tasolla): A[L..mid] ja A[(mid+1)..R]. Vertaamalla jakopisteen elementtiä voidaan päätellä, tulisiko etsintää jatkaa vasemmalla vai oikealla puoliskolla (ellei jakopisteessä ole etsittävää elementtiä).
Ternäärihaussa (ternary search) käytetään samankaltaista lähestymistapaa, paitsi että jokaisella iteraatiolla (tai rekursion tasolla) aloitustaulukko A[L..R] jaetaan kolmeksi lähes yhtä suureksi alitaulukoksi: A[L..mid1], A[(mid1+1)..mid2] ja A[(mid2+1)..R]. Numero key voi esiintyä vain yhdessä näistä kolmesta alitaulukosta, ja siksi muut kaksi voidaan jättää huomioimatta.
Kirjoita TERNSEARCH-proseduuri käyttäen ternaarihakua, jonka saat muuttamalla BINSEARCH-pseudokoodia olennaisilta kohdilta.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | BINSEARCH(A,L,R,key)
input A[1..n] is an array containing numbers; L and R are the
leftmost and rightmost indices that concern us; key is the value
we want to find
output: the index at which key occurs in A, or -1 if it doesn't
/* The numbers in A must be in order from smallest to largest.
We search in array A[L..R] for key. If key is found, we return
its location, otherwise we return -1.*/
if L == R then
if A[L] == key then
return L
else
return -1
end
else
mid = floor( (L+R)/2 )
if key <= A[mid] then
return BINSEARCH(A,L,mid,key)
else
return BINSEARCH(A,mid+1,R,key)
end
end
|
Tehtävä 2 - Luonnollinen mergesort¶
Tässä ongelmassa esimerkkitaulukkona on käytössä A[12, 14, 5, 3, 7, 20, 16, 9] , indeksi i on välillä 1-8. Tavoite on kirjoittaa pseudokoodi luonnolliselle mergesortille, joka järjestää A:n alkiot pienimmästä suurimpaan. Jotta luonnollisen mergesortin toiminnan voisi ymmärtää, tulee ensin ymmärtää käsitteet vähenevä inversio ja sarja (tässä kontekstissa). Järjestettävässä taulukossa on laskeva inversio paikassa i, kun A[i] > A[i+1]. Sarja on taas jokin alitaulukko, jonka alkiot ovat kasvavassa järjestyksessä. Sarjan lopussa on aina vähenevä inversio.
Esimerkkitaulukko voidaan jakaa sarjoihin seuraavasti:
sarja alkiot
1 [12,14]
2 [5]
3 [3, 7, 20]
4 [16]
5 [9]
Luonnollisessa mergesortissa ensin lomitetaan sarjat 1 ja 2 yhteen, sitten sarjat 3 ja 4, sitten sarjat 5 ja 6, kunnes viimeinen sarja on saavutettu. Tämän jälkeen sarjojsa pitäisi olla jäljellä n. puolet alkuperäisestä määrästä. Sarjoja lomitetaan yhteen, kunnes niitä on vain yksi jäljellä.
Kuvaus luonnollisen mergesortin toiminnasta on annettu myös algoritmissa NATMERGESORT:
NATMERGESORT(*A*)
1. Aloita etsimään laskevien inversioiden sijainteja kohdasta *A[1]*
lähtien. Näiden sijaintien perusteella etsitään alku- ja loppukohdat sarjoille.
2. Lomita peräkkäiset sarjat, kunnes lomitettavia sarjoja ei ole lisää.
3. Toista kohtaa 2, kunnes vain yksi sarja on jäljellä.
Jos NATMERGESORT suoritettaisiin esimerkkitaulukolle, se näyttäisi vaihe vaiheelta tältä:
Taso askel muodostetut sarjat
1 1 [12,14], [5], [3, 7, 20], [16], [9]
2 2 [5, 12,14], [3, 7, 16, 20], [9]
3 2 [3, 5, 7, 12,14, 16, 20], [9]
4 2 [3, 5, 7, 9, 12, 14, 16, 20]
Kirjoita pseudokoodi algoritmille NATMERGESORT.
A+ esittää tässä kohdassa tehtävän palautuslomakkeen.