[{"data":1,"prerenderedAt":7779},["ShallowReactive",2],{"dsa-stapels-en-wachtrijen":3,"dsa-nav-stapels-en-wachtrijen":3208},{"id":4,"title":5,"body":6,"description":3199,"extension":3200,"icon":3201,"meta":3202,"navigation":552,"order":549,"path":3203,"seo":3204,"stem":3205,"topic":3206,"__hash__":3207},"practicelyDsa\u002Fpracticely-dsa\u002Fstapels-en-wachtrijen.md","Stapels en wachtrijen uitgelegd: LIFO, FIFO en gelinkte lijsten",{"type":7,"value":8,"toc":3187},"minimark",[9,34,37,42,51,54,91,98,255,259,268,299,306,444,453,457,476,1071,1098,1102,1125,1133,1142,1167,1189,1268,1272,1287,1313,2061,2083,2087,2102,2111,2238,2263,2824,2828,2912,2919,2923,3047,3057,3061,3134,3138,3183],[10,11,12,13,17,18,22,23,17,26,29,30,33],"p",{},"Een ",[14,15,16],"strong",{},"stapel"," (",[19,20,21],"em",{},"stack",") en een ",[14,24,25],{},"wachtrij",[19,27,28],{},"queue",") zijn de twee eenvoudigste datastructuren die\ner bestaan, en tegelijk twee van de meest gebruikte. Elke keer dat je op Ctrl+Z drukt, gebruikt je\neditor een stapel. Elke keer dat je iets naar de printer stuurt, komt het in een wachtrij. En elke\nfunctieaanroep in je programma belandt op de aanroepstapel (",[19,31,32],{},"call stack",").",[10,35,36],{},"Op het tentamen krijg je meestal een reeks operaties en moet je de toestand erna opschrijven, of moet\nje uitleggen welke structuur bij een probleem past. In sollicitatiegesprekken is \"controleer of de\nhaakjes kloppen\" een klassieker. Allebei komen hieronder aan bod.",[38,39,41],"h2",{"id":40},"stapel-last-in-first-out","Stapel: last in, first out",[10,43,44,45,17,48,33],{},"Een stapel werkt als een stapel borden: je legt een nieuw bord bovenop en je pakt ook altijd het\nbovenste weer weg. Wat het laatst erop kwam, gaat er het eerst af: ",[14,46,47],{},"LIFO",[19,49,50],{},"last in, first out",[10,52,53],{},"De operaties:",[55,56,57,69,75,85],"ul",{},[58,59,60,64,65,68],"li",{},[61,62,63],"code",{},"push(x)",": leg ",[61,66,67],{},"x"," bovenop de stapel.",[58,70,71,74],{},[61,72,73],{},"pop()",": haal het bovenste element weg en geef het terug.",[58,76,77,80,81,84],{},[61,78,79],{},"peek()"," (of ",[61,82,83],{},"top()","): bekijk het bovenste element zonder het weg te halen.",[58,86,87,90],{},[61,88,89],{},"isEmpty()",": is de stapel leeg?",[10,92,93,94,97],{},"We noteren de toestand van een stapel altijd van ",[14,95,96],{},"onder naar boven",": het meest rechtse element is\nde bovenkant.",[99,100,101,120],"table",{},[102,103,104],"thead",{},[105,106,107,111,114,117],"tr",{},[108,109,110],"th",{},"Stap",[108,112,113],{},"Operatie",[108,115,116],{},"Teruggegeven",[108,118,119],{},"Stapel (onder → boven)",[121,122,123,142,159,176,190,207,223,238],"tbody",{},[105,124,125,129,134,137],{},[126,127,128],"td",{},"1",[126,130,131],{},[61,132,133],{},"push(4)",[126,135,136],{},"–",[126,138,139],{},[61,140,141],{},"4",[105,143,144,147,152,154],{},[126,145,146],{},"2",[126,148,149],{},[61,150,151],{},"push(7)",[126,153,136],{},[126,155,156],{},[61,157,158],{},"4, 7",[105,160,161,164,169,171],{},[126,162,163],{},"3",[126,165,166],{},[61,167,168],{},"push(1)",[126,170,136],{},[126,172,173],{},[61,174,175],{},"4, 7, 1",[105,177,178,180,184,186],{},[126,179,141],{},[126,181,182],{},[61,183,73],{},[126,185,128],{},[126,187,188],{},[61,189,158],{},[105,191,192,195,200,202],{},[126,193,194],{},"5",[126,196,197],{},[61,198,199],{},"push(9)",[126,201,136],{},[126,203,204],{},[61,205,206],{},"4, 7, 9",[105,208,209,212,216,219],{},[126,210,211],{},"6",[126,213,214],{},[61,215,73],{},[126,217,218],{},"9",[126,220,221],{},[61,222,158],{},[105,224,225,228,232,234],{},[126,226,227],{},"7",[126,229,230],{},[61,231,73],{},[126,233,227],{},[126,235,236],{},[61,237,141],{},[105,239,240,243,248,250],{},[126,241,242],{},"8",[126,244,245],{},[61,246,247],{},"push(5)",[126,249,136],{},[126,251,252],{},[61,253,254],{},"4, 5",[38,256,258],{"id":257},"wachtrij-first-in-first-out","Wachtrij: first in, first out",[10,260,261,262,17,265,33],{},"Een wachtrij werkt als de rij bij de kassa: wie het eerst aansluit, wordt het eerst geholpen:\n",[14,263,264],{},"FIFO",[19,266,267],{},"first in, first out",[55,269,270,283,293],{},[58,271,272,275,276,278,279,282],{},[61,273,274],{},"enqueue(x)",": zet ",[61,277,67],{}," ",[14,280,281],{},"achteraan"," in de rij.",[58,284,285,288,289,292],{},[61,286,287],{},"dequeue()",": haal het ",[14,290,291],{},"voorste"," element weg en geef het terug.",[58,294,295,298],{},[61,296,297],{},"front()",": bekijk het voorste element.",[10,300,301,302,305],{},"De toestand noteren we van ",[14,303,304],{},"voor naar achter",": het meest linkse element is als eerste aan de beurt.\nDezelfde reeks als hierboven, maar nu met een wachtrij:",[99,307,308,321],{},[102,309,310],{},[105,311,312,314,316,318],{},[108,313,110],{},[108,315,113],{},[108,317,116],{},[108,319,320],{},"Wachtrij (voor → achter)",[121,322,323,338,353,368,383,399,414,428],{},[105,324,325,327,332,334],{},[126,326,128],{},[126,328,329],{},[61,330,331],{},"enqueue(4)",[126,333,136],{},[126,335,336],{},[61,337,141],{},[105,339,340,342,347,349],{},[126,341,146],{},[126,343,344],{},[61,345,346],{},"enqueue(7)",[126,348,136],{},[126,350,351],{},[61,352,158],{},[105,354,355,357,362,364],{},[126,356,163],{},[126,358,359],{},[61,360,361],{},"enqueue(1)",[126,363,136],{},[126,365,366],{},[61,367,175],{},[105,369,370,372,376,378],{},[126,371,141],{},[126,373,374],{},[61,375,287],{},[126,377,141],{},[126,379,380],{},[61,381,382],{},"7, 1",[105,384,385,387,392,394],{},[126,386,194],{},[126,388,389],{},[61,390,391],{},"enqueue(9)",[126,393,136],{},[126,395,396],{},[61,397,398],{},"7, 1, 9",[105,400,401,403,407,409],{},[126,402,211],{},[126,404,405],{},[61,406,287],{},[126,408,227],{},[126,410,411],{},[61,412,413],{},"1, 9",[105,415,416,418,422,424],{},[126,417,227],{},[126,419,420],{},[61,421,287],{},[126,423,128],{},[126,425,426],{},[61,427,218],{},[105,429,430,432,437,439],{},[126,431,242],{},[126,433,434],{},[61,435,436],{},"enqueue(5)",[126,438,136],{},[126,440,441],{},[61,442,443],{},"9, 5",[10,445,446,447,449,450,452],{},"Zelfde invoer, totaal ander resultaat: de stapel eindigt met ",[61,448,254],{},", de wachtrij met ",[61,451,443],{},".",[38,454,456],{"id":455},"een-stapel-met-een-array-of-lijst","Een stapel met een array of lijst",[10,458,459,460,463,464,467,468,471,472,475],{},"Een stapel is eenvoudig te bouwen op een dynamische array (Python ",[61,461,462],{},"list",", Java ",[61,465,466],{},"ArrayList","). De\nbovenkant is het ",[14,469,470],{},"einde"," van de lijst: toevoegen en weghalen aan het einde kost ",[61,473,474],{},"O(1)"," (bij een\ndynamische array gemiddeld, omdat de array af en toe moet groeien).",[477,478,479,763],"code-tabs",{},[480,481,483],"template",{"v-slot:python":482},"",[484,485,489],"pre",{"className":486,"code":487,"language":488,"meta":482,"style":482},"language-python shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","class Stapel:\n    def __init__(self):\n        self.data = []\n\n    def push(self, x):\n        self.data.append(x)  # bovenkant = einde van de lijst\n\n    def pop(self):\n        if not self.data:\n            raise IndexError(\"pop op lege stapel\")\n        return self.data.pop()\n\n    def peek(self):\n        return self.data[-1]\n\n    def is_empty(self):\n        return len(self.data) == 0\n","python",[61,490,491,508,528,547,554,575,600,605,619,638,661,681,686,700,720,725,739],{"__ignoreMap":482},[492,493,496,500,504],"span",{"class":494,"line":495},"line",1,[492,497,499],{"class":498},"spNyl","class",[492,501,503],{"class":502},"sBMFI"," Stapel",[492,505,507],{"class":506},"sMK4o",":\n",[492,509,511,514,518,521,525],{"class":494,"line":510},2,[492,512,513],{"class":498},"    def",[492,515,517],{"class":516},"s2Zo4"," __init__",[492,519,520],{"class":506},"(",[492,522,524],{"class":523},"s5tWE","self",[492,526,527],{"class":506},"):\n",[492,529,531,535,537,541,544],{"class":494,"line":530},3,[492,532,534],{"class":533},"sTEyZ","        self",[492,536,452],{"class":506},[492,538,540],{"class":539},"swJcz","data",[492,542,543],{"class":506}," =",[492,545,546],{"class":506}," []\n",[492,548,550],{"class":494,"line":549},4,[492,551,553],{"emptyLinePlaceholder":552},true,"\n",[492,555,557,559,562,564,566,569,573],{"class":494,"line":556},5,[492,558,513],{"class":498},[492,560,561],{"class":516}," push",[492,563,520],{"class":506},[492,565,524],{"class":523},[492,567,568],{"class":506},",",[492,570,572],{"class":571},"sHdIc"," x",[492,574,527],{"class":506},[492,576,578,580,582,584,586,589,591,593,596],{"class":494,"line":577},6,[492,579,534],{"class":533},[492,581,452],{"class":506},[492,583,540],{"class":539},[492,585,452],{"class":506},[492,587,588],{"class":516},"append",[492,590,520],{"class":506},[492,592,67],{"class":516},[492,594,595],{"class":506},")",[492,597,599],{"class":598},"sHwdD","  # bovenkant = einde van de lijst\n",[492,601,603],{"class":494,"line":602},7,[492,604,553],{"emptyLinePlaceholder":552},[492,606,608,610,613,615,617],{"class":494,"line":607},8,[492,609,513],{"class":498},[492,611,612],{"class":516}," pop",[492,614,520],{"class":506},[492,616,524],{"class":523},[492,618,527],{"class":506},[492,620,622,626,629,632,634,636],{"class":494,"line":621},9,[492,623,625],{"class":624},"s7zQu","        if",[492,627,628],{"class":506}," not",[492,630,631],{"class":533}," self",[492,633,452],{"class":506},[492,635,540],{"class":539},[492,637,507],{"class":506},[492,639,641,644,647,649,652,656,658],{"class":494,"line":640},10,[492,642,643],{"class":624},"            raise",[492,645,646],{"class":502}," IndexError",[492,648,520],{"class":506},[492,650,651],{"class":506},"\"",[492,653,655],{"class":654},"sfazB","pop op lege stapel",[492,657,651],{"class":506},[492,659,660],{"class":506},")\n",[492,662,664,667,669,671,673,675,678],{"class":494,"line":663},11,[492,665,666],{"class":624},"        return",[492,668,631],{"class":533},[492,670,452],{"class":506},[492,672,540],{"class":539},[492,674,452],{"class":506},[492,676,677],{"class":516},"pop",[492,679,680],{"class":506},"()\n",[492,682,684],{"class":494,"line":683},12,[492,685,553],{"emptyLinePlaceholder":552},[492,687,689,691,694,696,698],{"class":494,"line":688},13,[492,690,513],{"class":498},[492,692,693],{"class":516}," peek",[492,695,520],{"class":506},[492,697,524],{"class":523},[492,699,527],{"class":506},[492,701,703,705,707,709,711,714,717],{"class":494,"line":702},14,[492,704,666],{"class":624},[492,706,631],{"class":533},[492,708,452],{"class":506},[492,710,540],{"class":539},[492,712,713],{"class":506},"[-",[492,715,128],{"class":716},"sbssI",[492,718,719],{"class":506},"]\n",[492,721,723],{"class":494,"line":722},15,[492,724,553],{"emptyLinePlaceholder":552},[492,726,728,730,733,735,737],{"class":494,"line":727},16,[492,729,513],{"class":498},[492,731,732],{"class":516}," is_empty",[492,734,520],{"class":506},[492,736,524],{"class":523},[492,738,527],{"class":506},[492,740,742,744,747,749,751,753,755,757,760],{"class":494,"line":741},17,[492,743,666],{"class":624},[492,745,746],{"class":516}," len",[492,748,520],{"class":506},[492,750,524],{"class":533},[492,752,452],{"class":506},[492,754,540],{"class":539},[492,756,595],{"class":506},[492,758,759],{"class":506}," ==",[492,761,762],{"class":716}," 0\n",[480,764,765],{"v-slot:java":482},[484,766,770],{"className":767,"code":768,"language":769,"meta":482,"style":482},"language-java shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import java.util.ArrayList;\n\nclass Stapel {\n    private final ArrayList\u003CInteger> data = new ArrayList\u003C>();\n\n    void push(int x) {\n        data.add(x); \u002F\u002F bovenkant = einde van de lijst\n    }\n\n    int pop() {\n        if (data.isEmpty()) {\n            throw new IllegalStateException(\"pop op lege stapel\");\n        }\n        return data.remove(data.size() - 1);\n    }\n\n    int peek() {\n        return data.get(data.size() - 1);\n    }\n\n    boolean isEmpty() {\n        return data.isEmpty();\n    }\n}\n","java",[61,771,772,792,796,805,839,843,861,881,886,890,902,920,941,946,977,981,985,995,1023,1028,1033,1046,1060,1065],{"__ignoreMap":482},[492,773,774,777,780,782,785,787,789],{"class":494,"line":495},[492,775,776],{"class":716},"import",[492,778,779],{"class":498}," java",[492,781,452],{"class":506},[492,783,784],{"class":498},"util",[492,786,452],{"class":506},[492,788,466],{"class":498},[492,790,791],{"class":506},";\n",[492,793,794],{"class":494,"line":510},[492,795,553],{"emptyLinePlaceholder":552},[492,797,798,800,802],{"class":494,"line":530},[492,799,499],{"class":498},[492,801,503],{"class":502},[492,803,804],{"class":506}," {\n",[492,806,807,810,813,816,819,822,825,828,831,834,836],{"class":494,"line":549},[492,808,809],{"class":498},"    private",[492,811,812],{"class":498}," final",[492,814,815],{"class":498}," ArrayList",[492,817,818],{"class":506},"\u003C",[492,820,821],{"class":498},"Integer",[492,823,824],{"class":506},">",[492,826,827],{"class":533}," data ",[492,829,830],{"class":506},"=",[492,832,833],{"class":624}," new",[492,835,815],{"class":498},[492,837,838],{"class":506},"\u003C>();\n",[492,840,841],{"class":494,"line":556},[492,842,553],{"emptyLinePlaceholder":552},[492,844,845,848,850,852,855,857,859],{"class":494,"line":577},[492,846,847],{"class":498},"    void",[492,849,561],{"class":516},[492,851,520],{"class":506},[492,853,854],{"class":498},"int",[492,856,572],{"class":571},[492,858,595],{"class":506},[492,860,804],{"class":506},[492,862,863,866,868,871,873,875,878],{"class":494,"line":602},[492,864,865],{"class":533},"        data",[492,867,452],{"class":506},[492,869,870],{"class":516},"add",[492,872,520],{"class":506},[492,874,67],{"class":533},[492,876,877],{"class":506},");",[492,879,880],{"class":598}," \u002F\u002F bovenkant = einde van de lijst\n",[492,882,883],{"class":494,"line":607},[492,884,885],{"class":506},"    }\n",[492,887,888],{"class":494,"line":621},[492,889,553],{"emptyLinePlaceholder":552},[492,891,892,895,897,900],{"class":494,"line":640},[492,893,894],{"class":498},"    int",[492,896,612],{"class":516},[492,898,899],{"class":506},"()",[492,901,804],{"class":506},[492,903,904,906,908,910,912,915,918],{"class":494,"line":663},[492,905,625],{"class":624},[492,907,17],{"class":506},[492,909,540],{"class":533},[492,911,452],{"class":506},[492,913,914],{"class":516},"isEmpty",[492,916,917],{"class":506},"())",[492,919,804],{"class":506},[492,921,922,925,927,930,932,934,936,938],{"class":494,"line":683},[492,923,924],{"class":624},"            throw",[492,926,833],{"class":624},[492,928,929],{"class":516}," IllegalStateException",[492,931,520],{"class":506},[492,933,651],{"class":506},[492,935,655],{"class":654},[492,937,651],{"class":506},[492,939,940],{"class":506},");\n",[492,942,943],{"class":494,"line":688},[492,944,945],{"class":506},"        }\n",[492,947,948,950,953,955,958,960,962,964,967,969,972,975],{"class":494,"line":702},[492,949,666],{"class":624},[492,951,952],{"class":533}," data",[492,954,452],{"class":506},[492,956,957],{"class":516},"remove",[492,959,520],{"class":506},[492,961,540],{"class":533},[492,963,452],{"class":506},[492,965,966],{"class":516},"size",[492,968,899],{"class":506},[492,970,971],{"class":506}," -",[492,973,974],{"class":716}," 1",[492,976,940],{"class":506},[492,978,979],{"class":494,"line":722},[492,980,885],{"class":506},[492,982,983],{"class":494,"line":727},[492,984,553],{"emptyLinePlaceholder":552},[492,986,987,989,991,993],{"class":494,"line":741},[492,988,894],{"class":498},[492,990,693],{"class":516},[492,992,899],{"class":506},[492,994,804],{"class":506},[492,996,998,1000,1002,1004,1007,1009,1011,1013,1015,1017,1019,1021],{"class":494,"line":997},18,[492,999,666],{"class":624},[492,1001,952],{"class":533},[492,1003,452],{"class":506},[492,1005,1006],{"class":516},"get",[492,1008,520],{"class":506},[492,1010,540],{"class":533},[492,1012,452],{"class":506},[492,1014,966],{"class":516},[492,1016,899],{"class":506},[492,1018,971],{"class":506},[492,1020,974],{"class":716},[492,1022,940],{"class":506},[492,1024,1026],{"class":494,"line":1025},19,[492,1027,885],{"class":506},[492,1029,1031],{"class":494,"line":1030},20,[492,1032,553],{"emptyLinePlaceholder":552},[492,1034,1036,1039,1042,1044],{"class":494,"line":1035},21,[492,1037,1038],{"class":498},"    boolean",[492,1040,1041],{"class":516}," isEmpty",[492,1043,899],{"class":506},[492,1045,804],{"class":506},[492,1047,1049,1051,1053,1055,1057],{"class":494,"line":1048},22,[492,1050,666],{"class":624},[492,1052,952],{"class":533},[492,1054,452],{"class":506},[492,1056,914],{"class":516},[492,1058,1059],{"class":506},"();\n",[492,1061,1063],{"class":494,"line":1062},23,[492,1064,885],{"class":506},[492,1066,1068],{"class":494,"line":1067},24,[492,1069,1070],{"class":506},"}\n",[10,1072,1073,1074,1077,1078,1081,1082,1085,1086,1089,1090,1093,1094,1097],{},"Voor een wachtrij werkt een gewone lijst slecht: ",[61,1075,1076],{},"dequeue"," haalt het ",[14,1079,1080],{},"eerste"," element weg, en dan\nmoeten alle andere elementen een plek opschuiven. In Python is ",[61,1083,1084],{},"list.pop(0)"," daarom ",[61,1087,1088],{},"O(n)",". Gebruik\nvoor een wachtrij ",[61,1091,1092],{},"collections.deque"," (Python) of ",[61,1095,1096],{},"ArrayDeque"," (Java), of bouw er een met een\ngelinkte lijst.",[38,1099,1101],{"id":1100},"gelinkte-lijsten","Gelinkte lijsten",[10,1103,12,1104,17,1107,1110,1111,1114,1115,17,1118,1121,1122,452],{},[14,1105,1106],{},"gelinkte lijst",[19,1108,1109],{},"linked list",") bestaat uit losse knopen (",[19,1112,1113],{},"nodes","). Elke knoop bevat een\nwaarde en een verwijzing naar de volgende knoop. In een ",[14,1116,1117],{},"enkel gelinkte lijst",[19,1119,1120],{},"singly linked\nlist",") wijst elke knoop alleen naar zijn opvolger; de lijst zelf onthoudt alleen de eerste knoop, de\n",[61,1123,1124],{},"head",[484,1126,1131],{"className":1127,"code":1129,"language":1130},[1128],"language-text","head → [4 | •] → [7 | •] → [1 | •] → null\n","text",[61,1132,1129],{"__ignoreMap":482},[10,1134,1135,1136,1141],{},"Het grote voordeel: ",[14,1137,1138,1139],{},"vooraan invoegen of verwijderen kost ",[61,1140,474],{},", want je verandert alleen een\npaar verwijzingen. Niets hoeft op te schuiven.",[55,1143,1144,1155],{},[58,1145,1146,1149,1150,1152,1153,452],{},[14,1147,1148],{},"Vooraan invoegen:"," maak een nieuwe knoop, laat hem naar de oude ",[61,1151,1124],{}," wijzen, maak hem de\nnieuwe ",[61,1154,1124],{},[58,1156,1157,1160,1161,1164,1165,452],{},[14,1158,1159],{},"Vooraan verwijderen:"," maak ",[61,1162,1163],{},"head.next"," de nieuwe ",[61,1166,1124],{},[10,1168,1169,1170,1173,1174,1176,1177,1179,1180,1182,1183,1188],{},"Het nadeel: je kunt niet direct naar index ",[61,1171,1172],{},"i"," springen. Om het ",[61,1175,1172],{},"-de element te vinden, loop je\nvanaf ",[61,1178,1124],{}," de verwijzingen af: ",[61,1181,1088],{},". Daarom werkt ",[1184,1185,1187],"a",{"href":1186},"\u002Fpracticely\u002Fdsa\u002Fzoeken","binair zoeken"," niet\nop een gelinkte lijst.",[99,1190,1191,1203],{},[102,1192,1193],{},[105,1194,1195,1197,1200],{},[108,1196,113],{},[108,1198,1199],{},"Array",[108,1201,1202],{},"Enkel gelinkte lijst",[121,1204,1205,1220,1233,1254],{},[105,1206,1207,1212,1216],{},[126,1208,1209,1210],{},"element op index ",[61,1211,1172],{},[126,1213,1214],{},[61,1215,474],{},[126,1217,1218],{},[61,1219,1088],{},[105,1221,1222,1225,1229],{},[126,1223,1224],{},"vooraan invoegen\u002Fverwijderen",[126,1226,1227],{},[61,1228,1088],{},[126,1230,1231],{},[61,1232,474],{},[105,1234,1235,1238,1243],{},[126,1236,1237],{},"achteraan invoegen",[126,1239,1240,1242],{},[61,1241,474],{}," gemiddeld",[126,1244,1245,1247,1248,1251,1252],{},[61,1246,474],{}," met ",[61,1249,1250],{},"tail","-verwijzing, anders ",[61,1253,1088],{},[105,1255,1256,1259,1263],{},[126,1257,1258],{},"achteraan verwijderen",[126,1260,1261],{},[61,1262,474],{},[126,1264,1265,1267],{},[61,1266,1088],{}," (je moet de voorlaatste knoop vinden)",[38,1269,1271],{"id":1270},"stapel-en-wachtrij-met-een-gelinkte-lijst","Stapel en wachtrij met een gelinkte lijst",[10,1273,12,1274,1276,1277,1280,1281,1283,1284,1286],{},[14,1275,16],{}," is een gelinkte lijst waarbij je alleen vooraan werkt: ",[61,1278,1279],{},"push"," voegt vooraan in, ",[61,1282,677],{},"\nverwijdert vooraan. De ",[61,1285,1124],{}," is de bovenkant van de stapel.",[10,1288,12,1289,1291,1292,1294,1295,1297,1298,1301,1302,1304,1305,1307,1308,1310,1311,452],{},[14,1290,25],{}," houdt twee verwijzingen bij: ",[61,1293,1124],{}," (voorkant) en ",[61,1296,1250],{}," (achterkant).\n",[61,1299,1300],{},"enqueue"," hangt een knoop achter ",[61,1303,1250],{},", ",[61,1306,1076],{}," haalt ",[61,1309,1124],{}," weg. Allebei ",[61,1312,474],{},[477,1314,1315,1682],{},[480,1316,1317],{"v-slot:python":482},[484,1318,1320],{"className":486,"code":1319,"language":488,"meta":482,"style":482},"class Knoop:\n    def __init__(self, waarde, volgende=None):\n        self.waarde = waarde\n        self.volgende = volgende\n\n\nclass Wachtrij:\n    def __init__(self):\n        self.head = None  # voorkant: hier gaat het eruit\n        self.tail = None  # achterkant: hier komt het erbij\n\n    def enqueue(self, x):\n        knoop = Knoop(x)\n        if self.tail is None:  # lege wachtrij\n            self.head = self.tail = knoop\n        else:\n            self.tail.volgende = knoop\n            self.tail = knoop\n\n    def dequeue(self):\n        if self.head is None:\n            raise IndexError(\"dequeue op lege wachtrij\")\n        x = self.head.waarde\n        self.head = self.head.volgende\n        if self.head is None:  # wachtrij is nu leeg\n            self.tail = None\n        return x\n",[61,1321,1322,1331,1354,1368,1382,1386,1390,1399,1411,1427,1442,1446,1463,1478,1497,1519,1526,1542,1554,1558,1571,1586,1603,1621,1642,1660,1674],{"__ignoreMap":482},[492,1323,1324,1326,1329],{"class":494,"line":495},[492,1325,499],{"class":498},[492,1327,1328],{"class":502}," Knoop",[492,1330,507],{"class":506},[492,1332,1333,1335,1337,1339,1341,1343,1346,1348,1351],{"class":494,"line":510},[492,1334,513],{"class":498},[492,1336,517],{"class":516},[492,1338,520],{"class":506},[492,1340,524],{"class":523},[492,1342,568],{"class":506},[492,1344,1345],{"class":571}," waarde",[492,1347,568],{"class":506},[492,1349,1350],{"class":571}," volgende",[492,1352,1353],{"class":506},"=None):\n",[492,1355,1356,1358,1360,1363,1365],{"class":494,"line":530},[492,1357,534],{"class":533},[492,1359,452],{"class":506},[492,1361,1362],{"class":539},"waarde",[492,1364,543],{"class":506},[492,1366,1367],{"class":533}," waarde\n",[492,1369,1370,1372,1374,1377,1379],{"class":494,"line":549},[492,1371,534],{"class":533},[492,1373,452],{"class":506},[492,1375,1376],{"class":539},"volgende",[492,1378,543],{"class":506},[492,1380,1381],{"class":533}," volgende\n",[492,1383,1384],{"class":494,"line":556},[492,1385,553],{"emptyLinePlaceholder":552},[492,1387,1388],{"class":494,"line":577},[492,1389,553],{"emptyLinePlaceholder":552},[492,1391,1392,1394,1397],{"class":494,"line":602},[492,1393,499],{"class":498},[492,1395,1396],{"class":502}," Wachtrij",[492,1398,507],{"class":506},[492,1400,1401,1403,1405,1407,1409],{"class":494,"line":607},[492,1402,513],{"class":498},[492,1404,517],{"class":516},[492,1406,520],{"class":506},[492,1408,524],{"class":523},[492,1410,527],{"class":506},[492,1412,1413,1415,1417,1419,1421,1424],{"class":494,"line":621},[492,1414,534],{"class":533},[492,1416,452],{"class":506},[492,1418,1124],{"class":539},[492,1420,543],{"class":506},[492,1422,1423],{"class":506}," None",[492,1425,1426],{"class":598},"  # voorkant: hier gaat het eruit\n",[492,1428,1429,1431,1433,1435,1437,1439],{"class":494,"line":640},[492,1430,534],{"class":533},[492,1432,452],{"class":506},[492,1434,1250],{"class":539},[492,1436,543],{"class":506},[492,1438,1423],{"class":506},[492,1440,1441],{"class":598},"  # achterkant: hier komt het erbij\n",[492,1443,1444],{"class":494,"line":663},[492,1445,553],{"emptyLinePlaceholder":552},[492,1447,1448,1450,1453,1455,1457,1459,1461],{"class":494,"line":683},[492,1449,513],{"class":498},[492,1451,1452],{"class":516}," enqueue",[492,1454,520],{"class":506},[492,1456,524],{"class":523},[492,1458,568],{"class":506},[492,1460,572],{"class":571},[492,1462,527],{"class":506},[492,1464,1465,1468,1470,1472,1474,1476],{"class":494,"line":688},[492,1466,1467],{"class":533},"        knoop ",[492,1469,830],{"class":506},[492,1471,1328],{"class":516},[492,1473,520],{"class":506},[492,1475,67],{"class":516},[492,1477,660],{"class":506},[492,1479,1480,1482,1484,1486,1488,1491,1494],{"class":494,"line":702},[492,1481,625],{"class":624},[492,1483,631],{"class":533},[492,1485,452],{"class":506},[492,1487,1250],{"class":539},[492,1489,1490],{"class":506}," is",[492,1492,1493],{"class":506}," None:",[492,1495,1496],{"class":598},"  # lege wachtrij\n",[492,1498,1499,1502,1504,1506,1508,1510,1512,1514,1516],{"class":494,"line":722},[492,1500,1501],{"class":533},"            self",[492,1503,452],{"class":506},[492,1505,1124],{"class":539},[492,1507,543],{"class":506},[492,1509,631],{"class":533},[492,1511,452],{"class":506},[492,1513,1250],{"class":539},[492,1515,543],{"class":506},[492,1517,1518],{"class":533}," knoop\n",[492,1520,1521,1524],{"class":494,"line":727},[492,1522,1523],{"class":624},"        else",[492,1525,507],{"class":506},[492,1527,1528,1530,1532,1534,1536,1538,1540],{"class":494,"line":741},[492,1529,1501],{"class":533},[492,1531,452],{"class":506},[492,1533,1250],{"class":539},[492,1535,452],{"class":506},[492,1537,1376],{"class":539},[492,1539,543],{"class":506},[492,1541,1518],{"class":533},[492,1543,1544,1546,1548,1550,1552],{"class":494,"line":997},[492,1545,1501],{"class":533},[492,1547,452],{"class":506},[492,1549,1250],{"class":539},[492,1551,543],{"class":506},[492,1553,1518],{"class":533},[492,1555,1556],{"class":494,"line":1025},[492,1557,553],{"emptyLinePlaceholder":552},[492,1559,1560,1562,1565,1567,1569],{"class":494,"line":1030},[492,1561,513],{"class":498},[492,1563,1564],{"class":516}," dequeue",[492,1566,520],{"class":506},[492,1568,524],{"class":523},[492,1570,527],{"class":506},[492,1572,1573,1575,1577,1579,1581,1583],{"class":494,"line":1035},[492,1574,625],{"class":624},[492,1576,631],{"class":533},[492,1578,452],{"class":506},[492,1580,1124],{"class":539},[492,1582,1490],{"class":506},[492,1584,1585],{"class":506}," None:\n",[492,1587,1588,1590,1592,1594,1596,1599,1601],{"class":494,"line":1048},[492,1589,643],{"class":624},[492,1591,646],{"class":502},[492,1593,520],{"class":506},[492,1595,651],{"class":506},[492,1597,1598],{"class":654},"dequeue op lege wachtrij",[492,1600,651],{"class":506},[492,1602,660],{"class":506},[492,1604,1605,1608,1610,1612,1614,1616,1618],{"class":494,"line":1062},[492,1606,1607],{"class":533},"        x ",[492,1609,830],{"class":506},[492,1611,631],{"class":533},[492,1613,452],{"class":506},[492,1615,1124],{"class":539},[492,1617,452],{"class":506},[492,1619,1620],{"class":539},"waarde\n",[492,1622,1623,1625,1627,1629,1631,1633,1635,1637,1639],{"class":494,"line":1067},[492,1624,534],{"class":533},[492,1626,452],{"class":506},[492,1628,1124],{"class":539},[492,1630,543],{"class":506},[492,1632,631],{"class":533},[492,1634,452],{"class":506},[492,1636,1124],{"class":539},[492,1638,452],{"class":506},[492,1640,1641],{"class":539},"volgende\n",[492,1643,1645,1647,1649,1651,1653,1655,1657],{"class":494,"line":1644},25,[492,1646,625],{"class":624},[492,1648,631],{"class":533},[492,1650,452],{"class":506},[492,1652,1124],{"class":539},[492,1654,1490],{"class":506},[492,1656,1493],{"class":506},[492,1658,1659],{"class":598},"  # wachtrij is nu leeg\n",[492,1661,1663,1665,1667,1669,1671],{"class":494,"line":1662},26,[492,1664,1501],{"class":533},[492,1666,452],{"class":506},[492,1668,1250],{"class":539},[492,1670,543],{"class":506},[492,1672,1673],{"class":506}," None\n",[492,1675,1677,1679],{"class":494,"line":1676},27,[492,1678,666],{"class":624},[492,1680,1681],{"class":533}," x\n",[480,1683,1684],{"v-slot:java":482},[484,1685,1687],{"className":767,"code":1686,"language":769,"meta":482,"style":482},"class Wachtrij {\n    private static class Knoop {\n        int waarde;\n        Knoop volgende;\n\n        Knoop(int waarde) {\n            this.waarde = waarde;\n        }\n    }\n\n    private Knoop head; \u002F\u002F voorkant: hier gaat het eruit\n    private Knoop tail; \u002F\u002F achterkant: hier komt het erbij\n\n    void enqueue(int x) {\n        Knoop knoop = new Knoop(x);\n        if (tail == null) { \u002F\u002F lege wachtrij\n            head = tail = knoop;\n        } else {\n            tail.volgende = knoop;\n            tail = knoop;\n        }\n    }\n\n    int dequeue() {\n        if (head == null) {\n            throw new IllegalStateException(\"dequeue op lege wachtrij\");\n        }\n        int x = head.waarde;\n        head = head.volgende;\n        if (head == null) { \u002F\u002F wachtrij is nu leeg\n            tail = null;\n        }\n        return x;\n    }\n}\n",[61,1688,1689,1697,1711,1720,1729,1733,1747,1761,1765,1769,1773,1788,1802,1806,1822,1841,1862,1879,1889,1905,1916,1920,1924,1928,1938,1953,1971,1975,1993,2009,2027,2037,2042,2051,2056],{"__ignoreMap":482},[492,1690,1691,1693,1695],{"class":494,"line":495},[492,1692,499],{"class":498},[492,1694,1396],{"class":502},[492,1696,804],{"class":506},[492,1698,1699,1701,1704,1707,1709],{"class":494,"line":510},[492,1700,809],{"class":498},[492,1702,1703],{"class":498}," static",[492,1705,1706],{"class":498}," class",[492,1708,1328],{"class":502},[492,1710,804],{"class":506},[492,1712,1713,1716,1718],{"class":494,"line":530},[492,1714,1715],{"class":498},"        int",[492,1717,1345],{"class":533},[492,1719,791],{"class":506},[492,1721,1722,1725,1727],{"class":494,"line":549},[492,1723,1724],{"class":498},"        Knoop",[492,1726,1350],{"class":533},[492,1728,791],{"class":506},[492,1730,1731],{"class":494,"line":556},[492,1732,553],{"emptyLinePlaceholder":552},[492,1734,1735,1737,1739,1741,1743,1745],{"class":494,"line":577},[492,1736,1724],{"class":516},[492,1738,520],{"class":506},[492,1740,854],{"class":498},[492,1742,1345],{"class":571},[492,1744,595],{"class":506},[492,1746,804],{"class":506},[492,1748,1749,1752,1755,1757,1759],{"class":494,"line":602},[492,1750,1751],{"class":506},"            this.",[492,1753,1754],{"class":533},"waarde ",[492,1756,830],{"class":506},[492,1758,1345],{"class":533},[492,1760,791],{"class":506},[492,1762,1763],{"class":494,"line":607},[492,1764,945],{"class":506},[492,1766,1767],{"class":494,"line":621},[492,1768,885],{"class":506},[492,1770,1771],{"class":494,"line":640},[492,1772,553],{"emptyLinePlaceholder":552},[492,1774,1775,1777,1779,1782,1785],{"class":494,"line":663},[492,1776,809],{"class":498},[492,1778,1328],{"class":498},[492,1780,1781],{"class":533}," head",[492,1783,1784],{"class":506},";",[492,1786,1787],{"class":598}," \u002F\u002F voorkant: hier gaat het eruit\n",[492,1789,1790,1792,1794,1797,1799],{"class":494,"line":683},[492,1791,809],{"class":498},[492,1793,1328],{"class":498},[492,1795,1796],{"class":533}," tail",[492,1798,1784],{"class":506},[492,1800,1801],{"class":598}," \u002F\u002F achterkant: hier komt het erbij\n",[492,1803,1804],{"class":494,"line":688},[492,1805,553],{"emptyLinePlaceholder":552},[492,1807,1808,1810,1812,1814,1816,1818,1820],{"class":494,"line":702},[492,1809,847],{"class":498},[492,1811,1452],{"class":516},[492,1813,520],{"class":506},[492,1815,854],{"class":498},[492,1817,572],{"class":571},[492,1819,595],{"class":506},[492,1821,804],{"class":506},[492,1823,1824,1826,1829,1831,1833,1835,1837,1839],{"class":494,"line":722},[492,1825,1724],{"class":498},[492,1827,1828],{"class":533}," knoop ",[492,1830,830],{"class":506},[492,1832,833],{"class":624},[492,1834,1328],{"class":516},[492,1836,520],{"class":506},[492,1838,67],{"class":533},[492,1840,940],{"class":506},[492,1842,1843,1845,1847,1850,1853,1856,1859],{"class":494,"line":727},[492,1844,625],{"class":624},[492,1846,17],{"class":506},[492,1848,1849],{"class":533},"tail ",[492,1851,1852],{"class":506},"==",[492,1854,1855],{"class":506}," null)",[492,1857,1858],{"class":506}," {",[492,1860,1861],{"class":598}," \u002F\u002F lege wachtrij\n",[492,1863,1864,1867,1869,1872,1874,1877],{"class":494,"line":741},[492,1865,1866],{"class":533},"            head ",[492,1868,830],{"class":506},[492,1870,1871],{"class":533}," tail ",[492,1873,830],{"class":506},[492,1875,1876],{"class":533}," knoop",[492,1878,791],{"class":506},[492,1880,1881,1884,1887],{"class":494,"line":997},[492,1882,1883],{"class":506},"        }",[492,1885,1886],{"class":624}," else",[492,1888,804],{"class":506},[492,1890,1891,1894,1896,1899,1901,1903],{"class":494,"line":1025},[492,1892,1893],{"class":533},"            tail",[492,1895,452],{"class":506},[492,1897,1898],{"class":533},"volgende ",[492,1900,830],{"class":506},[492,1902,1876],{"class":533},[492,1904,791],{"class":506},[492,1906,1907,1910,1912,1914],{"class":494,"line":1030},[492,1908,1909],{"class":533},"            tail ",[492,1911,830],{"class":506},[492,1913,1876],{"class":533},[492,1915,791],{"class":506},[492,1917,1918],{"class":494,"line":1035},[492,1919,945],{"class":506},[492,1921,1922],{"class":494,"line":1048},[492,1923,885],{"class":506},[492,1925,1926],{"class":494,"line":1062},[492,1927,553],{"emptyLinePlaceholder":552},[492,1929,1930,1932,1934,1936],{"class":494,"line":1067},[492,1931,894],{"class":498},[492,1933,1564],{"class":516},[492,1935,899],{"class":506},[492,1937,804],{"class":506},[492,1939,1940,1942,1944,1947,1949,1951],{"class":494,"line":1644},[492,1941,625],{"class":624},[492,1943,17],{"class":506},[492,1945,1946],{"class":533},"head ",[492,1948,1852],{"class":506},[492,1950,1855],{"class":506},[492,1952,804],{"class":506},[492,1954,1955,1957,1959,1961,1963,1965,1967,1969],{"class":494,"line":1662},[492,1956,924],{"class":624},[492,1958,833],{"class":624},[492,1960,929],{"class":516},[492,1962,520],{"class":506},[492,1964,651],{"class":506},[492,1966,1598],{"class":654},[492,1968,651],{"class":506},[492,1970,940],{"class":506},[492,1972,1973],{"class":494,"line":1676},[492,1974,945],{"class":506},[492,1976,1978,1980,1983,1985,1987,1989,1991],{"class":494,"line":1977},28,[492,1979,1715],{"class":498},[492,1981,1982],{"class":533}," x ",[492,1984,830],{"class":506},[492,1986,1781],{"class":533},[492,1988,452],{"class":506},[492,1990,1362],{"class":533},[492,1992,791],{"class":506},[492,1994,1996,1999,2001,2003,2005,2007],{"class":494,"line":1995},29,[492,1997,1998],{"class":533},"        head ",[492,2000,830],{"class":506},[492,2002,1781],{"class":533},[492,2004,452],{"class":506},[492,2006,1376],{"class":533},[492,2008,791],{"class":506},[492,2010,2012,2014,2016,2018,2020,2022,2024],{"class":494,"line":2011},30,[492,2013,625],{"class":624},[492,2015,17],{"class":506},[492,2017,1946],{"class":533},[492,2019,1852],{"class":506},[492,2021,1855],{"class":506},[492,2023,1858],{"class":506},[492,2025,2026],{"class":598}," \u002F\u002F wachtrij is nu leeg\n",[492,2028,2030,2032,2034],{"class":494,"line":2029},31,[492,2031,1909],{"class":533},[492,2033,830],{"class":506},[492,2035,2036],{"class":506}," null;\n",[492,2038,2040],{"class":494,"line":2039},32,[492,2041,945],{"class":506},[492,2043,2045,2047,2049],{"class":494,"line":2044},33,[492,2046,666],{"class":624},[492,2048,572],{"class":533},[492,2050,791],{"class":506},[492,2052,2054],{"class":494,"line":2053},34,[492,2055,885],{"class":506},[492,2057,2059],{"class":494,"line":2058},35,[492,2060,1070],{"class":506},[10,2062,2063,2064,2066,2067,2069,2070,2072,2073,2075,2076,2079,2080,2082],{},"Let op de randgevallen: bij de eerste ",[61,2065,1300],{}," moeten ",[61,2068,1124],{}," én ",[61,2071,1250],{}," naar de nieuwe knoop wijzen,\nen als de laatste knoop eruit gaat moet ",[61,2074,1250],{}," weer ",[61,2077,2078],{},"null"," worden. Vergeet je dat, dan wijst ",[61,2081,1250],{},"\nnaar een knoop die niet meer in de lijst zit.",[38,2084,2086],{"id":2085},"toepassing-haakjes-controleren","Toepassing: haakjes controleren",[10,2088,2089,2090,2093,2094,2097,2098,2101],{},"Klopt ",[61,2091,2092],{},"{[()()]}","? En ",[61,2095,2096],{},"([)]","? Elk sluithaakje moet passen bij het ",[14,2099,2100],{},"laatst geopende"," haakje dat nog\nopen staat. \"Laatst geopend, eerst gesloten\": dat is LIFO, dus een stapel.",[10,2103,2104,2105,2107,2108,2110],{},"Het algoritme: openingshaakje → ",[61,2106,1279],{},". Sluithaakje → ",[61,2109,677],{}," en controleer of het bijbehorende\nopeningshaakje eruit komt. Aan het eind moet de stapel leeg zijn.",[99,2112,2113,2125],{},[102,2114,2115],{},[105,2116,2117,2120,2123],{},[108,2118,2119],{},"Teken",[108,2121,2122],{},"Actie",[108,2124,119],{},[121,2126,2127,2140,2154,2167,2183,2195,2209,2224],{},[105,2128,2129,2134,2136],{},[126,2130,2131],{},[61,2132,2133],{},"{",[126,2135,1279],{},[126,2137,2138],{},[61,2139,2133],{},[105,2141,2142,2147,2149],{},[126,2143,2144],{},[61,2145,2146],{},"[",[126,2148,1279],{},[126,2150,2151],{},[61,2152,2153],{},"{ [",[105,2155,2156,2160,2162],{},[126,2157,2158],{},[61,2159,520],{},[126,2161,1279],{},[126,2163,2164],{},[61,2165,2166],{},"{ [ (",[105,2168,2169,2173,2179],{},[126,2170,2171],{},[61,2172,595],{},[126,2174,2175,2176,2178],{},"pop ",[61,2177,520],{},", past",[126,2180,2181],{},[61,2182,2153],{},[105,2184,2185,2189,2191],{},[126,2186,2187],{},[61,2188,520],{},[126,2190,1279],{},[126,2192,2193],{},[61,2194,2166],{},[105,2196,2197,2201,2205],{},[126,2198,2199],{},[61,2200,595],{},[126,2202,2175,2203,2178],{},[61,2204,520],{},[126,2206,2207],{},[61,2208,2153],{},[105,2210,2211,2216,2220],{},[126,2212,2213],{},[61,2214,2215],{},"]",[126,2217,2175,2218,2178],{},[61,2219,2146],{},[126,2221,2222],{},[61,2223,2133],{},[105,2225,2226,2231,2235],{},[126,2227,2228],{},[61,2229,2230],{},"}",[126,2232,2175,2233,2178],{},[61,2234,2133],{},[126,2236,2237],{},"leeg",[10,2239,2240,2241,2243,2244,2246,2247,2249,2250,2252,2253,2255,2256,2259,2260,2262],{},"De stapel is leeg aan het einde: ",[61,2242,2092],{}," klopt. Bij ",[61,2245,2096],{}," gaat het mis bij het derde teken:\n",[61,2248,595],{}," komt binnen, maar ",[61,2251,677],{}," levert ",[61,2254,2146],{}," op. Fout. En bij ",[61,2257,2258],{},"(()"," blijft er aan het eind een ",[61,2261,520],{}," op de\nstapel staan: ook fout.",[477,2264,2265,2481],{},[480,2266,2267],{"v-slot:python":482},[484,2268,2270],{"className":486,"code":2269,"language":488,"meta":482,"style":482},"def haakjes_kloppen(s):\n    paren = {\")\": \"(\", \"]\": \"[\", \"}\": \"{\"}\n    stapel = []\n    for c in s:\n        if c in \"([{\":\n            stapel.append(c)  # openingshaakje: push\n        elif c in paren:\n            # sluithaakje: de bovenkant moet het juiste openingshaakje zijn\n            if not stapel or stapel.pop() != paren[c]:\n                return False\n    return not stapel  # alles moet gesloten zijn\n",[61,2271,2272,2287,2346,2355,2371,2388,2407,2421,2426,2460,2468],{"__ignoreMap":482},[492,2273,2274,2277,2280,2282,2285],{"class":494,"line":495},[492,2275,2276],{"class":498},"def",[492,2278,2279],{"class":516}," haakjes_kloppen",[492,2281,520],{"class":506},[492,2283,2284],{"class":571},"s",[492,2286,527],{"class":506},[492,2288,2289,2292,2294,2296,2298,2300,2302,2305,2308,2310,2312,2314,2316,2318,2320,2322,2324,2326,2328,2330,2332,2334,2336,2338,2340,2342,2344],{"class":494,"line":510},[492,2290,2291],{"class":533},"    paren ",[492,2293,830],{"class":506},[492,2295,1858],{"class":506},[492,2297,651],{"class":506},[492,2299,595],{"class":654},[492,2301,651],{"class":506},[492,2303,2304],{"class":506},":",[492,2306,2307],{"class":506}," \"",[492,2309,520],{"class":654},[492,2311,651],{"class":506},[492,2313,568],{"class":506},[492,2315,2307],{"class":506},[492,2317,2215],{"class":654},[492,2319,651],{"class":506},[492,2321,2304],{"class":506},[492,2323,2307],{"class":506},[492,2325,2146],{"class":654},[492,2327,651],{"class":506},[492,2329,568],{"class":506},[492,2331,2307],{"class":506},[492,2333,2230],{"class":654},[492,2335,651],{"class":506},[492,2337,2304],{"class":506},[492,2339,2307],{"class":506},[492,2341,2133],{"class":654},[492,2343,651],{"class":506},[492,2345,1070],{"class":506},[492,2347,2348,2351,2353],{"class":494,"line":530},[492,2349,2350],{"class":533},"    stapel ",[492,2352,830],{"class":506},[492,2354,546],{"class":506},[492,2356,2357,2360,2363,2366,2369],{"class":494,"line":549},[492,2358,2359],{"class":624},"    for",[492,2361,2362],{"class":533}," c ",[492,2364,2365],{"class":624},"in",[492,2367,2368],{"class":533}," s",[492,2370,507],{"class":506},[492,2372,2373,2375,2377,2379,2381,2384,2386],{"class":494,"line":556},[492,2374,625],{"class":624},[492,2376,2362],{"class":533},[492,2378,2365],{"class":506},[492,2380,2307],{"class":506},[492,2382,2383],{"class":654},"([{",[492,2385,651],{"class":506},[492,2387,507],{"class":506},[492,2389,2390,2393,2395,2397,2399,2402,2404],{"class":494,"line":577},[492,2391,2392],{"class":533},"            stapel",[492,2394,452],{"class":506},[492,2396,588],{"class":516},[492,2398,520],{"class":506},[492,2400,2401],{"class":516},"c",[492,2403,595],{"class":506},[492,2405,2406],{"class":598},"  # openingshaakje: push\n",[492,2408,2409,2412,2414,2416,2419],{"class":494,"line":602},[492,2410,2411],{"class":624},"        elif",[492,2413,2362],{"class":533},[492,2415,2365],{"class":506},[492,2417,2418],{"class":533}," paren",[492,2420,507],{"class":506},[492,2422,2423],{"class":494,"line":607},[492,2424,2425],{"class":598},"            # sluithaakje: de bovenkant moet het juiste openingshaakje zijn\n",[492,2427,2428,2431,2433,2436,2439,2442,2444,2446,2448,2451,2453,2455,2457],{"class":494,"line":621},[492,2429,2430],{"class":624},"            if",[492,2432,628],{"class":506},[492,2434,2435],{"class":533}," stapel ",[492,2437,2438],{"class":506},"or",[492,2440,2441],{"class":533}," stapel",[492,2443,452],{"class":506},[492,2445,677],{"class":516},[492,2447,899],{"class":506},[492,2449,2450],{"class":506}," !=",[492,2452,2418],{"class":533},[492,2454,2146],{"class":506},[492,2456,2401],{"class":533},[492,2458,2459],{"class":506},"]:\n",[492,2461,2462,2465],{"class":494,"line":640},[492,2463,2464],{"class":624},"                return",[492,2466,2467],{"class":506}," False\n",[492,2469,2470,2473,2475,2478],{"class":494,"line":663},[492,2471,2472],{"class":624},"    return",[492,2474,628],{"class":506},[492,2476,2477],{"class":533}," stapel  ",[492,2479,2480],{"class":598},"# alles moet gesloten zijn\n",[480,2482,2483],{"v-slot:java":482},[484,2484,2486],{"className":767,"code":2485,"language":769,"meta":482,"style":482},"static boolean haakjesKloppen(String s) {\n    java.util.ArrayDeque\u003CCharacter> stapel = new java.util.ArrayDeque\u003C>();\n    for (char c : s.toCharArray()) {\n        if (c == '(' || c == '[' || c == '{') {\n            stapel.push(c); \u002F\u002F openingshaakje: push\n        } else if (c == ')' || c == ']' || c == '}') {\n            char verwacht = c == ')' ? '(' : c == ']' ? '[' : '{';\n            \u002F\u002F sluithaakje: de bovenkant moet het juiste openingshaakje zijn\n            if (stapel.isEmpty() || stapel.pop() != verwacht) {\n                return false;\n            }\n        }\n    }\n    return stapel.isEmpty(); \u002F\u002F alles moet gesloten zijn\n}\n",[61,2487,2488,2510,2548,2572,2620,2637,2686,2746,2751,2784,2791,2796,2800,2804,2820],{"__ignoreMap":482},[492,2489,2490,2493,2496,2499,2501,2504,2506,2508],{"class":494,"line":495},[492,2491,2492],{"class":498},"static",[492,2494,2495],{"class":498}," boolean",[492,2497,2498],{"class":516}," haakjesKloppen",[492,2500,520],{"class":506},[492,2502,2503],{"class":498},"String",[492,2505,2368],{"class":533},[492,2507,595],{"class":506},[492,2509,804],{"class":506},[492,2511,2512,2515,2517,2519,2521,2523,2525,2528,2530,2532,2534,2536,2538,2540,2542,2544,2546],{"class":494,"line":510},[492,2513,2514],{"class":498},"    java",[492,2516,452],{"class":506},[492,2518,784],{"class":498},[492,2520,452],{"class":506},[492,2522,1096],{"class":498},[492,2524,818],{"class":506},[492,2526,2527],{"class":498},"Character",[492,2529,824],{"class":506},[492,2531,2435],{"class":533},[492,2533,830],{"class":506},[492,2535,833],{"class":624},[492,2537,779],{"class":498},[492,2539,452],{"class":506},[492,2541,784],{"class":498},[492,2543,452],{"class":506},[492,2545,1096],{"class":498},[492,2547,838],{"class":506},[492,2549,2550,2552,2554,2557,2559,2561,2563,2565,2568,2570],{"class":494,"line":530},[492,2551,2359],{"class":624},[492,2553,17],{"class":506},[492,2555,2556],{"class":498},"char",[492,2558,2362],{"class":533},[492,2560,2304],{"class":624},[492,2562,2368],{"class":533},[492,2564,452],{"class":506},[492,2566,2567],{"class":516},"toCharArray",[492,2569,917],{"class":506},[492,2571,804],{"class":506},[492,2573,2574,2576,2578,2581,2583,2586,2588,2591,2594,2596,2598,2600,2602,2604,2606,2608,2610,2612,2614,2616,2618],{"class":494,"line":549},[492,2575,625],{"class":624},[492,2577,17],{"class":506},[492,2579,2580],{"class":533},"c ",[492,2582,1852],{"class":506},[492,2584,2585],{"class":506}," '",[492,2587,520],{"class":654},[492,2589,2590],{"class":506},"'",[492,2592,2593],{"class":506}," ||",[492,2595,2362],{"class":533},[492,2597,1852],{"class":506},[492,2599,2585],{"class":506},[492,2601,2146],{"class":654},[492,2603,2590],{"class":506},[492,2605,2593],{"class":506},[492,2607,2362],{"class":533},[492,2609,1852],{"class":506},[492,2611,2585],{"class":506},[492,2613,2133],{"class":654},[492,2615,2590],{"class":506},[492,2617,595],{"class":506},[492,2619,804],{"class":506},[492,2621,2622,2624,2626,2628,2630,2632,2634],{"class":494,"line":556},[492,2623,2392],{"class":533},[492,2625,452],{"class":506},[492,2627,1279],{"class":516},[492,2629,520],{"class":506},[492,2631,2401],{"class":533},[492,2633,877],{"class":506},[492,2635,2636],{"class":598}," \u002F\u002F openingshaakje: push\n",[492,2638,2639,2641,2643,2646,2648,2650,2652,2654,2656,2658,2660,2662,2664,2666,2668,2670,2672,2674,2676,2678,2680,2682,2684],{"class":494,"line":577},[492,2640,1883],{"class":506},[492,2642,1886],{"class":624},[492,2644,2645],{"class":624}," if",[492,2647,17],{"class":506},[492,2649,2580],{"class":533},[492,2651,1852],{"class":506},[492,2653,2585],{"class":506},[492,2655,595],{"class":654},[492,2657,2590],{"class":506},[492,2659,2593],{"class":506},[492,2661,2362],{"class":533},[492,2663,1852],{"class":506},[492,2665,2585],{"class":506},[492,2667,2215],{"class":654},[492,2669,2590],{"class":506},[492,2671,2593],{"class":506},[492,2673,2362],{"class":533},[492,2675,1852],{"class":506},[492,2677,2585],{"class":506},[492,2679,2230],{"class":654},[492,2681,2590],{"class":506},[492,2683,595],{"class":506},[492,2685,804],{"class":506},[492,2687,2688,2691,2694,2696,2698,2700,2702,2704,2706,2709,2711,2713,2715,2718,2720,2722,2724,2726,2728,2730,2732,2734,2736,2738,2740,2742,2744],{"class":494,"line":602},[492,2689,2690],{"class":498},"            char",[492,2692,2693],{"class":533}," verwacht ",[492,2695,830],{"class":506},[492,2697,2362],{"class":533},[492,2699,1852],{"class":506},[492,2701,2585],{"class":506},[492,2703,595],{"class":654},[492,2705,2590],{"class":506},[492,2707,2708],{"class":624}," ?",[492,2710,2585],{"class":506},[492,2712,520],{"class":654},[492,2714,2590],{"class":506},[492,2716,2717],{"class":624}," :",[492,2719,2362],{"class":533},[492,2721,1852],{"class":506},[492,2723,2585],{"class":506},[492,2725,2215],{"class":654},[492,2727,2590],{"class":506},[492,2729,2708],{"class":624},[492,2731,2585],{"class":506},[492,2733,2146],{"class":654},[492,2735,2590],{"class":506},[492,2737,2717],{"class":624},[492,2739,2585],{"class":506},[492,2741,2133],{"class":654},[492,2743,2590],{"class":506},[492,2745,791],{"class":506},[492,2747,2748],{"class":494,"line":607},[492,2749,2750],{"class":598},"            \u002F\u002F sluithaakje: de bovenkant moet het juiste openingshaakje zijn\n",[492,2752,2753,2755,2757,2759,2761,2763,2765,2767,2769,2771,2773,2775,2777,2780,2782],{"class":494,"line":621},[492,2754,2430],{"class":624},[492,2756,17],{"class":506},[492,2758,16],{"class":533},[492,2760,452],{"class":506},[492,2762,914],{"class":516},[492,2764,899],{"class":506},[492,2766,2593],{"class":506},[492,2768,2441],{"class":533},[492,2770,452],{"class":506},[492,2772,677],{"class":516},[492,2774,899],{"class":506},[492,2776,2450],{"class":506},[492,2778,2779],{"class":533}," verwacht",[492,2781,595],{"class":506},[492,2783,804],{"class":506},[492,2785,2786,2788],{"class":494,"line":640},[492,2787,2464],{"class":624},[492,2789,2790],{"class":506}," false;\n",[492,2792,2793],{"class":494,"line":663},[492,2794,2795],{"class":506},"            }\n",[492,2797,2798],{"class":494,"line":683},[492,2799,945],{"class":506},[492,2801,2802],{"class":494,"line":688},[492,2803,885],{"class":506},[492,2805,2806,2808,2810,2812,2814,2817],{"class":494,"line":702},[492,2807,2472],{"class":624},[492,2809,2441],{"class":533},[492,2811,452],{"class":506},[492,2813,914],{"class":516},[492,2815,2816],{"class":506},"();",[492,2818,2819],{"class":598}," \u002F\u002F alles moet gesloten zijn\n",[492,2821,2822],{"class":494,"line":722},[492,2823,1070],{"class":506},[38,2825,2827],{"id":2826},"meer-toepassingen","Meer toepassingen",[99,2829,2830,2843],{},[102,2831,2832],{},[105,2833,2834,2837,2840],{},[108,2835,2836],{},"Toepassing",[108,2838,2839],{},"Structuur",[108,2841,2842],{},"Waarom",[121,2844,2845,2855,2867,2878,2888,2902],{},[105,2846,2847,2850,2852],{},[126,2848,2849],{},"Undo in een editor",[126,2851,16],{},[126,2853,2854],{},"de laatste wijziging maak je als eerste ongedaan",[105,2856,2857,2862,2864],{},[126,2858,2859,2860,595],{},"Functieaanroepen (",[19,2861,32],{},[126,2863,16],{},[126,2865,2866],{},"de laatst aangeroepen functie keert als eerste terug",[105,2868,2869,2872,2875],{},[126,2870,2871],{},"DFS in een graaf",[126,2873,2874],{},"stapel (of recursie)",[126,2876,2877],{},"ga zo diep mogelijk, keer terug naar de laatste splitsing",[105,2879,2880,2883,2885],{},[126,2881,2882],{},"Printerwachtrij",[126,2884,25],{},[126,2886,2887],{},"opdrachten in volgorde van binnenkomst",[105,2889,2890,2897,2899],{},[126,2891,2892,2893],{},"BFS in een ",[1184,2894,2896],{"href":2895},"\u002Fpracticely\u002Fdsa\u002Fgrafen","graaf",[126,2898,25],{},[126,2900,2901],{},"knopen per laag verwerken, dichtstbijzijnde eerst",[105,2903,2904,2907,2909],{},[126,2905,2906],{},"Verzoeken op een webserver",[126,2908,25],{},[126,2910,2911],{},"eerlijk: wie eerst komt, wordt eerst bediend",[10,2913,2914,2915,452],{},"Wil je in plaats van \"eerst binnen\" juist \"kleinste eerst\" verwerken, dan heb je een\nprioriteitswachtrij nodig. Die bouw je met een ",[1184,2916,2918],{"href":2917},"\u002Fpracticely\u002Fdsa\u002Fheaps","heap",[38,2920,2922],{"id":2921},"complexiteit","Complexiteit",[99,2924,2925,2949],{},[102,2926,2927],{},[105,2928,2929,2931,2934,2937,2946],{},[108,2930,113],{},[108,2932,2933],{},"Stapel (array)",[108,2935,2936],{},"Stapel (gelinkte lijst)",[108,2938,2939,2940,2943,2944,595],{},"Wachtrij (",[61,2941,2942],{},"deque","\u002F",[61,2945,1096],{},[108,2947,2948],{},"Wachtrij (gelinkte lijst met tail)",[121,2950,2951,2976,3000,3026],{},[105,2952,2953,2960,2964,2968,2972],{},[126,2954,2955,2957,2958],{},[61,2956,1279],{}," \u002F ",[61,2959,1300],{},[126,2961,2962,1242],{},[61,2963,474],{},[126,2965,2966],{},[61,2967,474],{},[126,2969,2970,1242],{},[61,2971,474],{},[126,2973,2974],{},[61,2975,474],{},[105,2977,2978,2984,2988,2992,2996],{},[126,2979,2980,2957,2982],{},[61,2981,677],{},[61,2983,1076],{},[126,2985,2986],{},[61,2987,474],{},[126,2989,2990],{},[61,2991,474],{},[126,2993,2994],{},[61,2995,474],{},[126,2997,2998],{},[61,2999,474],{},[105,3001,3002,3010,3014,3018,3022],{},[126,3003,3004,2957,3007],{},[61,3005,3006],{},"peek",[61,3008,3009],{},"front",[126,3011,3012],{},[61,3013,474],{},[126,3015,3016],{},[61,3017,474],{},[126,3019,3020],{},[61,3021,474],{},[126,3023,3024],{},[61,3025,474],{},[105,3027,3028,3031,3035,3039,3043],{},[126,3029,3030],{},"zoeken naar een waarde",[126,3032,3033],{},[61,3034,1088],{},[126,3036,3037],{},[61,3038,1088],{},[126,3040,3041],{},[61,3042,1088],{},[126,3044,3045],{},[61,3046,1088],{},[10,3048,3049,3050,3053,3054,3056],{},"\"Gemiddeld\" (",[19,3051,3052],{},"amortized",") bij de array: meestal is er nog plek, maar af en toe moet de array\nverdubbelen en wordt alles gekopieerd. Verdeeld over alle operaties is dat nog steeds ",[61,3055,474],{}," per\noperatie.",[38,3058,3060],{"id":3059},"veelgemaakte-fouten-op-het-tentamen","Veelgemaakte fouten op het tentamen",[3062,3063,3064,3081,3093,3112,3121],"ol",{},[58,3065,3066,3069,3070,3073,3074,3076,3077,3080],{},[14,3067,3068],{},"De stapel in de verkeerde richting opschrijven."," Wij noteren van onder naar boven: na\n",[61,3071,3072],{},"push(4), push(7)"," is het ",[61,3075,158],{},", niet ",[61,3078,3079],{},"7, 4",". Het meest rechtse element gaat er als eerste af.",[58,3082,3083,278,3086,3088,3089,3092],{},[14,3084,3085],{},"Bij de wachtrij aan de verkeerde kant weghalen.",[61,3087,1076],{}," haalt het element weg dat het\nlangst wacht, dus het meest ",[14,3090,3091],{},"linkse"," in de notatie voor → achter.",[58,3094,3095,3098,3099,3102,3103,278,3106,3108,3109,3111],{},[14,3096,3097],{},"Een gewone lijst als wachtrij gebruiken"," en denken dat ",[61,3100,3101],{},"pop(0)"," of ",[61,3104,3105],{},"remove(0)",[61,3107,474],{}," is. Het\nis ",[61,3110,1088],{},", want alles schuift op.",[58,3113,3114,3117,3118,3120],{},[14,3115,3116],{},"Bij haakjes controleren vergeten te kijken of de stapel aan het eind leeg is."," Dan keur je\n",[61,3119,2258],{}," ten onrechte goed.",[58,3122,3123,3128,3129,3131,3132,452],{},[14,3124,3125,3127],{},[61,3126,1250],{}," niet bijwerken"," in een gelinkte wachtrij als de laatste knoop verdwijnt, of ",[61,3130,1124],{},"\nvergeten bij de eerste ",[61,3133,1300],{},[38,3135,3137],{"id":3136},"samenvatting","Samenvatting",[55,3139,3140,3152,3163,3172,3180],{},[58,3141,3142,3143,3145,3146,3148,3149,3151],{},"Stapel = ",[14,3144,47],{},": ",[61,3147,1279],{}," en ",[61,3150,677],{}," aan dezelfde kant; noteer van onder naar boven.",[58,3153,3154,3155,3145,3157,3159,3160,3162],{},"Wachtrij = ",[14,3156,264],{},[61,3158,1300],{}," achteraan, ",[61,3161,1076],{}," vooraan; noteer van voor naar achter.",[58,3164,3165,3166,3168,3169,3171],{},"Alle kernoperaties zijn ",[61,3167,474],{},", mits je de juiste implementatie kiest (geen ",[61,3170,3101],{}," op een lijst).",[58,3173,3174,3175,3177,3178,452],{},"Een enkel gelinkte lijst kan vooraan invoegen en verwijderen in ",[61,3176,474],{},", maar indexeren kost ",[61,3179,1088],{},[58,3181,3182],{},"Stapel: haakjes, undo, call stack, DFS. Wachtrij: printer, BFS, verzoeken verwerken.",[3184,3185,3186],"style",{},"html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .s5tWE, html code.shiki .s5tWE{--shiki-light:#E53935;--shiki-light-font-style:italic;--shiki-default:#F07178;--shiki-default-font-style:italic;--shiki-dark:#F07178;--shiki-dark-font-style:italic}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":482,"searchDepth":510,"depth":510,"links":3188},[3189,3190,3191,3192,3193,3194,3195,3196,3197,3198],{"id":40,"depth":510,"text":41},{"id":257,"depth":510,"text":258},{"id":455,"depth":510,"text":456},{"id":1100,"depth":510,"text":1101},{"id":1270,"depth":510,"text":1271},{"id":2085,"depth":510,"text":2086},{"id":2826,"depth":510,"text":2827},{"id":2921,"depth":510,"text":2922},{"id":3059,"depth":510,"text":3060},{"id":3136,"depth":510,"text":3137},"Stack en queue stap voor stap: push, pop, enqueue en dequeue, implementatie met array en gelinkte lijst, haakjes controleren en code in Python en Java.","md","i-lucide-layers",{},"\u002Fpracticely-dsa\u002Fstapels-en-wachtrijen",{"title":5,"description":3199},"practicely-dsa\u002Fstapels-en-wachtrijen","stapels-en-wachtrijen","muo76bpaJ6VLu5iRSvDFur7L2y0vejg1my9MPrCy8rk",{"prev":3209,"next":5331},{"id":3210,"title":3211,"body":3212,"description":5323,"extension":3200,"icon":5324,"meta":5325,"navigation":552,"order":530,"path":5326,"seo":5327,"stem":5328,"topic":5329,"__hash__":5330},"practicelyDsa\u002Fpracticely-dsa\u002Fzoeken.md","Binair zoeken uitgelegd: van lineair zoeken naar O(log n)",{"type":7,"value":3213,"toc":5311},[3214,3221,3243,3247,3255,3478,3488,3492,3495,3509,3553,3570,3574,3581,3645,3748,3762,3766,3773,3876,3898,3902,4336,4363,4367,4370,4421,4424,4490,4499,4503,4519,4603,4609,5057,5071,5073,5098,5192,5209,5211,5271,5273,5308],[10,3215,3216,3217,3220],{},"Zoeken in een lijst klinkt triviaal: loop alles af tot je het vindt. Dat werkt, maar bij een miljoen\nelementen kost het in het slechtste geval een miljoen vergelijkingen. Is de lijst ",[14,3218,3219],{},"gesorteerd",",\ndan kan het met twintig. Dat is het verschil tussen lineair en binair zoeken.",[10,3222,3223,17,3226,3229,3230,3232,3233,1304,3236,3102,3239,3242],{},[14,3224,3225],{},"Binair zoeken",[19,3227,3228],{},"binary search",") is een van de meest gevraagde algoritmes op tentamens en in\nsollicitatiegesprekken, juist omdat het er simpel uitziet en toch vol zit met kleine valkuilen: ",[61,3231,818],{},"\nof ",[61,3234,3235],{},"\u003C=",[61,3237,3238],{},"mid",[61,3240,3241],{},"mid+1","? Op deze pagina zie je precies welke variant we gebruiken en waarom die\nklopt.",[38,3244,3246],{"id":3245},"lineair-zoeken","Lineair zoeken",[10,3248,3249,17,3251,3254],{},[14,3250,3246],{},[19,3252,3253],{},"linear search",") bekijkt de elementen één voor één, van voor naar achter, tot het\ngezochte element gevonden is of de lijst op is.",[477,3256,3257,3346],{},[480,3258,3259],{"v-slot:python":482},[484,3260,3262],{"className":486,"code":3261,"language":488,"meta":482,"style":482},"def lineair_zoeken(a, x):\n    for i in range(len(a)):\n        if a[i] == x:\n            return i  # gevonden op index i\n    return -1  # niet gevonden\n",[61,3263,3264,3281,3305,3324,3335],{"__ignoreMap":482},[492,3265,3266,3268,3271,3273,3275,3277,3279],{"class":494,"line":495},[492,3267,2276],{"class":498},[492,3269,3270],{"class":516}," lineair_zoeken",[492,3272,520],{"class":506},[492,3274,1184],{"class":571},[492,3276,568],{"class":506},[492,3278,572],{"class":571},[492,3280,527],{"class":506},[492,3282,3283,3285,3288,3290,3293,3295,3298,3300,3302],{"class":494,"line":510},[492,3284,2359],{"class":624},[492,3286,3287],{"class":533}," i ",[492,3289,2365],{"class":624},[492,3291,3292],{"class":516}," range",[492,3294,520],{"class":506},[492,3296,3297],{"class":516},"len",[492,3299,520],{"class":506},[492,3301,1184],{"class":516},[492,3303,3304],{"class":506},")):\n",[492,3306,3307,3309,3312,3314,3316,3318,3320,3322],{"class":494,"line":530},[492,3308,625],{"class":624},[492,3310,3311],{"class":533}," a",[492,3313,2146],{"class":506},[492,3315,1172],{"class":533},[492,3317,2215],{"class":506},[492,3319,759],{"class":506},[492,3321,572],{"class":533},[492,3323,507],{"class":506},[492,3325,3326,3329,3332],{"class":494,"line":549},[492,3327,3328],{"class":624},"            return",[492,3330,3331],{"class":533}," i  ",[492,3333,3334],{"class":598},"# gevonden op index i\n",[492,3336,3337,3339,3341,3343],{"class":494,"line":556},[492,3338,2472],{"class":624},[492,3340,971],{"class":506},[492,3342,128],{"class":716},[492,3344,3345],{"class":598},"  # niet gevonden\n",[480,3347,3348],{"v-slot:java":482},[484,3349,3351],{"className":767,"code":3350,"language":769,"meta":482,"style":482},"static int lineairZoeken(int[] a, int x) {\n    for (int i = 0; i \u003C a.length; i++) {\n        if (a[i] == x) {\n            return i; \u002F\u002F gevonden op index i\n        }\n    }\n    return -1; \u002F\u002F niet gevonden\n}\n",[61,3352,3353,3382,3420,3442,3453,3457,3461,3474],{"__ignoreMap":482},[492,3354,3355,3357,3360,3363,3365,3367,3370,3372,3374,3376,3378,3380],{"class":494,"line":495},[492,3356,2492],{"class":498},[492,3358,3359],{"class":498}," int",[492,3361,3362],{"class":516}," lineairZoeken",[492,3364,520],{"class":506},[492,3366,854],{"class":498},[492,3368,3369],{"class":506},"[]",[492,3371,3311],{"class":533},[492,3373,568],{"class":506},[492,3375,3359],{"class":498},[492,3377,572],{"class":533},[492,3379,595],{"class":506},[492,3381,804],{"class":506},[492,3383,3384,3386,3388,3390,3392,3394,3397,3399,3401,3403,3405,3407,3410,3412,3415,3418],{"class":494,"line":510},[492,3385,2359],{"class":624},[492,3387,17],{"class":506},[492,3389,854],{"class":498},[492,3391,3287],{"class":533},[492,3393,830],{"class":506},[492,3395,3396],{"class":716}," 0",[492,3398,1784],{"class":506},[492,3400,3287],{"class":533},[492,3402,818],{"class":506},[492,3404,3311],{"class":533},[492,3406,452],{"class":506},[492,3408,3409],{"class":533},"length",[492,3411,1784],{"class":506},[492,3413,3414],{"class":533}," i",[492,3416,3417],{"class":506},"++)",[492,3419,804],{"class":506},[492,3421,3422,3424,3426,3428,3430,3432,3434,3436,3438,3440],{"class":494,"line":530},[492,3423,625],{"class":624},[492,3425,17],{"class":506},[492,3427,1184],{"class":533},[492,3429,2146],{"class":506},[492,3431,1172],{"class":533},[492,3433,2215],{"class":506},[492,3435,759],{"class":506},[492,3437,572],{"class":533},[492,3439,595],{"class":506},[492,3441,804],{"class":506},[492,3443,3444,3446,3448,3450],{"class":494,"line":549},[492,3445,3328],{"class":624},[492,3447,3414],{"class":533},[492,3449,1784],{"class":506},[492,3451,3452],{"class":598}," \u002F\u002F gevonden op index i\n",[492,3454,3455],{"class":494,"line":556},[492,3456,945],{"class":506},[492,3458,3459],{"class":494,"line":577},[492,3460,885],{"class":506},[492,3462,3463,3465,3467,3469,3471],{"class":494,"line":602},[492,3464,2472],{"class":624},[492,3466,971],{"class":506},[492,3468,128],{"class":716},[492,3470,1784],{"class":506},[492,3472,3473],{"class":598}," \u002F\u002F niet gevonden\n",[492,3475,3476],{"class":494,"line":607},[492,3477,1070],{"class":506},[10,3479,3480,3481,3484,3485,3487],{},"Het voordeel: de lijst hoeft niet gesorteerd te zijn, en het werkt ook op een\n",[1184,3482,1106],{"href":3483},"\u002Fpracticely\u002Fdsa\u002Fstapels-en-wachtrijen",". Het nadeel: ",[61,3486,1088],{},". Staat het element\nachteraan of helemaal niet in de lijst, dan bekijk je alles.",[38,3489,3491],{"id":3490},"binair-zoeken-het-idee","Binair zoeken: het idee",[10,3493,3494],{},"Denk aan een woordenboek. Je zoekt \"kwartel\" en slaat het boek ergens in het midden open bij \"mango\".\nOmdat de woorden alfabetisch staan, weet je meteen: het moet in de eerste helft zitten. De tweede\nhelft hoef je nooit meer te bekijken.",[10,3496,3497,3498,3501,3502,3148,3505,3508],{},"Binair zoeken doet hetzelfde met een ",[14,3499,3500],{},"gesorteerde"," array. Je houdt twee grenzen bij, ",[61,3503,3504],{},"lo",[61,3506,3507],{},"hi",",\nwaartussen het element moet zitten als het er is. Elke stap:",[3062,3510,3511,3518,3528,3542],{},[58,3512,3513,3514,3517],{},"Bereken ",[61,3515,3516],{},"mid = ⌊(lo + hi) \u002F 2⌋"," (naar beneden afronden).",[58,3519,3520,3521,3524,3525,3527],{},"Is ",[61,3522,3523],{},"a[mid]"," gelijk aan ",[61,3526,67],{},"? Gevonden.",[58,3529,3520,3530,3533,3534,3536,3537,3145,3539,452],{},[61,3531,3532],{},"a[mid] \u003C x","? Dan zit ",[61,3535,67],{}," rechts van ",[61,3538,3238],{},[61,3540,3541],{},"lo = mid + 1",[58,3543,3544,3545,3547,3548,3145,3550,452],{},"Anders zit ",[61,3546,67],{}," links van ",[61,3549,3238],{},[61,3551,3552],{},"hi = mid - 1",[10,3554,3555,3556,3148,3559,3562,3563,3566,3567,3569],{},"Je begint met ",[61,3557,3558],{},"lo = 0",[61,3560,3561],{},"hi = n - 1",", en je stopt als ",[61,3564,3565],{},"lo > hi",": dan is het zoekgebied leeg en\nstaat ",[61,3568,67],{}," niet in de array.",[38,3571,3573],{"id":3572},"uitgewerkt-voorbeeld-gevonden","Uitgewerkt voorbeeld: gevonden",[10,3575,3576,3577,3580],{},"We zoeken ",[61,3578,3579],{},"x = 30"," in deze array van tien elementen:",[99,3582,3583,3611],{},[102,3584,3585],{},[105,3586,3587,3590,3593,3595,3597,3599,3601,3603,3605,3607,3609],{},[108,3588,3589],{},"index",[108,3591,3592],{},"0",[108,3594,128],{},[108,3596,146],{},[108,3598,163],{},[108,3600,141],{},[108,3602,194],{},[108,3604,211],{},[108,3606,227],{},[108,3608,242],{},[108,3610,218],{},[121,3612,3613],{},[105,3614,3615,3617,3619,3621,3624,3627,3630,3633,3636,3639,3642],{},[126,3616,1184],{},[126,3618,163],{},[126,3620,242],{},[126,3622,3623],{},"12",[126,3625,3626],{},"17",[126,3628,3629],{},"21",[126,3631,3632],{},"25",[126,3634,3635],{},"30",[126,3637,3638],{},"34",[126,3640,3641],{},"41",[126,3643,3644],{},"50",[99,3646,3647,3668],{},[102,3648,3649],{},[105,3650,3651,3653,3655,3657,3659,3663,3666],{},[108,3652,110],{},[108,3654,3504],{},[108,3656,3507],{},[108,3658,3238],{},[108,3660,1184,3661],{},[492,3662,3238],{},[108,3664,3665],{},"Vergelijking",[108,3667,2122],{},[121,3669,3670,3690,3710,3730],{},[105,3671,3672,3674,3676,3678,3680,3682,3685],{},[126,3673,128],{},[126,3675,3592],{},[126,3677,218],{},[126,3679,141],{},[126,3681,3629],{},[126,3683,3684],{},"21 \u003C 30",[126,3686,3687],{},[61,3688,3689],{},"lo = 5",[105,3691,3692,3694,3696,3698,3700,3702,3705],{},[126,3693,146],{},[126,3695,194],{},[126,3697,218],{},[126,3699,227],{},[126,3701,3638],{},[126,3703,3704],{},"34 > 30",[126,3706,3707],{},[61,3708,3709],{},"hi = 6",[105,3711,3712,3714,3716,3718,3720,3722,3725],{},[126,3713,163],{},[126,3715,194],{},[126,3717,211],{},[126,3719,194],{},[126,3721,3632],{},[126,3723,3724],{},"25 \u003C 30",[126,3726,3727],{},[61,3728,3729],{},"lo = 6",[105,3731,3732,3734,3736,3738,3740,3742,3745],{},[126,3733,141],{},[126,3735,211],{},[126,3737,211],{},[126,3739,211],{},[126,3741,3635],{},[126,3743,3744],{},"gelijk",[126,3746,3747],{},"gevonden op index 6",[10,3749,3750,3751,3754,3755,3758,3759,452],{},"De waarden die achtereenvolgens worden vergeleken zijn ",[61,3752,3753],{},"21, 34, 25, 30",". Let op stap 3: ",[61,3756,3757],{},"(5 + 6) \u002F 2 = 5,5",", afgerond naar beneden geeft ",[61,3760,3761],{},"mid = 5",[38,3763,3765],{"id":3764},"uitgewerkt-voorbeeld-niet-gevonden","Uitgewerkt voorbeeld: niet gevonden",[10,3767,3768,3769,3772],{},"Nu zoeken we ",[61,3770,3771],{},"x = 10"," in dezelfde array:",[99,3774,3775,3795],{},[102,3776,3777],{},[105,3778,3779,3781,3783,3785,3787,3791,3793],{},[108,3780,110],{},[108,3782,3504],{},[108,3784,3507],{},[108,3786,3238],{},[108,3788,1184,3789],{},[492,3790,3238],{},[108,3792,3665],{},[108,3794,2122],{},[121,3796,3797,3817,3837,3857],{},[105,3798,3799,3801,3803,3805,3807,3809,3812],{},[126,3800,128],{},[126,3802,3592],{},[126,3804,218],{},[126,3806,141],{},[126,3808,3629],{},[126,3810,3811],{},"21 > 10",[126,3813,3814],{},[61,3815,3816],{},"hi = 3",[105,3818,3819,3821,3823,3825,3827,3829,3832],{},[126,3820,146],{},[126,3822,3592],{},[126,3824,163],{},[126,3826,128],{},[126,3828,242],{},[126,3830,3831],{},"8 \u003C 10",[126,3833,3834],{},[61,3835,3836],{},"lo = 2",[105,3838,3839,3841,3843,3845,3847,3849,3852],{},[126,3840,163],{},[126,3842,146],{},[126,3844,163],{},[126,3846,146],{},[126,3848,3623],{},[126,3850,3851],{},"12 > 10",[126,3853,3854],{},[61,3855,3856],{},"hi = 1",[105,3858,3859,3861,3863,3865,3867,3869,3873],{},[126,3860,136],{},[126,3862,146],{},[126,3864,128],{},[126,3866,136],{},[126,3868,136],{},[126,3870,3871],{},[61,3872,3565],{},[126,3874,3875],{},"stop: niet gevonden",[10,3877,3878,3879,3148,3881,3883,3884,3887,3888,3891,3892,3894,3895,3897],{},"Vergeleken waarden: ",[61,3880,242],{},[61,3882,3623],{}," liggen naast elkaar en ",[61,3885,3886],{},"10"," zit ertussen. Na drie vergelijkingen\n(",[61,3889,3890],{},"21, 8, 12",") is het zoekgebied leeg. De eindwaarde van ",[61,3893,3504],{}," (hier 2) is precies de plek waar je ",[61,3896,3886],{},"\nzou moeten invoegen om de array gesorteerd te houden; dat is handig om te onthouden.",[38,3899,3901],{"id":3900},"de-code","De code",[477,3903,3904,4097],{},[480,3905,3906],{"v-slot:python":482},[484,3907,3909],{"className":486,"code":3908,"language":488,"meta":482,"style":482},"def binair_zoeken(a, x):\n    lo, hi = 0, len(a) - 1\n    while lo \u003C= hi:  # zolang het zoekgebied niet leeg is\n        mid = (lo + hi) \u002F\u002F 2  # naar beneden afronden\n        if a[mid] == x:\n            return mid\n        elif a[mid] \u003C x:\n            lo = mid + 1  # x zit rechts van mid\n        else:\n            hi = mid - 1  # x zit links van mid\n    return -1  # niet gevonden\n",[61,3910,3911,3928,3957,3975,4003,4021,4028,4047,4064,4070,4087],{"__ignoreMap":482},[492,3912,3913,3915,3918,3920,3922,3924,3926],{"class":494,"line":495},[492,3914,2276],{"class":498},[492,3916,3917],{"class":516}," binair_zoeken",[492,3919,520],{"class":506},[492,3921,1184],{"class":571},[492,3923,568],{"class":506},[492,3925,572],{"class":571},[492,3927,527],{"class":506},[492,3929,3930,3933,3935,3938,3940,3942,3944,3946,3948,3950,3952,3954],{"class":494,"line":510},[492,3931,3932],{"class":533},"    lo",[492,3934,568],{"class":506},[492,3936,3937],{"class":533}," hi ",[492,3939,830],{"class":506},[492,3941,3396],{"class":716},[492,3943,568],{"class":506},[492,3945,746],{"class":516},[492,3947,520],{"class":506},[492,3949,1184],{"class":516},[492,3951,595],{"class":506},[492,3953,971],{"class":506},[492,3955,3956],{"class":716}," 1\n",[492,3958,3959,3962,3965,3967,3970,3972],{"class":494,"line":530},[492,3960,3961],{"class":624},"    while",[492,3963,3964],{"class":533}," lo ",[492,3966,3235],{"class":506},[492,3968,3969],{"class":533}," hi",[492,3971,2304],{"class":506},[492,3973,3974],{"class":598},"  # zolang het zoekgebied niet leeg is\n",[492,3976,3977,3980,3982,3984,3987,3990,3992,3994,3997,4000],{"class":494,"line":549},[492,3978,3979],{"class":533},"        mid ",[492,3981,830],{"class":506},[492,3983,17],{"class":506},[492,3985,3986],{"class":533},"lo ",[492,3988,3989],{"class":506},"+",[492,3991,3969],{"class":533},[492,3993,595],{"class":506},[492,3995,3996],{"class":506}," \u002F\u002F",[492,3998,3999],{"class":716}," 2",[492,4001,4002],{"class":598},"  # naar beneden afronden\n",[492,4004,4005,4007,4009,4011,4013,4015,4017,4019],{"class":494,"line":556},[492,4006,625],{"class":624},[492,4008,3311],{"class":533},[492,4010,2146],{"class":506},[492,4012,3238],{"class":533},[492,4014,2215],{"class":506},[492,4016,759],{"class":506},[492,4018,572],{"class":533},[492,4020,507],{"class":506},[492,4022,4023,4025],{"class":494,"line":577},[492,4024,3328],{"class":624},[492,4026,4027],{"class":533}," mid\n",[492,4029,4030,4032,4034,4036,4038,4040,4043,4045],{"class":494,"line":602},[492,4031,2411],{"class":624},[492,4033,3311],{"class":533},[492,4035,2146],{"class":506},[492,4037,3238],{"class":533},[492,4039,2215],{"class":506},[492,4041,4042],{"class":506}," \u003C",[492,4044,572],{"class":533},[492,4046,507],{"class":506},[492,4048,4049,4052,4054,4057,4059,4061],{"class":494,"line":607},[492,4050,4051],{"class":533},"            lo ",[492,4053,830],{"class":506},[492,4055,4056],{"class":533}," mid ",[492,4058,3989],{"class":506},[492,4060,974],{"class":716},[492,4062,4063],{"class":598},"  # x zit rechts van mid\n",[492,4065,4066,4068],{"class":494,"line":621},[492,4067,1523],{"class":624},[492,4069,507],{"class":506},[492,4071,4072,4075,4077,4079,4082,4084],{"class":494,"line":640},[492,4073,4074],{"class":533},"            hi ",[492,4076,830],{"class":506},[492,4078,4056],{"class":533},[492,4080,4081],{"class":506},"-",[492,4083,974],{"class":716},[492,4085,4086],{"class":598},"  # x zit links van mid\n",[492,4088,4089,4091,4093,4095],{"class":494,"line":663},[492,4090,2472],{"class":624},[492,4092,971],{"class":506},[492,4094,128],{"class":716},[492,4096,3345],{"class":598},[480,4098,4099],{"v-slot:java":482},[484,4100,4102],{"className":767,"code":4101,"language":769,"meta":482,"style":482},"static int binairZoeken(int[] a, int x) {\n    int lo = 0, hi = a.length - 1;\n    while (lo \u003C= hi) { \u002F\u002F zolang het zoekgebied niet leeg is\n        int mid = lo + (hi - lo) \u002F 2; \u002F\u002F gelijk aan ⌊(lo+hi)\u002F2⌋, maar zonder overflow\n        if (a[mid] == x) {\n            return mid;\n        } else if (a[mid] \u003C x) {\n            lo = mid + 1; \u002F\u002F x zit rechts van mid\n        } else {\n            hi = mid - 1; \u002F\u002F x zit links van mid\n        }\n    }\n    return -1; \u002F\u002F niet gevonden\n}\n",[61,4103,4104,4131,4160,4179,4213,4235,4244,4270,4287,4295,4312,4316,4320,4332],{"__ignoreMap":482},[492,4105,4106,4108,4110,4113,4115,4117,4119,4121,4123,4125,4127,4129],{"class":494,"line":495},[492,4107,2492],{"class":498},[492,4109,3359],{"class":498},[492,4111,4112],{"class":516}," binairZoeken",[492,4114,520],{"class":506},[492,4116,854],{"class":498},[492,4118,3369],{"class":506},[492,4120,3311],{"class":533},[492,4122,568],{"class":506},[492,4124,3359],{"class":498},[492,4126,572],{"class":533},[492,4128,595],{"class":506},[492,4130,804],{"class":506},[492,4132,4133,4135,4137,4139,4141,4143,4145,4147,4149,4151,4154,4156,4158],{"class":494,"line":510},[492,4134,894],{"class":498},[492,4136,3964],{"class":533},[492,4138,830],{"class":506},[492,4140,3396],{"class":716},[492,4142,568],{"class":506},[492,4144,3937],{"class":533},[492,4146,830],{"class":506},[492,4148,3311],{"class":533},[492,4150,452],{"class":506},[492,4152,4153],{"class":533},"length ",[492,4155,4081],{"class":506},[492,4157,974],{"class":716},[492,4159,791],{"class":506},[492,4161,4162,4164,4166,4168,4170,4172,4174,4176],{"class":494,"line":530},[492,4163,3961],{"class":624},[492,4165,17],{"class":506},[492,4167,3986],{"class":533},[492,4169,3235],{"class":506},[492,4171,3969],{"class":533},[492,4173,595],{"class":506},[492,4175,1858],{"class":506},[492,4177,4178],{"class":598}," \u002F\u002F zolang het zoekgebied niet leeg is\n",[492,4180,4181,4183,4185,4187,4189,4191,4193,4196,4198,4201,4203,4206,4208,4210],{"class":494,"line":549},[492,4182,1715],{"class":498},[492,4184,4056],{"class":533},[492,4186,830],{"class":506},[492,4188,3964],{"class":533},[492,4190,3989],{"class":506},[492,4192,17],{"class":506},[492,4194,4195],{"class":533},"hi ",[492,4197,4081],{"class":506},[492,4199,4200],{"class":533}," lo",[492,4202,595],{"class":506},[492,4204,4205],{"class":506}," \u002F",[492,4207,3999],{"class":716},[492,4209,1784],{"class":506},[492,4211,4212],{"class":598}," \u002F\u002F gelijk aan ⌊(lo+hi)\u002F2⌋, maar zonder overflow\n",[492,4214,4215,4217,4219,4221,4223,4225,4227,4229,4231,4233],{"class":494,"line":556},[492,4216,625],{"class":624},[492,4218,17],{"class":506},[492,4220,1184],{"class":533},[492,4222,2146],{"class":506},[492,4224,3238],{"class":533},[492,4226,2215],{"class":506},[492,4228,759],{"class":506},[492,4230,572],{"class":533},[492,4232,595],{"class":506},[492,4234,804],{"class":506},[492,4236,4237,4239,4242],{"class":494,"line":577},[492,4238,3328],{"class":624},[492,4240,4241],{"class":533}," mid",[492,4243,791],{"class":506},[492,4245,4246,4248,4250,4252,4254,4256,4258,4260,4262,4264,4266,4268],{"class":494,"line":602},[492,4247,1883],{"class":506},[492,4249,1886],{"class":624},[492,4251,2645],{"class":624},[492,4253,17],{"class":506},[492,4255,1184],{"class":533},[492,4257,2146],{"class":506},[492,4259,3238],{"class":533},[492,4261,2215],{"class":506},[492,4263,4042],{"class":506},[492,4265,572],{"class":533},[492,4267,595],{"class":506},[492,4269,804],{"class":506},[492,4271,4272,4274,4276,4278,4280,4282,4284],{"class":494,"line":607},[492,4273,4051],{"class":533},[492,4275,830],{"class":506},[492,4277,4056],{"class":533},[492,4279,3989],{"class":506},[492,4281,974],{"class":716},[492,4283,1784],{"class":506},[492,4285,4286],{"class":598}," \u002F\u002F x zit rechts van mid\n",[492,4288,4289,4291,4293],{"class":494,"line":621},[492,4290,1883],{"class":506},[492,4292,1886],{"class":624},[492,4294,804],{"class":506},[492,4296,4297,4299,4301,4303,4305,4307,4309],{"class":494,"line":640},[492,4298,4074],{"class":533},[492,4300,830],{"class":506},[492,4302,4056],{"class":533},[492,4304,4081],{"class":506},[492,4306,974],{"class":716},[492,4308,1784],{"class":506},[492,4310,4311],{"class":598}," \u002F\u002F x zit links van mid\n",[492,4313,4314],{"class":494,"line":663},[492,4315,945],{"class":506},[492,4317,4318],{"class":494,"line":683},[492,4319,885],{"class":506},[492,4321,4322,4324,4326,4328,4330],{"class":494,"line":688},[492,4323,2472],{"class":624},[492,4325,971],{"class":506},[492,4327,128],{"class":716},[492,4329,1784],{"class":506},[492,4331,3473],{"class":598},[492,4333,4334],{"class":494,"line":702},[492,4335,1070],{"class":506},[10,4337,4338,4339,4342,4343,4346,4347,4349,4350,4352,4353,4355,4356,4359,4360,4362],{},"In Java schrijven we ",[61,4340,4341],{},"lo + (hi - lo) \u002F 2"," in plaats van ",[61,4344,4345],{},"(lo + hi) \u002F 2",". Voor niet-negatieve ",[61,4348,3504],{},"\nen ",[61,4351,3507],{}," levert dat dezelfde ",[61,4354,3238],{}," op, maar het voorkomt dat ",[61,4357,4358],{},"lo + hi"," groter wordt dan de maximale\n",[61,4361,854],{}," bij hele grote arrays. In Python bestaat dat probleem niet.",[38,4364,4366],{"id":4365},"off-by-one-valkuilen","Off-by-one-valkuilen",[10,4368,4369],{},"Binair zoeken is berucht om fouten van één positie. De drie keuzes in onze variant horen bij elkaar:",[99,4371,4372,4381],{},[102,4373,4374],{},[105,4375,4376,4379],{},[108,4377,4378],{},"Keuze",[108,4380,2842],{},[121,4382,4383,4394,4408],{},[105,4384,4385,4389],{},[126,4386,4387],{},[61,4388,3561],{},[126,4390,4391,4393],{},[61,4392,3507],{}," is de laatste index die nog kandidaat is (inclusief)",[105,4395,4396,4401],{},[126,4397,4398],{},[61,4399,4400],{},"while lo \u003C= hi",[126,4402,4403,4404,4407],{},"als ",[61,4405,4406],{},"lo == hi"," is er nog precies één kandidaat die je moet bekijken",[105,4409,4410,4416],{},[126,4411,4412,1304,4414],{},[61,4413,3541],{},[61,4415,3552],{},[126,4417,4418,4420],{},[61,4419,3523],{}," is al bekeken, die hoeft niet meer in het zoekgebied",[10,4422,4423],{},"Wat gaat er mis als je een van de drie verandert?",[55,4425,4426,4445,4473],{},[58,4427,4428,4433,4434,4437,4438,4441,4442,4444],{},[14,4429,4430],{},[61,4431,4432],{},"while lo \u003C hi",": in het eerste voorbeeld stop je na stap 3 met ",[61,4435,4436],{},"lo = hi = 6",", zonder ",[61,4439,4440],{},"a[6]","\nte bekijken. Je meldt \"niet gevonden\" terwijl ",[61,4443,3635],{}," er wel staat.",[58,4446,4447,4455,4456,4459,4460,4462,4463,4466,4467,4469,4470,452],{},[14,4448,4449,4342,4452],{},[61,4450,4451],{},"lo = mid",[61,4453,4454],{},"mid + 1",": met ",[61,4457,4458],{},"lo = 5, hi = 6"," krijg je ",[61,4461,3761],{},", en als\n",[61,4464,4465],{},"a[5] \u003C x"," blijft ",[61,4468,3504],{}," op 5 staan. Het zoekgebied krimpt niet: een ",[14,4471,4472],{},"oneindige lus",[58,4474,4475,1247,4480,4482,4483,4485,4486,4489],{},[14,4476,4477],{},[61,4478,4479],{},"hi = n",[61,4481,3235],{},": dan kan ",[61,4484,3238],{}," gelijk worden aan ",[61,4487,4488],{},"n"," en lees je buiten de array.",[10,4491,4492,4493,4495,4496,4498],{},"Er bestaan ook correcte varianten met ",[61,4494,4479],{}," (exclusief) en ",[61,4497,4432],{},". Die werken prima, maar\nmeng de twee stijlen nooit. Op Practicely gebruiken we altijd de variant hierboven.",[38,4500,4502],{"id":4501},"variant-het-eerste-voorkomen","Variant: het eerste voorkomen",[10,4504,4505,4506,4508,4509,4512,4513,4515,4516,4518],{},"Staat ",[61,4507,67],{}," meerdere keren in de array, dan geeft gewoon binair zoeken een willekeurige van de\nvoorkomens terug. In ",[61,4510,4511],{},"[1, 3, 3, 3, 3, 7, 9]"," vindt het ",[61,4514,163],{}," al bij de eerste stap, op index 3. Wil je\nhet ",[14,4517,1080],{}," voorkomen, dan ga je na een treffer verder zoeken in de linkerhelft en onthoud je de\nbeste index tot nu toe:",[99,4520,4521,4542],{},[102,4522,4523],{},[105,4524,4525,4527,4529,4531,4533,4537,4539],{},[108,4526,110],{},[108,4528,3504],{},[108,4530,3507],{},[108,4532,3238],{},[108,4534,1184,4535],{},[492,4536,3238],{},[108,4538,2122],{},[108,4540,4541],{},"Beste tot nu toe",[121,4543,4544,4564,4583],{},[105,4545,4546,4548,4550,4552,4554,4556,4562],{},[126,4547,128],{},[126,4549,3592],{},[126,4551,211],{},[126,4553,163],{},[126,4555,163],{},[126,4557,4558,4559],{},"gelijk, zoek links: ",[61,4560,4561],{},"hi = 2",[126,4563,163],{},[105,4565,4566,4568,4570,4572,4574,4576,4581],{},[126,4567,146],{},[126,4569,3592],{},[126,4571,146],{},[126,4573,128],{},[126,4575,163],{},[126,4577,4558,4578],{},[61,4579,4580],{},"hi = 0",[126,4582,128],{},[105,4584,4585,4587,4589,4591,4593,4595,4601],{},[126,4586,163],{},[126,4588,3592],{},[126,4590,3592],{},[126,4592,3592],{},[126,4594,128],{},[126,4596,4597,4598],{},"1 \u003C 3: ",[61,4599,4600],{},"lo = 1",[126,4602,128],{},[10,4604,4605,4606,4608],{},"Daarna is ",[61,4607,3565],{}," en is het antwoord index 1.",[477,4610,4611,4804],{},[480,4612,4613],{"v-slot:python":482},[484,4614,4616],{"className":486,"code":4615,"language":488,"meta":482,"style":482},"def eerste_voorkomen(a, x):\n    lo, hi = 0, len(a) - 1\n    antwoord = -1\n    while lo \u003C= hi:\n        mid = (lo + hi) \u002F\u002F 2\n        if a[mid] == x:\n            antwoord = mid  # onthouden en links verder zoeken\n            hi = mid - 1\n        elif a[mid] \u003C x:\n            lo = mid + 1\n        else:\n            hi = mid - 1\n    return antwoord\n",[61,4617,4618,4635,4661,4673,4685,4706,4724,4737,4749,4767,4779,4785,4797],{"__ignoreMap":482},[492,4619,4620,4622,4625,4627,4629,4631,4633],{"class":494,"line":495},[492,4621,2276],{"class":498},[492,4623,4624],{"class":516}," eerste_voorkomen",[492,4626,520],{"class":506},[492,4628,1184],{"class":571},[492,4630,568],{"class":506},[492,4632,572],{"class":571},[492,4634,527],{"class":506},[492,4636,4637,4639,4641,4643,4645,4647,4649,4651,4653,4655,4657,4659],{"class":494,"line":510},[492,4638,3932],{"class":533},[492,4640,568],{"class":506},[492,4642,3937],{"class":533},[492,4644,830],{"class":506},[492,4646,3396],{"class":716},[492,4648,568],{"class":506},[492,4650,746],{"class":516},[492,4652,520],{"class":506},[492,4654,1184],{"class":516},[492,4656,595],{"class":506},[492,4658,971],{"class":506},[492,4660,3956],{"class":716},[492,4662,4663,4666,4668,4670],{"class":494,"line":530},[492,4664,4665],{"class":533},"    antwoord ",[492,4667,830],{"class":506},[492,4669,971],{"class":506},[492,4671,4672],{"class":716},"1\n",[492,4674,4675,4677,4679,4681,4683],{"class":494,"line":549},[492,4676,3961],{"class":624},[492,4678,3964],{"class":533},[492,4680,3235],{"class":506},[492,4682,3969],{"class":533},[492,4684,507],{"class":506},[492,4686,4687,4689,4691,4693,4695,4697,4699,4701,4703],{"class":494,"line":556},[492,4688,3979],{"class":533},[492,4690,830],{"class":506},[492,4692,17],{"class":506},[492,4694,3986],{"class":533},[492,4696,3989],{"class":506},[492,4698,3969],{"class":533},[492,4700,595],{"class":506},[492,4702,3996],{"class":506},[492,4704,4705],{"class":716}," 2\n",[492,4707,4708,4710,4712,4714,4716,4718,4720,4722],{"class":494,"line":577},[492,4709,625],{"class":624},[492,4711,3311],{"class":533},[492,4713,2146],{"class":506},[492,4715,3238],{"class":533},[492,4717,2215],{"class":506},[492,4719,759],{"class":506},[492,4721,572],{"class":533},[492,4723,507],{"class":506},[492,4725,4726,4729,4731,4734],{"class":494,"line":602},[492,4727,4728],{"class":533},"            antwoord ",[492,4730,830],{"class":506},[492,4732,4733],{"class":533}," mid  ",[492,4735,4736],{"class":598},"# onthouden en links verder zoeken\n",[492,4738,4739,4741,4743,4745,4747],{"class":494,"line":607},[492,4740,4074],{"class":533},[492,4742,830],{"class":506},[492,4744,4056],{"class":533},[492,4746,4081],{"class":506},[492,4748,3956],{"class":716},[492,4750,4751,4753,4755,4757,4759,4761,4763,4765],{"class":494,"line":621},[492,4752,2411],{"class":624},[492,4754,3311],{"class":533},[492,4756,2146],{"class":506},[492,4758,3238],{"class":533},[492,4760,2215],{"class":506},[492,4762,4042],{"class":506},[492,4764,572],{"class":533},[492,4766,507],{"class":506},[492,4768,4769,4771,4773,4775,4777],{"class":494,"line":640},[492,4770,4051],{"class":533},[492,4772,830],{"class":506},[492,4774,4056],{"class":533},[492,4776,3989],{"class":506},[492,4778,3956],{"class":716},[492,4780,4781,4783],{"class":494,"line":663},[492,4782,1523],{"class":624},[492,4784,507],{"class":506},[492,4786,4787,4789,4791,4793,4795],{"class":494,"line":683},[492,4788,4074],{"class":533},[492,4790,830],{"class":506},[492,4792,4056],{"class":533},[492,4794,4081],{"class":506},[492,4796,3956],{"class":716},[492,4798,4799,4801],{"class":494,"line":688},[492,4800,2472],{"class":624},[492,4802,4803],{"class":533}," antwoord\n",[480,4805,4806],{"v-slot:java":482},[484,4807,4809],{"className":767,"code":4808,"language":769,"meta":482,"style":482},"static int eersteVoorkomen(int[] a, int x) {\n    int lo = 0, hi = a.length - 1;\n    int antwoord = -1;\n    while (lo \u003C= hi) {\n        int mid = lo + (hi - lo) \u002F 2;\n        if (a[mid] == x) {\n            antwoord = mid; \u002F\u002F onthouden en links verder zoeken\n            hi = mid - 1;\n        } else if (a[mid] \u003C x) {\n            lo = mid + 1;\n        } else {\n            hi = mid - 1;\n        }\n    }\n    return antwoord;\n}\n",[61,4810,4811,4838,4866,4881,4897,4925,4947,4960,4974,5000,5014,5022,5036,5040,5044,5053],{"__ignoreMap":482},[492,4812,4813,4815,4817,4820,4822,4824,4826,4828,4830,4832,4834,4836],{"class":494,"line":495},[492,4814,2492],{"class":498},[492,4816,3359],{"class":498},[492,4818,4819],{"class":516}," eersteVoorkomen",[492,4821,520],{"class":506},[492,4823,854],{"class":498},[492,4825,3369],{"class":506},[492,4827,3311],{"class":533},[492,4829,568],{"class":506},[492,4831,3359],{"class":498},[492,4833,572],{"class":533},[492,4835,595],{"class":506},[492,4837,804],{"class":506},[492,4839,4840,4842,4844,4846,4848,4850,4852,4854,4856,4858,4860,4862,4864],{"class":494,"line":510},[492,4841,894],{"class":498},[492,4843,3964],{"class":533},[492,4845,830],{"class":506},[492,4847,3396],{"class":716},[492,4849,568],{"class":506},[492,4851,3937],{"class":533},[492,4853,830],{"class":506},[492,4855,3311],{"class":533},[492,4857,452],{"class":506},[492,4859,4153],{"class":533},[492,4861,4081],{"class":506},[492,4863,974],{"class":716},[492,4865,791],{"class":506},[492,4867,4868,4870,4873,4875,4877,4879],{"class":494,"line":530},[492,4869,894],{"class":498},[492,4871,4872],{"class":533}," antwoord ",[492,4874,830],{"class":506},[492,4876,971],{"class":506},[492,4878,128],{"class":716},[492,4880,791],{"class":506},[492,4882,4883,4885,4887,4889,4891,4893,4895],{"class":494,"line":549},[492,4884,3961],{"class":624},[492,4886,17],{"class":506},[492,4888,3986],{"class":533},[492,4890,3235],{"class":506},[492,4892,3969],{"class":533},[492,4894,595],{"class":506},[492,4896,804],{"class":506},[492,4898,4899,4901,4903,4905,4907,4909,4911,4913,4915,4917,4919,4921,4923],{"class":494,"line":556},[492,4900,1715],{"class":498},[492,4902,4056],{"class":533},[492,4904,830],{"class":506},[492,4906,3964],{"class":533},[492,4908,3989],{"class":506},[492,4910,17],{"class":506},[492,4912,4195],{"class":533},[492,4914,4081],{"class":506},[492,4916,4200],{"class":533},[492,4918,595],{"class":506},[492,4920,4205],{"class":506},[492,4922,3999],{"class":716},[492,4924,791],{"class":506},[492,4926,4927,4929,4931,4933,4935,4937,4939,4941,4943,4945],{"class":494,"line":577},[492,4928,625],{"class":624},[492,4930,17],{"class":506},[492,4932,1184],{"class":533},[492,4934,2146],{"class":506},[492,4936,3238],{"class":533},[492,4938,2215],{"class":506},[492,4940,759],{"class":506},[492,4942,572],{"class":533},[492,4944,595],{"class":506},[492,4946,804],{"class":506},[492,4948,4949,4951,4953,4955,4957],{"class":494,"line":602},[492,4950,4728],{"class":533},[492,4952,830],{"class":506},[492,4954,4241],{"class":533},[492,4956,1784],{"class":506},[492,4958,4959],{"class":598}," \u002F\u002F onthouden en links verder zoeken\n",[492,4961,4962,4964,4966,4968,4970,4972],{"class":494,"line":607},[492,4963,4074],{"class":533},[492,4965,830],{"class":506},[492,4967,4056],{"class":533},[492,4969,4081],{"class":506},[492,4971,974],{"class":716},[492,4973,791],{"class":506},[492,4975,4976,4978,4980,4982,4984,4986,4988,4990,4992,4994,4996,4998],{"class":494,"line":621},[492,4977,1883],{"class":506},[492,4979,1886],{"class":624},[492,4981,2645],{"class":624},[492,4983,17],{"class":506},[492,4985,1184],{"class":533},[492,4987,2146],{"class":506},[492,4989,3238],{"class":533},[492,4991,2215],{"class":506},[492,4993,4042],{"class":506},[492,4995,572],{"class":533},[492,4997,595],{"class":506},[492,4999,804],{"class":506},[492,5001,5002,5004,5006,5008,5010,5012],{"class":494,"line":640},[492,5003,4051],{"class":533},[492,5005,830],{"class":506},[492,5007,4056],{"class":533},[492,5009,3989],{"class":506},[492,5011,974],{"class":716},[492,5013,791],{"class":506},[492,5015,5016,5018,5020],{"class":494,"line":663},[492,5017,1883],{"class":506},[492,5019,1886],{"class":624},[492,5021,804],{"class":506},[492,5023,5024,5026,5028,5030,5032,5034],{"class":494,"line":683},[492,5025,4074],{"class":533},[492,5027,830],{"class":506},[492,5029,4056],{"class":533},[492,5031,4081],{"class":506},[492,5033,974],{"class":716},[492,5035,791],{"class":506},[492,5037,5038],{"class":494,"line":688},[492,5039,945],{"class":506},[492,5041,5042],{"class":494,"line":702},[492,5043,885],{"class":506},[492,5045,5046,5048,5051],{"class":494,"line":722},[492,5047,2472],{"class":624},[492,5049,5050],{"class":533}," antwoord",[492,5052,791],{"class":506},[492,5054,5055],{"class":494,"line":727},[492,5056,1070],{"class":506},[10,5058,5059,5060,5063,5064,5066,5067,5070],{},"Het ",[14,5061,5062],{},"laatste"," voorkomen werkt spiegelbeeldig: na een treffer ",[61,5065,3541],{},". Met eerste en laatste\nvoorkomen samen tel je in ",[61,5068,5069],{},"O(log n)"," hoe vaak een waarde voorkomt.",[38,5072,2922],{"id":2921},[10,5074,5075,5076,5079,5080,5083,5084,5087,5088,5091,5092,5095,5096,452],{},"Elke stap halveert het zoekgebied. Na ",[61,5077,5078],{},"k"," stappen zijn er hooguit ",[61,5081,5082],{},"n \u002F 2ᵏ"," kandidaten over, dus na\nongeveer ",[61,5085,5086],{},"log₂ n"," stappen is er nog één. Als recurrente betrekking: ",[61,5089,5090],{},"T(n) = T(n\u002F2) + 1",", en volgens\nde mastermethode (zie ",[1184,5093,2921],{"href":5094},"\u002Fpracticely\u002Fdsa\u002Fcomplexiteit",") is dat ",[61,5097,5069],{},[99,5099,5100,5110],{},[102,5101,5102],{},[105,5103,5104,5106,5108],{},[108,5105],{},[108,5107,3246],{},[108,5109,3225],{},[121,5111,5112,5126,5141,5154,5167,5181],{},[105,5113,5114,5117,5120],{},[126,5115,5116],{},"Voorwaarde",[126,5118,5119],{},"geen",[126,5121,5122,5123,5125],{},"array ",[14,5124,3219],{},", directe toegang via index",[105,5127,5128,5131,5136],{},[126,5129,5130],{},"Best case",[126,5132,5133,5135],{},[61,5134,474],{}," (eerste element)",[126,5137,5138,5140],{},[61,5139,474],{}," (middelste element)",[105,5142,5143,5146,5150],{},[126,5144,5145],{},"Gemiddeld",[126,5147,5148],{},[61,5149,1088],{},[126,5151,5152],{},[61,5153,5069],{},[105,5155,5156,5159,5163],{},[126,5157,5158],{},"Slechtst",[126,5160,5161],{},[61,5162,1088],{},[126,5164,5165],{},[61,5166,5069],{},[105,5168,5169,5172,5176],{},[126,5170,5171],{},"Extra geheugen",[126,5173,5174],{},[61,5175,474],{},[126,5177,5178,5180],{},[61,5179,474],{}," (iteratief)",[105,5182,5183,5186,5189],{},[126,5184,5185],{},"Vergelijkingen bij n = 1.000.000",[126,5187,5188],{},"tot 1.000.000",[126,5190,5191],{},"hooguit 20",[10,5193,5194,5195,5198,5199,5203,5204,5208],{},"Moet je maar één keer zoeken in ongesorteerde data, dan is lineair zoeken sneller dan eerst sorteren\n(",[61,5196,5197],{},"O(n log n)",") en dan binair zoeken. Zoek je vaak in dezelfde data, dan verdient het sorteren zich\nsnel terug. Nog sneller opzoeken kan met een ",[1184,5200,5202],{"href":5201},"\u002Fpracticely\u002Fdsa\u002Fhashtabellen","hashtabel",", en voor data\ndie steeds verandert is een ",[1184,5205,5207],{"href":5206},"\u002Fpracticely\u002Fdsa\u002Fbinaire-zoekbomen","binaire zoekboom"," handig.",[38,5210,3060],{"id":3059},[3062,5212,5213,5219,5238,5246,5262],{},[58,5214,5215,5218],{},[14,5216,5217],{},"Binair zoeken op een ongesorteerde array."," Het algoritme geeft dan gewoon een fout antwoord,\nzonder foutmelding. Controleer altijd eerst de voorwaarde.",[58,5220,5221,278,5226,5229,5230,3076,5232,5234,5235,5237],{},[14,5222,5223,5225],{},[61,5224,3238],{}," naar boven afronden.",[61,5227,5228],{},"(5 + 6) \u002F 2"," wordt ",[61,5231,194],{},[61,5233,211],{},". Bij een traceervraag verschuift\néén verkeerde ",[61,5236,3238],{}," alle volgende stappen.",[58,5239,5240,5245],{},[14,5241,5242,5244],{},[61,5243,4432],{}," gebruiken"," bij de inclusieve variant, waardoor je het laatste kandidaat-element\nnooit bekijkt.",[58,5247,5248,4342,5256,3148,5258,5261],{},[14,5249,5250,3102,5252,5255],{},[61,5251,4451],{},[61,5253,5254],{},"hi = mid"," schrijven",[61,5257,4454],{},[61,5259,5260],{},"mid - 1",". Dat kan een oneindige\nlus opleveren.",[58,5263,5264,5267,5268,5270],{},[14,5265,5266],{},"Bij de traceervraag de laatste vergelijking vergeten."," Ook de vergelijking waarin ",[61,5269,67],{}," gevonden\nwordt, hoort in de lijst van vergeleken waarden.",[38,5272,3137],{"id":3136},[55,5274,5275,5283,5294,5305],{},[58,5276,5277,5278,5280,5281,452],{},"Lineair zoeken werkt altijd en kost ",[61,5279,1088],{},"; binair zoeken eist een gesorteerde array en kost ",[61,5282,5069],{},[58,5284,5285,5286,1304,5288,1304,5290,1304,5292,452],{},"Onze variant: ",[61,5287,3558],{},[61,5289,3561],{},[61,5291,3516],{},[61,5293,4400],{},[58,5295,5296,5297,5229,5299,5301,5302,5304],{},"Bij ",[61,5298,3532],{},[61,5300,3541],{},", anders ",[61,5303,3552],{},"; zo krimpt het zoekgebied altijd.",[58,5306,5307],{},"Voor het eerste voorkomen zoek je na een treffer links verder en onthoud je de index.",[3184,5309,5310],{},"html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":482,"searchDepth":510,"depth":510,"links":5312},[5313,5314,5315,5316,5317,5318,5319,5320,5321,5322],{"id":3245,"depth":510,"text":3246},{"id":3490,"depth":510,"text":3491},{"id":3572,"depth":510,"text":3573},{"id":3764,"depth":510,"text":3765},{"id":3900,"depth":510,"text":3901},{"id":4365,"depth":510,"text":4366},{"id":4501,"depth":510,"text":4502},{"id":2921,"depth":510,"text":2922},{"id":3059,"depth":510,"text":3060},{"id":3136,"depth":510,"text":3137},"Lineair en binair zoeken stap voor stap: een trace met lo, hi en mid, de off-by-one-valkuilen, het eerste voorkomen vinden en code in Python en Java.","i-lucide-search",{},"\u002Fpracticely-dsa\u002Fzoeken",{"title":3211,"description":5323},"practicely-dsa\u002Fzoeken","zoeken","MRqxQRbAp5DYPc2i8AX4gmsTB8-LXQ7_s9tWgGllG9Q",{"id":5332,"title":5333,"body":5334,"description":7771,"extension":3200,"icon":7772,"meta":7773,"navigation":552,"order":556,"path":7774,"seo":7775,"stem":7776,"topic":7777,"__hash__":7778},"practicelyDsa\u002Fpracticely-dsa\u002Fhashtabellen.md","Hashtabellen uitgelegd: hashfuncties, botsingen en linear probing",{"type":7,"value":5335,"toc":7757},[5336,5355,5358,5362,5369,5375,5407,5423,5427,5445,5450,5465,5519,5522,5580,5586,5590,5608,5616,5783,5786,5814,5818,5830,5876,5891,5901,5939,5948,5952,5959,5965,5978,5988,6009,6020,6082,6105,6109,6112,7486,7511,7515,7518,7549,7566,7584,7586,7664,7667,7669,7722,7724,7754],[10,5337,5338,5339,5342,5343,5346,5347,5350,5351,5354],{},"Een hashtabel (",[19,5340,5341],{},"hash table",") bewaart sleutels zo dat je ze in gemiddeld ",[14,5344,5345],{},"constante tijd"," terugvindt.\nGeen lijst doorlopen, geen binair zoeken: je rekent uit waar de sleutel moet staan en kijkt daar.\nElke ",[61,5348,5349],{},"dict"," in Python en elke ",[61,5352,5353],{},"HashMap"," in Java werkt zo.",[10,5356,5357],{},"Je moet dit kennen omdat het overal terugkomt. Op het tentamen vragen ze vrijwel altijd om een tabel\nmet de hand te vullen. In sollicitatiegesprekken is \"gebruik een hashmap\" het antwoord op de helft van\nde programmeervragen. En in de praktijk wil je begrijpen waarom een opzoeking ineens traag wordt.",[38,5359,5361],{"id":5360},"de-hashfunctie","De hashfunctie",[10,5363,5364,5365,5368],{},"Een hashfunctie (",[19,5366,5367],{},"hash function",") zet een sleutel om in een vakjesnummer. Op Practicely gebruiken we\nsteeds dezelfde, eenvoudige functie:",[484,5370,5373],{"className":5371,"code":5372,"language":1130},[1128],"h(k) = k mod m\n",[61,5374,5372],{"__ignoreMap":482},[10,5376,5377,5378,5381,5382,5385,5386,5389,5390,5393,5394,5389,5397,5400,5401,5403,5404,452],{},"Hierin is ",[61,5379,5380],{},"m"," de tabelgrootte, het aantal vakjes. Bij ",[61,5383,5384],{},"m = 7"," komt sleutel ",[61,5387,5388],{},"15"," in vakje ",[61,5391,5392],{},"15 mod 7 = 1","\nen sleutel ",[61,5395,5396],{},"27",[61,5398,5399],{},"27 mod 7 = 6",". De vakjes zijn genummerd van ",[61,5402,3592],{}," tot en met ",[61,5405,5406],{},"m - 1",[10,5408,5409,5410,5412,5413,5416,5417,5419,5420,5422],{},"Een goede hashfunctie verdeelt sleutels gelijkmatig over de tabel. Daarom kiest men voor ",[61,5411,5380],{}," vaak een\npriemgetal: met ",[61,5414,5415],{},"m = 10"," belanden alle sleutels die op een ",[61,5418,3592],{}," eindigen in hetzelfde vakje, met ",[61,5421,5384],{},"\ngebeurt dat veel minder snel.",[38,5424,5426],{"id":5425},"botsingen","Botsingen",[10,5428,5429,5430,5433,5434,3148,5436,5438,5439,5441,5442,5444],{},"Er zijn veel meer mogelijke sleutels dan vakjes, dus twee sleutels komen soms in hetzelfde vakje\nuit. Dat heet een botsing (",[19,5431,5432],{},"collision","). ",[61,5435,5388],{},[61,5437,242],{}," hebben bij ",[61,5440,5384],{}," allebei hashwaarde ",[61,5443,128],{},".\nBotsingen zijn niet te vermijden; de vraag is alleen hoe je ermee omgaat. Er zijn twee klassieke\noplossingen.",[5446,5447,5449],"h3",{"id":5448},"chaining","Chaining",[10,5451,5452,5453,5456,5457,5459,5460,1247,5463,452],{},"Bij chaining (",[19,5454,5455],{},"separate chaining",") is elk vakje een lijst. Een nieuwe sleutel komt ",[14,5458,281],{}," de\nlijst van zijn vakje. We voegen in deze volgorde in: ",[61,5461,5462],{},"15, 11, 27, 8, 20, 34",[61,5464,5384],{},[99,5466,5467,5479],{},[102,5468,5469],{},[105,5470,5471,5474],{},[108,5472,5473],{},"Sleutel",[108,5475,5476],{},[61,5477,5478],{},"h(k)",[121,5480,5481,5487,5494,5500,5506,5513],{},[105,5482,5483,5485],{},[126,5484,5388],{},[126,5486,128],{},[105,5488,5489,5492],{},[126,5490,5491],{},"11",[126,5493,141],{},[105,5495,5496,5498],{},[126,5497,5396],{},[126,5499,211],{},[105,5501,5502,5504],{},[126,5503,242],{},[126,5505,128],{},[105,5507,5508,5511],{},[126,5509,5510],{},"20",[126,5512,211],{},[105,5514,5515,5517],{},[126,5516,3638],{},[126,5518,211],{},[10,5520,5521],{},"Eindresultaat:",[99,5523,5524,5534],{},[102,5525,5526],{},[105,5527,5528,5531],{},[108,5529,5530],{},"Vakje",[108,5532,5533],{},"Inhoud",[121,5535,5536,5542,5549,5555,5561,5567,5573],{},[105,5537,5538,5540],{},[126,5539,3592],{},[126,5541,4081],{},[105,5543,5544,5546],{},[126,5545,128],{},[126,5547,5548],{},"15 → 8",[105,5550,5551,5553],{},[126,5552,146],{},[126,5554,4081],{},[105,5556,5557,5559],{},[126,5558,163],{},[126,5560,4081],{},[105,5562,5563,5565],{},[126,5564,141],{},[126,5566,5491],{},[105,5568,5569,5571],{},[126,5570,194],{},[126,5572,4081],{},[105,5574,5575,5577],{},[126,5576,211],{},[126,5578,5579],{},"27 → 20 → 34",[10,5581,5582,5583,5585],{},"Zoeken naar ",[61,5584,3638],{}," betekent: naar vakje 6 gaan en die lijst doorlopen. Hoe korter de lijsten, hoe sneller.",[5446,5587,5589],{"id":5588},"linear-probing","Linear probing",[10,5591,5592,5593,5596,5597,17,5599,5602,5603,17,5605,33],{},"Bij open adressering (",[19,5594,5595],{},"open addressing",") staat elke sleutel direct in de tabel, zonder lijsten. De\neenvoudigste variant is linear probing: is het vakje bezet, probeer dan het ",[14,5598,1376],{},[61,5600,5601],{},"+1","). Ben je\nbij het laatste vakje, dan ga je verder bij ",[61,5604,3592],{},[19,5606,5607],{},"wrap-around",[10,5609,5610,5611,5613,5614,452],{},"Dezelfde sleutels, dezelfde volgorde, ",[61,5612,5384],{},". Een leeg vakje noteren we als ",[61,5615,4081],{},[99,5617,5618,5646],{},[102,5619,5620],{},[105,5621,5622,5625,5629,5632,5634,5636,5638,5640,5642,5644],{},[108,5623,5624],{},"Invoeging",[108,5626,5627],{},[61,5628,5478],{},[108,5630,5631],{},"Geprobeerde vakjes",[108,5633,3592],{},[108,5635,128],{},[108,5637,146],{},[108,5639,163],{},[108,5641,141],{},[108,5643,194],{},[108,5645,211],{},[121,5647,5648,5670,5692,5714,5737,5760],{},[105,5649,5650,5652,5654,5656,5658,5660,5662,5664,5666,5668],{},[126,5651,5388],{},[126,5653,128],{},[126,5655,128],{},[126,5657,4081],{},[126,5659,5388],{},[126,5661,4081],{},[126,5663,4081],{},[126,5665,4081],{},[126,5667,4081],{},[126,5669,4081],{},[105,5671,5672,5674,5676,5678,5680,5682,5684,5686,5688,5690],{},[126,5673,5491],{},[126,5675,141],{},[126,5677,141],{},[126,5679,4081],{},[126,5681,5388],{},[126,5683,4081],{},[126,5685,4081],{},[126,5687,5491],{},[126,5689,4081],{},[126,5691,4081],{},[105,5693,5694,5696,5698,5700,5702,5704,5706,5708,5710,5712],{},[126,5695,5396],{},[126,5697,211],{},[126,5699,211],{},[126,5701,4081],{},[126,5703,5388],{},[126,5705,4081],{},[126,5707,4081],{},[126,5709,5491],{},[126,5711,4081],{},[126,5713,5396],{},[105,5715,5716,5718,5720,5723,5725,5727,5729,5731,5733,5735],{},[126,5717,242],{},[126,5719,128],{},[126,5721,5722],{},"1, 2",[126,5724,4081],{},[126,5726,5388],{},[126,5728,242],{},[126,5730,4081],{},[126,5732,5491],{},[126,5734,4081],{},[126,5736,5396],{},[105,5738,5739,5741,5743,5746,5748,5750,5752,5754,5756,5758],{},[126,5740,5510],{},[126,5742,211],{},[126,5744,5745],{},"6, 0",[126,5747,5510],{},[126,5749,5388],{},[126,5751,242],{},[126,5753,4081],{},[126,5755,5491],{},[126,5757,4081],{},[126,5759,5396],{},[105,5761,5762,5764,5766,5769,5771,5773,5775,5777,5779,5781],{},[126,5763,3638],{},[126,5765,211],{},[126,5767,5768],{},"6, 0, 1, 2, 3",[126,5770,5510],{},[126,5772,5388],{},[126,5774,242],{},[126,5776,3638],{},[126,5778,5491],{},[126,5780,4081],{},[126,5782,5396],{},[10,5784,5785],{},"Let op drie dingen:",[55,5787,5788,5796,5801],{},[58,5789,5790,5792,5793,5795],{},[61,5791,242],{}," botst met ",[61,5794,5388],{}," in vakje 1 en schuift één plek op naar vakje 2.",[58,5797,5798,5800],{},[61,5799,5510],{}," hoort in vakje 6, dat is bezet, dus via wrap-around naar vakje 0.",[58,5802,5803,5805,5806,5809,5810,5813],{},[61,5804,3638],{}," hoort ook in vakje 6 en moet vijf vakjes proberen. Bezette vakjes vormen een aaneengesloten\nblok (",[19,5807,5808],{},"cluster","), en elke nieuwe sleutel die in dat blok valt, maakt het blok nog langer. Dat\nverschijnsel heet ",[19,5811,5812],{},"primary clustering"," en is het grote nadeel van linear probing.",[38,5815,5817],{"id":5816},"zoeken-en-verwijderen","Zoeken en verwijderen",[10,5819,5820,5823,5824,5826,5827,5829],{},[14,5821,5822],{},"Zoeken"," volgt exact dezelfde route als invoegen. Begin bij ",[61,5825,5478],{}," en schuif op tot je de sleutel\nvindt of een ",[14,5828,2237],{}," vakje tegenkomt. Een leeg vakje betekent: hier zou de sleutel gestaan hebben, dus\nhij zit niet in de tabel.",[99,5831,5832,5844],{},[102,5833,5834],{},[105,5835,5836,5839,5841],{},[108,5837,5838],{},"Zoek",[108,5840,5631],{},[108,5842,5843],{},"Resultaat",[121,5845,5846,5855,5866],{},[105,5847,5848,5850,5852],{},[126,5849,3638],{},[126,5851,5768],{},[126,5853,5854],{},"gevonden in vakje 3",[105,5856,5857,5860,5863],{},[126,5858,5859],{},"22",[126,5861,5862],{},"1, 2, 3, 4, 5",[126,5864,5865],{},"vakje 5 is leeg, dus niet gevonden",[105,5867,5868,5871,5874],{},[126,5869,5870],{},"13",[126,5872,5873],{},"6, 0, 1, 2, 3, 4, 5",[126,5875,5865],{},[10,5877,5878,5881,5882,5884,5885,5887,5888,5890],{},[14,5879,5880],{},"Verwijderen"," is lastiger. Stel dat je ",[61,5883,242],{}," uit vakje 2 haalt en het vakje gewoon leeg maakt. Zoek je\ndaarna naar ",[61,5886,3638],{},", dan probeer je 6, 0, 1, 2 en stopt bij het lege vakje 2: \"niet gevonden\", terwijl\n",[61,5889,3638],{}," gewoon in vakje 3 staat. Je hebt de keten doorgeknipt.",[10,5892,5893,5894,5897,5898,452],{},"De oplossing is een grafsteen (",[19,5895,5896],{},"tombstone","): een markering \"hier stond iets\". Hieronder genoteerd als ",[61,5899,5900],{},"×",[99,5902,5903,5921],{},[102,5904,5905],{},[105,5906,5907,5909,5911,5913,5915,5917,5919],{},[108,5908,3592],{},[108,5910,128],{},[108,5912,146],{},[108,5914,163],{},[108,5916,141],{},[108,5918,194],{},[108,5920,211],{},[121,5922,5923],{},[105,5924,5925,5927,5929,5931,5933,5935,5937],{},[126,5926,5510],{},[126,5928,5388],{},[126,5930,5900],{},[126,5932,3638],{},[126,5934,5491],{},[126,5936,4081],{},[126,5938,5396],{},[10,5940,5941,5942,5944,5945,5947],{},"Bij zoeken loop je door een ",[61,5943,5900],{}," heen; bij invoegen mag je een ",[61,5946,5900],{}," hergebruiken. Bij chaining speelt\ndit probleem niet: daar haal je de sleutel gewoon uit de lijst.",[38,5949,5951],{"id":5950},"load-factor-en-rehashen","Load factor en rehashen",[10,5953,5954,5955,5958],{},"De load factor (",[19,5956,5957],{},"bezettingsgraad",") is",[484,5960,5963],{"className":5961,"code":5962,"language":1130},[1128],"α = n \u002F m\n",[61,5964,5962],{"__ignoreMap":482},[10,5966,5967,5968,5970,5971,5974,5975,5977],{},"met ",[61,5969,4488],{}," het aantal opgeslagen sleutels. In het voorbeeld hierboven is ",[61,5972,5973],{},"α = 6\u002F7 ≈ 0,86",". Dat is hoog,\nen je ziet het effect: zoeken naar ",[61,5976,5870],{}," kost zeven stappen.",[10,5979,5980,5981,5984,5985,5987],{},"Bij linear probing moet ",[61,5982,5983],{},"α"," altijd kleiner dan 1 blijven (anders is de tabel vol) en in de praktijk\nruim onder 0,7. Bij chaining kan ",[61,5986,5983],{}," boven 1 komen, maar dan worden de lijsten lang.",[10,5989,5990,5991,5993,5994,5997,5998,6001,6002,6004,6005,6008],{},"Daarom groeit een hashtabel automatisch. Wordt ",[61,5992,5983],{}," te groot, dan maak je een nieuwe, grotere tabel\n(vaak ongeveer twee keer zo groot) en voeg je ",[14,5995,5996],{},"alle"," sleutels opnieuw in. Dat heet rehashen\n(",[19,5999,6000],{},"rehashing","). Je kunt de oude array niet zomaar kopiëren: met een nieuwe ",[61,6003,5380],{}," verandert ",[61,6006,6007],{},"k mod m","\nvoor bijna elke sleutel.",[10,6010,6011,6012,6015,6016,6019],{},"Rehashen we onze zes sleutels naar ",[61,6013,6014],{},"m = 13"," (in de volgorde waarin ze in de oude tabel staan:\n",[61,6017,6018],{},"20, 15, 8, 34, 11, 27","), dan krijg je:",[99,6021,6022,6052],{},[102,6023,6024],{},[105,6025,6026,6028,6030,6032,6034,6036,6038,6040,6042,6044,6046,6048,6050],{},[108,6027,3592],{},[108,6029,128],{},[108,6031,146],{},[108,6033,163],{},[108,6035,141],{},[108,6037,194],{},[108,6039,211],{},[108,6041,227],{},[108,6043,242],{},[108,6045,218],{},[108,6047,3886],{},[108,6049,5491],{},[108,6051,3623],{},[121,6053,6054],{},[105,6055,6056,6058,6060,6062,6064,6066,6068,6070,6072,6074,6076,6078,6080],{},[126,6057,4081],{},[126,6059,5396],{},[126,6061,5388],{},[126,6063,4081],{},[126,6065,4081],{},[126,6067,4081],{},[126,6069,4081],{},[126,6071,5510],{},[126,6073,242],{},[126,6075,3638],{},[126,6077,4081],{},[126,6079,5491],{},[126,6081,4081],{},[10,6083,6084,6085,3148,6087,6089,6090,6093,6094,6096,6097,17,6100,6102,6103,452],{},"Nog maar één botsing (",[61,6086,3638],{},[61,6088,242],{},", allebei vakje 8) en ",[61,6091,6092],{},"α = 6\u002F13 ≈ 0,46",". Rehashen kost ",[61,6095,1088],{},", maar\nomdat het steeds zeldzamer gebeurt naarmate de tabel groeit, is invoegen ",[19,6098,6099],{},"gemiddeld over alle\noperaties",[19,6101,3052],{},") nog steeds ",[61,6104,474],{},[38,6106,6108],{"id":6107},"code-hashtabel-met-linear-probing","Code: hashtabel met linear probing",[10,6110,6111],{},"Een minimale hashtabel voor gehele getallen, met tombstones. Hij rehasht niet automatisch, zodat hij\nprecies dezelfde tabellen oplevert als de voorbeelden hierboven.",[477,6113,6114,6798],{},[480,6115,6116],{"v-slot:python":482},[484,6117,6119],{"className":486,"code":6118,"language":488,"meta":482,"style":482},"LEEG = None\nWEG = \"×\"  # tombstone\n\n\nclass HashTabel:\n    def __init__(self, m):\n        self.m = m\n        self.vakjes = [LEEG] * m\n\n    def _route(self, k):\n        # alle vakjes in probeervolgorde: h(k), h(k)+1, ... met wrap-around\n        start = k % self.m\n        for stap in range(self.m):\n            yield (start + stap) % self.m\n\n    def zoek(self, k):\n        for i in self._route(k):\n            if self.vakjes[i] is LEEG:\n                return -1  # leeg vakje: sleutel bestaat niet\n            if self.vakjes[i] == k:\n                return i\n        return -1\n\n    def voeg_toe(self, k):\n        if self.zoek(k) != -1:\n            return  # al aanwezig\n        for i in self._route(k):\n            if self.vakjes[i] is LEEG or self.vakjes[i] == WEG:\n                self.vakjes[i] = k\n                return\n        raise OverflowError(\"tabel is vol\")\n\n    def verwijder(self, k):\n        i = self.zoek(k)\n        if i != -1:\n            self.vakjes[i] = WEG  # niet LEEG, anders breekt de zoekketen\n\n\nt = HashTabel(7)\nfor k in [15, 11, 27, 8, 20, 34]:\n    t.voeg_toe(k)\nprint([\"-\" if v is LEEG else v for v in t.vakjes])\n# [20, 15, 8, 34, 11, '-', 27]\n",[61,6120,6121,6130,6146,6150,6154,6163,6180,6193,6217,6221,6239,6244,6264,6286,6312,6316,6333,6354,6377,6388,6410,6417,6425,6429,6446,6471,6478,6498,6540,6560,6565,6584,6588,6605,6624,6639,6662,6667,6672,6688,6729,6746,6792],{"__ignoreMap":482},[492,6122,6123,6126,6128],{"class":494,"line":495},[492,6124,6125],{"class":533},"LEEG ",[492,6127,830],{"class":506},[492,6129,1673],{"class":506},[492,6131,6132,6135,6137,6139,6141,6143],{"class":494,"line":510},[492,6133,6134],{"class":533},"WEG ",[492,6136,830],{"class":506},[492,6138,2307],{"class":506},[492,6140,5900],{"class":654},[492,6142,651],{"class":506},[492,6144,6145],{"class":598},"  # tombstone\n",[492,6147,6148],{"class":494,"line":530},[492,6149,553],{"emptyLinePlaceholder":552},[492,6151,6152],{"class":494,"line":549},[492,6153,553],{"emptyLinePlaceholder":552},[492,6155,6156,6158,6161],{"class":494,"line":556},[492,6157,499],{"class":498},[492,6159,6160],{"class":502}," HashTabel",[492,6162,507],{"class":506},[492,6164,6165,6167,6169,6171,6173,6175,6178],{"class":494,"line":577},[492,6166,513],{"class":498},[492,6168,517],{"class":516},[492,6170,520],{"class":506},[492,6172,524],{"class":523},[492,6174,568],{"class":506},[492,6176,6177],{"class":571}," m",[492,6179,527],{"class":506},[492,6181,6182,6184,6186,6188,6190],{"class":494,"line":602},[492,6183,534],{"class":533},[492,6185,452],{"class":506},[492,6187,5380],{"class":539},[492,6189,543],{"class":506},[492,6191,6192],{"class":533}," m\n",[492,6194,6195,6197,6199,6202,6204,6207,6210,6212,6215],{"class":494,"line":607},[492,6196,534],{"class":533},[492,6198,452],{"class":506},[492,6200,6201],{"class":539},"vakjes",[492,6203,543],{"class":506},[492,6205,6206],{"class":506}," [",[492,6208,6209],{"class":533},"LEEG",[492,6211,2215],{"class":506},[492,6213,6214],{"class":506}," *",[492,6216,6192],{"class":533},[492,6218,6219],{"class":494,"line":621},[492,6220,553],{"emptyLinePlaceholder":552},[492,6222,6223,6225,6228,6230,6232,6234,6237],{"class":494,"line":640},[492,6224,513],{"class":498},[492,6226,6227],{"class":516}," _route",[492,6229,520],{"class":506},[492,6231,524],{"class":523},[492,6233,568],{"class":506},[492,6235,6236],{"class":571}," k",[492,6238,527],{"class":506},[492,6240,6241],{"class":494,"line":663},[492,6242,6243],{"class":598},"        # alle vakjes in probeervolgorde: h(k), h(k)+1, ... met wrap-around\n",[492,6245,6246,6249,6251,6254,6257,6259,6261],{"class":494,"line":683},[492,6247,6248],{"class":533},"        start ",[492,6250,830],{"class":506},[492,6252,6253],{"class":533}," k ",[492,6255,6256],{"class":506},"%",[492,6258,631],{"class":533},[492,6260,452],{"class":506},[492,6262,6263],{"class":539},"m\n",[492,6265,6266,6269,6272,6274,6276,6278,6280,6282,6284],{"class":494,"line":688},[492,6267,6268],{"class":624},"        for",[492,6270,6271],{"class":533}," stap ",[492,6273,2365],{"class":624},[492,6275,3292],{"class":516},[492,6277,520],{"class":506},[492,6279,524],{"class":533},[492,6281,452],{"class":506},[492,6283,5380],{"class":539},[492,6285,527],{"class":506},[492,6287,6288,6291,6293,6296,6298,6301,6303,6306,6308,6310],{"class":494,"line":702},[492,6289,6290],{"class":624},"            yield",[492,6292,17],{"class":506},[492,6294,6295],{"class":533},"start ",[492,6297,3989],{"class":506},[492,6299,6300],{"class":533}," stap",[492,6302,595],{"class":506},[492,6304,6305],{"class":506}," %",[492,6307,631],{"class":533},[492,6309,452],{"class":506},[492,6311,6263],{"class":539},[492,6313,6314],{"class":494,"line":722},[492,6315,553],{"emptyLinePlaceholder":552},[492,6317,6318,6320,6323,6325,6327,6329,6331],{"class":494,"line":727},[492,6319,513],{"class":498},[492,6321,6322],{"class":516}," zoek",[492,6324,520],{"class":506},[492,6326,524],{"class":523},[492,6328,568],{"class":506},[492,6330,6236],{"class":571},[492,6332,527],{"class":506},[492,6334,6335,6337,6339,6341,6343,6345,6348,6350,6352],{"class":494,"line":741},[492,6336,6268],{"class":624},[492,6338,3287],{"class":533},[492,6340,2365],{"class":624},[492,6342,631],{"class":533},[492,6344,452],{"class":506},[492,6346,6347],{"class":516},"_route",[492,6349,520],{"class":506},[492,6351,5078],{"class":516},[492,6353,527],{"class":506},[492,6355,6356,6358,6360,6362,6364,6366,6368,6370,6372,6375],{"class":494,"line":997},[492,6357,2430],{"class":624},[492,6359,631],{"class":533},[492,6361,452],{"class":506},[492,6363,6201],{"class":539},[492,6365,2146],{"class":506},[492,6367,1172],{"class":539},[492,6369,2215],{"class":506},[492,6371,1490],{"class":506},[492,6373,6374],{"class":533}," LEEG",[492,6376,507],{"class":506},[492,6378,6379,6381,6383,6385],{"class":494,"line":1025},[492,6380,2464],{"class":624},[492,6382,971],{"class":506},[492,6384,128],{"class":716},[492,6386,6387],{"class":598},"  # leeg vakje: sleutel bestaat niet\n",[492,6389,6390,6392,6394,6396,6398,6400,6402,6404,6406,6408],{"class":494,"line":1030},[492,6391,2430],{"class":624},[492,6393,631],{"class":533},[492,6395,452],{"class":506},[492,6397,6201],{"class":539},[492,6399,2146],{"class":506},[492,6401,1172],{"class":539},[492,6403,2215],{"class":506},[492,6405,759],{"class":506},[492,6407,6236],{"class":533},[492,6409,507],{"class":506},[492,6411,6412,6414],{"class":494,"line":1035},[492,6413,2464],{"class":624},[492,6415,6416],{"class":533}," i\n",[492,6418,6419,6421,6423],{"class":494,"line":1048},[492,6420,666],{"class":624},[492,6422,971],{"class":506},[492,6424,4672],{"class":716},[492,6426,6427],{"class":494,"line":1062},[492,6428,553],{"emptyLinePlaceholder":552},[492,6430,6431,6433,6436,6438,6440,6442,6444],{"class":494,"line":1067},[492,6432,513],{"class":498},[492,6434,6435],{"class":516}," voeg_toe",[492,6437,520],{"class":506},[492,6439,524],{"class":523},[492,6441,568],{"class":506},[492,6443,6236],{"class":571},[492,6445,527],{"class":506},[492,6447,6448,6450,6452,6454,6457,6459,6461,6463,6465,6467,6469],{"class":494,"line":1644},[492,6449,625],{"class":624},[492,6451,631],{"class":533},[492,6453,452],{"class":506},[492,6455,6456],{"class":516},"zoek",[492,6458,520],{"class":506},[492,6460,5078],{"class":516},[492,6462,595],{"class":506},[492,6464,2450],{"class":506},[492,6466,971],{"class":506},[492,6468,128],{"class":716},[492,6470,507],{"class":506},[492,6472,6473,6475],{"class":494,"line":1662},[492,6474,3328],{"class":624},[492,6476,6477],{"class":598},"  # al aanwezig\n",[492,6479,6480,6482,6484,6486,6488,6490,6492,6494,6496],{"class":494,"line":1676},[492,6481,6268],{"class":624},[492,6483,3287],{"class":533},[492,6485,2365],{"class":624},[492,6487,631],{"class":533},[492,6489,452],{"class":506},[492,6491,6347],{"class":516},[492,6493,520],{"class":506},[492,6495,5078],{"class":516},[492,6497,527],{"class":506},[492,6499,6500,6502,6504,6506,6508,6510,6512,6514,6516,6519,6521,6523,6525,6527,6529,6531,6533,6535,6538],{"class":494,"line":1977},[492,6501,2430],{"class":624},[492,6503,631],{"class":533},[492,6505,452],{"class":506},[492,6507,6201],{"class":539},[492,6509,2146],{"class":506},[492,6511,1172],{"class":539},[492,6513,2215],{"class":506},[492,6515,1490],{"class":506},[492,6517,6518],{"class":533}," LEEG ",[492,6520,2438],{"class":506},[492,6522,631],{"class":533},[492,6524,452],{"class":506},[492,6526,6201],{"class":539},[492,6528,2146],{"class":506},[492,6530,1172],{"class":539},[492,6532,2215],{"class":506},[492,6534,759],{"class":506},[492,6536,6537],{"class":533}," WEG",[492,6539,507],{"class":506},[492,6541,6542,6545,6547,6549,6551,6553,6555,6557],{"class":494,"line":1995},[492,6543,6544],{"class":533},"                self",[492,6546,452],{"class":506},[492,6548,6201],{"class":539},[492,6550,2146],{"class":506},[492,6552,1172],{"class":539},[492,6554,2215],{"class":506},[492,6556,543],{"class":506},[492,6558,6559],{"class":533}," k\n",[492,6561,6562],{"class":494,"line":2011},[492,6563,6564],{"class":624},"                return\n",[492,6566,6567,6570,6573,6575,6577,6580,6582],{"class":494,"line":2029},[492,6568,6569],{"class":624},"        raise",[492,6571,6572],{"class":502}," OverflowError",[492,6574,520],{"class":506},[492,6576,651],{"class":506},[492,6578,6579],{"class":654},"tabel is vol",[492,6581,651],{"class":506},[492,6583,660],{"class":506},[492,6585,6586],{"class":494,"line":2039},[492,6587,553],{"emptyLinePlaceholder":552},[492,6589,6590,6592,6595,6597,6599,6601,6603],{"class":494,"line":2044},[492,6591,513],{"class":498},[492,6593,6594],{"class":516}," verwijder",[492,6596,520],{"class":506},[492,6598,524],{"class":523},[492,6600,568],{"class":506},[492,6602,6236],{"class":571},[492,6604,527],{"class":506},[492,6606,6607,6610,6612,6614,6616,6618,6620,6622],{"class":494,"line":2053},[492,6608,6609],{"class":533},"        i ",[492,6611,830],{"class":506},[492,6613,631],{"class":533},[492,6615,452],{"class":506},[492,6617,6456],{"class":516},[492,6619,520],{"class":506},[492,6621,5078],{"class":516},[492,6623,660],{"class":506},[492,6625,6626,6628,6630,6633,6635,6637],{"class":494,"line":2058},[492,6627,625],{"class":624},[492,6629,3287],{"class":533},[492,6631,6632],{"class":506},"!=",[492,6634,971],{"class":506},[492,6636,128],{"class":716},[492,6638,507],{"class":506},[492,6640,6642,6644,6646,6648,6650,6652,6654,6656,6659],{"class":494,"line":6641},36,[492,6643,1501],{"class":533},[492,6645,452],{"class":506},[492,6647,6201],{"class":539},[492,6649,2146],{"class":506},[492,6651,1172],{"class":539},[492,6653,2215],{"class":506},[492,6655,543],{"class":506},[492,6657,6658],{"class":533}," WEG  ",[492,6660,6661],{"class":598},"# niet LEEG, anders breekt de zoekketen\n",[492,6663,6665],{"class":494,"line":6664},37,[492,6666,553],{"emptyLinePlaceholder":552},[492,6668,6670],{"class":494,"line":6669},38,[492,6671,553],{"emptyLinePlaceholder":552},[492,6673,6675,6678,6680,6682,6684,6686],{"class":494,"line":6674},39,[492,6676,6677],{"class":533},"t ",[492,6679,830],{"class":506},[492,6681,6160],{"class":516},[492,6683,520],{"class":506},[492,6685,227],{"class":716},[492,6687,660],{"class":506},[492,6689,6691,6694,6696,6698,6700,6702,6704,6707,6709,6712,6714,6717,6719,6722,6724,6727],{"class":494,"line":6690},40,[492,6692,6693],{"class":624},"for",[492,6695,6253],{"class":533},[492,6697,2365],{"class":624},[492,6699,6206],{"class":506},[492,6701,5388],{"class":716},[492,6703,568],{"class":506},[492,6705,6706],{"class":716}," 11",[492,6708,568],{"class":506},[492,6710,6711],{"class":716}," 27",[492,6713,568],{"class":506},[492,6715,6716],{"class":716}," 8",[492,6718,568],{"class":506},[492,6720,6721],{"class":716}," 20",[492,6723,568],{"class":506},[492,6725,6726],{"class":716}," 34",[492,6728,2459],{"class":506},[492,6730,6732,6735,6737,6740,6742,6744],{"class":494,"line":6731},41,[492,6733,6734],{"class":533},"    t",[492,6736,452],{"class":506},[492,6738,6739],{"class":516},"voeg_toe",[492,6741,520],{"class":506},[492,6743,5078],{"class":516},[492,6745,660],{"class":506},[492,6747,6749,6752,6755,6757,6759,6761,6763,6766,6769,6771,6774,6776,6778,6780,6782,6785,6787,6789],{"class":494,"line":6748},42,[492,6750,6751],{"class":516},"print",[492,6753,6754],{"class":506},"([",[492,6756,651],{"class":506},[492,6758,4081],{"class":654},[492,6760,651],{"class":506},[492,6762,2645],{"class":624},[492,6764,6765],{"class":516}," v ",[492,6767,6768],{"class":506},"is",[492,6770,6518],{"class":516},[492,6772,6773],{"class":624},"else",[492,6775,6765],{"class":516},[492,6777,6693],{"class":624},[492,6779,6765],{"class":516},[492,6781,2365],{"class":624},[492,6783,6784],{"class":516}," t",[492,6786,452],{"class":506},[492,6788,6201],{"class":539},[492,6790,6791],{"class":506},"])\n",[492,6793,6795],{"class":494,"line":6794},43,[492,6796,6797],{"class":598},"# [20, 15, 8, 34, 11, '-', 27]\n",[480,6799,6800],{"v-slot:java":482},[484,6801,6803],{"className":767,"code":6802,"language":769,"meta":482,"style":482},"import java.util.Arrays;\n\nstatic class HashTabel {\n    private static final int LEEG = Integer.MIN_VALUE;\n    private static final int WEG = Integer.MIN_VALUE + 1; \u002F\u002F tombstone\n    private final int m;\n    private final int[] vakjes;\n\n    HashTabel(int m) {\n        this.m = m;\n        this.vakjes = new int[m];\n        Arrays.fill(vakjes, LEEG);\n    }\n\n    private int h(int k) {\n        return Math.floorMod(k, m); \u002F\u002F ook correct voor negatieve sleutels\n    }\n\n    int zoek(int k) {\n        for (int stap = 0; stap \u003C m; stap++) {\n            int i = (h(k) + stap) % m;\n            if (vakjes[i] == LEEG) return -1; \u002F\u002F leeg vakje: sleutel bestaat niet\n            if (vakjes[i] == k) return i;\n        }\n        return -1;\n    }\n\n    void voegToe(int k) {\n        if (zoek(k) != -1) return; \u002F\u002F al aanwezig\n        for (int stap = 0; stap \u003C m; stap++) {\n            int i = (h(k) + stap) % m;\n            if (vakjes[i] == LEEG || vakjes[i] == WEG) {\n                vakjes[i] = k;\n                return;\n            }\n        }\n        throw new IllegalStateException(\"tabel is vol\");\n    }\n\n    void verwijder(int k) {\n        int i = zoek(k);\n        if (i != -1) vakjes[i] = WEG; \u002F\u002F niet LEEG, anders breekt de zoekketen\n    }\n}\n",[61,6804,6805,6822,6826,6836,6860,6891,6903,6918,6922,6937,6951,6971,6991,6995,6999,7018,7043,7047,7051,7067,7097,7130,7162,7188,7192,7202,7206,7210,7227,7256,7286,7316,7353,7370,7376,7380,7384,7403,7407,7411,7427,7443,7477,7481],{"__ignoreMap":482},[492,6806,6807,6809,6811,6813,6815,6817,6820],{"class":494,"line":495},[492,6808,776],{"class":716},[492,6810,779],{"class":498},[492,6812,452],{"class":506},[492,6814,784],{"class":498},[492,6816,452],{"class":506},[492,6818,6819],{"class":498},"Arrays",[492,6821,791],{"class":506},[492,6823,6824],{"class":494,"line":510},[492,6825,553],{"emptyLinePlaceholder":552},[492,6827,6828,6830,6832,6834],{"class":494,"line":530},[492,6829,2492],{"class":498},[492,6831,1706],{"class":498},[492,6833,6160],{"class":502},[492,6835,804],{"class":506},[492,6837,6838,6840,6842,6844,6846,6848,6850,6853,6855,6858],{"class":494,"line":549},[492,6839,809],{"class":498},[492,6841,1703],{"class":498},[492,6843,812],{"class":498},[492,6845,3359],{"class":498},[492,6847,6518],{"class":533},[492,6849,830],{"class":506},[492,6851,6852],{"class":533}," Integer",[492,6854,452],{"class":506},[492,6856,6857],{"class":533},"MIN_VALUE",[492,6859,791],{"class":506},[492,6861,6862,6864,6866,6868,6870,6873,6875,6877,6879,6882,6884,6886,6888],{"class":494,"line":556},[492,6863,809],{"class":498},[492,6865,1703],{"class":498},[492,6867,812],{"class":498},[492,6869,3359],{"class":498},[492,6871,6872],{"class":533}," WEG ",[492,6874,830],{"class":506},[492,6876,6852],{"class":533},[492,6878,452],{"class":506},[492,6880,6881],{"class":533},"MIN_VALUE ",[492,6883,3989],{"class":506},[492,6885,974],{"class":716},[492,6887,1784],{"class":506},[492,6889,6890],{"class":598}," \u002F\u002F tombstone\n",[492,6892,6893,6895,6897,6899,6901],{"class":494,"line":577},[492,6894,809],{"class":498},[492,6896,812],{"class":498},[492,6898,3359],{"class":498},[492,6900,6177],{"class":533},[492,6902,791],{"class":506},[492,6904,6905,6907,6909,6911,6913,6916],{"class":494,"line":602},[492,6906,809],{"class":498},[492,6908,812],{"class":498},[492,6910,3359],{"class":498},[492,6912,3369],{"class":506},[492,6914,6915],{"class":533}," vakjes",[492,6917,791],{"class":506},[492,6919,6920],{"class":494,"line":607},[492,6921,553],{"emptyLinePlaceholder":552},[492,6923,6924,6927,6929,6931,6933,6935],{"class":494,"line":621},[492,6925,6926],{"class":516},"    HashTabel",[492,6928,520],{"class":506},[492,6930,854],{"class":498},[492,6932,6177],{"class":571},[492,6934,595],{"class":506},[492,6936,804],{"class":506},[492,6938,6939,6942,6945,6947,6949],{"class":494,"line":640},[492,6940,6941],{"class":506},"        this.",[492,6943,6944],{"class":533},"m ",[492,6946,830],{"class":506},[492,6948,6177],{"class":533},[492,6950,791],{"class":506},[492,6952,6953,6955,6958,6960,6962,6964,6966,6968],{"class":494,"line":663},[492,6954,6941],{"class":506},[492,6956,6957],{"class":533},"vakjes ",[492,6959,830],{"class":506},[492,6961,833],{"class":624},[492,6963,3359],{"class":498},[492,6965,2146],{"class":506},[492,6967,5380],{"class":533},[492,6969,6970],{"class":506},"];\n",[492,6972,6973,6976,6978,6981,6983,6985,6987,6989],{"class":494,"line":683},[492,6974,6975],{"class":533},"        Arrays",[492,6977,452],{"class":506},[492,6979,6980],{"class":516},"fill",[492,6982,520],{"class":506},[492,6984,6201],{"class":533},[492,6986,568],{"class":506},[492,6988,6374],{"class":533},[492,6990,940],{"class":506},[492,6992,6993],{"class":494,"line":688},[492,6994,885],{"class":506},[492,6996,6997],{"class":494,"line":702},[492,6998,553],{"emptyLinePlaceholder":552},[492,7000,7001,7003,7005,7008,7010,7012,7014,7016],{"class":494,"line":722},[492,7002,809],{"class":498},[492,7004,3359],{"class":498},[492,7006,7007],{"class":516}," h",[492,7009,520],{"class":506},[492,7011,854],{"class":498},[492,7013,6236],{"class":571},[492,7015,595],{"class":506},[492,7017,804],{"class":506},[492,7019,7020,7022,7025,7027,7030,7032,7034,7036,7038,7040],{"class":494,"line":727},[492,7021,666],{"class":624},[492,7023,7024],{"class":533}," Math",[492,7026,452],{"class":506},[492,7028,7029],{"class":516},"floorMod",[492,7031,520],{"class":506},[492,7033,5078],{"class":533},[492,7035,568],{"class":506},[492,7037,6177],{"class":533},[492,7039,877],{"class":506},[492,7041,7042],{"class":598}," \u002F\u002F ook correct voor negatieve sleutels\n",[492,7044,7045],{"class":494,"line":741},[492,7046,885],{"class":506},[492,7048,7049],{"class":494,"line":997},[492,7050,553],{"emptyLinePlaceholder":552},[492,7052,7053,7055,7057,7059,7061,7063,7065],{"class":494,"line":1025},[492,7054,894],{"class":498},[492,7056,6322],{"class":516},[492,7058,520],{"class":506},[492,7060,854],{"class":498},[492,7062,6236],{"class":571},[492,7064,595],{"class":506},[492,7066,804],{"class":506},[492,7068,7069,7071,7073,7075,7077,7079,7081,7083,7085,7087,7089,7091,7093,7095],{"class":494,"line":1030},[492,7070,6268],{"class":624},[492,7072,17],{"class":506},[492,7074,854],{"class":498},[492,7076,6271],{"class":533},[492,7078,830],{"class":506},[492,7080,3396],{"class":716},[492,7082,1784],{"class":506},[492,7084,6271],{"class":533},[492,7086,818],{"class":506},[492,7088,6177],{"class":533},[492,7090,1784],{"class":506},[492,7092,6300],{"class":533},[492,7094,3417],{"class":506},[492,7096,804],{"class":506},[492,7098,7099,7102,7104,7106,7108,7111,7113,7115,7117,7120,7122,7124,7126,7128],{"class":494,"line":1035},[492,7100,7101],{"class":498},"            int",[492,7103,3287],{"class":533},[492,7105,830],{"class":506},[492,7107,17],{"class":506},[492,7109,7110],{"class":516},"h",[492,7112,520],{"class":506},[492,7114,5078],{"class":533},[492,7116,595],{"class":506},[492,7118,7119],{"class":506}," +",[492,7121,6300],{"class":533},[492,7123,595],{"class":506},[492,7125,6305],{"class":506},[492,7127,6177],{"class":533},[492,7129,791],{"class":506},[492,7131,7132,7134,7136,7138,7140,7142,7144,7146,7148,7150,7153,7155,7157,7159],{"class":494,"line":1048},[492,7133,2430],{"class":624},[492,7135,17],{"class":506},[492,7137,6201],{"class":533},[492,7139,2146],{"class":506},[492,7141,1172],{"class":533},[492,7143,2215],{"class":506},[492,7145,759],{"class":506},[492,7147,6374],{"class":533},[492,7149,595],{"class":506},[492,7151,7152],{"class":624}," return",[492,7154,971],{"class":506},[492,7156,128],{"class":716},[492,7158,1784],{"class":506},[492,7160,7161],{"class":598}," \u002F\u002F leeg vakje: sleutel bestaat niet\n",[492,7163,7164,7166,7168,7170,7172,7174,7176,7178,7180,7182,7184,7186],{"class":494,"line":1062},[492,7165,2430],{"class":624},[492,7167,17],{"class":506},[492,7169,6201],{"class":533},[492,7171,2146],{"class":506},[492,7173,1172],{"class":533},[492,7175,2215],{"class":506},[492,7177,759],{"class":506},[492,7179,6236],{"class":533},[492,7181,595],{"class":506},[492,7183,7152],{"class":624},[492,7185,3414],{"class":533},[492,7187,791],{"class":506},[492,7189,7190],{"class":494,"line":1067},[492,7191,945],{"class":506},[492,7193,7194,7196,7198,7200],{"class":494,"line":1644},[492,7195,666],{"class":624},[492,7197,971],{"class":506},[492,7199,128],{"class":716},[492,7201,791],{"class":506},[492,7203,7204],{"class":494,"line":1662},[492,7205,885],{"class":506},[492,7207,7208],{"class":494,"line":1676},[492,7209,553],{"emptyLinePlaceholder":552},[492,7211,7212,7214,7217,7219,7221,7223,7225],{"class":494,"line":1977},[492,7213,847],{"class":498},[492,7215,7216],{"class":516}," voegToe",[492,7218,520],{"class":506},[492,7220,854],{"class":498},[492,7222,6236],{"class":571},[492,7224,595],{"class":506},[492,7226,804],{"class":506},[492,7228,7229,7231,7233,7235,7237,7239,7241,7243,7245,7247,7249,7251,7253],{"class":494,"line":1995},[492,7230,625],{"class":624},[492,7232,17],{"class":506},[492,7234,6456],{"class":516},[492,7236,520],{"class":506},[492,7238,5078],{"class":533},[492,7240,595],{"class":506},[492,7242,2450],{"class":506},[492,7244,971],{"class":506},[492,7246,128],{"class":716},[492,7248,595],{"class":506},[492,7250,7152],{"class":624},[492,7252,1784],{"class":506},[492,7254,7255],{"class":598}," \u002F\u002F al aanwezig\n",[492,7257,7258,7260,7262,7264,7266,7268,7270,7272,7274,7276,7278,7280,7282,7284],{"class":494,"line":2011},[492,7259,6268],{"class":624},[492,7261,17],{"class":506},[492,7263,854],{"class":498},[492,7265,6271],{"class":533},[492,7267,830],{"class":506},[492,7269,3396],{"class":716},[492,7271,1784],{"class":506},[492,7273,6271],{"class":533},[492,7275,818],{"class":506},[492,7277,6177],{"class":533},[492,7279,1784],{"class":506},[492,7281,6300],{"class":533},[492,7283,3417],{"class":506},[492,7285,804],{"class":506},[492,7287,7288,7290,7292,7294,7296,7298,7300,7302,7304,7306,7308,7310,7312,7314],{"class":494,"line":2029},[492,7289,7101],{"class":498},[492,7291,3287],{"class":533},[492,7293,830],{"class":506},[492,7295,17],{"class":506},[492,7297,7110],{"class":516},[492,7299,520],{"class":506},[492,7301,5078],{"class":533},[492,7303,595],{"class":506},[492,7305,7119],{"class":506},[492,7307,6300],{"class":533},[492,7309,595],{"class":506},[492,7311,6305],{"class":506},[492,7313,6177],{"class":533},[492,7315,791],{"class":506},[492,7317,7318,7320,7322,7324,7326,7328,7330,7332,7334,7337,7339,7341,7343,7345,7347,7349,7351],{"class":494,"line":2039},[492,7319,2430],{"class":624},[492,7321,17],{"class":506},[492,7323,6201],{"class":533},[492,7325,2146],{"class":506},[492,7327,1172],{"class":533},[492,7329,2215],{"class":506},[492,7331,759],{"class":506},[492,7333,6518],{"class":533},[492,7335,7336],{"class":506},"||",[492,7338,6915],{"class":533},[492,7340,2146],{"class":506},[492,7342,1172],{"class":533},[492,7344,2215],{"class":506},[492,7346,759],{"class":506},[492,7348,6537],{"class":533},[492,7350,595],{"class":506},[492,7352,804],{"class":506},[492,7354,7355,7358,7360,7362,7364,7366,7368],{"class":494,"line":2044},[492,7356,7357],{"class":533},"                vakjes",[492,7359,2146],{"class":506},[492,7361,1172],{"class":533},[492,7363,2215],{"class":506},[492,7365,543],{"class":506},[492,7367,6236],{"class":533},[492,7369,791],{"class":506},[492,7371,7372,7374],{"class":494,"line":2053},[492,7373,2464],{"class":624},[492,7375,791],{"class":506},[492,7377,7378],{"class":494,"line":2058},[492,7379,2795],{"class":506},[492,7381,7382],{"class":494,"line":6641},[492,7383,945],{"class":506},[492,7385,7386,7389,7391,7393,7395,7397,7399,7401],{"class":494,"line":6664},[492,7387,7388],{"class":624},"        throw",[492,7390,833],{"class":624},[492,7392,929],{"class":516},[492,7394,520],{"class":506},[492,7396,651],{"class":506},[492,7398,6579],{"class":654},[492,7400,651],{"class":506},[492,7402,940],{"class":506},[492,7404,7405],{"class":494,"line":6669},[492,7406,885],{"class":506},[492,7408,7409],{"class":494,"line":6674},[492,7410,553],{"emptyLinePlaceholder":552},[492,7412,7413,7415,7417,7419,7421,7423,7425],{"class":494,"line":6690},[492,7414,847],{"class":498},[492,7416,6594],{"class":516},[492,7418,520],{"class":506},[492,7420,854],{"class":498},[492,7422,6236],{"class":571},[492,7424,595],{"class":506},[492,7426,804],{"class":506},[492,7428,7429,7431,7433,7435,7437,7439,7441],{"class":494,"line":6731},[492,7430,1715],{"class":498},[492,7432,3287],{"class":533},[492,7434,830],{"class":506},[492,7436,6322],{"class":516},[492,7438,520],{"class":506},[492,7440,5078],{"class":533},[492,7442,940],{"class":506},[492,7444,7445,7447,7449,7452,7454,7456,7458,7460,7462,7464,7466,7468,7470,7472,7474],{"class":494,"line":6748},[492,7446,625],{"class":624},[492,7448,17],{"class":506},[492,7450,7451],{"class":533},"i ",[492,7453,6632],{"class":506},[492,7455,971],{"class":506},[492,7457,128],{"class":716},[492,7459,595],{"class":506},[492,7461,6915],{"class":533},[492,7463,2146],{"class":506},[492,7465,1172],{"class":533},[492,7467,2215],{"class":506},[492,7469,543],{"class":506},[492,7471,6537],{"class":533},[492,7473,1784],{"class":506},[492,7475,7476],{"class":598}," \u002F\u002F niet LEEG, anders breekt de zoekketen\n",[492,7478,7479],{"class":494,"line":6794},[492,7480,885],{"class":506},[492,7482,7484],{"class":494,"line":7483},44,[492,7485,1070],{"class":506},[10,7487,7488,7489,7492,7493,7495,7496,3148,7498,7500,7501,3524,7504,7507,7508,452],{},"In Python geeft ",[61,7490,7491],{},"k % m"," voor een negatieve ",[61,7494,5078],{}," altijd een uitkomst tussen ",[61,7497,3592],{},[61,7499,5406],{},". In Java is\n",[61,7502,7503],{},"-3 % 7",[61,7505,7506],{},"-3","; daarom gebruikt de Java-versie ",[61,7509,7510],{},"Math.floorMod",[38,7512,7514],{"id":7513},"in-de-praktijk-python-dict-en-java-hashmap","In de praktijk: Python dict en Java HashMap",[10,7516,7517],{},"Je schrijft zelden je eigen hashtabel, maar je gebruikt er dagelijks een.",[55,7519,7520,7534],{},[58,7521,7522,7530,7531,7533],{},[14,7523,7524,7525,3148,7527],{},"Python ",[61,7526,5349],{},[61,7528,7529],{},"set"," gebruiken open adressering, maar niet met ",[61,7532,5601],{},": de volgende plek wordt\nberekend uit meer bits van de hash, zodat clusters minder snel ontstaan. De tabel groeit zodra hij\nvoor ongeveer twee derde gevuld is.",[58,7535,7536,7541,7542,7545,7546,7548],{},[14,7537,7538,7539],{},"Java ",[61,7540,5353],{}," gebruikt chaining. De standaard maximale load factor is ",[61,7543,7544],{},"0,75","; daarboven\nverdubbelt de tabel. Wordt één lijst langer dan acht elementen (en is de tabel groot genoeg), dan\nmaakt Java er een gebalanceerde boom van, zodat ook het slechtste geval ",[61,7547,5069],{}," blijft.",[10,7550,7551,7552,3102,7555,7558,7559,7561,7562,7565],{},"Voor objecten als sleutel roepen beide ",[61,7553,7554],{},"hash()",[61,7556,7557],{},"hashCode()"," aan. Daarom moet je in Java\n",[61,7560,7557],{}," overschrijven als je ",[61,7563,7564],{},"equals()"," overschrijft: twee gelijke objecten moeten in hetzelfde\nvakje uitkomen, anders vindt de map ze niet terug.",[10,7567,7568,7569,7571,7572,7574,7575,7578,7579,7581,7582,33],{},"Het opzoeken van een sleutel in een ",[61,7570,5349],{}," is dus geen lineair zoeken zoals in\n",[1184,7573,5329],{"href":1186},", maar een berekening. Dat maakt het verschil tussen een ",[61,7576,7577],{},"O(n²)","- en een\n",[61,7580,1088],{},"-oplossing bij veel sollicitatievragen (zie ",[1184,7583,2921],{"href":5094},[38,7585,2922],{"id":2921},[99,7587,7588,7599],{},[102,7589,7590],{},[105,7591,7592,7594,7596],{},[108,7593,113],{},[108,7595,5145],{},[108,7597,7598],{},"Slechtste geval",[121,7600,7601,7613,7627,7639,7651],{},[105,7602,7603,7605,7609],{},[126,7604,5822],{},[126,7606,7607],{},[61,7608,474],{},[126,7610,7611],{},[61,7612,1088],{},[105,7614,7615,7618,7623],{},[126,7616,7617],{},"Invoegen",[126,7619,7620,7622],{},[61,7621,474],{}," (amortized)",[126,7624,7625],{},[61,7626,1088],{},[105,7628,7629,7631,7635],{},[126,7630,5880],{},[126,7632,7633],{},[61,7634,474],{},[126,7636,7637],{},[61,7638,1088],{},[105,7640,7641,7644,7647],{},[126,7642,7643],{},"Rehashen",[126,7645,7646],{},"—",[126,7648,7649],{},[61,7650,1088],{},[105,7652,7653,7656,7660],{},[126,7654,7655],{},"Geheugen",[126,7657,7658],{},[61,7659,1088],{},[126,7661,7662],{},[61,7663,1088],{},[10,7665,7666],{},"Het slechtste geval treedt op als (bijna) alle sleutels dezelfde hashwaarde krijgen: dan heb je één\nlange lijst (chaining) of één lang cluster (probing), en ben je terug bij lineair zoeken. Met een\ngoede hashfunctie en een lage load factor is dat in de praktijk zeldzaam.",[38,7668,3060],{"id":3059},[3062,7670,7671,7685,7694,7708,7714],{},[58,7672,7673,7676,7677,7679,7680,7682,7683,452],{},[14,7674,7675],{},"Wrap-around vergeten."," Valt een sleutel bij ",[61,7678,5384],{}," op vakje 6 en dat is bezet, dan is de\nvolgende poging vakje ",[61,7681,3592],{},", niet vakje ",[61,7684,227],{},[58,7686,7687,7690,7691,7693],{},[14,7688,7689],{},"Stoppen bij het eerste bezette vakje tijdens zoeken."," Je stopt pas bij de sleutel zelf of bij\neen ",[14,7692,2237],{}," vakje. Een bezet vakje met een andere sleutel betekent: doorzoeken.",[58,7695,7696,7699,7700,7702,7703,3076,7705,452],{},[14,7697,7698],{},"Bij chaining vooraan invoegen."," In onze conventie komt een nieuwe sleutel ",[14,7701,281],{}," de lijst:\n",[61,7704,5579],{},[61,7706,7707],{},"34 → 20 → 27",[58,7709,7710,7713],{},[14,7711,7712],{},"Een verwijderd vakje leeg maken bij linear probing."," Daarmee knip je zoekketens door. Gebruik\neen tombstone.",[58,7715,7716,7719,7720,452],{},[14,7717,7718],{},"Bij rehashen de oude posities kopiëren."," Na het vergroten moet je elke sleutel opnieuw hashen\nmet de nieuwe ",[61,7721,5380],{},[38,7723,3137],{"id":3136},[55,7725,7726,7735,7738,7741,7748],{},[58,7727,7728,7729,7732,7733,452],{},"Een hashtabel berekent de plek van een sleutel met ",[61,7730,7731],{},"h(k) = k mod m","; zoeken en invoegen kosten\ngemiddeld ",[61,7734,474],{},[58,7736,7737],{},"Botsingen los je op met chaining (lijst per vakje, achteraan toevoegen) of linear probing\n(volgende vakje, met wrap-around).",[58,7739,7740],{},"Bij linear probing stopt zoeken pas bij de sleutel of een leeg vakje; verwijderen gaat met een\ntombstone.",[58,7742,7743,7744,7747],{},"Houd de load factor ",[61,7745,7746],{},"α = n\u002Fm"," laag; wordt hij te hoog, dan rehash je naar een grotere tabel.",[58,7749,7750,7751,7753],{},"Slechtste geval is ",[61,7752,1088],{},", als alle sleutels op dezelfde plek uitkomen.",[3184,7755,7756],{},"html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .s5tWE, html code.shiki .s5tWE{--shiki-light:#E53935;--shiki-light-font-style:italic;--shiki-default:#F07178;--shiki-default-font-style:italic;--shiki-dark:#F07178;--shiki-dark-font-style:italic}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":482,"searchDepth":510,"depth":510,"links":7758},[7759,7760,7764,7765,7766,7767,7768,7769,7770],{"id":5360,"depth":510,"text":5361},{"id":5425,"depth":510,"text":5426,"children":7761},[7762,7763],{"id":5448,"depth":530,"text":5449},{"id":5588,"depth":530,"text":5589},{"id":5816,"depth":510,"text":5817},{"id":5950,"depth":510,"text":5951},{"id":6107,"depth":510,"text":6108},{"id":7513,"depth":510,"text":7514},{"id":2921,"depth":510,"text":2922},{"id":3059,"depth":510,"text":3060},{"id":3136,"depth":510,"text":3137},"Hoe werkt een hashtabel? Leer hashfuncties, botsingen, chaining en linear probing stap voor stap, plus load factor, rehashen en code in Python en Java.","i-lucide-hash",{},"\u002Fpracticely-dsa\u002Fhashtabellen",{"title":5333,"description":7771},"practicely-dsa\u002Fhashtabellen","hashtabellen","EsIg57LVwl5TrF3wO864vy4tqQTkxKMgwpo2Nn07vnU",1793084907869]