Løsningsforslag - oppgaver i Avsnitt 1.1.3


Oppgave 1

I dette faget vil i hvert fall flg. sorteringsmetoder bli tatt opp (det finnes mange flere):

Oppgave 2

Regnskapet sier at antallet grunnleggende operasjoner er 5n + x der x er antallet ganger sammenligningen a[i] > a[m] er sann. Med de 10 verdiene 10, 5, 7, 2, 9, 1, 3, 8, 4, 6 vil sammenligningen aldri bli sann siden den største ligger først, dvs. x = 0. Dermed blir det utført 5·10 = 50 grunnleggende operasjoner.

Oppgave 3

Her blir x = 9 og dermed 5·10 + 9 = 59 grunnleggende operasjoner.

Oppgave 4

Her blir x = 4 og dermed 5·10 + 4 = 54 grunnleggende operasjoner.

Oppgave 5

Første versjon av metoden minmaks benytter at vi på forhånd har metoder maks og min som finner størst og minst verdi i en tabell.

  public static int[] minmaks(int[] a)
  {
    return new int[]{min(a),maks(a)};
  }

Den første versjonen utfører alltid 2n − 2 sammenligninger siden maks-metoden og min-metoden hver for seg ufører n − 1 sammenligninger.

Neste versjon av minmaks er hårfint mer effektiv:

  public static int[] minmaks(int[] a)
  {
    int mi = 0, minverdi = a[0];
    int ma = 0, maksverdi = a[0];

    int verdi = 0;

    for (int i = 1; i < a.length; i++)
    {
      verdi = a[i];

      if (verdi > maksverdi) { maksverdi = verdi; ma = i;}
      else if (verdi < minverdi) {minverdi = verdi; mi = i;}
    }

    return new int[]{mi,ma};
  }  

Testen verdi > maksverdi utføres n − 1 ganger. Hver gang den ikke er sann blir også testen verdi < minverdi utført. Det viser seg (se Avsnitt 1.1.6) at sammenligningen verdi > maksverdi er sann gjennomsnittlig få ganger og dermed usann de fleste gangene. Dermed får vi et gjennomsnittlig antall sammenligninger i metoden over som bare er marginalt mindre enn 2n − 2.

Det verste tilfellet får vi når den største ligger først. Fortsatt vil verdi > maksverdi bli utført hver gang, og den er usann hver gang. Dermed blir også verdi < minverdi utført hver gang. Tilsammen 2n - 2 sammenligninger i det verste tilfellet.

Det er mulig å lage en en algoritme som bruker ca. 1.5n sammenligninger. Men da må det isteden foretas en del ombyttinger i tabellen og kostnadene ved det er nok større enn det en tjener på å ha færre sammenligninger. Se Oppgave 1 i Avsnitt 1.2.14 i Delkapittel 1.2.

Oppgave 6

  public static long fak(int n)
  {
    if (n < 0)
      throw new IllegalArgumentException("n < 0");
    long fak = 1;

    for (int i = 2; i <= n; i++) fak *= i;

    return fak;
  }

Hvis n = 0 eller 1 utføres ingen multiplikasjoner. Hvis n > 1 utføres det n − 1 multiplikasjoner.