Quote
“Algorithm”, a word used by programmers when they don’t want to explain what they did.
Algoritme?
Hva er en algoritme?
En algoritme er en logisk funksjon som utfører en gitt operasjon. Altså, du kan teknisk sett kalle en funksjon som plusser sammen to tall en “algoritme”, men som oftest er en algoritme noe litt mer komplisert enn som så. Ofte blir algoritmer brukt for å gjøre operasjoner som tar mye tid, raskere.
Må jeg bruke Python i disse oppgavene?
Nei! Du kan bruke hvilket som helst programmeringsspråk du foretrekker i disse oppgavene.
Innebygde biblioteker?
Tanken i disse oppgavene er å unngå å bruke innebygde biblioteker eller spesielle Python funksjoner. For eksempel, det finnes en enkel “one-liner” for å reversere tekst: text[::-1], men her vil vi at du prøver å løse slike oppgaver uten å bruke dette. Det kan hende vi nevner en innebygd funksjon dersom løsningen er litt vanskelig å finne på. Dette vil bli markert med ❗.
I praksis så skal det være fullt mulig å løse alle disse oppgavene med if, for, while og vanlige listeoperasjoner.
Hvordan “designe” en algoritme?
Som oftest blir algoritmer designet iterativt. Hva betyr dette?
1. ✅ Bryt først problemet ned i mindre deler.
- Tenk først å fremst på det aller viktigste du trenger for at algoritmen skal fungere
- Skal den returnere en verdi? En
boolean? En liste? - Trenger jeg noen hjelpe-funksjoner?
- Skal den returnere en verdi? En
2. ❓ Er det noen “edge-cases”?
- Hva skjer dersom du hiver inn en tom liste eller tekst?
3. ✅ Begynn med å bare prøve å lage en løsning
4. ✅ Sjekk om algoritmen virker grei i kjøretid
- Prøv større input, tar det lang tid?
5. ❓ Tenk på løsningen din, trenger du alle stegene du har brukt?
- Er alle
if-sjekker nødvendige? - Hvis du har mer enn en
for-loop, finnes det noen klare måter å gjør dette til enfor-loop?- Dette er forskjellig dersom du har nested loops eller loops etterhverandre. Etterhverandre er ofte mulig å unngå.
6. ✅ Tenk på ekstreme scenarioer med inputs:
- Eksempel med tall: store tall, små tall, negative tall
- Teksteksempel: mye tekst, mange små ord, ekstra mellomrom, store og små bokstaver.
7. ❓ Er det nyttig bruke pseudo-kode til å forstå logikken bedre?
Oppgave 1 - Finne ut om en liste inneholder et gitt tall
Lag en algoritme (funksjon) som finner ut om en liste inneholder et gitt tall. Den skal returnere True eller False basert på om tallet eksisterer i listen eller ikke.
Her er en liste med test-data:
Test-data for algoritme:
| Test-Data | Sjekk | Svar |
|---|---|---|
[1, 2, 3, 4, 5, 6, 7, 8, 9] | 5 | True |
[1, 2, 3, 4, 5, 6, 7, 8, 9] | 10 | False |
[2, 3, 5, 7, 11, 13, 17, 19, 23] | 2 | True |
[2, 3, 5, 7, 11, 13, 17, 19, 23] | 10 | False |
[-1, 0, 1, -34, 321, 22, 98, -214] | -214 | True |
[-1, 0, 1, -34, 321, 22, 98, -214] | 0 | True |
[-1, 0, 1, -34, 321, 22, 98, -214] | 2 | False |
Tips til framgangsmåte
- Ta inn en liste og en liste-verdi in en funksjon. I denne oppgaven skal det være tall, men kan være tekst.
- Bruk en
for-loop til å gå igjennom listen - Hvis tallet er lik sjekke-tallet, returner
True - Dersom
for-loopen er over og du ikke har funnet det, returnerFalse
Svaret (i python)
def exists_in_list(the_list, check):
for number in the_list:
if number == check:
return True
return False
Oppgave 2 - Summering
Lag en algoritme som summerer sammen en liste med tall.
Test-data for algoritme:
[1, 2, 3, 4, 5, 6], gir svaret21.[5, 1, 23, 68, 22, 13, 4], gir svaret136[3, 3, -3, -3, 3]gir svaret3. Eventuelt så kan du ignorere negative tall å gi svaret9.
Tips til framgangsmåte
- Ta inn en liste i en funksjon
- Lagre en midlertidig sum som
0. - Bruk en
for-loop for å gå igjennom listen. returnsummen av listen.
Svaret (i python)
def sum_list(numbers):
total = 0
for num in numbers:
total += num
return total
Oppgave 3a - Maksverdi i en liste
Lag en algoritme som finner den største verdien i en liste.
Test-data for algoritme:
[1, 2, 3, 4, 5, 6], gir svaret6.[6, 17, 227, 1, 23, 42, 12], gir svaret227[2, -2, 2, -2, -2, 2]gir svaret2.
Tips til framgangsmåte
- Ta inn en liste i en funksjon
- Sett en midlertidig verdi til første element i listen.
- Bruk en
for-loop for å gå igjennom listen å sammenlign med verdien du satt i 2. - Hvis verdien er større sett den midlertidige verdien til den nye verdien.
returndenne midlertidige verdien.
Svaret (i python)
def find_max(numbers):
largest = numbers[0]
for num in numbers:
if num > largest:
largest = num
return largest
Oppgave 3b - Hvis listen er tom?
Legg til en sjekk som tester om listen inneholder elementer. Hvis ikke, returner None.
Svaret (i python)
def find_max(numbers):
if len(numbers) == 0:
return None
largest = numbers[0]
for num in numbers:
if num > largest:
largest = num
return largest
Oppgave 4 - Telle antall av et gitt element i en liste
Lag en algoritme som teller antallet av et gitt element i en liste.
Test-data for algoritme:
["apple", "banana", "orange", "apple", "apple", "banana"]medapplegir svaret 3.[1, 4, 5, 2, 4, -3, -4, 4, 2, 4, 221, 3, 1, 1, 4, 1, 12, 33, 4, 4, 2, -4, 1, 4]med4gir svaret8.["cat", "dog", "cat", "mouse", "cat", "dog", "dog"]meddoggir svaret3.[7, 7, 2, 9, 7, 1, 0, 7, 3, 7, 9]med7gir svaret5.["red", "blue", "green", "red", "yellow", "red"]medredgir svaret3.[10, -2, -2, -2, 5, 10, 10, -2]med-2gir svaret4.
Tips til framgangsmåte
- Ta inn en liste og en sjekke-verdi i en funksjon
- Begynn med en midlertidig telle verdi satt til 0.
- Gå igjennom listen med en
for-loop. - Hvis elementet er likt med sjekken, øk telle-verdien med 1.
- Returner telle-verdien.
Svaret (i python)
def count(the_list, check):
count = 0
for element in the_list:
if element == check:
count += 1
return count
Oppgave 5 - Reversere en string, tekst
Lag en algoritme som reverserer en gitt string.
Test-data for algoritme:
Hello there!blir til!ereht olleH.heisann alle sammenblir tilnemmas ella nnasiehPythonblir tilnohtyPracecarblir tilracecar12345abcblir tilcba54321god morgenblir tilnegrom dog
Tips til framgangsmåte
- Ta inn en
stringi en funksjon - Lag en midlertidig verdi for å lagre en tom
string. - Gå igjennom tekstne med en
for-loop medrange. Her kan du gå igjennom listen baklengs, men det går an å løse denne ved å gå framover i listen. - Legg til hver karakter i den midlertidige verdien i rekkefølge.
- Returner den midlertidige teksten.
Svaret (i python)
def reverse(text):
result = ""
# Denne linja er litt komplisert, men den starter
# på slutten, går (inkludert) til 0 (ved å skrive
# -1 som slutt), og teller nedover med 1 hver gang
for i in range(len(text) - 1, -1, -1):
result += text[i]
return result
Eventuelt så kan du bruke en algoritme som legger til på begynnelsen i stedet:
def reverse(text):
result = ""
for i in range(0, len(text)):
# legg til på begynnelsen i stedet
result = text[i] + result
return result
Oppgave 6 - Palindrom-algoritme
Lag en algoritme som sjekker om et gitt ord er et palindrom. Eksempler på palindromer er abba, racecar, regninger.
Tips til framgangsmåte
- Lag en funksjon som tar in tekst å sjekke
- Bruk en
for-loop til å sjekke om bokstavene på hver side av teksten er like. - Returner
Falsedersom en bokstav ikke stemmer, hvis alle stemmer (for-loopen blir ferdig), returnerTrue.
Ekstra:
Ser du hvordan du kan gjøre algoritmen dobbelt så rask?
Hint
Du trenger bare å sjekke halvparten!
Svaret (i python)
def palindrome(text):
for i in range(0, len(text)):
if text[i] != text[len(text) - i - 1]:
return False
return True
Raskere algoritme
def palindrome(text):
for i in range(0, int(len(text) / 2)):
if text[i] != text[len(text) - i - 1]:
return False
return True
Oppgave 7 - Sjekke om en liste er sortert
Lag en algoritme som sjekker om en liste er sortert. Den letteste måten å sjekke dette på er å begynne fra begynnelsen å sammenligne om neste element er “større”. Dersom et element ikke er “større” så er ikke listen sortert.
Test-data for algoritme:
[1, 2, 3, 4, 5, 6], gir svaretTrue.[6, 17, 227, 1, 23, 42, 12], gir svaretFalse[2, -2, 2, -2, -2, 2]gir svaretFalse.[2, 2, 3, 4, 4, 6], gir svaretTrue.[12, 23, 34, 45, 56, 67], gir svaretTrue.
Tips til framgangsmåte
- Lag en funksjon som tar in en liste
- Bruk en
for-loop til å gå igjennom hele listen (bruk range til lengden av listen, minus 1len(list) - 1) - Sammenlign element \(n\) med \(n + 1\), altså nåværende element med neste element.
- Hvis \(n\) er mindre enn \(n + 1\), gå til neste sammenligning.
- Hvis det ikke er mindre, men større, så er ikke listen sortert. Returner
Falseher. - Hvis du når enden så er listen sortert, returner
True.
Svaret (i Python)
def is_sorted(the_list):
for i in range(len(the_list) - 1):
if the_list[i] > the_list[i + 1]:
return False
return True
Oppgave 8 - Shuffle
Lag en algoritme som blander en liste med ting. Det finnes mange måter å gjøre dette på, men en god måte er det som kalles en Fisher-Yates shuffle algorithm. Du kan lese mer om denne her Wikipedia.
Test Data
["a", "b", "c", "d", "e"]→ kan bli f.eks.["c", "e", "a", "d", "b"][1, 2, 3, 4, 5, 6]→ kan bli f.eks.[4, 1, 6, 3, 2, 5]["apple", "banana", "orange"]→ kan bli f.eks.["orange", "apple", "banana"]["x"]→ blir fortsatt["x"][]→ blir fortsatt[]
Den fungerer slik:
Algoritmen
- Lag en funksjon som tar inn listen med tall
- Lag en ny tom liste som skal holde på det blanda resultatet.
- Bruk en
randomtil å velge en tilfeldig index i listen. - Legg til dette elementet i den tomme listen og slett det fra den gamle
- Returner den nye listen fra funksjonen
Svaret (i Python)
import random
def shuffle(the_list):
shuffled = []
while len(the_list) > 0:
i = random.randrange(0, len(the_list))
shuffled.append(the_list[i])
the_list.pop(i)
return shuffled
Oppgave 9 - Bogo-sort
I denne oppgaven skal du lage en (praktisk talt) forferdelig, men ekstremt enkel sorterings-algoritme. Den er ekstremt dårlig når det kommer til store lister (den kommer til å ta evigheter med mer enn 12-13 ting). I Level 2 så skal vi lage en bedre sorterings-algoritme, bubble-sort.
Test Data
[3, 1, 2]→[1, 2, 3][5, 4, 3, 2, 1]→[1, 2, 3, 4, 5][10, 7, 8, 2]→[2, 7, 8, 10][1, 1, 1]→[1, 1, 1][9, 3, 6, 3, 9]→[3, 3, 6, 9, 9][0, -1, 4, -2]→[-2, -1, 0, 4]
Algoritmen fungerer slik:
Algoritmen
- Lag en funksjon som tar inn listen med usorterte tall
- Bland listen tilfedlig (bruk shuffle fra oppgave 8).
- Sjekk om listen er sortert (bruk sjekken du lagde i oppgave 7).
- Hvis listen ikke er sortert, repeter steg 2 og 3.
- Repeter helt til listen er sortert, deretter return
Enkelt forklart: bogo-sort blander hele listen og håper på at den er sortert.
Hint: Gjerne bruk shuffle fra oppgave 8 til å lage en usortert liste for algoritmen din.
Svaret (i Python)
def bogo_sort(the_list):
while not is_sorted(the_list):
the_list = shuffle(the_list)
return the_list
Oppgave 10a - Søk etter tekst - “substring” (Vanskelig!)
Lag en algoritme som kan finne et søkeord i tekst. Altså, dersom du har en setning som hello there så vil du returnere True med søkeordet hello, False med et søkeord som hahah. Denne algoritmen skal fungere uansett input og output.
Bruk tekst-dataen under til å sjekke om algoritmen din fungerer.
Test-data for algoritme:
hello there everyonemedthere=Truehello there everyonemedever=Truehello there everyonemedthen=Falseqwecvyufavsjekkftyergwcerymedsjekk=True
Tips til framgangsmåte
- Lag en funksjon som tar inn to
strings, data og søkeord. - Bruk en
for-loop medrangetil å gå igjennom teksten. - Her er det viktig å tenke på hvor langt loopen skal gå.
- Opprett en midlertidig variabel som sier om søkeordet har blitt funnet, sett den til
Trueby default. - Bruk enda en
for-loop medrangetil å sammenligne der du er i teksten med søkeordet. - Hvis noe i søkeordet ikke stemmer med der du sjekker nå, sett den midlertidige variabelen til
Trueogbreakut av den indre loopen - Hvis du kommer til slutten av teksten uten å finne noe, returner
False
Svaret (i Python)
def search(data, word):
for i in range(0, len(data) - len(word) + 1):
found = True
for j in range (0, len(word)):
if data[i + j] != word[j]:
found = False
break
if found:
return True
return False
Oppgave 10b
Legg også til en ekstra sjekk som passer på at søkeordet ikke er lengre enn setningen.
Tips til framgangsmåte
- Legg til denne sjekken før
for-loopen.
Svaret (i python)
def search(data, word):
if len(word) > len(data):
return False
for i in range(0, len(data) - len(word) + 1):
found = True
for j in range (0, len(word)):
if data[i + j] != word[j]:
found = False
break
if found:
return True
return False
Oppgave 11 - Reversering av ord i setning (Vanskelig)
Husk tilbake på Oppgave 5 om å reversere en setning. Gjør om på (eller begynn på nytt), å lag en algoritme som reverserer hvert enkelt ord i en setning, så setter dem sammen igjen.
Test-data for algoritme:
hello there everyoneblir tilolleh ereht enoyreveThis is the way it goes!blir tilsihT si eht yaw ti !seogdoes this racecar go? of course!blir tilseod siht racecar ?og fo !esruoc
Tips til framgangsmåte
- Lag en funksjon som tar inn en
string. - ❗Del opp teksten ved å bruke
.split(" "). - Lag en midlertidig variabel for å lagre sluttverdien.
- Bruk en
for-loop til å gå igjennom hvert ord. - Bruk samme metode for reversering som i Oppgave 5
- Bruk resultatet å legg til i variablen du lagde i steg 2.
- Returner sluttverdien
Svaret (i Python)
def reverse_words(words):
sentence = words.split(" ")
output = ""
for word in sentence:
reversed_word = ""
for i in range(0, len(word)):
reversed_word = word[i] + reversed_word
output += reversed_word + " "
return output
➕Ekstra:
Oppgave E1 - Slette duplikater fra en liste
Si du har en liste som inneholder tall, eller tekst, men vi vil slette duplikatene. Lag en algoritme som sletter alle duplikater fra en liste og inneholder kun den første av hvert unike element som eksisterer i lista.
Tips til framgangsmåte
- Begynn med en funksjon som tar inn en liste
- Her skal vi bruke
while-loops i stedet forfor. Det gjør det lettere i Python, i andre språk fungererformed telle-variabler fint. - Opprett en tellevariabel
idx(for index, elleri) - Bruk en
whileloop som skal gå til lengden av listen - Vi vil sammenligne elementet på
idxmed alle andre elementer - Opprett en tellevariabel til
jdx(ellerj) som starter påidx + 1 - Sammenlign element på
idxmed element påjdx, hvis de er like, slettjdxmed å brukepop(jdx). - HUSK! Hvis du sletter elementet så blir listen mindre, derfor må vi gå tilbake et steg ved
jdx -= 1. - Øk
jdxmed 1 og test neste element - Etter den indre
while-loopen økidxmed 1 og den ytrewhile-loopen vil fortsette - Returner til slutt listen med slettede duplikater
Test Data
[1, 2, 2, 3, 1, 4, 3]→ blir[1, 2, 3, 4]["a", "b", "a", "c", "b", "d"]→ blir["a", "b", "c", "d"][5, 5, 5, 5]→ blir[5]["x", "y", "z", "x", "y", "x"]→ blir["x", "y", "z"][10, -1, 10, -1, 0, 0, 10]→ blir[10, -1, 0]["apple", "apple', "banana", "orange", "apple", "orange", "pear", "apple"]- Skal gi:
["apple", "banana", "orange", "pear"]
- Skal gi:
Svaret (i Python)
def delete_duplicates(the_list):
idx = 0
while idx < len(the_list):
jdx = idx + 1
while jdx < len(the_list):
if the_list[idx] == the_list[jdx]:
the_list.pop(jdx)
jdx -= 1
jdx += 1
idx += 1
return the_list
Oppgave E2 - Counting Sort
Counting sort er en av de få sorterings-algoritmene som fungerer i det vi kaller \(O(n)\) tid. Altså, den tar ikke så veldig mye lengre tid enn antall elementer i lista. Les mer om Big O notation i Level 2.
Det kommer litt an på hvor stort spennet av elementer er. Hvis det minste er 0 og det største er 100000 kan det ta litt tid, så denne kan brukes dersom spennet av verdier er lite. Den fungerer heller ikke for negative tall, men det går an å modifisere algoritmen til å fungere med negative tall.
Algoritmen fungerer slik:
- Finn ut hvor stort største element er, lagre verdien til dette elementet som \(k\).
- Lag en liste som inneholder \(k + 1\) elementer,
count. - Gå igjennom den usorterte listen og bruk verdien til tallet som index. Altså, hvis elementet har verdien 47, så går du til
count[47]og øker den med 1. - Gå igjennom
countlisten og plasser antallet tall som indeksen er. Eksempel: Det står 3 på index 1, så legger du til tre 1 tall.
Testdata
| Usortert Data | Sortert Data |
|---|---|
[7, 3, 9, 1, 4, 3, 0, 6, 8, 6, 2, 1, 9, 0, 5, 4] | [0, 0, 1, 1, 2, 3, 3, 4, 4, 5, 6, 6, 7, 8, 9, 9] |
[12, 13, 15, 0, 8, 15, 8, 5, 16, 8, 0, 20, 4, 9, 17, 16, 1, 3, 6, 15, 5, 2, 3, 1, 19, 13, 17, 5, 3, 10] | [0, 0, 1, 1, 2, 3, 3, 3, 4, 5, 5, 5, 6, 8, 8, 8, 9, 10, 12, 13, 13, 15, 15, 15, 16, 16, 17, 17, 19, 20] |
Tips til framgangsmåte
- Begynn med å lage en funksjon med en liste som input
- Lag en tom
outputliste - Bruk en
for-loop til å gå igjennom hele listen - Hold styr på maksverdien i en variabel før
for-loopen - Oppdater maksverdien dersom du finner noe større
- Lag en liste som inneholder dette antall nuller + 1. Eksempel: største verdi er 47, da lager du en liste med 48 nuller. Dete kan du gjøre med
[0] * (maks + 1), eller enforloop. Kall dencount. - Gå igjennom listen en gang til med en
for-loop - Bruk verdien til elementet som index og øk med 1.
count[value] += 1 - Bruk en
for-loop til å gå igjennomcountlisten. - Bruk verdien som er på hver index til å legge til det antallet tall
- Returner den sorterte listen
Svaret (i Python)
def counting_sort(input_list):
output = []
max_val = input_list[0]
for n in input_list:
if n > max_val:
max_val = n
# dette vil lage en haug med nuller
count = [0] * (max_val + 1)
for n in input_list:
count[n] += 1
for i in range(len(count)):
# bruk _ for å ignorere en verdi
for _ in range(count[i]):
output.append(i)
return output

