Viikko 2: Tiivistelmä

Tämän viikon tehtävien aiheena on:

Logaritmi

Logaritmi logk(x) ilmaisee, montako kertaa luku x täytyy jakaa luvulla k, ennen kuin päästään lukuun 1 tai sen alle.

Esimerkiksi log2(16) = 4, koska 16 täytyy jakaa 2:lla 4 kertaa:

16 → 8 → 4 → 2 → 1

Monen algoritmin toiminta perustuu puolittamiseen, jolloin 2-kantainen logaritmi (log2) liittyy algoritmin aikavaativuuteen. Usein tietojenkäsittelyssä alaindeksi 2 jää pois ja log tarkoittaa samaa kuin log2.

Tärkeä asia on, että log(x) on hyvin pieni, kun x on syötteen koko tms. Esimerkiksi log(106) on vain noin 20 ja log(109) on vain noin 30. Niinpä jos logaritmi esiintyy aikavaativuudessa, sen voi jättää lähes huomiotta eli O(n log n) on lähes yhtä nopea kuin O(n).

Järjestäminen

Yleisin syy logaritmin esiintymiseen aikavaativuudessa on, että algoritmi järjestää jotain. Tehokkaiden järjestämisalgoritmien aikavaativuus on O(n log n).

Tutustumme järjestämisalgoritmeihin pintaa syvemmältä kurssin loppuosassa, ja tällä hetkellä riittää tietää, että Javan komentoja Arrays.sort ja Collections.sort voi käyttää järjestämään tehokkaasti taulukko tai ArrayList. Niistä on hyötyä tämän viikon TMC-tehtävissä...

Logaritmi muualla

Logaritmi esiintyy algoritmeissa myös seuraavissa yhteyksissä:

Nämäkin tilanteet liittyvät yleensä jollain tavalla järjestämiseen, kuten tulemme huomaamaan myöhemmin.

Usein tehtävän voi ratkaista suoraviivaisesti ajassa O(n2), mutta haasteena on löytää tehokkaampi ratkaisu ajassa O(n log n). Kun logaritmi ilmestyy kuvioihin, on syytä juhlaan, koska O(n log n) on huomattavasti nopeampi algoritmi kuin O(n2).