Skip to content

Latest commit

 

History

History
71 lines (46 loc) · 3.59 KB

ovn3.md

File metadata and controls

71 lines (46 loc) · 3.59 KB

Övning 3 grudat23

Fredag 21/4 kl 08.00

Vid övningen ska du vara beredd att muntligt presentera och diskutera dina lösningar och din programkod.

  • Gör (minst) en fil per uppgift och lägg filerna i katalogen username-ovn3 i organisationen grudat23 på KTH GitHub.
  • Utgå från mallarna i /grudat23/ovn0/.
  • Lösningar ska vara inlämnade före deadline.

Du väljer själv vilket av programspråken Python, Go eller Java du vill använda. Observera att all kod på den här kursen ska dokumenteras och testas.

Betyg G

3.1 Fakultet i repris

Skriv en rekursiv fakultetsfunktion och bevisa att den är korrekt med hjälp av induktion.

Utöver beviset ska du som vanligt skriva testkod.

Beware of bugs in the above code; I have only proved it correct, not tried it.

– Donald Knuth

Video om induktion

3.2 Typvärde

Typvärdet (mode) i ett statistiskt datamaterial är det värde som förekommer flest gånger.

  • Skriv en funktion som beräknar typvärdet för en vektor med heltal. Om flera värden är lika vanliga skall funktionen ge det minsta av dem.
  • Tidskomplexiteten för din algoritm ska vara O(n log n).

Det är fritt fram att använda de datastrukturer och algoritmer som finns i standardbiblioteken för Python, Java eller Go. Det är bra att kunna sitt standardbibliotek och det är bra praxis att använda en färdig vältestad funktion snarare än att skriva den själv.

Med det sagt, så får man inte använda https://docs.python.org/3/library/statistics.html#statistics.multimode, som ju nästan löser uppgiften direkt. Observera också att det inte framgår av Python-dokumentationen vilken tidskomplexitet denna funktion har.

3.3 Negativt och positivt

  • Skriv en funktion som ändrar ordningen på en vektor med tal så att de negativa talen kommer först. Vektorn ska inte sorteras, du behöver endast samla alla negativa tal för sig.
  • Skriv en loopinvariant som förklarar hur koden fungerar.
  • Räkna också ut tidskomplexiteten för din algoritm.

Algoritmen ska vara in-place (Wikipedia: In-place algorithm), dvs använda högst O(1) extra utrymme. Du får inte använda någon sorteringsalgoritm.

Video om loopinvarianter

Betyg VG

För betyg VG ska du göra samma uppgifter som för betyg G, men med det extra kravet att algoritmerna i uppgift 3.2 och 3.3 ska ha O(n) tidskomplexitet. Det räcker med förväntad (expected) tid, men värstafall går förstås också bra. (Linjär värstafallstid är svårt men inte helt omöjligt.)

På engelska skiljer man på average time complexity där man väger samman tiderna för alla möjliga indata och expected time complexity där algoritmen använder sig av slump för att göra värstafallsbeteendet extremt osannolikt. Vi har sett två exempel på expected time hittils i kursen: hashtabeller och treapar. På svenska finns det tyvärr ingen tydlig och bra terminologi.

Så här skriver Wikipedia om Average-case complexity:

Average-case analysis requires a notion of an "average" input to an algorithm, which leads to the problem of devising a probability distribution over inputs. Alternatively, a randomized algorithm can be used. The analysis of such algorithms leads to the related notion of an expected complexity.