Hvilke egenskaper gjelder?
Personene til venstre for venstre hånd er sortert alfabetisk, og de er alle alfabetisk mindre enn resten.
Maksimalt antall ombyttinger?
Hvis rekken er sortert synkende (omvendt sortert) blir det bytter for hver eneste sammenligning. Følgende viser første "gjennomløp" med høyre hånd for en rekke med fire tall (venstre hånd peker på plass 1 hele tiden):
8 - 5 - 4 - 2
5 - 8 - 4 - 2
4 - 8 - 5 - 2
2 - 8 - 5 - 4
Når N=4 får vi altså N-1=3 bytter for å få på plass det minste tallet i plass 1. Merk at tallene fra og med posisjon 2 er omvendt sortert (5 - 4 - 2). Deretter må vi bruke N-2=2 bytter for å få riktig tall i plass 2, og N-3=1 bytter for å få riktig tall i plass 3. Det siste tallet er da nødvendigvis også korrekt plassert. Det betyr (N-1) + (N-2) + ... + 1 = N ×(N-1)/2 bytter. Dette er for øvrig en meget ineffektiv sorteringsalgoritme.
Lagringsplass for databasen til Hobbyhuset?
For å svare på denne oppgaven tar vi utgangspunkt i tabelldefinisjonene i vedlegg B. Basert på datatypene til kolonnene kan vi regne ut plassbehovet for én enkelt rad. Deretter anslår vi antall rader i hver tabell for å beregne samlet plassbehov for databasen.
Vi må først finne plassbehovet for enkeltverdier i ulike datatyper. Vi tar utgangspunkt i dokumentasjonen for MySQL, og setter opp følgende forenklede tabell for de datatypene som brukes i Hobbyhuset:
Datatype | Antall byter |
---|---|
SMALLINT | 2 |
INTEGER | 4 |
CHAR(n) | n |
VARCHAR(n) | n+1 |
DECIMAL(8,2) | 8 |
DATE | 3 |
Vi antar her at hvert tegn lagret som tekst krever 1 byte. Dette avhenger av hvilke tegnsett som er valgt. Hvis slike data lagres som Unicode vil hvert tegn kreve minst 2 byter, og noen tegn som mye som 4 byter.
Plassbehovet for verdier i datatypen DECIMAL(p,s) avhenger av totalt antall siffer p og antall plasser etter desimalpunktum s. I Hobbyhuset blir denne datatypen kun brukt for å lagre beløp og da hele veien som DECIMAL(8, 2). Vi går ikke nærmere inn på hvordan plassbehovet for denne datatypen er generelt, og antar bare at DECIMAL(8, 2) krever 8 byter.
Vi antar videre at data blir lagret "tett", ved at vi multipliserer plassbehovet for én rad med anslått antall rader for å finne plassbehovet for en tabell. Dette er ikke realistisk - forklaring følger i kapittel 9.
Tabell | Antall rader | Byter pr. rad | Plassbehov |
---|---|---|---|
Poststed | 4 000 | 4 + 51 = 55 | 220 000 |
Ansatt | 50 | 2 + 51 + 51 + 101 + 4 + 3 + 1 + 51 + 8 = 272 | 13 600 |
Kategori | 30 | 2 + 51 = 53 | 1 590 |
Kunde | 500 | 4 + 51 + 51 + 101 + 4 = 211 | 105 500 |
Vare | 2 000 | 5 + 51 + 8 + 2 + 4 + 3 = 73 | 146 000 |
Prishistorikk | 10 000 | 5 + 3 + 8 = 16 | 160 000 |
Ordre | 5 000 | 4 + 3 + 3 + 3 + 4 = 17 | 85 000 |
Ordrelinje | 20 000 | 4 + 5 + 8 + 4 = 21 | 420 000 |
Totalt | 1 151 690 |
Totalt vil databasen dermed kreve ca. 1 151 690 byter ≈ 1.2 MB.
Eksempeltabeller for universitetsdatabase.
Også på denne oppgaven er det mange mulige svar. Løsningen under fokuserer på ansatte, studenter og kurs, men et universitet må også lagre mange andre typer av informasjon. Vi nøyer oss med noen få eksempelrader for hver tabell.
Merk hvordan visse verdier går igjen i flere tabeller, f.eks. finner vi igjen både studentnumre og kurskoder i tabellen Karakter. Dette gjøres for at tabellene skal henge logisk sammen.
AnsNr | Fornavn | Etternavn | Stilling |
---|---|---|---|
20 | Knuth | Ullmann | Professor |
21 | Martin | Abel | Amanuensis |
22 | Lise | Fahrenheit | Professor |
23 | Celcius | Morgenstierne | Universitetslektor |
StudKode | Navn | Studiepoeng |
---|---|---|
701902 | Sivilingeniør IKT | 300 |
701933 | Bachelor sykepleie | 180 |
701055 | Bachelor friluftsliv | 180 |
KursKode | Navn | Studiepoeng |
---|---|---|
INF208 | Databaser II | 15 |
MAT001 | Matematikk | 10 |
INF001 | Grunnkurs IKT | 10 |
INF230 | Objektorientert systemutvikling | 10 |
INF382 | Automatateori | 10 |
INF399 | Parallellprogrammering | 10 |
StudKode | KursKode | Årstrinn | Semester |
---|---|---|---|
701902 | MAT001 | 1 | H |
701902 | INF208 | 4 | V |
701933 | MAT001 | 1 | H |
StudNr | Fornavn | Etternavn | Adresse | PostNr |
---|---|---|---|---|
05201 | Per | Zachariassen | Bjerggata 2 | 3400 |
05217 | Karianne | Brandt | Lovisenbergveien 17 | 3200 |
09333 | Birgitte | Lorentzen | Bergenveien 237 | 3200 |
StudNr | KursKode | Dato | Karakter |
---|---|---|---|
05201 | MAT001 | 10.12.2015 | C |
05201 | INF208 | 04.05.2016 | B |
09333 | MAT001 | 08.06.2016 | D |
Oversett 10000111 fra 2-tallsystemet til 10-tallsystemet.
1 × 27 + 0 × 26 +
0 × 25 + 0 × 24 +
0 × 23 + 1 × 22 +
1 × 21 + 1 × 20
= 128 + 0 + 0 + 0 + 0 + 4 + 2 + 1
= 135
Oversett 204 fra 10-tallsystemet til 2-tallsystemet.
Boken gir ingen oppskrift på hvordan man går fram, så her måtte man enten slå opp i en gammel matte-bok, søke på nettet, eller tenke ut en framgangsmåte selv.
Framgangsmåte: Heltallsdivider tallet på 2 og sjekk om det gir (1 til) rest. I så fall skal siste siffer være 1, og ellers 0. Fortsett på samme måte med toerplassen, firerplassen, åtterplassen osv., helt til resultatet av divisjonen blir 0.
10-tallsystemet | Resultat | Rest | 2-tallsystemet |
---|---|---|---|
204 / 2 | 102 | 0 | 0 |
102 / 2 | 51 | 0 | 00 |
51 / 2 | 25 | 1 | 100 |
25 / 2 | 12 | 1 | 1100 |
12 / 2 | 6 | 0 | 01100 |
6 / 2 | 3 | 0 | 001100 |
3 / 2 | 1 | 1 | 1001100 |
1 / 2 | 0 | 1 | 11001100 |
0 |
204 i 10-tallsystemet blir altså 11001100 i 2-tallsystemet, som vi kan dobbeltsjekke ved å oversette tilbake: 128 + 64 + 8 + 4 = 204.