1 00:00:00,000 --> 00:00:02,740 [Powered by Google Translate] [Walk Through - Probleem Stel 5] 2 00:00:02,740 --> 00:00:04,870 [Zamyla Chan - Harvard Universiteit] 3 00:00:04,870 --> 00:00:07,190 [Hierdie is CS50. - CS50.TV] 4 00:00:07,190 --> 00:00:10,400 >> Alles reg. Hallo, almal, en welkom by Walk Through 5. 5 00:00:10,400 --> 00:00:17,400 >> Pset5 is spelfoute, wat ons sal wees om 'n speltoetser. 6 00:00:17,400 --> 00:00:21,030 Speltoetsers is uiters belangrik. 7 00:00:21,030 --> 00:00:23,390 Het dit ooit met jou gebeur? 8 00:00:23,390 --> 00:00:27,170 Jy is baie werk, baie skat op 'n vraestel vir 'n botsing 9 00:00:27,170 --> 00:00:33,120 en dan nog steeds eindig om 'n baie gloei rade soos 'n D of 'n D = 10 00:00:33,120 --> 00:00:39,390 en omdat jy is die leverworst verwoester in die walvis-Wye Woord. 11 00:00:39,390 --> 00:00:44,710 Ja, proeflees jou soetrissies is 'n saak van die uiterste impotensie. 12 00:00:44,710 --> 00:00:49,140 Dit is 'n probleem wat manhaftig, manlike studente. 13 00:00:49,140 --> 00:00:56,260 Ek was een keer vertel deur my sith graad folteraar dat ek nooit sou kry in 'n goeie kollega. 14 00:00:56,260 --> 00:01:00,250 En dit is al wat ek ooit wou hê, dis al enige kind wil op my ouderdom, 15 00:01:00,250 --> 00:01:04,569 net om te kry in 'n goeie kollega. 16 00:01:04,569 --> 00:01:12,720 En nie net 'n kollega. Nee, ek wou om te gaan na 'n Ivory Legal kollega. 17 00:01:12,720 --> 00:01:18,360 So as ek het nie te verbeter, sou gegaan my drome gaan na Harvard, 18 00:01:18,360 --> 00:01:22,730 Jale, of Gevangenis - jy weet, in die gevangenis, New Jersey. 19 00:01:22,730 --> 00:01:25,170 So ek het vir myself 'n speltoetser. 20 00:01:25,170 --> 00:01:29,380 Dit is 'n klein uittreksel uit een van my gunsteling gesproke woord kunstenaars, Taylor Mali. 21 00:01:29,380 --> 00:01:34,630 In elk geval, soos hy sê, die belangrikheid van 'n speltoetser is baie belangrik. 22 00:01:34,630 --> 00:01:39,440 >> So welkom om Walk Through 5, waarin ons sal praat oor pset5: spelfoute, 23 00:01:39,440 --> 00:01:44,300 wat ons sal wees om ons eie speltoetser. 24 00:01:44,300 --> 00:01:50,880 Die toolbox vir hierdie week, die verspreiding kode, gaan belangrik wees om na te kyk 25 00:01:50,880 --> 00:01:54,950 net die verskillende funksies wat jou woordeboek gaan hê om te verstaan. 26 00:01:54,950 --> 00:02:01,500 Ons is eintlik gaan word met verskeie c lêers wat saam ons pset maak. 27 00:02:01,500 --> 00:02:05,420 En so soek deur die verskillende aspekte, selfs al het ons eintlik is nie redigering 28 00:02:05,420 --> 00:02:10,770 een van die lêers, speller.c, te weet hoe dit werk met betrekking tot dictionary.c, 29 00:02:10,770 --> 00:02:14,100 wat ons sal skryf, gaan redelik belangrik. 30 00:02:14,100 --> 00:02:16,970 Die pset spec bevat ook 'n baie nuttige inligting 31 00:02:16,970 --> 00:02:21,360 in terme van die dinge wat jy kan aanneem, reëls en dinge soos wat, 32 00:02:21,360 --> 00:02:24,710 so seker wees dat die pset spec sorgvuldig deur te lees vir wenke. 33 00:02:24,710 --> 00:02:29,310 En toe in twyfel van 'n reël of iets soos dit, dan verwys altyd na die pset spec 34 00:02:29,310 --> 00:02:31,550 of Bespreek. 35 00:02:31,550 --> 00:02:34,060 Gaan Hierdie pset is swaar op pointers, 36 00:02:34,060 --> 00:02:37,890 sodat ons wil hê om seker te maak dat ons verstaan ​​die verskil tussen die toevoeging van sterre 37 00:02:37,890 --> 00:02:41,680 in die voorkant van die wyser se naam en-karakters, hoe om hulle te bevry, ens. 38 00:02:41,680 --> 00:02:47,550 So 'n meester van wysers gaan wees baie nuttig in hierdie probleem stel. 39 00:02:47,550 --> 00:02:50,460 Ons gaan kyk 'n bietjie meer in geskakelde lyste, 40 00:02:50,460 --> 00:02:57,790 waar ons elemente wat ons noem nodes wat beide 'n waarde sowel as 'n wyser 41 00:02:57,790 --> 00:03:02,520 aan die volgende node, en so in wese wat verskillende elemente een na die ander. 42 00:03:02,520 --> 00:03:07,190 Daar is 'n paar verskillende opsies van die uitvoering van jou werklike woordeboek. 43 00:03:07,190 --> 00:03:13,150 Ons gaan in twee hoof-metodes, wat hash tabelle en dan probeer om te kyk. 44 00:03:13,150 --> 00:03:17,660 In beide van hulle, hulle betrek 'n soort van die idee van 'n geskakelde lys 45 00:03:17,660 --> 00:03:20,790 waar jy elemente aan mekaar verbind. 46 00:03:20,790 --> 00:03:25,640 En so gaan ons te kyk oor hoe jy dalk in staat wees om te bedryf rondom geskakelde lyste, 47 00:03:25,640 --> 00:03:29,680 skep, opgevolg in terme van hoe om, byvoorbeeld, voeg 'n nodus in 48 00:03:29,680 --> 00:03:32,760 of gratis al die nodes sowel. 49 00:03:32,760 --> 00:03:34,740 In terme van bevry nodes, wat is regtig belangrik 50 00:03:34,740 --> 00:03:37,700 dat wanneer ons daarna malloc geheue, is ons vry om dit. 51 00:03:37,700 --> 00:03:42,910 Daarom wil ons maak seker dat geen wyser gaan unfreed, dat ons nie enige geheue lekkasies. 52 00:03:42,910 --> 00:03:48,330 Ons gaan 'n hulpmiddel genaamd Valgrind wat jou program loop in te voer 53 00:03:48,330 --> 00:03:52,260 en tjeks of al die geheue wat jy toegeken word dan vrygelaat. 54 00:03:52,260 --> 00:03:59,080 Voltooi Jou pset word slegs wanneer dit werk en dit het volle funksionaliteit, 55 00:03:59,080 --> 00:04:03,990 maar ook Valgrind jou vertel dat jy nie gevind het nie enige geheue lekkasies. 56 00:04:03,990 --> 00:04:06,690 Ten slotte, vir hierdie pset, ek wil regtig om te beklemtoon - 57 00:04:06,690 --> 00:04:11,360 Ek bedoel, soos gewoonlik, is ek beslis 'n ondersteuner van die gebruik van pen en papier vir jou probleem stelle, 58 00:04:11,360 --> 00:04:14,840 maar vir hierdie een, ek dink dat pen en papier gaan wees veral belangrik 59 00:04:14,840 --> 00:04:19,000 wanneer jy wil teken pyle om dinge te doen en te verstaan ​​hoe dinge werk. 60 00:04:19,000 --> 00:04:24,440 So beslis probeer om pen en papier te gebruik om dinge uit te trek voordat jy kodering 61 00:04:24,440 --> 00:04:26,970 want dit kan 'n bietjie slordig. 62 00:04:26,970 --> 00:04:30,700 >> Eerstens, laat ons gaan 'n bietjie in geskakelde lyste. 63 00:04:30,700 --> 00:04:35,510 Geskakelde lyste bestaan ​​van nodes, waar elke node het 'n waarde wat verband hou met dit, 64 00:04:35,510 --> 00:04:39,810 sowel as 'n wyser na die volgende node nadat dit. 65 00:04:39,810 --> 00:04:43,680 'N paar van die dinge wat belangrik is met die geskakelde lyste is wat ons nodig het om te onthou 66 00:04:43,680 --> 00:04:48,810 waar ons eerste node is, en dan weer ons weet waar die eerste node is, 67 00:04:48,810 --> 00:04:52,990 dié manier kan ons toegang tot die knoop wat die eerste nodus van punte te 68 00:04:52,990 --> 00:04:55,850 en dan die een daarna en die een daarna. 69 00:04:55,850 --> 00:05:00,340 En dan die laaste element in jou geskakelde lys is dat die node se wyser 70 00:05:00,340 --> 00:05:02,340 is altyd gaan om te wys word VRYGEMAAK. 71 00:05:02,340 --> 00:05:08,230 Wanneer 'n node punte aan nul is, dan weet jy dat jy die einde van die lys bereik het, 72 00:05:08,230 --> 00:05:12,320 dat node is die laaste een, dat daar is niks daarna. 73 00:05:12,320 --> 00:05:16,970 Hier in hierdie skematiese, sien jy dat die pyle is die wysers, 74 00:05:16,970 --> 00:05:20,290 en die blou gedeelte is waar die waarde gestoor word, 75 00:05:20,290 --> 00:05:24,420 en dan die rooi blokkie met die wyser na die node se wyser 76 00:05:24,420 --> 00:05:27,050 verwys na die volgende node nadat dit. 77 00:05:27,050 --> 00:05:33,730 En so sien jy hier, die D-node wys word VRYGEMAAK, want dit is die laaste element in die lys. 78 00:05:33,730 --> 00:05:38,240 >> Kom ons kyk na hoe ons kan 'n struct definieer vir 'n knoop. 79 00:05:38,240 --> 00:05:40,130 En omdat ons wil verskeie nodes te hê, 80 00:05:40,130 --> 00:05:43,180 dit gaan om 'n typedef struct 81 00:05:43,180 --> 00:05:46,870 wat ons gaan verskeie gevalle van nodes te hê. 82 00:05:46,870 --> 00:05:50,850 En so het ons dit definieer as 'n nuwe datatipe. 83 00:05:50,850 --> 00:05:53,630 Hier het ons 'n typedef struct node. 84 00:05:53,630 --> 00:05:56,160 In hierdie voorbeeld, is ons te make met integer nodes, 85 00:05:56,160 --> 00:06:00,490 so ons het 'n heelgetal genoem waarde en dan het ons nog 'n wyser, 86 00:06:00,490 --> 00:06:07,390 en in hierdie geval, dit is 'n wyser na 'n node, so ons het 'n struct node * genoem volgende. 87 00:06:07,390 --> 00:06:09,520 En dan het ons die roeping van hierdie hele ding node. 88 00:06:09,520 --> 00:06:11,110 Maak seker dat u hierdie sintaksis. 89 00:06:11,110 --> 00:06:17,940 Let daarop dat node is eintlik gekla bo sowel as onder die kode tussen krulhakies. 90 00:06:17,940 --> 00:06:23,400 Dan om tred te hou van waar my eerste node is in hierdie geskakelde lys, 91 00:06:23,400 --> 00:06:29,390 dan het ek 'n node pointer genoem kop, en ek malloc genoeg ruimte vir die grootte van 'n node. 92 00:06:29,390 --> 00:06:36,240 Kennisgewing, egter, dat die kop is eintlik 'n node wyser as in teenstelling met 'n werklike node self. 93 00:06:36,240 --> 00:06:40,130 So die kop eintlik nie enige waarde bevat, 94 00:06:40,130 --> 00:06:45,590 Dit wys net na wat ookal die eerste node in my geskakelde lys is. 95 00:06:55,080 --> 00:06:58,340 >> 'N beter begrip van geskakelde lyste te kry, want dit is baie belangrik 96 00:06:58,340 --> 00:07:02,220 om tred te hou om seker te maak dat jy die ketting in stand te hou, 97 00:07:02,220 --> 00:07:09,990 Ek hou daarvan om te dink aan dit as mense in 'n lyn hande vashou, 98 00:07:09,990 --> 00:07:14,330 waar elke persoon hou hande met die volgende een. 99 00:07:14,330 --> 00:07:18,350 Jy nie kan sien in hierdie tekening, maar basies het hulle verwys na die volgende persoon 100 00:07:18,350 --> 00:07:23,760 wat in die ketting. 101 00:07:23,760 --> 00:07:29,270 En so, as jy wil 'n geskakelde lys waar hierdie mense om oor te steek - 102 00:07:29,270 --> 00:07:32,830 dink al die mense het waardes wat verband hou met hulle 103 00:07:32,830 --> 00:07:36,590 en ook verwys na die volgende persoon in die lyn - 104 00:07:36,590 --> 00:07:40,810 as jy wil die geskakelde lys te verken, byvoorbeeld, om óf die waardes wysig 105 00:07:40,810 --> 00:07:42,830 of soek vir 'n waarde of iets soos dit, 106 00:07:42,830 --> 00:07:48,270 dan moet jy 'n wyser na die spesifieke persoon te hê. 107 00:07:48,270 --> 00:07:52,670 So ons gaan 'n data tipe node wyser te hê. 108 00:07:52,670 --> 00:07:55,580 Vir hierdie geval, laat ons noem dit wyser. 109 00:07:55,580 --> 00:07:59,630 Nog 'n algemene manier om dit te noem Iterator of iets soos dit sou wees 110 00:07:59,630 --> 00:08:05,130 want dit is iterating oor en eintlik beweeg watter node dit verwys na. 111 00:08:05,130 --> 00:08:14,410 Dit hier sal ons wyser wees. 112 00:08:14,410 --> 00:08:20,180 Ons wyser sal eers verwys na die eerste element in ons lys. 113 00:08:20,180 --> 00:08:26,910 En so wat ons wil doen, is ons sou basies die voortsetting van die wyser, 114 00:08:26,910 --> 00:08:29,130 om dit van kant tot kant. 115 00:08:29,130 --> 00:08:33,409 In hierdie geval, ons wil om dit te skuif na die volgende element in die lys. 116 00:08:33,409 --> 00:08:38,480 Met skikkings, wat ons sou doen, is ons net sou sê dat ons die indeks verhoog deur 1. 117 00:08:38,480 --> 00:08:46,020 In hierdie geval, is eintlik wat ons nodig het om te doen vind watter persoon die huidige persoon wys, 118 00:08:46,020 --> 00:08:48,930 en wat gaan die volgende waarde wees. 119 00:08:48,930 --> 00:08:53,230 So as wyser is net 'n node wyser, dan wat ons wil doen 120 00:08:53,230 --> 00:08:56,320 is ons wil te kry om die waarde wat die wyser wys. 121 00:08:56,320 --> 00:09:01,350 Ons wil te kry om daardie node en dan, sodra ons op daardie node, waar dit verwys na. 122 00:09:01,350 --> 00:09:05,820 Te kry om die werklike node dat die wyser wys, 123 00:09:05,820 --> 00:09:13,160 gewoonlik dui ons dit deur (* wyser). 124 00:09:13,160 --> 00:09:19,160 Dit sou gee jou die werklike node dat die wyser wys. 125 00:09:19,160 --> 00:09:21,730 En dan na dat, wat ons wil doen, is wat ons wil om toegang te verkry tot 126 00:09:21,730 --> 00:09:25,680 wat dit ook al node se volgende waarde is. 127 00:09:25,680 --> 00:09:32,820 Dit te doen, om toegang te verkry tot die waardes binnekant van die struct, ons het die dot-operateur. 128 00:09:32,820 --> 00:09:39,530 So dan is dit sou wees (* wyser). Volgende. 129 00:09:39,530 --> 00:09:44,840 Maar dit is 'n bietjie slordig in terme van die hakies om die * wyser, 130 00:09:44,840 --> 00:09:56,800 en so het ons hierdie hele verklaring vervang met muis->. 131 00:09:56,800 --> 00:10:02,700 Dit is 'n bietjie en dan 'n groter as teken, sodat die maak van 'n pyl. 132 00:10:02,700 --> 00:10:05,840 muis-> Volgende. 133 00:10:05,840 --> 00:10:12,390 Wat eintlik kry jy die knoop wat die wyser punte. Dat die waarde van die volgende is. 134 00:10:12,390 --> 00:10:16,790 Dus, in plaas van met die ster en die dot jy die vervanging met 'n pyl. 135 00:10:16,790 --> 00:10:24,820 Wees baie versigtig wees om seker te maak dat jy probeer om hierdie sintaksis te gebruik. 136 00:10:33,550 --> 00:10:37,620 >> Nou dat ons ons wyser as ons wil hê om toegang te verkry tot die waarde, 137 00:10:37,620 --> 00:10:40,450 voor, het ons wyser-> Volgende 138 00:10:40,450 --> 00:10:46,260 maar die waarde op die knoop om toegang te verkry dat die wyser wys, het ons net net sê 139 00:10:46,260 --> 00:10:48,070 node-> waarde. 140 00:10:48,070 --> 00:10:53,600 Van daar, dit is van datatipe wat ons ook al die waardes en die nodes om te wees het gedefinieer. 141 00:10:53,600 --> 00:10:59,620 As dit is 'n int node, dan muis-> waarde is net gaan om 'n heelgetal te wees. 142 00:10:59,620 --> 00:11:04,870 Sodat ons bedrywighede kan doen, gaan gelijkheid, toewys verskillende waardes, ens. 143 00:11:04,870 --> 00:11:11,090 So dan wat jy wil doen as jy jou muis om te beweeg na die volgende persoon, 144 00:11:11,090 --> 00:11:15,270 jy eintlik die waarde van die wyser verander. 145 00:11:15,270 --> 00:11:19,340 Sedert die wyser is 'n node pointer, jy verander die werklike pointer adres 146 00:11:19,340 --> 00:11:23,890 aan die adres van die volgende node in jou lys. 147 00:11:23,890 --> 00:11:28,930 Dit is net 'n paar Poskode waar jy kan itereer. 148 00:11:28,930 --> 00:11:31,230 Waar ek die opmerking om iets te doen, 149 00:11:31,230 --> 00:11:33,850 dis waar jy waarskynlik gaan om toegang te verkry tot die waarde 150 00:11:33,850 --> 00:11:37,850 of doen iets om te doen met daardie spesifieke nodus. 151 00:11:37,850 --> 00:11:43,050 Dit aan die gang, ek sê dat my wyser aanvanklik 152 00:11:43,050 --> 00:11:48,430 gaan om te wys op die eerste element in die geskakelde lys. 153 00:11:48,430 --> 00:11:52,910 En so wat voorlê, ek het dit gedefinieer as die hoof van die node. 154 00:11:52,910 --> 00:11:57,610 >> Soos ek voorheen genoem, bevry is werklik belangrik is. 155 00:11:57,610 --> 00:12:02,440 Jy wil om seker te maak dat jy bevry elke element in die lys sodra jy klaar is met dit. 156 00:12:02,440 --> 00:12:04,940 As jy hoef nie enige van daardie wysers meer verwysing, 157 00:12:04,940 --> 00:12:10,620 jy wil om seker te maak dat jy vry om al van daardie wysers. 158 00:12:10,620 --> 00:12:14,460 Maar jy wil baie versigtig te wees hier in wat jy wil enige geheue lekkasies te voorkom. 159 00:12:14,460 --> 00:12:25,080 As jy gratis een persoon vroeg, dan is al die wenke dat node punte 160 00:12:25,080 --> 00:12:26,900 verlore gaan. 161 00:12:26,900 --> 00:12:32,070 Terug te gaan na die persoon voorbeeld te maak dit 'n bietjie meer high stakes, 162 00:12:32,070 --> 00:12:49,600 laat ons hierdie mense, behalwe in hierdie geval het hulle beweeg oor 'n dam met 'n monster. 163 00:12:49,600 --> 00:12:53,200 Ons wil hê om seker te maak dat wanneer ons gratis, maar ons verloor nie 164 00:12:53,200 --> 00:12:58,920 en laat gaan van enige nodes voordat ons het hulle eintlik bevry. 165 00:12:58,920 --> 00:13:05,730 Byvoorbeeld, as jy was om te noem net gratis op hierdie man hier, 166 00:13:05,730 --> 00:13:15,350 dan sou hy vrygelaat word, maar dan al hierdie ouens sal dan verlore wees 167 00:13:15,350 --> 00:13:18,450 en hulle sou wegraak en val neer. 168 00:13:18,450 --> 00:13:24,900 Sodat ons wil hê om seker te maak dat in plaas daarvan, ons wil 'n skakel na die res te handhaaf. 169 00:13:37,630 --> 00:13:42,480 Ons hoof pointer, wat wys na die eerste element in die lys. 170 00:13:42,480 --> 00:13:49,990 Dit is soort van soos 'n tou anker die eerste persoon. 171 00:13:52,870 --> 00:13:57,470 Wat wil jy dalk om te doen wanneer jy vry is 'n lys het - 172 00:13:57,470 --> 00:14:04,520 As jy wil hê dat die eerste element eerste vrye, dan kan jy 'n tydelike pointer 173 00:14:04,520 --> 00:14:07,370 wat dui op alles wat die eerste element is. 174 00:14:07,370 --> 00:14:11,420 Sodat jy jou tydelike wyser wys hier. 175 00:14:11,420 --> 00:14:15,840 Op dié manier, ons het 'n houvas van die eerste nodus. 176 00:14:15,840 --> 00:14:18,930 En dan, omdat ons weet dat die eerste nodus gaan word bevry, 177 00:14:18,930 --> 00:14:24,890 dan kan ons hierdie tou, hierdie anker, ons hoof beweeg, 178 00:14:24,890 --> 00:14:31,930 om werklik te wys wat die eerste een wys. 179 00:14:31,930 --> 00:14:38,760 So is hierdie kop wys eintlik nou tot die tweede element. 180 00:14:38,760 --> 00:14:43,980 Nou is ons toegelaat om te bevry wat gestoor word in temp, 181 00:14:43,980 --> 00:14:53,360 en so kan ons vee sonder dat dit in gevaar stel al die ander nodusse in ons lys. 182 00:14:54,140 --> 00:15:05,020 Nog 'n manier dat jy dit kan doen, kan 183 00:15:05,020 --> 00:15:08,650 elke keer as jy net vry om die laaste element in die lys 184 00:15:08,650 --> 00:15:11,010 want hulle is gewaarborg om nie gewys word tot niks. 185 00:15:11,010 --> 00:15:15,570 Sodat jy kan net vry om hierdie een, dan vry om hierdie een, dan is gratis hierdie een. 186 00:15:15,570 --> 00:15:21,900 Dit werk beslis, maar is 'n bietjie stadiger, want deur die aard van die geskakelde lyste, 187 00:15:21,900 --> 00:15:24,670 ons kan net nie dadelik spring tot die laaste een. 188 00:15:24,670 --> 00:15:28,030 Ons het elke element in die geskakelde lys te verken 189 00:15:28,030 --> 00:15:31,020 en kyk of dat 'n mens verwys na VRYGEMAAK, so elke keer, 190 00:15:31,020 --> 00:15:33,780 en dan wanneer ons aan die einde, dan is gratis dat. 191 00:15:33,780 --> 00:15:40,270 As jy hierdie proses was om te doen, jy sou eintlik beheer word, 192 00:15:40,270 --> 00:15:44,190 kontrolering hier, dan kontroleer hier, bevry dit, 193 00:15:44,190 --> 00:15:47,470 dan weer terug, nagaan hier, nagaan hier, bevry dit, 194 00:15:47,470 --> 00:15:49,660 nagaan, en dit dan bevry. 195 00:15:49,660 --> 00:15:52,880 Dit neem 'n bietjie meer tyd. Ja. 196 00:15:52,880 --> 00:15:59,060 >> [Student] Sou dit moontlik wees om 'n geskakelde lys te maak wat 'n afrit wyser aan die einde slaan? 197 00:15:59,060 --> 00:16:01,320 Dit sou beslis moontlik wees nie. 198 00:16:01,320 --> 00:16:08,340 Die vraag te herhaal, is dit moontlik 'n geskakelde lys struktuur te hê 199 00:16:08,340 --> 00:16:12,490 van so 'n aard dat jy het 'n wyser wys aan die einde van die geskakelde lys? 200 00:16:12,490 --> 00:16:18,090 Ek sou sê dit is moontlik, en elke keer wat jy plaas iets in jou geskakelde lys 201 00:16:18,090 --> 00:16:21,470 wat jy wil hê dat die wyser en dinge soos wat te werk. 202 00:16:21,470 --> 00:16:26,640 Jy sal 'n node * stert, byvoorbeeld. 203 00:16:26,640 --> 00:16:29,840 Maar wanneer jy hierdie funksie is die uitvoering van, jy het om te dink van die trade-offs, 204 00:16:29,840 --> 00:16:32,700 graag hoeveel keer gaan ek word iterating oor hierdie, 205 00:16:32,700 --> 00:16:36,100 hoe moeilik dit gaan wees spoor van die stert te hou, sowel as die hoof 206 00:16:36,100 --> 00:16:38,400 sowel as my Iterator, en dinge soos dat. 207 00:16:40,730 --> 00:16:42,480 Beteken dit? >> [Student] Ja. 208 00:16:42,480 --> 00:16:48,270 Dit is moontlik, maar in terme van ontwerp besluite te neem, moet jy die opsies op te weeg. 209 00:16:53,850 --> 00:17:01,090 >> Hier is 'n geraamte van die kode wat sal toelaat dat jy elke element in 'n geskakelde lys te bevry. 210 00:17:01,090 --> 00:17:05,460 Weereens, want ek is meer as 'n geskakelde lys iterating, ek gaan om te wil 'n soort van die muis te hê 211 00:17:05,460 --> 00:17:08,670 of Iterator. 212 00:17:08,670 --> 00:17:14,640 Ons is iterating totdat die wyser is NULL. 213 00:17:14,640 --> 00:17:17,640 Jy nie wil hê om te itereer wanneer jou merker NULL 214 00:17:17,640 --> 00:17:20,579 want dit beteken dat daar is nie iets wat in die lys. 215 00:17:20,579 --> 00:17:25,069 So, hier is Ek maak 'n tydelike node * 216 00:17:25,069 --> 00:17:29,610 verwys na wat ek oorweeg is die eerste van my lys, 217 00:17:29,610 --> 00:17:35,340 en dan het ek my wyser beweeg voor 1 en dan vry alles wat ek gehad het in die tydelike stoor. 218 00:17:38,460 --> 00:17:43,650 >> Nou kom ons by invoeging in geskakelde lyste. 219 00:18:00,200 --> 00:18:09,660 Ek het drie nodes in my geskakelde lys, en laat ons saam met die eenvoudige geval 220 00:18:09,660 --> 00:18:18,970 waar ons wil hê ander node te voeg aan die einde van ons geskakelde lys. 221 00:18:18,970 --> 00:18:25,980 Dit te doen, alles wat ons wil doen, is om ons wil deurkruis 222 00:18:25,980 --> 00:18:32,100 om uit te vind waar die einde van die geskakelde lys is, so ook al node wys word VRYGEMAAK - 223 00:18:32,100 --> 00:18:33,850 wat is hierdie een - 224 00:18:33,850 --> 00:18:37,260 en dan sê, eintlik, hierdie een is nie van plan om die laaste nodus wees; 225 00:18:37,260 --> 00:18:39,830 ons eintlik gaan 'n ander een te hê. 226 00:18:39,830 --> 00:18:46,260 So sou ons die huidige een punt wat ons die invoeging. 227 00:18:46,260 --> 00:18:50,080 So nou die rooi persoon word hier die laaste nodus in die geskakelde lys. 228 00:18:50,080 --> 00:18:56,080 En so het die kenmerk van die laaste nodus in die geskakelde lys is dat dit dui op VRYGEMAAK. 229 00:18:56,080 --> 00:19:09,380 So dan wat ons wil hê om dit te doen, is stel die rooi man se wyser word VRYGEMAAK. Daar. 230 00:19:09,380 --> 00:19:25,370 >> Maar wat as ons wou 'n node in tussen die tweede en derde een te voeg? 231 00:19:25,370 --> 00:19:28,960 Dat 'n mens nie heeltemal so eenvoudig nie, want ons wil om seker te maak 232 00:19:28,960 --> 00:19:34,290 wat ons laat gaan nie van enige node in ons geskakelde lys. 233 00:19:34,290 --> 00:19:43,450 Wat ons wil hê om dit te doen, is om seker te maak dat ons onsself anker aan elke een. 234 00:19:43,450 --> 00:19:49,900 Byvoorbeeld, kom ons noem dit die tweede een. 235 00:19:49,900 --> 00:19:54,390 As jy sê die tweede een wys nou na die nuwe een 236 00:19:54,390 --> 00:20:02,520 en jy het net 'n wyser gemaak het, wat tot gevolg sal hê in hierdie man verlore 237 00:20:02,520 --> 00:20:07,830 want daar is nie 'n skakel na hom. 238 00:20:07,830 --> 00:20:18,970 In plaas daarvan - ek sal trek dit weer. Verskoon my artistieke vermoëns. 239 00:20:18,970 --> 00:20:26,570 Ons weet dat ons net kan nie direk koppel 2 na die nuwe een. 240 00:20:26,570 --> 00:20:30,480 Ons het om seker te maak dat ons hou op die laaste een. 241 00:20:30,480 --> 00:20:39,200 Wat ons wil doen is om 'n tydelike pointer 242 00:20:39,200 --> 00:20:42,650 die element wat gaan word aangeheg. 243 00:20:42,650 --> 00:20:45,140 So dan het ons 'n tydelike wyser daar. 244 00:20:45,140 --> 00:20:50,780 Omdat ons weet dat hierdie derde een is die baan gehou word, 245 00:20:50,780 --> 00:20:53,680 2 kan nou 'n skakel na ons nuwe een. 246 00:20:53,680 --> 00:20:57,490 En as hierdie nuwe rooi man is gaan om te wees in tussen 2 en 3, 247 00:20:57,490 --> 00:21:05,550 wat dan daardie man se wyser gaan om aan te dui? >> [Student] Temp. 248 00:21:05,550 --> 00:21:07,490 Temp. Ja. 249 00:21:07,490 --> 00:21:15,430 So dan die rooi man se waarde gaan wees temp. 250 00:21:26,090 --> 00:21:33,010 Wanneer jy die invoeging in geskakelde lyste, sien ons dat ons kon 251 00:21:33,010 --> 00:21:38,260 maklik iets byvoeg tot die einde deur die skep van 'n tydelike skikking, 252 00:21:38,260 --> 00:21:42,850 of as ons wou iets by te voeg in die middel van ons verskeidenheid, 253 00:21:42,850 --> 00:21:46,810 dan sou dit 'n bietjie meer skuifel rond. 254 00:21:46,810 --> 00:21:50,240 As jy wil, byvoorbeeld, het 'n gesorteerde geskakelde lys, 255 00:21:50,240 --> 00:21:54,880 dan moet jy soort van weeg die koste en voordele van daardie 256 00:21:54,880 --> 00:21:59,720 want as jy wil 'n gesorteerde skikking te hê, beteken dit dat elke keer wat jy plaas in dit, 257 00:21:59,720 --> 00:22:01,630 dit gaan om 'n bietjie meer tyd te neem. 258 00:22:01,630 --> 00:22:05,500 Maar, as jy wil later op, soos ons sal vind sal ons wil, 259 00:22:05,500 --> 00:22:10,280 soektog deur 'n geskakelde lys, dan is dit dalk makliker wees as jy weet dat alles in orde is. 260 00:22:10,280 --> 00:22:15,340 Sodat jy dalk wil om te weeg die koste en voordele van daardie. 261 00:22:20,150 --> 00:22:27,740 >> Nog 'n manier om in te voeg in 'n geskakelde lys is in die begin van 'n lys te voeg. 262 00:22:27,740 --> 00:22:34,700 As ons ons anker trek hier - dit is ons hoof - 263 00:22:34,700 --> 00:22:40,960 en dan het hierdie mense wat daaraan gekoppel is, 264 00:22:40,960 --> 00:22:48,460 en dan het ons 'n nuwe node ingevoeg word in die begin, 265 00:22:48,460 --> 00:22:52,590 dan wat sou ons wil om dit te doen? 266 00:22:55,220 --> 00:23:03,580 Wat sou verkeerd wees met net sê: Ek wil die rooi om te skakel na die blou, 267 00:23:03,580 --> 00:23:05,790 want dit is die eerste een? 268 00:23:05,790 --> 00:23:08,570 Wat sou hier gebeur? 269 00:23:08,570 --> 00:23:12,130 Al van hierdie drie sou verlore raak. 270 00:23:12,130 --> 00:23:14,140 Sodat ons nie wil hê om dit te doen. 271 00:23:14,140 --> 00:23:21,430 Weer, het ons geleer dat ons moet 'n soort van tydelike wyser te hê. 272 00:23:21,430 --> 00:23:34,470 Kom ons kies 'n tydelike punt aan hierdie man te hê. 273 00:23:34,470 --> 00:23:39,640 Dan kan ons die blou een punt na die tydelike 274 00:23:39,640 --> 00:23:43,240 en dan die rooi punt na die blou. 275 00:23:43,240 --> 00:23:47,830 Die rede waarom ek gebruik mense hier is omdat ons regtig wil om te visualiseer 276 00:23:47,830 --> 00:23:53,180 vashou aan mense en om seker te maak dat ons 'n skakel na hulle 277 00:23:53,180 --> 00:23:57,590 voordat ons laat gaan van 'n ander hand of iets soos dit. 278 00:24:05,630 --> 00:24:10,650 >> Nou dat ons 'n gevoel van geskakelde lyste - hoe ons kan skep 'n geskakelde lys 279 00:24:10,650 --> 00:24:15,090 en die skep van die strukture wat bestaan ​​uit die tipe definisie vir 'n node 280 00:24:15,090 --> 00:24:19,060 en dan om seker te maak dat ons 'n wyser na die hoof van die geskakelde lys - 281 00:24:19,060 --> 00:24:23,210 wanneer ons dit en ons weet hoe om te deurkruis deur middel van 'n skikking, 282 00:24:23,210 --> 00:24:28,200 toegang tot verskillende elemente, ons weet hoe om te voeg en ons weet hoe om hulle te bevry, 283 00:24:28,200 --> 00:24:30,260 dan kan ons in spelfoute. 284 00:24:30,260 --> 00:24:38,150 Soos gewoonlik het ons 'n afdeling van vrae wat sal jy gebruik om te werk met geskakelde lyste 285 00:24:38,150 --> 00:24:41,750 en verskillende strukture soos toue en stapels. 286 00:24:41,750 --> 00:24:46,000 Dan kan ons beweeg in spelfoute. 287 00:24:46,000 --> 00:24:55,170 >> Spelfouten het in die verspreiding-kode 'n paar van die lêers van belang. 288 00:24:55,170 --> 00:24:58,850 Eerste keer wat ons opmerk dat ons hierdie makefile hier, 289 00:24:58,850 --> 00:25:03,040 wat ons regtig nie vantevore teengekom. 290 00:25:03,040 --> 00:25:10,090 As jy kyk binne die pset5 gids, sal jy agterkom dat jy 'n h-lêer. 291 00:25:10,090 --> 00:25:12,530 dan moet jy twee c lêers. 292 00:25:12,530 --> 00:25:18,920 Wat hierdie makefile doen is voor, ons sou net tik maak en dan die program se naam 293 00:25:18,920 --> 00:25:25,550 en dan sal ons sien al hierdie argumente en vlae geslaag het in die vertaler. 294 00:25:25,550 --> 00:25:30,580 Wat die makefile doen, is stel ons in staat om verskeie lêers in 'n keer op te stel 295 00:25:30,580 --> 00:25:34,650 en slaag in die vlae wat ons wil hê. 296 00:25:34,650 --> 00:25:41,300 Hier het ons net sien daar is 'n header-lêer hier. 297 00:25:41,300 --> 00:25:43,730 Dan het ons eintlik twee bronkodelêers. 298 00:25:43,730 --> 00:25:47,520 Ons het speller.c en dictionary.c. 299 00:25:47,520 --> 00:25:54,560 Jy is welkom om die makefile te wysig as jy wil. 300 00:25:54,560 --> 00:26:03,310 Let op dat hier as jy tik skoon is, dan is wat dit doen nie eintlik iets verwyder 301 00:26:03,310 --> 00:26:06,340 wat is die kern. 302 00:26:06,340 --> 00:26:09,190 As jy 'n segmentering skuld, basies jy 'n kern dump. 303 00:26:09,190 --> 00:26:13,260 So sal hierdie lelike klein lêer verskyn in jou gids genoem kern. 304 00:26:13,260 --> 00:26:16,310 Jy sal wil hê om te verwyder dat dit skoon te maak. 305 00:26:16,310 --> 00:26:20,940 Dit verwyder enige exe lêers en o lêers. 306 00:26:27,900 --> 00:26:30,220 >> Kom ons neem 'n blik in dictionary.h. 307 00:26:30,220 --> 00:26:34,410 Dit sê dat dit 'n woordeboek se funksionaliteit verklaar. 308 00:26:34,410 --> 00:26:39,530 Ons het 'n maksimum lengte vir 'n woord in die woordeboek. 309 00:26:39,530 --> 00:26:45,130 Ons sê dat dit gaan om die langste moontlike woord wees. Dit is van lengte 45. 310 00:26:45,130 --> 00:26:48,900 So gaan ons nie enige woorde wat oorskry lengte te hê. 311 00:26:48,900 --> 00:26:50,980 Hier het ons net die funksie prototipes. 312 00:26:50,980 --> 00:26:55,290 Ons het nie die werklike implementering, want dit is wat ons sal moet doen vir hierdie pset. 313 00:26:55,290 --> 00:26:59,940 Maar wat dit doen omdat ons te doen het met groter lêers hier 314 00:26:59,940 --> 00:27:06,650 en funksionaliteit op 'n groter skaal, is dit nuttig om 'n H-lêer te hê 315 00:27:06,650 --> 00:27:11,290 sodat iemand anders te lees of te gebruik om jou kode kan verstaan ​​wat aangaan. 316 00:27:11,290 --> 00:27:17,910 En miskien is hulle wil om te implementeer, probeer as jy gedoen het hash tabelle of vice versa. 317 00:27:17,910 --> 00:27:21,850 Dan sal hulle sê my vrag funksie, 318 00:27:21,850 --> 00:27:26,950 die werklike implementering gaan verskil, maar hierdie prototipe sal nie verander nie. 319 00:27:26,950 --> 00:27:33,280 Hier het ons gaan, wat terugkeer waar as 'n gegewe woord in die woordeboek. 320 00:27:33,280 --> 00:27:39,800 Dan het ons 'n las, wat basies neem in 'n woordeboek lêer 321 00:27:39,800 --> 00:27:44,360 en laai dan is dit in sommige data struktuur. 322 00:27:44,360 --> 00:27:47,500 Ons het grootte, wat, toe hy geroep is, gee die grootte van jou woordeboek, 323 00:27:47,500 --> 00:27:50,310 Hoeveel woorde is gestoor in dit, 324 00:27:50,310 --> 00:27:54,390 en dan los, wat bevry al die geheue wat jy geneem het 325 00:27:54,390 --> 00:27:57,900 terwyl die maak van jou woordeboek. 326 00:28:01,070 --> 00:28:03,590 >> Kom ons neem 'n blik op dictionary.c. 327 00:28:03,590 --> 00:28:10,490 Ons sien dat dit lyk baie soortgelyk na dictionary.h, behalwe nou is dit net het al van hierdie Todos. 328 00:28:10,490 --> 00:28:16,980 En so het dit is jou werk. Uiteindelik, sal jy vul word speller.c met al van hierdie kode. 329 00:28:16,980 --> 00:28:21,540 Dictionary.c, toe loop, is regtig nie van plan om iets te doen, 330 00:28:21,540 --> 00:28:29,590 so ons kyk na speller.c die werklike implementering van die speltoetser te sien. 331 00:28:29,590 --> 00:28:32,060 Selfs al is jy nie van plan om die wysiging van enige van hierdie kode, 332 00:28:32,060 --> 00:28:38,050 dit is belangrik om te lees, verstaan ​​wanneer vrag genoem, wanneer Ek roep tjek, 333 00:28:38,050 --> 00:28:42,350 net om te verstaan, kaart dit uit, sien hoe die funksie werk. 334 00:28:42,350 --> 00:28:49,860 Sien ons dat dit kontroleer vir die korrekte gebruik. 335 00:28:49,860 --> 00:28:55,200 Wese, wanneer iemand loop speller, dit dui daarop dat dit is opsioneel 336 00:28:55,200 --> 00:29:00,950 vir hulle om te slaag in 'n woordeboek lêer, want daar gaan 'n standaard woordeboek lêer. 337 00:29:00,950 --> 00:29:05,410 En dan sal hulle het om te slaag in die teks te wees spelling nagegaan. 338 00:29:05,410 --> 00:29:11,410 rusage handel met die verloop van tyd, omdat 'n deel van hierdie pset wat ons sal hanteer later 339 00:29:11,410 --> 00:29:14,790 is nie net om 'n funksionerende speltoetser werk 340 00:29:14,790 --> 00:29:17,190 maar eintlik om dit te vinnig. 341 00:29:17,190 --> 00:29:22,040 En so dan is dit waar rusage gaan kom. 342 00:29:22,040 --> 00:29:28,740 Hier, sien ons die eerste oproep na een van ons dictionary.c lêers wat vrag. 343 00:29:28,740 --> 00:29:34,720 Load terugkeer waar of onwaar is - waar op sukses, valse op mislukking. 344 00:29:34,720 --> 00:29:41,400 So as die woordeboek is nie gelaai, dan sal die speller.c terug 1 en stop. 345 00:29:41,400 --> 00:29:47,920 Maar as dit nie vrag behoorlik, dan is dit gaan om voort te gaan. 346 00:29:47,920 --> 00:29:50,740 Ons gaan voort, en ons sien 'n paar lêer I / O hier, 347 00:29:50,740 --> 00:29:56,210 waar dit gaan om te word wat met die opening van die tekslêer. 348 00:29:56,210 --> 00:30:04,640 Hier, wat dit doen spell-kontrole elke enkele woord in die teks. 349 00:30:04,640 --> 00:30:09,270 So, wat speller.c is reg hier is iterating oor elk van die woorde in die tekslêer 350 00:30:09,270 --> 00:30:12,790 en dan kyk hulle in die woordeboek. 351 00:30:24,680 --> 00:30:32,350 Hier het ons 'n Boolese verkeerd gespelde wat sal sien as die tjek terug waar is of nie. 352 00:30:32,350 --> 00:30:37,110 As die woord is eintlik in die woordeboek, kyk dan waar sal terugkeer. 353 00:30:37,110 --> 00:30:39,760 Dit beteken dat die woord nie verkeerd gespel. 354 00:30:39,760 --> 00:30:45,330 So verkeerd gespel sou vals wees, en dit is hoekom ons die bang is, is die aanduiding. 355 00:30:45,330 --> 00:30:56,320 Ons hou op gaan, en dan is dit hou van hoe baie verkeerd gespelde woorde 356 00:30:56,320 --> 00:30:58,910 daar is in die lêer. 357 00:30:58,910 --> 00:31:03,870 Dit gaan voort op en sluit die lêer. 358 00:31:03,870 --> 00:31:09,250 Dan is hier, is dit verslae hoe baie verkeerd gespelde woorde jy het. 359 00:31:09,250 --> 00:31:12,680 Dit bereken hoe lank dit geneem het om die woordeboek te laai, 360 00:31:12,680 --> 00:31:15,080 hoe lank dit geneem het om dit te sien, 361 00:31:15,080 --> 00:31:18,510 hoeveel tyd wat dit neem om die grootte te bereken, 362 00:31:18,510 --> 00:31:21,260 wat, as ons gaan op baie klein moet wees, 363 00:31:21,260 --> 00:31:25,390 en dan hoe lank dit geneem het om die woordeboek af te laai. 364 00:31:25,390 --> 00:31:27,700 Hier bo sien ons die oproep om hier te los. 365 00:31:27,700 --> 00:31:52,690 As ons kyk vir die grootte, 366 00:31:52,690 --> 00:31:59,050 dan sien ons dat hier is die oproep tot grootte waar dit bepaal die grootte van die woordeboek. 367 00:32:05,730 --> 00:32:07,100 Awesome. 368 00:32:07,100 --> 00:32:10,920 >> Ons taak vir hierdie pset is om vrag te implementeer, wat die woordeboek sal laai 369 00:32:10,920 --> 00:32:15,480 data struktuur - wat ook al jy kies, is dit 'n hash tafel of 'n probeer - 370 00:32:15,480 --> 00:32:18,810 met die woorde uit die woordeboek lêer. 371 00:32:18,810 --> 00:32:25,290 Dan moet jy 'n grootte, wat sal die aantal woorde in die woordeboek terugkeer. 372 00:32:25,290 --> 00:32:29,860 En as jy vrag in 'n slim manier te implementeer, dan grootte moet wees redelik maklik. 373 00:32:29,860 --> 00:32:33,860 Dan het jy gaan, wat sal kyk of 'n gegewe woord in die woordeboek. 374 00:32:33,860 --> 00:32:38,690 So speller.c slaag in 'n tou, en dan moet jy of daardie string om seker te maak 375 00:32:38,690 --> 00:32:41,610 is vervat in jou woordeboek. 376 00:32:41,610 --> 00:32:46,750 Let daarop dat ons oor die algemeen standaard woordeboeke, 377 00:32:46,750 --> 00:32:53,020 maar in hierdie pset, basies enige woordeboek in enige taal geslaag het. 378 00:32:53,020 --> 00:32:57,040 Sodat ons kan nie net aanvaar dat die woord van die binnekant. 379 00:32:57,040 --> 00:33:03,090 Die woord Foobar kan gedefinieer word in 'n bepaalde woordeboek dat ons slaag. 380 00:33:03,090 --> 00:33:07,920 En dan het ons los, wat bevry die woordeboek uit die geheue. 381 00:33:07,920 --> 00:33:11,930 >> Eerste, wil ek graag om te gaan oor die hash tafel metode 382 00:33:11,930 --> 00:33:14,630 oor hoe ons kan al die vier funksies te implementeer, 383 00:33:14,630 --> 00:33:18,650 en dan sal ek gaan oor die probeer metode, hoe ons die vier funksies te implementeer, 384 00:33:18,650 --> 00:33:22,720 en aan die einde praat oor 'n paar algemene wenke wanneer jy die pset 385 00:33:22,720 --> 00:33:27,870 en ook hoe jy dalk in staat wees om te gebruik Valgrind vir die geheue lekkasies na te gaan. 386 00:33:27,870 --> 00:33:30,550 >> Kom ons kry in die hash tafel metode. 387 00:33:30,550 --> 00:33:35,910 'N hash tafel bestaan ​​uit 'n lys van emmers. 388 00:33:35,910 --> 00:33:43,010 Elke waarde, elke woord, gaan om te gaan in een van hierdie emmers. 389 00:33:43,010 --> 00:33:53,200 'N hash tafel versprei ideaal eweredig al hierdie waardes dat jy verby in 390 00:33:53,200 --> 00:33:57,160 en vult hulle dan in die emmer sodanig dat elke emmer 391 00:33:57,160 --> 00:34:02,000 het ongeveer 'n gelyke aantal waardes in. 392 00:34:02,000 --> 00:34:09,630 Die struktuur vir 'n hash tafel, het ons 'n verskeidenheid van geskakelde lyste. 393 00:34:09,630 --> 00:34:17,900 Wat doen ons wanneer ons in 'n waarde, gaan ons waar daardie waarde moet behoort, 394 00:34:17,900 --> 00:34:23,840 watter emmer dit behoort aan, en plaas dit dan in die geskakelde lys wat verband hou met daardie emmer. 395 00:34:23,840 --> 00:34:28,199 Hier, wat ek het is 'n hash funksie. 396 00:34:28,199 --> 00:34:31,320 Dit is 'n int hash tafel. 397 00:34:31,320 --> 00:34:38,540 So vir die eerste emmer, enige heelgetalle onder 10 gaan in die eerste emmer. 398 00:34:38,540 --> 00:34:42,190 Enige heelgetalle bo 10 maar onder 20 gaan in die tweede, 399 00:34:42,190 --> 00:34:44,179 en dan so aan en so voort. 400 00:34:44,179 --> 00:34:52,370 Vir my, is elke emmer hierdie getalle verteenwoordig. 401 00:34:52,370 --> 00:34:59,850 , Sê egter ek was in 50 te slaag, byvoorbeeld. 402 00:34:59,850 --> 00:35:07,490 Dit wil voorkom asof die eerste drie bevat 'n reeks van tien nommers. 403 00:35:07,490 --> 00:35:12,570 Maar ek wil toelaat dat my hash tafel te neem in 'n soort van heelgetalle, 404 00:35:12,570 --> 00:35:19,860 so dan sou ek al die getalle bo 30 in die laaste emmer uit te filter. 405 00:35:19,860 --> 00:35:26,660 En so is daar dan wat sal lei tot 'n soort van 'n ongebalanseerde hash tafel. 406 00:35:31,330 --> 00:35:35,640 Te herhaal, 'n hash tafel is net 'n verskeidenheid van emmers 407 00:35:35,640 --> 00:35:38,590 waar elke emmer is 'n geskakelde lys. 408 00:35:38,590 --> 00:35:43,730 En so om te bepaal waar elke waarde gaan, welke emmer gaan dit in, 409 00:35:43,730 --> 00:35:46,260 jy gaan om te wil hê wat 'n hash funksie genoem 410 00:35:46,260 --> 00:35:55,010 wat nie 'n waarde en dan sê hierdie waarde stem ooreen met 'n sekere emmer. 411 00:35:55,010 --> 00:36:00,970 So bo in hierdie voorbeeld, my hash funksie het elke waarde. 412 00:36:00,970 --> 00:36:03,020 Dit nagegaan of dit was minder as 10. 413 00:36:03,020 --> 00:36:05,360 As dit was, sou dit sit dit in die eerste emmer. 414 00:36:05,360 --> 00:36:08,910 Dit kontroleer of dit is minder as 20, plaas dit in die tweede as dit waar is, 415 00:36:08,910 --> 00:36:12,880 tjeks as dit is minder as 30, en dan sit dit in die derde emmer, 416 00:36:12,880 --> 00:36:16,990 en dan alles val net om die vierde emmer. 417 00:36:16,990 --> 00:36:20,110 So as jy 'n waarde, jou hash funksie 418 00:36:20,110 --> 00:36:25,420 sal daardie waarde plaas in die toepaslike emmer. 419 00:36:25,420 --> 00:36:32,430 Die hash funksie moet basies te weet hoeveel emmers jy het. 420 00:36:32,430 --> 00:36:37,960 Jou hash tafel grootte, die aantal van emmers wat jy het, 421 00:36:37,960 --> 00:36:41,190 dit gaan 'n vaste getal wat is aan jou, vir jou om te besluit, 422 00:36:41,190 --> 00:36:43,590 maar dit gaan om 'n vaste getal wees. 423 00:36:43,590 --> 00:36:51,840 Sodat jou hash funksie sal vertrou op dit om te bepaal watter emmer elke sleutel gaan in 424 00:36:51,840 --> 00:36:54,450 van so 'n aard dat dit eweredig versprei. 425 00:36:56,150 --> 00:37:03,820 Soortgelyk aan die implementering van geskakelde lyste, nou elke node in die hash tafel 426 00:37:03,820 --> 00:37:07,000 is eintlik 'n tipe char te hê. 427 00:37:07,000 --> 00:37:14,340 Sodat ons 'n char skikking met die naam woord en dan nog 'n wyser na die volgende node, 428 00:37:14,340 --> 00:37:19,010 wat sin maak, want dit gaan om 'n geskakelde lys. 429 00:37:19,010 --> 00:37:24,350 Onthou toe ons geskakelde lyste, ek het 'n node * genoem kop 430 00:37:24,350 --> 00:37:31,060 wat verwys na die eerste nodus in die geskakelde lys. 431 00:37:31,060 --> 00:37:34,020 Maar vir ons hash tafel, want ons het verskeie geskakelde lyste, 432 00:37:34,020 --> 00:37:37,520 Wat ons wil hê, is dat ons wil ons hash tafel te wees soos, "Wat is 'n emmer?" 433 00:37:37,520 --> 00:37:43,340 'N emmer is net 'n lys van node pointers, 434 00:37:43,340 --> 00:37:50,620 en so elke element in die emmer is eintlik verwys na die ooreenstemmende geskakelde lys. 435 00:37:56,180 --> 00:38:01,520 Om terug te gaan na hierdie skematiese, sien jy dat die emmers self is die pyle, 436 00:38:01,520 --> 00:38:06,980 nie die werklike nodes. 437 00:38:11,680 --> 00:38:16,420 Een van die noodsaaklike eiendom van hash funksies is dat hulle deterministiese. 438 00:38:16,420 --> 00:38:19,440 Dit beteken dat wanneer jy hash die nommer 2, 439 00:38:19,440 --> 00:38:22,270 dit moet altyd dieselfde emmer terug. 440 00:38:22,270 --> 00:38:26,440 Elke enkele waarde wat gaan in die hash funksie, as dit herhaal word, 441 00:38:26,440 --> 00:38:29,690 het dieselfde indeks te kry. 442 00:38:29,690 --> 00:38:34,210 Sodat jou hash funksie gee die indeks van die skikking 443 00:38:34,210 --> 00:38:38,530 waar daardie waarde behoort. 444 00:38:38,530 --> 00:38:41,790 Soos ek voorheen genoem, is die getal van die emmers vas, 445 00:38:41,790 --> 00:38:49,630 en so jou indeks wat jy terugkeer het minder wees as die getal van emmers 446 00:38:49,630 --> 00:38:52,680 maar groter as 0. 447 00:38:52,680 --> 00:39:00,780 Die rede waarom ons het hash funksies in plaas van slegs 'n enkele geskakelde lys 448 00:39:00,780 --> 00:39:09,290 of een array is wat ons wil in staat wees om te spring na 'n sekere afdeling die maklikste 449 00:39:09,290 --> 00:39:11,720 as ons weet wat die eienskap van 'n waarde - 450 00:39:11,720 --> 00:39:14,760 in plaas van om te soek deur die hele hele woordeboek, 451 00:39:14,760 --> 00:39:18,320 in staat is om te spring na 'n sekere deel van dit. 452 00:39:19,880 --> 00:39:24,440 Jou hash funksie moet in ag neem dat ideaal, 453 00:39:24,440 --> 00:39:28,980 elke emmer het ongeveer dieselfde aantal sleutels. 454 00:39:28,980 --> 00:39:35,040 Sedert die hash tafel is 'n reeks van geskakelde lyste, 455 00:39:35,040 --> 00:39:38,480 dan is die geskakelde lyste self gaan om meer as een node te hê. 456 00:39:38,480 --> 00:39:43,210 In die vorige voorbeeld, twee verskillende nommers, selfs al is hulle nie gelyke, 457 00:39:43,210 --> 00:39:46,950 wanneer hashed, sou terugkeer dieselfde indeks. 458 00:39:46,950 --> 00:39:53,620 So wanneer jy te doen het met woorde, een woord wanneer hashed 459 00:39:53,620 --> 00:39:57,450 dieselfde hash waarde as 'n ander woord sou wees. 460 00:39:57,450 --> 00:40:04,140 Dit is wat ons noem 'n botsing, wanneer ons 'n node dat, wanneer hashed, 461 00:40:04,140 --> 00:40:09,610 die geskakelde lys op daardie emmer is nie leeg nie. 462 00:40:09,610 --> 00:40:14,180 Die tegniek wat ons noem daar is lineêre ondersoekende, 463 00:40:14,180 --> 00:40:22,550 waar jy gaan in die geskakelde lys en dan vind waar jy wil te voeg dat die node 464 00:40:22,550 --> 00:40:25,520 want jy het 'n botsing. 465 00:40:25,520 --> 00:40:28,070 Jy kan sien dat daar dalk 'n trade-off hier te wees, reg? 466 00:40:28,070 --> 00:40:33,760 As jy 'n baie klein hash tafel, 'n baie klein aantal van emmers, 467 00:40:33,760 --> 00:40:36,380 dan is jy gaan 'n baie botsings te hê. 468 00:40:36,380 --> 00:40:40,460 Maar dan as jy 'n baie groot hash tafel, 469 00:40:40,460 --> 00:40:44,110 is jy waarskynlik gaan om die botsings te verminder, 470 00:40:44,110 --> 00:40:47,170 maar dit gaan 'n baie groot data struktuur wees. 471 00:40:47,170 --> 00:40:49,310 Daar gaan trade-offs met. 472 00:40:49,310 --> 00:40:51,310 So wanneer jy jou pset jy maak, probeer om te speel 473 00:40:51,310 --> 00:40:54,210 tussen miskien om 'n kleiner hash tafel 474 00:40:54,210 --> 00:41:02,100 maar dan die wete dat dit gaan om 'n bietjie langer neem om die verskillende elemente te verken 475 00:41:02,100 --> 00:41:04,270 van hierdie geskakelde lyste. 476 00:41:04,270 --> 00:41:09,500 >> Watter lading gaan doen is itereer oor elke woord in die woordeboek. 477 00:41:09,500 --> 00:41:13,180 Dit gaan in 'n wyser na die woordeboek-lêer. 478 00:41:13,180 --> 00:41:18,050 So jy gaan om voordeel te trek van die lêer I / O-funksies wat jy bemeester pset4 479 00:41:18,050 --> 00:41:23,010 en itereer oor elke woord in die woordeboek. 480 00:41:23,010 --> 00:41:26,620 Jy wil elke woord in die woordeboek na 'n nuwe node word, 481 00:41:26,620 --> 00:41:32,730 en jy gaan elke een van daardie nodes te plaas binnekant van jou woordeboek datastruktuur. 482 00:41:32,730 --> 00:41:36,560 Wanneer jy 'n nuwe woord, jy weet dat dit gaan om 'n nodus. 483 00:41:36,560 --> 00:41:46,590 Sodat jy kan dadelik gaan en malloc 'n node wyser vir elke nuwe woord wat jy het. 484 00:41:46,590 --> 00:41:52,610 Hier is ek roep my node pointer new_node en ek mallocing wat? Die grootte van 'n node. 485 00:41:52,610 --> 00:41:59,190 Toe het die werklike string uit 'n lêer te lees, omdat die woordeboek is eintlik gestoor 486 00:41:59,190 --> 00:42:03,340 deur 'n woord, en dan 'n nuwe lyn, wat ons kan neem voordeel van 487 00:42:03,340 --> 00:42:06,520 is die funksie fscanf, 488 00:42:06,520 --> 00:42:10,280 waardeur lêer is die woordeboek leer dat ons geslaag het in, 489 00:42:10,280 --> 00:42:18,900 sodat dit skanderings die lêer vir 'n string en plekke wat die string in die laaste argument. 490 00:42:18,900 --> 00:42:26,890 As jy onthou terug na een van die lesings, toe het ons oor 491 00:42:26,890 --> 00:42:29,320 en soort van geskilde die lae terug op die CS50 biblioteek, 492 00:42:29,320 --> 00:42:33,430 ons het 'n implementering van fscanf daar. 493 00:42:33,430 --> 00:42:37,700 Om terug te gaan na fscanf, ons het die lêer dat ons lees van, 494 00:42:37,700 --> 00:42:42,570 ons is op soek vir 'n string in die lêer, en dan is ons plaas dit in 495 00:42:42,570 --> 00:42:48,340 Ek het hier new_node-> woord omdat new_node is 'n node pointer, 496 00:42:48,340 --> 00:42:50,380 nie 'n werklike node. 497 00:42:50,380 --> 00:42:57,100 So dan moet ek sê new_node, ek wil om te gaan na die node dat dit verwys na 498 00:42:57,100 --> 00:43:01,190 en dan wys dat die waarde te woord. 499 00:43:01,190 --> 00:43:08,540 Ons wil dan daardie woord en plaas dit in die hash tafel. 500 00:43:08,540 --> 00:43:13,750 Besef dat ons new_node 'n node pointer 501 00:43:13,750 --> 00:43:18,230 want ons gaan om te wil weet wat die adres van daardie node is 502 00:43:18,230 --> 00:43:23,940 wanneer ons plaas dit in omdat die struktuur van die nodes self, van die struct, 503 00:43:23,940 --> 00:43:26,380 is dat hulle 'n wyser na 'n nuwe node. 504 00:43:26,380 --> 00:43:30,820 So wat is dan die adres van daardie node gaan om aan te dui? 505 00:43:30,820 --> 00:43:34,550 Dat die adres gaan wees new_node. 506 00:43:34,550 --> 00:43:42,140 Beteken dit sin maak, hoekom maak ons ​​'n nodus * new_node in teenstelling met 'n nodus? 507 00:43:43,700 --> 00:43:45,700 Okay. 508 00:43:45,700 --> 00:43:52,840 Ons het 'n woord. Dat die waarde is new_node-> woord. 509 00:43:52,840 --> 00:43:55,970 Dit bevat 'n woord uit die woordeboek wat ons wil invoer. 510 00:43:55,970 --> 00:44:00,210 So, wat ons wil doen, is ons wil ons hash funksie aan te roep op daardie string 511 00:44:00,210 --> 00:44:03,780 omdat ons hash funksie neem in 'n tou en dan terug keer ons 'n heelgetal, 512 00:44:03,780 --> 00:44:12,090 waar daardie heelgetal is die indeks waar hashtable op daardie indeks verteenwoordig die emmer. 513 00:44:12,090 --> 00:44:18,260 Ons wil hê dat die indeks te neem en dan gaan na die indeks van die hash tafel 514 00:44:18,260 --> 00:44:26,960 en gebruik dan daardie geskakelde lys om die knoop te voeg by new_node. 515 00:44:26,960 --> 00:44:31,950 Onthou dat jy egter besluit om jou node te voeg, 516 00:44:31,950 --> 00:44:34,370 of dit nou in die middel as jy dit wil hê om te sorteer 517 00:44:34,370 --> 00:44:39,650 of aan die begin of aan die einde, maar maak seker dat jou laaste node altyd na VRYGEMAAK 518 00:44:39,650 --> 00:44:46,730 want dit is die enigste manier waarop ons weet waar die laaste element van ons geskakelde lys is. 519 00:44:50,790 --> 00:44:59,710 >> Indien die grootte is 'n heelgetal wat verteenwoordig die aantal woorde in 'n woordeboek, 520 00:44:59,710 --> 00:45:03,060 dan is een manier om dit te doen, is dat wanneer grootte genoem word 521 00:45:03,060 --> 00:45:05,840 ons gaan deur elke element in ons hash tafel 522 00:45:05,840 --> 00:45:09,410 en dan itereer deur elke geskakelde lys in die hash tafel 523 00:45:09,410 --> 00:45:13,770 en bereken dan die lengte van die verhoging van ons counter 1 deur 1. 524 00:45:13,770 --> 00:45:16,580 Maar elke keer dat die grootte genoem word, wat gaan 'n lang tyd te neem 525 00:45:16,580 --> 00:45:22,120 want ons gaan lineêr indringende elke enkele geskakelde lys. 526 00:45:22,120 --> 00:45:30,530 In plaas daarvan, gaan dit 'n baie makliker wees as jy hou van hoeveel woorde geslaag. 527 00:45:30,530 --> 00:45:36,330 Daarom dan, as jy 'n toonbank binne jou vrag funksie 528 00:45:36,330 --> 00:45:42,430 dat updates as wat nodig is, dan is counter, as jy dit aan 'n globale veranderlike, 529 00:45:42,430 --> 00:45:44,930 sal kan verkry word deur die grootte. 530 00:45:44,930 --> 00:45:51,450 So watter grootte kan eenvoudig doen, is in een lyn, net die toonbank waarde terug, 531 00:45:51,450 --> 00:45:55,500 die grootte van die woordeboek, wat jy reeds in die vrag hanteer. 532 00:45:55,500 --> 00:46:05,190 Dit is wat ek bedoel het toe ek gesê het as jy implementeer las op 'n nuttige manier, 533 00:46:05,190 --> 00:46:08,540 dan grootte gaan redelik maklik te wees. 534 00:46:08,540 --> 00:46:11,350 >> So nou het ons kry om te kyk. 535 00:46:11,350 --> 00:46:15,960 Nou het ons te doen het met woorde uit die insette teks lêer, 536 00:46:15,960 --> 00:46:19,910 en so ons gaan om te kontroleer of al van daardie inset woorde 537 00:46:19,910 --> 00:46:22,520 is eintlik in die woordeboek of nie. 538 00:46:22,520 --> 00:46:26,520 Soortgelyk aan Scramble, ons wil om voorsiening te maak vir die geval onsensitiwiteit. 539 00:46:26,520 --> 00:46:32,110 Jy wil om seker te maak dat al die woorde geslaag, selfs al het hulle is gemengde geval, 540 00:46:32,110 --> 00:46:37,840 wanneer dit met 'n tou vergelyk genoem word, is ekwivalent. 541 00:46:37,840 --> 00:46:42,450 Die woorde in die woordeboek teks lêers is eintlik alle kleinletters. 542 00:46:42,450 --> 00:46:49,280 Nog 'n ding is dat jy kan aanneem dat elke woord in elke string geslaag het, 543 00:46:49,280 --> 00:46:53,200 gaan wees óf alfabetiese of bevat apostrofes. 544 00:46:53,200 --> 00:46:58,010 Apostrofs gaan om geldig te wees woorde in ons woordeboek. 545 00:46:58,010 --> 00:47:06,470 So as jy 'n woord met afkappingsteken S, dit is 'n werklike wettige woord in jou woordeboek 546 00:47:06,470 --> 00:47:11,650 wat gaan om te wees een van die nodusse in jou hash tafel. 547 00:47:13,470 --> 00:47:18,350 Maak seker as die woord bestaan, dan is dit het om te wees in ons hash tafel. 548 00:47:18,350 --> 00:47:22,210 As die woord in die woordeboek is nie, dan is al die woorde in die woordeboek is in die hash tafel, 549 00:47:22,210 --> 00:47:26,560 so laat ons kyk vir hierdie woord in die hash tafel. 550 00:47:26,560 --> 00:47:29,250 Ons weet dat, aangesien ons ons hash funksie geïmplementeer 551 00:47:29,250 --> 00:47:38,420 van so 'n aard dat elke unieke woord is altyd aan die dieselfde waarde hashed, 552 00:47:38,420 --> 00:47:43,340 dan weet ons dat in plaas van soek deur ons hele hele hash tafel, 553 00:47:43,340 --> 00:47:48,310 ons kan eintlik die geskakelde lys vind dat woord hoort. 554 00:47:48,310 --> 00:47:51,850 As dit in die woordeboek was, dan sou dit in die emmer. 555 00:47:51,850 --> 00:47:57,140 Wat ons kan doen, as die woord is die naam van ons string geslaag, 556 00:47:57,140 --> 00:48:01,560 Ons kan nie net hash dat woord en kyk na die geskakelde lys 557 00:48:01,560 --> 00:48:06,410 op die waarde van hashtable [hash (woord)]. 558 00:48:06,410 --> 00:48:12,410 Van daar is, wat ons kan doen, is ons het 'n klein subset van die nodes om te soek vir hierdie woord, 559 00:48:12,410 --> 00:48:16,770 en so kan ons die geskakelde lys deurkruis, met behulp van 'n voorbeeld van vroeër in die instruksies, 560 00:48:16,770 --> 00:48:24,110 en dan bel string vergelyk op die woord waar die wyser wys, 561 00:48:24,110 --> 00:48:28,430 dat die woord, en kyk of daardie vergelyk. 562 00:48:30,280 --> 00:48:35,110 Afhangende van die manier waarop jy organiseer jou hash funksie, 563 00:48:35,110 --> 00:48:39,260 as dit gesorteer is, kan jy in staat wees om valse 'n bietjie vroeër terugkeer, 564 00:48:39,260 --> 00:48:43,440 maar as dit ongesorteerde, dan kan jy wil om voort te gaan kameelkoei deur jou geskakelde lys 565 00:48:43,440 --> 00:48:46,480 totdat jy die laaste element van die lys. 566 00:48:46,480 --> 00:48:53,320 En as jy nog nie gevind nie die woord deur die tyd wat jy aan die einde van die geskakelde lys, 567 00:48:53,320 --> 00:48:56,890 wat beteken dat jou woord bestaan ​​nie in die woordeboek, 568 00:48:56,890 --> 00:48:59,410 en so dat die woord is ongeldig, 569 00:48:59,410 --> 00:49:02,730 en die tjek moet terugkeer vals. 570 00:49:02,730 --> 00:49:09,530 >> Nou kom ons by los, waar ons wil al die nodes dat ons malloc'd te bevry, 571 00:49:09,530 --> 00:49:14,050 so vry al die nodes binnekant van ons hash tafel. 572 00:49:14,050 --> 00:49:20,270 Ons gaan om te wil itereer oor die hele van die geskakelde lyste en vry al die nodes in daardie. 573 00:49:20,270 --> 00:49:29,350 As jy kyk in die instruksies hierbo na die voorbeeld waar ons vry 'n geskakelde lys, 574 00:49:29,350 --> 00:49:35,140 dan sal jy wil om die proses te herhaal vir elke element in die hash tafel. 575 00:49:35,140 --> 00:49:37,780 En ek gaan oor na die einde van die walkthrough, 576 00:49:37,780 --> 00:49:46,600 maar Valgrind is 'n hulpmiddel waar jy kan sien as jy behoorlik bevry 577 00:49:46,600 --> 00:49:53,600 elke node wat jy malloc'd of enigiets anders wat jy malloc'd, enige ander wyser. 578 00:49:55,140 --> 00:50:00,530 So dit is hash tabelle, waar ons 'n eindige aantal emmers 579 00:50:00,530 --> 00:50:09,220 en 'n hash funksie wat 'n waarde sal neem en dan wys dat waarde tot 'n sekere emmer. 580 00:50:09,220 --> 00:50:13,340 >> Nou kom ons by drieë. 581 00:50:13,340 --> 00:50:18,750 Probeer om 'n soort van kyk soos hierdie, en ek sal ook 'n voorbeeld. 582 00:50:18,750 --> 00:50:25,630 Basies, jy het 'n hele verskeidenheid van potensiële letters, 583 00:50:25,630 --> 00:50:29,210 en dan wanneer jy die bou van 'n woord, 584 00:50:29,210 --> 00:50:36,490 daardie brief gekoppel kan word vir 'n woordeboek na 'n wye verskeidenheid van moontlikhede. 585 00:50:36,490 --> 00:50:40,840 Sommige woorde begin met C, maar gaan dan voort met 'n, 586 00:50:40,840 --> 00:50:42,960 maar ander gaan voort met O, byvoorbeeld. 587 00:50:42,960 --> 00:50:51,090 'N Trie is 'n manier van die visualisering van al die moontlike kombinasies van daardie woorde. 588 00:50:51,090 --> 00:50:59,070 'N Trie gaan om tred te hou van die volgorde van letters wat uit woorde, 589 00:50:59,070 --> 00:51:08,280 vertakking wanneer dit nodig is, wanneer een letter kan gevolg word deur 'n veelvoud van briewe, 590 00:51:08,280 --> 00:51:16,630 en aan die einde dui by elke punt of daardie woord geldig is of nie 591 00:51:16,630 --> 00:51:30,120 want as jy die spelling van die woord MAT, MA Ek dink nie 'n geldige woord, maar MAT is. 592 00:51:30,120 --> 00:51:37,820 En so in jou Trie, sou dit aandui dat na MAT wat eintlik 'n geldige woord. 593 00:51:41,790 --> 00:51:48,590 Elke node in ons Trie is eintlik van plan om 'n verskeidenheid van node verwysings te bevat, 594 00:51:48,590 --> 00:51:52,970 en ons gaan te hê, spesifiek, 27 van daardie node pointers, 595 00:51:52,970 --> 00:52:00,550 een vir elke letter in die alfabet, asook die Apostrof. 596 00:52:00,550 --> 00:52:10,450 Elke element in die skikking self gaan om te wys na 'n ander node. 597 00:52:10,450 --> 00:52:14,020 So indien daardie node is NULL, indien daar is niks daarna, 598 00:52:14,020 --> 00:52:20,550 dan weet ons dat daar is geen verdere letters in die woord volgorde. 599 00:52:20,550 --> 00:52:26,950 Maar as daardie node nie NULL is nie, wat beteken dat daar meer briewe in daardie brief ry. 600 00:52:26,950 --> 00:52:32,160 En dan verder, moet elke node dui aan of dit is die laaste karakter van 'n woord of nie. 601 00:52:38,110 --> 00:52:43,170 >> Kom ons gaan na 'n voorbeeld van 'n Trie. 602 00:52:50,500 --> 00:52:58,340 Ek het eers ruimte vir 27 nodusse in die skikking. 603 00:52:58,340 --> 00:53:03,200 As ek die woord BAR - 604 00:53:13,310 --> 00:53:15,370 As ek die woord bar en ek wil hê dat te voeg, 605 00:53:15,370 --> 00:53:22,700 die eerste letter B, so as my Trie is leeg, 606 00:53:22,700 --> 00:53:29,910 B is die tweede letter van die alfabet, so ek gaan om te kies om dit hier te plaas op hierdie indeks. 607 00:53:29,910 --> 00:53:33,450 Ek gaan B hier te hê. 608 00:53:33,450 --> 00:53:42,400 B gaan na 'n node wat wys na 'n ander verskeidenheid van al die moontlike karakters te wees 609 00:53:42,400 --> 00:53:45,870 wat kan volg na die letter B. 610 00:53:45,870 --> 00:53:57,610 In hierdie geval, ek handel met die woord bar, so 'n kom hier. 611 00:54:02,000 --> 00:54:08,990 Na 'n, ek het die letter R, so dan 'n nou punte op sy eie kombinasie, 612 00:54:08,990 --> 00:54:15,120 en dan R hier sal wees. 613 00:54:15,120 --> 00:54:22,470 BAR is 'n volledige woord, so dan sal ek gaan R punt na 'n ander node 614 00:54:22,470 --> 00:54:33,990 wat sê dat woord is geldig. 615 00:54:36,010 --> 00:54:40,970 Dat node is ook van plan om 'n verskeidenheid van nodes te hê, 616 00:54:40,970 --> 00:54:45,260 maar diegene sou wees NULL. 617 00:54:45,260 --> 00:54:49,080 Maar basies, dit kan voortgaan soos dit. 618 00:54:49,080 --> 00:54:54,250 Dit sal 'n bietjie meer duidelik wanneer ons na 'n ander voorbeeld, 619 00:54:54,250 --> 00:54:56,780 so met my dra. 620 00:54:56,780 --> 00:55:02,050 Nou het ons BAR binnekant van ons woordeboek. 621 00:55:02,050 --> 00:55:05,980 Nou sê ons het die woord BAZ. 622 00:55:05,980 --> 00:55:12,630 Ons begin met B, en ons het reeds B as een van die briewe wat in ons woordeboek is. 623 00:55:12,630 --> 00:55:15,170 Dit is gevolg met A. Ons het 'n reeds. 624 00:55:15,170 --> 00:55:19,250 Maar dan plaas daarvan, ons het Z volgende. 625 00:55:19,250 --> 00:55:25,490 So is daar dan 'n element in die skikking gaan wees Z, 626 00:55:25,490 --> 00:55:30,810 en so dan dat 'n mens gaan om te wys na 'n ander geldige einde van die woord. 627 00:55:30,810 --> 00:55:36,930 So sien ons dat wanneer ons voortgaan om deur B en dan 'n 628 00:55:36,930 --> 00:55:43,480 daar is twee verskillende opsies vir die woorde wat tans in ons woordeboek wat begin met B en A. 629 00:55:49,650 --> 00:55:57,460 Sê dat ons wou die woord te voeg Foobar. 630 00:55:57,460 --> 00:56:05,620 Dan sou ons 'n inskrywing maak by F. 631 00:56:05,620 --> 00:56:11,320 F is 'n nodus wat dui op 'n hele reeks. 632 00:56:11,320 --> 00:56:22,790 Ons O sou vind, gaan na O, O skakel dan na 'n hele lys. 633 00:56:22,790 --> 00:56:35,340 Ons B wil hê en gaan dan voort, het ons het 'n en dan R. 634 00:56:35,340 --> 00:56:43,570 So dan Foobar deurkruis al die pad af tot Foobar is 'n korrekte woord. 635 00:56:43,570 --> 00:56:52,590 En so dan is dit 'n geldige woord sou wees. 636 00:56:52,590 --> 00:57:00,170 Nou sê ons volgende woord in die woordeboek is die woord FOO. 637 00:57:00,170 --> 00:57:03,530 Ons sou sê F. Wat volg F? 638 00:57:03,530 --> 00:57:06,190 Ek het eintlik reeds 'n ruimte vir O, so ek gaan om voort te gaan. 639 00:57:06,190 --> 00:57:09,150 Ek hoef nie 'n nuwe een te maak. Voort te gaan. 640 00:57:09,150 --> 00:57:15,500 FOO is 'n geldige woord in hierdie woordeboek is, so dan gaan ek om aan te dui 641 00:57:15,500 --> 00:57:21,660 dat dit geldig is. 642 00:57:21,660 --> 00:57:28,370 As ek stop my ry daar, sou dit korrek wees. 643 00:57:28,370 --> 00:57:33,050 Maar as ons het voortgegaan om ons volgorde van ANDY C na B 644 00:57:33,050 --> 00:57:39,750 en moes net FOOB FOOB is nie 'n woord, en dit is nie aangedui as 'n geldige een. 645 00:57:47,370 --> 00:57:57,600 In 'n Trie, het jy elke node wat aandui of dit is 'n geldige woord of nie, 646 00:57:57,600 --> 00:58:05,840 en dan is elke node het ook 'n verskeidenheid van 27 node pointers 647 00:58:05,840 --> 00:58:09,520 wat dan punt nodes hulself. 648 00:58:09,520 --> 00:58:12,940 >> Hier is 'n manier van hoe jy dalk wil om dit te definieer. 649 00:58:12,940 --> 00:58:17,260 Egter, net soos in die hash tafel voorbeeld, waar ons 'n node * Hoof 650 00:58:17,260 --> 00:58:21,320 die begin van die geskakelde lys om aan te dui, is ons ook gaan om te wil 651 00:58:21,320 --> 00:58:29,150 een of ander manier om te weet waar die begin van ons Trie is. 652 00:58:29,150 --> 00:58:34,110 Sommige mense noem probeer bome, en dit is waar die wortel kom uit. 653 00:58:34,110 --> 00:58:36,910 So wil ons die wortel van ons boom om seker te maak dat ons bly gegrond 654 00:58:36,910 --> 00:58:39,570 te waar ons Trie is. 655 00:58:42,910 --> 00:58:46,300 Ons het reeds soort van het oor 656 00:58:46,300 --> 00:58:50,240 die manier waarop jy kon dink oor die laai van elke woord in die woordeboek. 657 00:58:50,240 --> 00:58:54,540 Wese, vir elke woord wat jy gaan om te wil om te itereer deur jou Trie 658 00:58:54,540 --> 00:58:59,590 en die wete dat elke element in die kinders - ons noem dit kinders in hierdie geval - 659 00:58:59,590 --> 00:59:04,290 ooreenstem met 'n ander brief, jy gaan wil om daardie waardes na te gaan 660 00:59:04,290 --> 00:59:08,320 op daardie betrokke indeks wat ooreenstem met die brief. 661 00:59:08,320 --> 00:59:11,260 So dink al die pad terug na die keiser en Vigenere, 662 00:59:11,260 --> 00:59:16,070 die wete dat elke brief wat jy kan soort kaart terug na 'n alfabetiese indeks, 663 00:59:16,070 --> 00:59:20,690 beslis 'n deur Z gaan redelik maklik te wees om te karteer 'n alfabetiese letter, 664 00:59:20,690 --> 00:59:25,200 maar ongelukkig apostrofes is ook 'n aanvaarde karakter in woorde. 665 00:59:25,200 --> 00:59:31,650 Ek is nie eens seker wat die ASCII-waarde is, 666 00:59:31,650 --> 00:59:39,250 so dat as jy wil om 'n indeks te vind om te besluit of jy dit wil hê om die eerste een te wees 667 00:59:39,250 --> 00:59:44,550 of die laaste een, het jy 'n harde gekodeerde tjek vir daardie te maak 668 00:59:44,550 --> 00:59:48,930 en dan sit dit in die indeks 26, byvoorbeeld. 669 00:59:48,930 --> 00:59:55,300 So is julle dan die beheer van die waarde op kinders [i] 670 00:59:55,300 --> 00:59:58,400 waar [i] ooreenstem met watter letter jy. 671 00:59:58,400 --> 01:00:04,110 As dit is NULL, wat beteken dat daar nie tans enige moontlike letters 672 01:00:04,110 --> 01:00:08,150 die gevolg is van daardie vorige volgorde, so jy gaan wil malloc 673 01:00:08,150 --> 01:00:13,150 en maak 'n nuwe node en dat kinders [i] punt om dit te 674 01:00:13,150 --> 01:00:17,890 , sodat jy - wanneer ons 'n brief in die reghoek plaas - 675 01:00:17,890 --> 01:00:23,680 die maak van kinders nie-nul en punt in dat die nuwe node. 676 01:00:23,680 --> 01:00:28,340 Maar as dit nie NULL is nie, soos in ons geval van FOO 677 01:00:28,340 --> 01:00:34,570 wanneer ons reeds Foobar, gaan ons voort, 678 01:00:34,570 --> 01:00:44,010 en ons is nooit die maak van 'n nuwe node, maar eerder net die opstel is_word na ware 679 01:00:44,010 --> 01:00:47,790 aan die einde van daardie woord. 680 01:00:50,060 --> 01:00:55,340 >> So dan as voorheen, want hier het jy te doen het met elke brief op 'n tyd, 681 01:00:55,340 --> 01:01:01,470 dit gaan makliker wees vir jou grootte, in plaas van om te bereken 682 01:01:01,470 --> 01:01:06,910 en gaan deur die hele boom en bereken hoeveel kinders het ek 683 01:01:06,910 --> 01:01:10,850 en dan vertakking, onthou hoeveel is aan die linkerkant en aan die regterkant 684 01:01:10,850 --> 01:01:12,850 en dinge soos wat, gaan dit 'n baie makliker vir jou 685 01:01:12,850 --> 01:01:16,220 as jy net hou van hoeveel woorde wat jy wil byvoeg in 686 01:01:16,220 --> 01:01:18,080 wanneer jy te doen het met vrag. 687 01:01:18,080 --> 01:01:22,630 En so is daar dan dié manier grootte kan net 'n globale veranderlike grootte terug. 688 01:01:25,320 --> 01:01:28,530 >> Nou kom ons te kontroleer. 689 01:01:28,530 --> 01:01:33,920 Dieselfde standaarde as voorheen, waar ons wil om voorsiening te maak vir die geval onsensitiwiteit. 690 01:01:33,920 --> 01:01:40,400 So goed, ons aanvaar dat die snare is slegs alfabetiese karakters of die apostrofes 691 01:01:40,400 --> 01:01:44,000 omdat kinders is 'n verskeidenheid van 27 lank, 692 01:01:44,000 --> 01:01:48,480 so al die letters van die alfabet, plus die afkappingsteken. 693 01:01:48,480 --> 01:01:53,800 Vir check wat jy wil doen, is wat jy sal wil begin by die wortel 694 01:01:53,800 --> 01:01:58,440 omdat die wortel sal verwys na 'n verskeidenheid wat die volgende bevat 695 01:01:58,440 --> 01:02:01,630 al die moontlike begin letters van 'n woord. 696 01:02:01,630 --> 01:02:03,680 Jy gaan om daar te begin, 697 01:02:03,680 --> 01:02:11,590 en dan moet jy gaan om te kyk, is hierdie waarde NULL of nie, 698 01:02:11,590 --> 01:02:16,490 want as die waarde is NULL, wat beteken dat die woordeboek nie enige waardes 699 01:02:16,490 --> 01:02:21,480 wat bevat dat die brief in daardie spesifieke volgorde. 700 01:02:21,480 --> 01:02:24,970 As dit is NULL, dan beteken dit dat die woord dadelik verkeerd gespel. 701 01:02:24,970 --> 01:02:27,110 Maar as dit is nie NULL, dan kan jy voortgaan, 702 01:02:27,110 --> 01:02:34,090 sê dat die eerste brief is 'n moontlike eerste letter in 'n woord, 703 01:02:34,090 --> 01:02:40,630 maar nou is ek wil om te kyk of die tweede brief, daardie volgorde, is binne-in my woordeboek. 704 01:02:40,630 --> 01:02:46,540 So jy gaan om te gaan na die indeks van die kinders van die eerste node 705 01:02:46,540 --> 01:02:50,720 en kyk of daardie tweede brief bestaan. 706 01:02:50,720 --> 01:02:57,440 Dan moet jy die proses herhaal om te kontroleer of daardie volgorde geldig is of nie 707 01:02:57,440 --> 01:02:59,060 binne jou Trie. 708 01:02:59,060 --> 01:03:06,430 Wanneer die node kinders op daardie indekspunte null, 709 01:03:06,430 --> 01:03:10,710 jy weet dat daardie volgorde nie bestaan ​​nie, 710 01:03:10,710 --> 01:03:16,230 maar dan as jy aan die einde van die woord wat jy ingetik het, 711 01:03:16,230 --> 01:03:20,070 dan moet jy nou wil seker dat ek hierdie reeks voltooi het 712 01:03:20,070 --> 01:03:27,610 en gevind dat dit binne my Trie, is dat die woord geldig is of nie? 713 01:03:27,610 --> 01:03:32,480 En so dan kan jy wil om seker te maak dat, en dis toe dat as jy daardie volgorde gevind het, 714 01:03:32,480 --> 01:03:35,120 dan kan jy wil om te kyk of die woord geldig is of nie 715 01:03:35,120 --> 01:03:40,290 want onthou terug in die vorige geval dat ek getrek het waar ons moes FOOB, 716 01:03:40,290 --> 01:03:48,410 dit was 'n geldige ry dat ons gevind, maar was nie 'n werklike geldige woord self. 717 01:03:50,570 --> 01:03:59,000 >> Net so, los in die drieë wat jy wil al die nodes in jou Trie af te laai. 718 01:03:59,000 --> 01:04:04,790 Jammer. Soortgelyk aan die hash tabelle waar los ons bevry al die nodusse, 719 01:04:04,790 --> 01:04:09,740 in die drieë wat ons wil ook vry al die nodes. 720 01:04:09,740 --> 01:04:15,000 Los sal eintlik werk maklikste van onder na bo 721 01:04:15,000 --> 01:04:19,290 want dit is in wese geskakelde lyste. 722 01:04:19,290 --> 01:04:22,540 Daarom wil ons seker maak dat ons hou op al die waardes 723 01:04:22,540 --> 01:04:25,700 en vry almal van hulle uitdruklik. 724 01:04:25,700 --> 01:04:28,840 Wat jy gaan om te wil doen as jy die werk met 'n Trie 725 01:04:28,840 --> 01:04:35,640 is 'n reis na die onderkant en vry om die laagste moontlike node eerste 726 01:04:35,640 --> 01:04:39,190 en gaan dan aan al die kinders en dan gratis al daardie, 727 01:04:39,190 --> 01:04:43,050 optrek en dan gratis, ens. 728 01:04:43,050 --> 01:04:48,790 Soort van soos die hantering van die onderste laag van die oor die eerste 729 01:04:48,790 --> 01:04:51,940 en dan gaan tot bo wanneer jy alles bevry het. 730 01:04:51,940 --> 01:04:56,720 Dit is 'n goeie voorbeeld van waar rekursiewe funksie kan handig te pas kom. 731 01:04:56,720 --> 01:05:03,830 Sodra jy die onderste laag van jou Trie bevry, 732 01:05:03,830 --> 01:05:08,000 dan is jy op die res van dit los noem, 733 01:05:08,000 --> 01:05:13,620 om seker te maak dat jy bevry elke mini - 734 01:05:13,620 --> 01:05:16,410 Jy kan soort van visualiseer dit as mini drieë. 735 01:05:23,300 --> 01:05:28,990 So jy hoef jou wortel hier. 736 01:05:30,840 --> 01:05:35,230 Ek is net te vereenvoudig dit so ek het nie 26 van hulle te trek. 737 01:05:37,250 --> 01:05:43,770 So jy het hierdie, en dan hierdie verteenwoordig rye van woorde 738 01:05:43,770 --> 01:05:54,620 waar al die van hierdie klein sirkels is briewe wat is geldig volgordes van letters. 739 01:06:03,040 --> 01:06:07,160 Laat ons net 'n bietjie meer voortgaan. 740 01:06:15,110 --> 01:06:25,750 Wat jy gaan om te wil doen, is die bodem hier en dan vry hierdie een 741 01:06:25,750 --> 01:06:31,640 en dan vry om hierdie een aan die onderkant voordat jy vry om die boonste een hier 742 01:06:31,640 --> 01:06:38,180 want as jy vrye iets in die tweede vlak, 743 01:06:38,180 --> 01:06:47,230 dan is jy eintlik sou hierdie waarde hier verloor. 744 01:06:47,230 --> 01:06:54,780 Dit is hoekom dit belangrik is in los vir 'n Trie om seker te maak dat jy eerste op die bodem bevry. 745 01:06:54,780 --> 01:06:59,480 Wat wil jy dalk om te doen is om te sê vir elke node 746 01:06:59,480 --> 01:07:06,430 Ek wil al van die kinders af te laai. 747 01:07:16,060 --> 01:07:22,140 >> Nou dat ons het gegaan oor los vir die hash tafel metode sowel as die oor die metode, 748 01:07:22,140 --> 01:07:27,020 ons gaan om te wil om te kyk na Valgrind. 749 01:07:27,020 --> 01:07:29,640 Loop jy Valgrind met die volgende opdragte. 750 01:07:29,640 --> 01:07:32,700 Jy het valgrind-v. 751 01:07:32,700 --> 01:07:40,960 Jy kontrolering vir alle lekkasies wanneer jy speller hierdie sekere teks 752 01:07:40,960 --> 01:07:46,980 omdat speller te neem in 'n tekslêer. 753 01:07:46,980 --> 01:07:52,330 So Valgrind sal vir jou 'n program hardloop, vertel hoeveel bytes jy toegeken, 754 01:07:52,330 --> 01:07:57,150 hoeveel bytes jy bevry, en dit sal jou vertel of jy bevry net genoeg 755 01:07:57,150 --> 01:07:58,930 of jy het nie vry genoeg, 756 01:07:58,930 --> 01:08:02,850 of soms kan jy selfs oor vry, soos vry om 'n nodus wat reeds bevry 757 01:08:02,850 --> 01:08:05,140 en dit sal u laat terugkeer foute. 758 01:08:05,140 --> 01:08:11,600 As jy gebruik Valgrind, sal dit gee jou 'n paar boodskappe 759 01:08:11,600 --> 01:08:15,970 aandui of jy het bevry minder as genoeg, net genoeg, 760 01:08:15,970 --> 01:08:19,609 of meer as genoeg tyd. 761 01:08:24,370 --> 01:08:30,410 >> 'N deel van hierdie pset, dit is opsioneel The Big Raad uit te daag. 762 01:08:30,410 --> 01:08:35,790 Maar wanneer ons te doen het met hierdie datastrukture 763 01:08:35,790 --> 01:08:40,689 dit is soort van pret om te sien hoe vinnig en hoe doeltreffend jou datastrukture kan wees. 764 01:08:40,689 --> 01:08:44,490 Is jou hash funksie gevolg in 'n baie van botsings? 765 01:08:44,490 --> 01:08:46,300 Of is jou data grootte regtig groot? 766 01:08:46,300 --> 01:08:49,420 Neem dit 'n baie tyd om te verken? 767 01:08:49,420 --> 01:08:54,800 In die log van die speller, dit uitgange hoeveel tyd wat jy gebruik om te laai, 768 01:08:54,800 --> 01:08:57,700 om seker te maak, grootte te voer en af ​​te laai, 769 01:08:57,700 --> 01:09:00,720 en so dié gepos in The Big Raad, 770 01:09:00,720 --> 01:09:03,600 waar jy kan meeding teen jou klasmaats 771 01:09:03,600 --> 01:09:11,350 en 'n paar personeellede om te sien wie die vinnigste speltoetser het. 772 01:09:11,350 --> 01:09:14,760 Een ding wat ek wil om daarop te let oor die hash tabelle 773 01:09:14,760 --> 01:09:20,470 is dat daar is 'n paar redelik eenvoudige hash funksies wat ons kan dink. 774 01:09:20,470 --> 01:09:27,240 Byvoorbeeld, jy het 26 emmers, en so elke emmer 775 01:09:27,240 --> 01:09:30,200 ooreenstem met die eerste letter in 'n woord, 776 01:09:30,200 --> 01:09:35,229 maar dit gaan om te lei tot 'n redelik ongebalanseerde hash tafel 777 01:09:35,229 --> 01:09:40,979 want daar is 'n baie minder woorde wat begin met 'n X as begin met M, byvoorbeeld. 778 01:09:40,979 --> 01:09:47,890 Een manier om te gaan oor die speller is as jy wil al die ander funksies om af te kry, 779 01:09:47,890 --> 01:09:53,240 dan net 'n eenvoudige hash funksie gebruik om in staat wees om jou kode aan die gang te kry 780 01:09:53,240 --> 01:09:58,650 en gaan dan terug en verander die grootte van jou hash tafel en die definisie. 781 01:09:58,650 --> 01:10:03,430 Daar is 'n baie van die hulpbronne op die internet vir hash funksies, 782 01:10:03,430 --> 01:10:08,250 en so is dit vir hierdie pset hash funksies word toegelaat om navorsing te doen op die internet 783 01:10:08,250 --> 01:10:15,560 vir 'n paar wenke en inspirasie so lank as wat jy maak seker om te noem waar jy het dit uit. 784 01:10:15,560 --> 01:10:22,060 Jy is welkom om te kyk en te interpreteer sommige hash funksie wat jy kry op die internet. 785 01:10:22,060 --> 01:10:27,460 Terug na daardie, kan jy in staat wees om te sien as iemand 'n Trie gebruik 786 01:10:27,460 --> 01:10:31,700 of die implementering daarvan is vinniger as jou hash tafel of nie. 787 01:10:31,700 --> 01:10:35,290 Jy kan verskeie kere aan The Big Raad. 788 01:10:35,290 --> 01:10:37,660 Dit sal jou mees onlangse inskrywing te teken. 789 01:10:37,660 --> 01:10:44,300 So miskien het jy verander jou hash funksie en dan besef dat dit eintlik 'n baie vinniger 790 01:10:44,300 --> 01:10:46,780 of 'n baie stadiger as voorheen. 791 01:10:46,780 --> 01:10:50,960 Dit is 'n bietjie van 'n prettige manier. 792 01:10:50,960 --> 01:10:57,190 Daar is altyd 1 of 2 personeellede wat probeer om die stadigste moontlike woordeboek te maak, 793 01:10:57,190 --> 01:11:00,210 so dit is altyd pret om na te kyk. 794 01:11:00,210 --> 01:11:07,630 >> Die gebruik vir die pset is jy hardloop speller met 'n opsionele woordeboek 795 01:11:07,630 --> 01:11:12,840 en dan 'n verpligte teks lêer. 796 01:11:12,840 --> 01:11:18,380 By verstek wanneer jy speller met net 'n teks lêer en spesifiseer nie 'n woordeboek, 797 01:11:18,380 --> 01:11:24,410 dit gaan die woordeboek teks lêer, die groot een om te gebruik 798 01:11:24,410 --> 01:11:27,920 in die cs50/pset5/dictionaries-lêergids. 799 01:11:27,920 --> 01:11:32,760 Dat 'n mens meer as 100,000 woorde. 800 01:11:32,760 --> 01:11:37,950 Hulle het ook 'n klein woordeboek, wat aansienlik minder woorde 801 01:11:37,950 --> 01:11:40,730 wat CS50 vir jou gemaak het. 802 01:11:40,730 --> 01:11:44,050 Kan egter baie maklik jy net maak jou eie woordeboek 803 01:11:44,050 --> 01:11:47,150 as jy net wil om saam te werk in klein voorbeelde - 804 01:11:47,150 --> 01:11:51,140 Byvoorbeeld, as jy wil gdb te gebruik en jy weet die spesifieke waardes 805 01:11:51,140 --> 01:11:53,560 wat jy wil jou hash tafel te karteer aan. 806 01:11:53,560 --> 01:12:00,430 So jy kan net jou eie teks lêer net met BAR, BAZ, FOO en Tapper, 807 01:12:00,430 --> 01:12:04,860 maak dat in 'n tekslêer, skei dié elk met 1 lyn, 808 01:12:04,860 --> 01:12:12,670 en maak dan jou eie teks lêer wat letterlik net miskien 1 of 2 woorde bevat 809 01:12:12,670 --> 01:12:15,950 sodat jy presies weet wat die uitset moet wees. 810 01:12:15,950 --> 01:12:21,870 Sommige van die monster teks lêers wat The Big Raad wanneer jy uitdaging sal kontroleer 811 01:12:21,870 --> 01:12:25,580 Oorlog en Vrede en 'n Jane Austen roman of iets soos dit. 812 01:12:25,580 --> 01:12:30,450 So wanneer jy begin, dit is 'n baie makliker om jou eie teks lêers te maak 813 01:12:30,450 --> 01:12:34,160 wat bevat slegs 'n paar woorde, of miskien 10 814 01:12:34,160 --> 01:12:38,280 sodat jy kan voorspel wat die uitkoms moet wees 815 01:12:38,280 --> 01:12:42,880 en dan gaan dit teen so meer van 'n beheerde voorbeeld. 816 01:12:42,880 --> 01:12:45,820 En so omdat ons te doen het met die voorspelling en die dinge rondom, 817 01:12:45,820 --> 01:12:48,690 Ek wil weer aan te moedig jy pen en papier te gebruik 818 01:12:48,690 --> 01:12:50,700 want dit is regtig gaan om jou te help met hierdie een - 819 01:12:50,700 --> 01:12:55,620 die tekens van die pyle, hoe die hash tafel of hoe jou Trie lyk, 820 01:12:55,620 --> 01:12:57,980 wanneer jy iets waar die pyle gaan bevry, 821 01:12:57,980 --> 01:13:01,730 hou jy genoeg, sien jy enige skakels verdwyn 822 01:13:01,730 --> 01:13:05,750 en val in die afgrond van geheue gelek. 823 01:13:05,750 --> 01:13:11,070 So asseblief, probeer om dinge uit te trek selfs nog voordat jy kode skryf neer. 824 01:13:11,070 --> 01:13:14,520 Teken dinge uit, sodat jy verstaan ​​hoe dinge gaan werk 825 01:13:14,520 --> 01:13:22,750 want dan het ek waarborg jy hardloop in minder pointer muddles daar. 826 01:13:24,270 --> 01:13:25,910 >> Alles reg. 827 01:13:25,910 --> 01:13:28,780 Wil ek wens jou die beste van geluk met hierdie pset. 828 01:13:28,780 --> 01:13:31,980 Dit is waarskynlik die moeilikste een. 829 01:13:31,980 --> 01:13:40,360 So probeer om te vroeg te begin, teken dinge uit, teken dinge uit, en baie geluk. 830 01:13:40,360 --> 01:13:42,980 Dit was Walk Through 5. 831 01:13:45,160 --> 01:13:47,000 >> [CS50.TV]