A common sense guide to data structures and algorithms Flashcards

1
Q

CH9. Wat zijn Abstract Data Types?

A

Een data structuur waarbij het niet boeit hoe data wordt opgeslagen, alleen hoe het bewerkt en gebruikt wordt.

Een stack is bijvoorbeeld een array met regels die je zelf moet coderen. Maar het kan net zo goed een lijst zijn.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q

CH9. Waarom zou je een Stack gebruiken als een Stack een aangepaste array is?

A
  1. Het voorkomt bugs, omdat de programmeur zich moet houden aan de regels van de stack.
  2. Het mentale model van een stack helpt bij het gebruiken en toepassen van een LIFO mindset.
  3. Het is duidelijk voor andere programmeurs dat ze werken met een LIFO-gebaseerd algoritme.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q

CH1. Wat is belangrijk bij het maken van code, naast dat het werkt?

A
  • Onderhoudbaarheid
  • Modulariteit
  • Leesbaarheid
  • Organisatie
  • Code-efficiëntie
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q

CH1. Wat zijn de 4 basis operations van data structuren?

A
  1. Lezen => Iets lezen op een specifieke plek
  2. Zoeken => Een specifieke waarde zoeken
  3. Toevoegen / ‘insert’
  4. Verwijderen / ‘delete’
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q

CH1. Waarom wordt de snelheid of efficiëntie van een data structuur in stappen en niet in tijd gemeten?

A
  • Een programma kan op de nieuwste supercomputer sneller (seconden) werken dan op een computer uit 1990.
  • Een programma zal de ene keer langzamer runnen en de andere keer sneller (vertraging door internet, wat runt de computer op de achtergrond, errors/bugs/server problemen, etc.)
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q

CH1. Waarom kan een computer de waarde op een specifieke plek (index) in een array binnen 1 stap lezen, maar niet in een linked list?

A

Een array heeft een plek in het geheugen, van begin tot eind 1 reeks. De elementen van een linked lijst verwijzen naar elkaar, omdat zij niet ‘naast elkaar’ worden opgeslagen in het geheugen.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q

CH1. Wat is het verschil in efficiëntie tussen lezen en zoeken in een array?

A

Lezen gebeurt in 1 stap, zoeken in min. 1, max. N (aantal elementen in de array).

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
8
Q

CH1. Hoeveel stappen kost elke basis operation bij een normale array?

A
Best case scenario: Worst case scenario
Lezen => 1:-
Zoeken =>  1:N
Insertion => 1:N+1
Deletion => 1:N
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
9
Q

CH1. Wat is het verschil tussen een set en een array?

A

In een set komen er geen duplicaten voor. In een array wel.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
10
Q

CH1. Hoeveel stappen kost elke basis operation bij een normale set?

A
Best case scenario: Worst case scenario
Lezen => 1:- (onduidelijk)
Zoeken =>  1:N
Insertion => N+1:2N+1
Deletion => 1:N
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
11
Q

CH2. Wat is een algoritme?

A

Een verzameling/reeks instructies voor het voltooien van een specifieke taak.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
12
Q

CH2. Waarom is linear search in een geordende array sneller dan bij een normale array?

A

De elementen van een geordende array hebben een volgorde. Als je 22 zoekt en je bent bij 30 gekomen in een array die van laag naar hoog is gesorteerd, dan weet je al dat 22 niet meer te vinden zal zijn. Je kan de search vroeger beëindigen dan in een normale array.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
13
Q

CH3. Wat is de Big O Notation?

A

De Big O Notation geeft in CS aan hoe het aantal stappen toeneemt in verhouding met het aantal elementen.

Linear search: O(N)
Binary search: O(log N)
Er is ook O(N^2), O(sqrt(N)), etc.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
14
Q

CH3. Als een programma altijd hetzelfde aantal stappen neemt, wat is dan de Big O Notation?

A

O(1), ook als het aantal stappen meer dan 1 is.

Het zijn beide rechte, horizontale lijnen die tonen dat het aantal stappen niet toeneemt naarmate er meer data wordt toegevoegd.

Zelfs als het aantal stappen een miljoen is, blijft het O(1), want het is een constante. O(N) zal altijd bij een bepaalde hoeveelheid data minder efficiënt zijn dan O(1).

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
15
Q

CH3. Wat is belangrijk om te onthouden bij het noteren van de Big O Notation?

A

Tenzij anders wordt vermeldt, ga je uit van het Worst Case Scenario.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
16
Q

CH3. Wat is log 8?
En log 64?
En log3 81?

A

log 8 = 3
log 64 = 6
log3 81 = 3

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
17
Q

CH10. Wat zijn successors en terminal nodes?

A

Successor is een synoniem (onzeker) voor children nodes.

Een terminal node heeft precies 0 successors.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
18
Q

CH10. Wanneer zijn 2 binary bomen vergelijkbaar (‘similar’) en wanneer zijn het kopieën?

A

Vergelijkbaar als ze dezelfde structuur hebben. Kopieën als ze vergelijkbaar zijn én als de dezelfde inhoud hebben op dezelfde plekken.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
19
Q

CH10. Wat is de hoogte van een boom?

A

Het maximale aantal knooppunten in het langste pad van de boom.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
20
Q

CH10. Wat is een binaire boom?

A

Een boom waarvan elk knooppunt maximaal 2 children kan hebben.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
21
Q

CH10. Wanneer is een boom compleet?

A

Als alle levels (op mogelijk de laatste na) het maximale aantal knooppunten bevatten en de laatste zo veel mogelijk links gevuld is.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
22
Q

CH10. Hoe kan je makkelijk berekenen op welke plek de kinderen van een knooppunt in een binaire boom staan?

A

Als K = de index van het huidige knooppunt, dan is 2k het linkerkind en 2k+1 het rechterkind.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
23
Q

CH10. Hoe kan je makkelijk de diepte/hoogte van een complete boom berekenen?

A

dn = [log2 n + 1]

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
24
Q

CH10. Wat is een extended tree (of 2-tree)?

A

Een boom waarin elk knooppunt precies 0 (external node) of 2 (internal node) kinderen heeft.

25
Q

CH10. Wat is het verschil tussen Sequential en Linked representation van binary trees?

A

Linked representation gebruikt meerdere, parallelle arrays. Sequential representation gebruikt 1 array.

26
Q

CH10. Hoe is een linked representation van een Binary Tree opgebouwd?

A

1) INFO[K] = data node N
2) LEFT[K] = Locatie linker kind N
3) RIGHT[K] = Locatie rechter kind N
4) ROOT = pointer 1e element

27
Q

CH10. Wat houdt Sequential Representation in en wanneer is het handiger dan Linked Representation?

A

Sequential Representation is 1 single linear array binaire boom. Dit is handig voor (bijna-)complete bomen. Hier kan je 2K en 2K+1 gebruiken om de kinderen van een node N te vinden.

END bevat de locatie van het laatste knooppunt.

28
Q

CH10. Wat zijn de 3 standaard manieren om door een binaire boom te gaan?

A
1. Preorder
= Root, links, rechts
2. Inorder
= Links, root, rechts
3. Postorder
= Links, rechts, root

Opmerkingen:

  • Links gaat ALTIJD vóór rechts.
  • De naam geeft aan wanneer de Root aan de beurt is.
29
Q

CH10. Wat is een binary search tree?

A

Een binaire boom waarbij voor ELK knooppunt N geldt dat elk knooppunt links van N kleiner is dan N en elk knooppunt rechts van N groter is dan N.

30
Q

CH10. Wanneer is een boom gebalanceerd?

A

Als de hoogtes van de subbomen met maximaal 1 verschillen.

31
Q

CH10. Wat is een Heap?

A

Een heap (of maxheap) is een complete binaire boom waarbij voor elk knooppunt N geldt dat de waarde groter dan of gelijk is aan de waarde van al zijn kinderen.

32
Q

CH10. Hoe voeg je een element toe aan een heap?

A
  1. Voeg het ITEM toe op END+1

2. Wissel het ITEM om met de ouder van ITEM (P(ITEM)) zolang ITEM > P(ITEM).

33
Q

CH10. Hoe verwijder je een element uit een heap?

A
  1. Sla de ROOT op in ITEM.
  2. Vervang de ROOT met het laatste ITEM L in de heap en END = END - 1.
    3a. Pak het grootste kind Large(L) van L. Als L < Large(L), wissel ze om.
    3b. Herhaal totdat L >= Large(L).
34
Q

CH10. Hoe voeg je een element toe aan een binaire zoekboom?

A
  1. Vergelijk ITEM met Root N
    2a. Item > N, ga naar rechts
    2b. Item < N, ga naar links
  2. Herhaal, totdat je ITEM vindt (ofwel ITEM is een duplicaat) óf totdat je een lege subboom tegenkomt.
35
Q

CH10. Hoe verwijder je een element uit een binaire zoekboom?

A
  1. Zoek het te verwijderen element.
    2a. Als het element N geen kinderen heeft, verwijder N.
    2b. Als het element N 1 kind M heeft, verwijder N en vervang het met M.
    2c. Als het element N 2 kinderen heeft, vind dan eerst de inorder successor S(N) van N.
    Verwijder S(N).
    Vervang N met S(N).
36
Q

CH9. Wat is het nut van een ADT als het ingebouwde datastructuren gebruikt? Waarom zou je die ingebouwde datastructuren niet gewoon gebruiken?

A
  • Je voorkomt bugs / fouten, doordat de regels geforceerd worden.
  • Je denkt op een andere manier na.
  • Het maakt duidelijk op welke manier de code werkt, aan jezelf en anderen.
37
Q

CH14. Wat zijn nodes?

A

Verbonden gegevens die door het geheugen zijn verspreid, worden knooppunten genoemd

38
Q

CH14. Wat is het verschil tussen hoe een array en linked list data opslaan?

A

Een array zoekt bij het aanmaken een stuk op waar opeenvolgende ‘cellen’ vrij zijn in het geheugen. Hierin wordt de data opgeslagen.

Een linked list verspreidt de data over cellen waar deze vrij zijn en elk element verwijst naar het volgende.

39
Q

CH14. Wat weet je over nodes, specifiek m.b.t. linked lists?

A

Elke node bevat een stukje data en een pointer naar de locatie van het volgende element. Een linked list gebruikt dus 2 cellen per element (1 voor data, 1 voor pointer).

De laatste node heeft een null pointer.

40
Q

CH14. Wat is de Big O notatie van Linked List bij lezen, zoeken, invoegen en verwijderen?

A
  1. Lezen => O(N)
  2. Zoeken => O(N)
  3. Invoegen => O(1 in het beste geval) of O(N + 1) in het ergste geval
  4. Verwijderen => O(1 in het beste geval) of O(N) in het ergste geval
41
Q

CH14. Wat is bijzonder aan het verwijderen van nodes in linked lists?

A

Je verwijdert de node niet echt, maar je zorgt ervoor dat geen enkele andere node meer naar de te verwijderen node verwijst.

Het is zo goed als verwijderd qua effect.

42
Q

CH14. Wanneer is een linked list handiger dan een array?

A
  1. Als je elementen aan het begin gaat toevoegen of verwijderen (denk aan stacks en queues).
  2. Als je veel elementen moet gaan verwijderen midden in een verzameling.

Arrays verschuiven na elke verwijdering alle elementen, maar een linked list verandert gewoon de pointerwaarde.

43
Q

CH14. Wat is de perfecte onderliggende data structuur voor queues?

A

Doubly linked lists, omdat ze met O(1) tijdcomplexiteit elementen kunnen toevoegen en verwijderen aan beide uiteindes.

44
Q

CH15. Wat is een binary search tree?

A

Een boom waarvan elke node maximaal 1 linker- en 1 rechterkind heeft.
Ook moet elk linkerkind van elke node kleiner zijn dan de node, en elk rechterkind moet groter zijn dan de node.

45
Q

CH15. Wanneer is een boom gebalanceerd?

A

Wanneer de subbomen van de nodes dezelfde hoeveelheid nodes bevatten.

46
Q

CH15. Wat is de time complexity van een binary search tree? En hoe weet je dat?

A

O(log N), omdat je bij elke node de helft wegstreept.

47
Q

CH15. Hoeveel levels heeft een perfect gebalanceerde boom nodig om N aantal nodes te bevatten?

A

log(N) levels, want per level verdubbel je het aantal nodes vergeleken met het vorige level.

48
Q

CH15. Waarom zou je een binary search tree over een ordered array gebruiken, als ze allebei O(log N) time complexity hebben voor het zoeken van elementen?

A

Omdat een binary search tree sterker is in het toevoegen van elementen dan een ordered array.

49
Q

CH15. Wat is de time complexity van insertion in een Binary Search Tree en hoe kan dit?

A

O(log N), omdat je net zoals bij zoeken bij elke stap de helft van de elementen kan wegstrepen. Je doet daar niks meer mee.

50
Q

CH15. Wanneer zou je een binary search tree over een ordered array gebruiken?

A

Als je verwacht dat de data veel veranderingen zal ondergaan, dan gebruik je een binary search tree.

51
Q

CH15. Waar moet je voor oppassen bij het maken van een Binary Search Tree?

A

Het maken van een BST van gesorteerde data zorgt ervoor dat een boom extreem ongebalanceerd wordt gemaakt, waardoor search O(N) duurt i.p.v. O(log N).

Meestal krijg je een redelijk gebalanceerde boom als je willekeurig ‘gesorteerde’ data toevoegt.

52
Q

CH15. Hoe verwijder je een element uit een BST?

A
  1. Heeft de node geen kinderen => Verwijder het.
  2. Heeft de node 1 kind => Vervang het met het kind
  3. Heeft de node 2 kinderen => Vervang de node met de laagste (als in kleinste) van de grotere waardes van de node.
    3b. Als deze vervangende node een rechterkind heeft, plaats deze dan op de oude plek van de vervangende node.
53
Q

CH15. Wat is Tree Traversal, waarvoor gebruik je het en welke Time Complexity heeft het?

A

Tree Traversel is het ‘bezoeken’ van elke node in een boom a.d.h.v. een recursieve methode die op een bepaalde manier (pre-, in- of postorder) de nodes langsgaat.

Time Complexity is O(N), omdat je langs elke node gaat.

54
Q

CH16. Wat is een Heap?

A

Een complete binaire boom waarvan elke node groter is dan alle afstammelingen.

55
Q

CH16. Wat betekent het als een boom ‘complete’ is?

A

Dat houdt in dat elke rij volledig gevuld is met nodes, op de laatste na. In de laatste rij mag er geen node voorkomen na een lege plek.

56
Q

CH16. Bij het verwijderen van een element uit de heap, mag je alleen de root node verwijderen. De last node wordt dan de nieuwe root node en moet omlaag ‘druppelen’.

Waarom moet dit ‘druppelen’ richting het grootste kind van de nieuwe root node gebeuren?

A

Als je de nieuwe root node met het kleinere kind omwisselt, klopt de heap structuur niet meer. Het grotere kind is dan groter dan de nieuwe root node.

57
Q

CH16. Waarom worden heaps als de betere keuze gezien vergeleken met geordende arrays?

A

Geordende array | Heap
Insertion: O(N) | O(log N)
Deletion: O(1) | O(log N)

De heap is in het consistent snel, terwijl de array soms héél snel en soms héél langzaam is.

58
Q

CH16. Waarom is het belangrijk dat een heap compleet en gebalanceerd blijft?

A

Zodat bepaalde operaties O(log N) time complexity kunnen hebben.

59
Q

CH16. Wanneer zou je een binary search tree boven een heap gebruiken?

A

BST => Search

Heap => Insert/Delete