""" coding=utf-8
|
|
|
|
Analytical Skills
|
|
Practicum 4: algoritmiek
|
|
|
|
(c) 2019 Hogeschool Utrecht
|
|
Tijmen Muller (tijmen.muller@hu.nl)
|
|
|
|
|
|
Naam:
|
|
Klas:
|
|
Studentnummer:
|
|
|
|
|
|
Opdracht: beantwoord onderstaande vragen en werk onderstaande functies uit. Elke functie krijgt als argument een
|
|
(mogelijk ongesorteerde) lijst *lst* met gehele getallen (int).
|
|
|
|
Let op! Je mag voor deze opdracht geen extra modules importeren met 'import'.
|
|
"""
|
|
"""
|
|
1. Sorteeralgoritme
|
|
|
|
Hieronder staat de pseudocode van een sorteeralgoritme:
|
|
1. Startend vanaf het begin van een lijst, vergelijk elk element met zijn volgende buur.
|
|
2. Als het element groter is dan zijn volgende buur, verwissel ze van plaats.
|
|
3. Doorloop zo de lijst tot het eind.
|
|
4. Als er verwisselingen zijn geweest bij stap 2., ga naar stap 1.
|
|
|
|
1a. Handmatig toepassen
|
|
Gegeven is de lijst l = [ 4, 3, 1, 2 ]. Geef de waardes die de lijst aanneemt bij álle tussenstappen bij
|
|
toepassing van bovenstaand sorteeralgoritme.
|
|
|
|
[antwoord]
|
|
|
|
|
|
1b. Implementatie
|
|
Implementeer het sorteeralgoritme in Python in een functie genaamd my_sort(lst).
|
|
|
|
|
|
1c. Best en worst case
|
|
- Stel je hebt een lijst met de waarden 1, 2 en 3. Bij welke volgorde van de waarden in de lijst is het
|
|
sorteeralgoritme het snelste klaar (best-case scenario)? Hoeveel vergelijkingen (zoals beschreven
|
|
in stap 1. van de pseudocode) zijn nodig geweest?
|
|
|
|
[antwoord]
|
|
|
|
|
|
- Bij welke volgorde van de waarden in de lijst is het sorteeralgoritme het minst snel klaar
|
|
(worst-case scenario)? Hoeveel vergelijkingen zijn nodig geweest?
|
|
|
|
[antwoord]
|
|
|
|
|
|
- Stel je hebt een lijst met de waarden 1 tot en met 4. Wat is nu het best-case scenario?
|
|
Hoeveel vergelijkingen zijn er nodig?
|
|
En wat is nu het worst-case scenario? Hoeveel vergelijkingen zijn er nodig?
|
|
|
|
[antwoord]
|
|
|
|
|
|
- Stel je hebt een lijst met de waarden 1 tot en met n (je weet nu dus niet precies hoeveel waarden er in de
|
|
lijst zitten, het zijn er 'n'). Wat is nu het best-case scenario? Hoeveel vergelijkingen zijn er nodig?
|
|
En wat is nu het worst-case scenario? Hoeveel vergelijkingen zijn er nodig?
|
|
|
|
[antwoord]
|
|
|
|
|
|
|
|
2. Recursie
|
|
|
|
2a. Lineair zoeken
|
|
Implementeer het lineair zoekalgoritme in Python op een *recursieve* manier. Maak hiervoor de functie genaamd
|
|
linear_search_recursive(lst, target).
|
|
|
|
|
|
2b. Binair zoeken
|
|
Implementeer het binair zoekalgoritme in Python op een *recursieve* manier. Maak hiervoor de functie genaamd
|
|
binary_search_recursive(lst, target).
|
|
"""
|
|
|
|
|
|
def my_sort(lst):
|
|
"""
|
|
Sorteert gegeven lijst lst volgens het algoritme zoals beschreven in de pseudocode bij 1. hierboven.
|
|
De sortering vind 'in place' plaats, met andere woorden: de gegeven lijst lst wordt *zelf* gemuteerd. Er is
|
|
geen return-waarde.
|
|
"""
|
|
return None
|
|
|
|
|
|
def linear_search_recursive(lst, target):
|
|
"""
|
|
Zoekt een element in gegeven lijst door middel van recursief lineair zoeken.
|
|
|
|
Argumenten:
|
|
lst -- de lijst waarin gezocht wordt (list)
|
|
target -- het element dat gezocht wordt
|
|
|
|
Retourneert of het element in de lijst voorkomt (bool)
|
|
"""
|
|
return False
|
|
|
|
|
|
def binary_search_recursive(lst, target):
|
|
"""
|
|
Zoekt een element in gegeven lijst door middel van recursief binair zoeken.
|
|
|
|
Argumenten:
|
|
lst -- de lijst waarin gezocht wordt (list)
|
|
target -- het element dat gezocht wordt
|
|
|
|
Retourneert of het element in de lijst voorkomt (bool)
|
|
"""
|
|
return False
|
|
|
|
|
|
"""==============================================[ HU TESTRAAMWERK ]====================================================
|
|
Onderstaand staan de tests voor je code -- hieronder mag je niets wijzigen!
|
|
Je kunt je code testen door deze file te runnen of met behulp van pytest.
|
|
"""
|
|
import random
|
|
|
|
|
|
def test_my_sort():
|
|
lst_test = random.sample(range(-99, 100), 6)
|
|
lst_copy = lst_test.copy()
|
|
my_sort(lst_test)
|
|
assert lst_test == sorted(lst_copy), f"Fout: my_sort({lst_copy}) geeft {lst_test} in plaats van {sorted(lst_copy)}"
|
|
|
|
|
|
def test_linear_search_recursive():
|
|
for i in range(10):
|
|
lst_test = random.sample(range(20), 10)
|
|
target = random.randrange(20)
|
|
assert linear_search_recursive(lst_test, target) == (target in lst_test), "Fout: linear_search_recursive({}, {}) geeft {} in plaats van {}".format(lst_test, target, linear_search_recursive(lst_test, target), target in lst_test)
|
|
|
|
|
|
def test_binary_search_recursive():
|
|
for i in range(10):
|
|
lst_test = sorted(random.sample(range(20), 10))
|
|
target = random.randrange(20)
|
|
assert binary_search_recursive(lst_test, target) == (target in lst_test), "Fout: binary_search_recursive({}, {}) geeft {} in plaats van {}".format(lst_test, target, binary_search_recursive(lst_test, target), target in lst_test)
|
|
|
|
|
|
if __name__ == '__main__':
|
|
try:
|
|
print("\x1b[0;32m")
|
|
|
|
test_my_sort()
|
|
print("Je functie my_sort() werkt goed!")
|
|
|
|
test_linear_search_recursive()
|
|
print("Je functie linear_search_recursive() werkt goed!")
|
|
|
|
test_binary_search_recursive()
|
|
print("Je functie binary_search_recursive() werkt goed!")
|
|
|
|
print("\nGefeliciteerd, alles lijkt te werken! Lever je werk nu in op Canvas...")
|
|
|
|
except AssertionError as ae:
|
|
print("\x1b[0;31m" + str(ae))
|