Dette er ein maskinomsett tekst som kann innehalda feil!
Quote
«Algoritme», eit ord programmerar nyttar når dei ikkje vil forklåra kva dei har gjort.
Algoritme?
Kva er ein algoritme?
Ein algoritme er ein logisk funksjon som utfører ein gjeven operasjon. Altså, du kan teknisk sett kalla ei funksjon som plussar saman to tal ein «algoritme», men som oftast er ein algoritme noko litt meir komplisert enn som så. Ofte vert algoritmar brukte for å gjera operasjonar som tek mykje tid, raskare.
Må eg bruka Python i desse oppgåvene?
Nei! Du kan bruka kvart som helst programmeringsspråk du føretrekk i desse oppgåvene.
Innebygde bibliotek?
Tanken i desse oppgåvene er å unngå å bruke innebygde bibliotek eller spesielle Python funksjonar. Til dømes, det finst ein enkel «one-liner» for å reversere tekst: text[::-1], men her vil me at du prøver å løyse slike oppgåver utan å bruke dette. Det kan hende me nemner ein innebygd funksjon dersom løysinga er litt vanskeleg å finne på. Dette vil verte markert med ❗.
I praksis, so skal det vera fullt mogleg å løyse alle desse oppgåvene med if, for, while og vanlege listeoperasjonar.
Korleis «designe» ein algoritme?
Som oftast vert algoritmar designa iterativt. Kva tyder dette?
1. ✅ Bryt fyrst problemet ned i mindre delar.
- Tenk fyrst å fremst på det aller viktigaste du treng for at algoritmen skal fungera
- Skal han returnera ein verdi? Ein
boolean? Ei liste? - Treng eg nokon hjelpe-funksjonar?
- Skal han returnera ein verdi? Ein
2. ❓ Er der nokon «edge-cases»?
- Kva hender dersom du kastar inn ei tom liste eller tekst?
3. ✅ Byrja med å berre prøva å laga ein løysing
4. ✅ Sjå um algoritmen hev ein god fart i kjøretida
- Prøv større innmat, tek det lang tid?
5. ❓ Hugs på løysinga di, treng du alle stega du har brukt?
- Er alle
if-sjekkar naudsynte? - Um du har meir enn ein
for-lykkje, finst det nokre klåre måtar å gjera dette til einfor-lykkje?- Dette er ulikt dersom du har nestla lykkjer eller lykkjer etter kvarandre. Etter kvarandre er ofte mogleg å unngå.
6. ✅ Hugs på ekstreme scenarium med inputs:
- Døme med tal: store tal, små tal, negative tal
- Tekstdøme: mykje tekst, mange små ord, ekstra mellomrom, store og små bokstavar.
7. ❓ Er det nytto å bruka pseudo-kode til å forstå logikken betre?
Oppgåve 1 – Finna ut om ei liste inneheld eit gjeve tal
Lag ein algoritme (funksjon) som finn ut om ei liste inneheld eit gjeve tal. Han skal returnera True eller False basert på om talet eksisterer i lista eller ikkje.
Her er ei 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
- Tak inn ei liste og ei liste-verdi inn i ei funksjon. I denne oppgåva skal det vera tal, men kan vera tekst.
- Bruk ei
for-lykkje til å gå gjennom lista - Um talet er lik sjekketalet, returner
True - Dersom
for-lykkja er over og du ikkje har funne det, returnerFalse
Svaret (i python)
def exists_in_list(the_list, check):
for number in the_list:
if number == check:
return True
return False
Oppgåve 2 - Summering
Lag ein algoritme som summerer ihop ei liste med tal.
Test-data for algoritme:
[1, 2, 3, 4, 5, 6], gjev svaret21.[5, 1, 23, 68, 22, 13, 4], gjev svaret136[3, 3, -3, -3, 3]gjev svaret3. Eventuelt so kann du ignorera negative tal å gjeva svaret9.
Tips til framgangsmåte
- Tak inn ei liste i ei funksjon
- Lagra ei midlertidig sum som
0. - Bruk ei
for-lykkje for å gå gjennom lista. returnsummen av lista.
Svaret (i python)
def sum_list(numbers):
total = 0
for num in numbers:
total += num
return total
Oppgåve 3a – Største verdi i ei liste
Lag ein algoritme som finn den største verdien i ei liste.
Test-data for algoritme:
[1, 2, 3, 4, 5, 6], gjev svaret6.[6, 17, 227, 1, 23, 42, 12], gjev svaret227[2, -2, 2, -2, -2, 2]gjev svaret2.
Tips til framgangsmåte
- Tak inn ei liste i ei funksjon
- Set ei midlertidig verdi til fyrste elementet i lista.
- Bruk ei
for-lykkje for å gå igjennom lista og samanlikn med verdien du sette i 2. - Um verdien er større, set 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
Uppgåve 3b – Um lista er tom?
Legg til ein prøve som testar um lista inneheld element. Um ikkje, 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
Oppgåve 4 – Telja talet av eit gjeve element i ei liste
Lag ein algoritme som tel talet av eit gjeve element i ei liste.
Test-data for algoritme:
["apple", "banana", "orange", "apple", "apple", "banana"]medapplegjev 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]med4gjev svaret8.["cat", "dog", "cat", "mouse", "cat", "dog", "dog"]meddoggjev svaret3.[7, 7, 2, 9, 7, 1, 0, 7, 3, 7, 9]med7gjev svaret5.["red", "blue", "green", "red", "yellow", "red"]medredgjev svaret3.[10, -2, -2, -2, 5, 10, 10, -2]med-2gjev svaret4.
Tips til framgangsmåte
- Tak inn ei liste og ei sjekkeverdi i ei funksjon
- Byrj med ei midlertidig teljeverdi sett til 0.
- Gå igjennom lista med ei
for-lykkje. - Um elementet er likt med sjekken, auk teljeverdien med 1.
- Returner teljeverdien.
Svaret (i python)
def count(the_list, check):
count = 0
for element in the_list:
if element == check:
count += 1
return count
Oppgåve 5 – Vende ein streng, tekst
Lag ein algoritme som vender ein gjeven streng.
Test-data for algoritme:
Hello there!vert til!ereht olleH.heisann alle sammenvert tilnemmas ella nnasiehPythonvert tilnohtyPracecarvert tilracecar12345abcvert tilcba54321god morgenvert tilnegrom dog
Tips til framgangsmåte
- Tak inn ein
stringi ei funksjon - Lag ei mellombels verdi for å lagra ein tom
string. - Gå igjennom tekstane med ein
for-løkke medrange. Her kan du gå igjennom lista baklengs, men det går an å løysa denne ved å gå framover i lista. - Legg til kvar karakter i den mellombelse verdien i rekkefølge.
- Returner den mellombelse teksten.
Svaret (i python)
def reverse(text):
result = ""
# Denne linja er litt komplisert, men ho startar
# på slutten, går (inkludert) til 0 (ved å skrive
# -1 som slutt), og tel nedover med 1 kvar gong
for i in range(len(text) - 1, -1, -1):
result += text[i]
return result
Eventuelt so kann du bruke ein algoritme som legg til på byrjinga i staden:
def reverse(text):
result = ""
for i in range(0, len(text)):
# legg til på byrjinga i staden
result = text[i] + result
return result
Oppgåve 6 – Palindrom-algoritme
Lag ein algoritme som sjekkar om eit gjeve ord er eit palindrom. Døme på palindrom er abba, racecar, regninger.
Tips til framgangsmåte
- Lag ei funksjon som tek inn tekst å sjekke
- Bruk ei
for-løkke til å sjekke om bokstavane på kvar side av teksten er like. - Returner
Falsedersom ei bokstav ikkje stemmer, viss alle stemmer (for-løkka blir ferdig), returnerTrue.
Ekstra:
Ser du korleis du kan gjere algoritmen dobbelt så rask?
Hint
Du treng berre å 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
Raskare 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
Oppgåve 7 – Sjekke um ei liste er sortert
Lag ein algoritme som sjekkar um ei liste er sortert. Den lettaste måten å sjekke dette på er å byrja frå byrjinga å samanlikne um neste element er «større». Dersom eit element ikkje er «større» så er ikkje lista sortert.
Test-data for algoritme:
[1, 2, 3, 4, 5, 6], gjev svaretTrue.[6, 17, 227, 1, 23, 42, 12], gjev svaretFalse[2, -2, 2, -2, -2, 2]gjev svaretFalse.[2, 2, 3, 4, 4, 6], gjev svaretTrue.[12, 23, 34, 45, 56, 67], gjev svaretTrue.
Tips til framgangsmåte
- Lag ei funksjon som tek inn ei liste
- Bruk ei
for-lykkje til å gå gjennom heile lista (bruk range til lengda av lista, minus 1len(list) - 1) - Samanlikn element \(n\) med \(n + 1\), altså noverande element med neste element.
- Um \(n\) er mindre enn \(n + 1\), gå til neste samanlikning.
- Um det ikkje er mindre, men større, så er ikkje lista sortert. Returner
Falseher. - Um du når enden, så er lista 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
Oppgåve 8 - Blanding
Lag ein algoritme som blandar ei liste med ting. Det finst mange måtar å gjera dette på, men ein god måte er det som vert kalla ein Fisher-Yates shuffle algoritme. Du kan lesa meir om denne her Wikipedia.
Test Data
["a", "b", "c", "d", "e"]→ kan verte t.d.["c", "e", "a", "d", "b"][1, 2, 3, 4, 5, 6]→ kan verte t.d.[4, 1, 6, 3, 2, 5]["apple", "banana", "orange"]→ kan verte t.d.["orange", "apple", "banana"]["x"]→ vert framleis["x"][]→ vert framleis[]
Han verkar slik:
Algoritmen
- Lag ei funksjon som tek inn lista med tal
- Lag ei ny tom liste som skal halda på det blanda resultatet.
- Bruk ein
randomtil å velja ein tilfeldig indeks i lista. - Legg til dette elementet i den tomme lista og slett det frå den gamle
- Returner den nye lista frå 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
Oppgåve 9 - Bogo-sort
I denne oppgåva skal du lage ein (praktisk talt) forferdeleg, men ekstremt enkel sorterings-algoritme. Han er ekstremt dårleg når det gjeld til store lister (han kjem til å taka evigheter med meir enn 12-13 ting). I Level 2 så skal me laga ein betre 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 verkar slik:
Algoritmen
- Lag ei funksjon som tek inn lista med usorterte tal
- Bland lista tilfeldig (bruk shuffle frå oppgåve 8).
- Sjekk om lista er sortert (bruk sjekken du laga i oppgåve 7).
- Um lista ikkje er sortert, gjenta steg 2 og 3.
- Gjentak heilt til lista er sortert, deretter returner
Enkelt forklart: bogo-sort blandar heile lista og vonar på at ho er sortert.
Hint: Gjerne bruk shuffle frå oppgåve 8 til å laga ei 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
Oppgåve 10a – Søk etter tekst – «substring» (Vanskelig!)
Lag ein algoritme som kann finne eit søkeord i tekst. Altså, dersom du har ei setning som hello there så vil du returnere True med søkeordet hello, False med eit 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 ei funksjon som tek inn to
stringar, data og søkeord. - Bruk ei
for-løkke medrangetil å gå gjennom teksten. - Her er det viktig å tenkje på kor langt løkka skal gå.
- Opprett ei midlertidig variabel som seier om søkeordet har vorte funne, sett ho til
Trueby default. - Bruk endå ei
for-løkke medrangetil å samanlikne der du er i teksten med søkeordet. - Um noko i søkeordet ikkje stemmer med der du sjekkar no, sett den midlertidige variabelen til
Trueogbreakut av den indre løkka - Um du kjem til slutten av teksten utan å finne noko, 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
Oppgåve 10b
Legg òg til ein ekstra kontroll som passar på at søkeordet ikkje er lengre enn setningi.
Tips til framgangsmåte
- Legg til denne kontrollen før
for-lykkja.
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
Oppgåve 11 - Reversering av ord i setning (Vanskelig)
Hugsa attende til Oppgåve 5 um å reversera ei setning. Gjør um på (eller byrja på nytt), å lag ein algoritme som reverserer kvart eit ord i ei setning, so set dei saman att.
Test-data for algoritme:
hello there everyonevert tilolleh ereht enoyreveThis is the way it goes!vert tilsihT si eht yaw ti !seogdoes this racecar go? of course!vert tilseod siht racecar ?og fo !esruoc
Tips til framgangsmåte
- Lag ei funksjon som tek inn ei
string. - ❗Del opp teksten ved å bruke
.split(" "). - Lag ei mellombels variabel for å lagra sluttverdien.
- Bruk ei
for-løkke til å gå gjennom kvart ord. - Bruk same metoden for reversering som i Oppgåve 5
- Bruk resultatet og legg til i variabelen du laga 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:
Oppgåve E1 – Slette duplikatar frå ei liste
Sagt at du hev ei liste som innhald tall, eller tekst, men me vil slette duplikatarne. Lag ein algoritme som slettar alle duplikatar frå ei liste og innhald berre den fyrste av kvart unikt element som eksisterer i lista.
Tips til framgangsmåte
- Byrj med ein funksjon som tek inn ei liste
- Her skal me bruke
while-løkker i staden forfor. Det gjer det lettare i Python, i andre språk fungererformed telje-variablar fint. - Opprett ei teljevariabel
idx(for indeks, elleri) - Bruk ei
while-løkke som skal gå til lengda av lista - Me vil samanlikne elementet på
idxmed alle andre element - Opprett ei teljevariabel til
jdx(ellerj) som startar påidx + 1 - Samanlikn element på
idxmed element påjdx, viss dei er like, slettjdxved å brukepop(jdx). - HUGSA! Hvis du slettar elementet så blir lista mindre, derfor må me gå tilbake eit steg ved
jdx -= 1. - Auka
jdxmed 1 og test neste element - Etter den indre
while-løkka aukaidxmed 1 og den ytrewhile-løkka vil fortsette - Returner til slutt lista med sletta duplikatar
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 gjeva:
["apple", "banana", "orange", "pear"]
- Skal gjeva:
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
Oppgåve E2 - Counting Sort
Counting sort er ein av dei få sorterings-algoritmene som verkar i det me kallar \(O(n)\) tid. Altså, han tek ikkje så veldig mykje lengre tid enn talet på element i lista. Les meir om Big O notasjon i Level 2.
Det kjem litt an på kor stort spennet av element er. Dersom det minste er 0 og det største er 100000 kan det taka litt tid, så denne kan brukast dersom spennet av verdiar er lite. Han fungerer heller ikkje for negative tal, men det går an å modifisera algoritmen til å fungera med negative tal.
Algoritmen fungerer slik:
- Finn ut kor stort største element er, lagre verdien til dette elementet som \(k\).
- Lag ei liste som inneheld \(k + 1\) element,
count. - Gå igjennom den usorterte lista og bruk verdien til talet som indeks. Altså, dersom elementet har verdien 47, så går du til
count[47]og aukar den med 1. - Gå igjennom
countlista og plasser talet på tal som indeksen er. Døme: Det står 3 på indeks 1, så legg du til tre 1 tal.
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
- Byrj med å lage ein funksjon med ei liste som innspel
- Lag ei tom
outputliste - Bruk ei
for-lykkje til å gå gjennom heile lista - Halde styr på maksverdien i ein variabel før
for-lykkja - Oppdater maksverdien dersom du finn noko større
- Lag ei liste som inneheld dette talet nullar + 1. Døme: største verdi er 47, då lagar du ei liste med 48 nullar. Dette kan du gjere med
[0] * (maks + 1), eller eiforlykkje. Kall dencount. - Gå gjennom lista ein gong til med ei
for-lykkje - Bruk verdien til elementet som indeks og auk med 1.
count[value] += 1 - Bruk ei
for-lykkje til å gå gjennomcountlista. - Bruk verdien som er på kvar indeks til å leggje til det talet tall
- Returner den sorterte lista
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 ein haug med nullar
count = [0] * (max_val + 1)
for n in input_list:
count[n] += 1
for i in range(len(count)):
# bruk _ for å ignorere ein verdi
for _ in range(count[i]):
output.append(i)
return output

