Lue ensin tällä sivulla olevat yleisohjeet. Tarkemmat tiedot löytyvät tehtäväkohtaisista ohjeista. Jokaiseen tehtävään on saatavilla oma zip-tiedosto, josta löytyvää koodia voit käyttää ratkaisujesi pohjana.
| Tehtävä | Palautuksia | Pisteet | Max. | Taso | Pak. | Määräaika |
|---|---|---|---|---|---|---|
| MF1: perustason CPU-toteutus | ||||||
Toteuta yksinkertainen, perättäinen perusratkaisu. Varmista, että se toimii kuten pitääkin. Älä pyri tässä vaiheessa hyödyntämään rinnakkaisuutta missään muodossa. Tässä on tarkoitus käyttää suoraviivaista, naiivia algoritmia, joka laskee mediaanin erikseen kullekin pikselille lineaariaikaisella hakualgoritmilla. |
||||||
| – | – | 5 + 0 | ★ | Pak. | 2026-08-31 klo 23:59:59 | |
| MF2: moniytimellinen rinnakkaisuus | ||||||
Rinnakkaista tehtävän MF1 ratkaisu OpenMP:llä siten, että ratkaisussa hyödynnetään useita CPU-ytimiä rinnakkain. |
||||||
| – | – | 3 + 0 | ★ | Pak. | 2026-08-31 klo 23:59:59 | |
| MF9a: parempi algoritmi | ||||||
Suunnittele parempi algoritmi, joka ei laske mediaania uudelleen jokaiselle pikselille erikseen. Tee siitä mahdollisimman tehokas, myös erittäin suurikokoisille ikkunoille. Käytä kaikkia CPU:lta löytyviä resursseja. |
||||||
| – | – | 5 + 0 | ★★★ | Pak. | 2026-08-31 klo 23:59:59 | |
Tässä tehtävässä toteutetaan kaksiulotteinen mediaanisuodatin suorakulmaisella suodatusikkunalla.
Toteuta seuraava funktio:
void mf(int ny, int nx, int hy, int hx, const float* in, float* out)
Tässä in ja out osoittavat float-taulukoihin, joista kussakin on ny*nx alkiota. Funktion kutsuja varaa taulukot, joten muistinhallintaa ei tarvita.
Pikselin (x,y) alkuperäinen arvo on taulukossa in[x + nx*y] ja sen uusi arvo tallennetaan taulukkoon out[x + nx*y].
Tulosteen pikseli (x,y) sisältää mediaanin kaikista pikseleistä koordinaateilla (i,j), joille
0 <= i < nx,0 <= j < ny,x - hx <= i <= x + hx,y - hy <= j <= y + hy.Tämä on liukuva ikkuna. Huomaa, että ikkunassa on enintään (2*hx+1) * (2*hy+1) pikseliä, mutta reunojen läheisyydessä pikseleitä on vähemmän.
Tässä tehtävässä vektorin a = (a1, a2, …, an) mediaani määritellään seuraavasti:
Alla olevat esimerkit havainnollistavat, mitä oikein toteutettu ohjelma tekee, kun sitä sovelletaan bittikarttakuvan kuhunkin värikomponenttiin. Näissä esimerkeissä kullekin värikomponentille kunkin pikselin arvo on liukuvan ikkunan (mitat (2k+1) × (2k+1)) sisällä olevien pikseliarvojen mediaani. Vie hiiri tuloskuvien päälle nähdäksesi eroavaisuudet syötekuvan ja tuloskuvan välillä.
k = 1
k = 2
k = 5
k = 10
Kohinan poisto, k = 1
Kohinan poisto, k = 2
Käytä mediaanin etsimiseen nopeaa valinta-algoritmia. Älä käytä lajittelua; quickselect ja muut hyvät valinta-algoritmit ovat paljon lajittelua nopeampia. Standardikirjastosta löytyy valmiiksi hyvä C++-toteutus, joten tätä ei tarvitse keksiä uudelleen.
Tässä esimerkkitekniikoita tehtävän MF9a ratkaisemiseen: