ALGORITMIEN SUUNNITTELU JA ANALYYSI 

Kevät-2007

 

 

Harjoitus 2. (viikolla 5)

 

 

1.   Kuvaa sanallisesti puun ja verkon läpikäyntialgoritmien periaatteet.  Puun läpikäyntialgoritmit, syvyyssuuntainen- ja leveyssuuntainen läpikäynti, ovat monisteen sivulla 12 ja verkon vastaavat algoritmit ovat monisteen sivulla 13.  (Vrt. Luennoissa oleva lause "vieraile sellaisen solmun lapsessa, jolla on vielä vierailemattomia lapsia ja jonka vierailusta on kulunut mahdollisimman paljon aikaa".)

 

 

2.   Piirrä seuraavasta verkosta saatava (eräs) syvyyssuuntainen virittävä metsä, kun haku alkaa solmusta e.  Merkitse kuvaan lisäksi erikseen etenevät kaaret, takautuvat kaaret ja poikittais­kaaret.

 

                                   

 

3.   Piirrä edellisen tehtävän verkosta saatava (eräs) leveyssuuntainen virittävä metsä, kun haku alkaa solmusta a.  Merkitse tähänkin kuvaan lisäksi erikseen etenevät kaaret, takautuvat kaaret ja poikittaiskaaret.

4.   Eräs syklittömän suunnatun verkon (eli DAGin) visualisointialgoritmi jakaa aluksi verkon sol­mut päällekkäisiin kerroksiin niin, että kaikki verkon kaaret osoittavat alaspäin:

Kerros 1

 

 

Kerros 2

 

 

Kerros 3

 
 


                                     

 

      Algoritmi siis valitsee jokaiselle verkon solmulle kerroksen sillä rajoituksella, että jokaisen kaa­ren alkupään kerros on pienempi kuin sen loppupään kerros.

 

      Kirjoita algoritmi (pseudokoodi), joka tekee jaon kerroksiin. Yritä tehdä algoritmista sellainen, että kerroksia tulee mahdollisimman vähän. Vihje: Sellaiset solmut, joiden lähtöaste on 0, sopivat esimerkiksi alimpaan kerrokseen.

 

 

 

Toteuta tehtäväpaperin taustapuolen esiinkääntämissuorite.


 

5.   Maksimaalisen osajoukon ongelmassa etsitään kokonaislukujonosta yhtenäistä osaa, joka antaa suurimman lukujen summan.  Esimerkiksi jonosta [-1,2,3, -5, 7, -2, 5, 1, -1] suurin summa on 11, joka tulee jonon osasta [7, -2, 5, 1].

 

      Seuraavassa on kaksi algoritmia suurimman summan etsimiseen:

 

procedure maxsummal (F: integer[n])

begin

      maxsumma ← 0 ;

      for vasen 1 to n do

               for oikea vasen to n do

                     begin

                           summa ← 0 ;

                           for i vasen to oikea do

                                 summa ← summa +F[i] ;

                           if summa> maxsumma then maxsumma ← summa

                     end ;

      return maxsumma

end

 

procedure maxsumma2 (F: integer[n])

begin

      scanmax  0; vanhamax ← 0;

      for i ← 1 to n do

               begin

                     if scanmax + F[i] > 0

                           then scanmaxscanmax + F[i]

                           else scanmax ← 0 ;

                     if scanmax > vanhamax then vanhamaxscanmax

               end ;

      return vanhamax

end

 

      a)   Selitä, miten kumpikin algoritmi toimii.

      b)   Mitkä ovat em. algoritmien aikavaatimukset?

 

 

6.   Binäärihaku on toteutettu rekursiivisella proseduurilla.  Kirjoita algoritmin aikavaatimusta T(n) kuvaava rekursioyhtälö ja ratkaise se.