1 00:00:00,000 --> 00:00:02,000 [Powered by Google Translate] [Semajno 6] 2 00:00:02,000 --> 00:00:04,000 [Davido J. Malan] [Universitato Harvard] 3 00:00:04,000 --> 00:00:08,000 [Jen CS50.] [CS50.TV] 4 00:00:08,000 --> 00:00:12,000 >> Ĉi tiu estas CS50, kaj ĉi tiu estas la komenco de Semajno 6, 5 00:00:12,000 --> 00:00:16,000 tial kelkaj novaj iloj estas nun disponebla por vi utiligi, 6 00:00:16,000 --> 00:00:19,000 la unua el kiuj estas nomita CS50 Stilo. 7 00:00:19,000 --> 00:00:22,000 Odds estas se vi estas kiel mi aŭ iu el la instruado uloj, 8 00:00:22,000 --> 00:00:26,000 vi probable vidis programon kies stilo aspektas iom io tiamaniere. 9 00:00:26,000 --> 00:00:30,000 Eble vi komencas tranĉi kelkajn angulojn malfrue en la nokto, aŭ vi trakti ĝin poste, 10 00:00:30,000 --> 00:00:32,000 kaj tiam TF aŭ CA venas super dum oficejo horoj. 11 00:00:32,000 --> 00:00:34,000 Tiam estas malfacile por ni legas. 12 00:00:34,000 --> 00:00:38,000 Nu, ĉi tiu kodo estas sintakse ĝusta, kaj ĝi estos kompili, kaj ĝi estos reale kuri. 13 00:00:38,000 --> 00:00:40,000 Sed estas certe ne estas 5 por stilo. 14 00:00:40,000 --> 00:00:45,000 >> Sed nun, se ni iros en tiu ĉi dosierujo tie- 15 00:00:45,000 --> 00:00:48,000 kaj rimarki ke mi havas conditions2.c- 16 00:00:48,000 --> 00:00:55,000 kaj mi kuras tiu nova komando, style50, sur ĉi tiu dosiero conditions2.c, Enter, 17 00:00:55,000 --> 00:00:57,000 rimarki ke ĝi estas informis min ke estis stiligita. 18 00:00:57,000 --> 00:01:00,000 Gedit rimarkis, ke la dosiero estas ŝanĝita je disko, 19 00:01:00,000 --> 00:01:08,000 kaj se mi alklakos reŝargi, ĉiuj viaj problemoj estas jam aŭtomatigita. 20 00:01:08,000 --> 00:01:15,000 [Aplaŭdo] 21 00:01:15,000 --> 00:01:17,000 Tio estas unu el la aĵoj kiujn ni faris tiun semajnfinon. 22 00:01:17,000 --> 00:01:20,000 Rimarkas ke estas malperfekta ĉar estas iom da kodo 23 00:01:20,000 --> 00:01:23,000 ke simple ne povos stylize perfekte, 24 00:01:23,000 --> 00:01:26,000 sed realigi ĉi estas nun ilo vi povas utiligi 25 00:01:26,000 --> 00:01:33,000 eĉ se nur por ordigita kelkaj el la pli errantly metis frizita krampoj kaj similaj. 26 00:01:33,000 --> 00:01:36,000 >> Sed pli konvinkaj nun estas CS50 Check. 27 00:01:36,000 --> 00:01:39,000 Kun CS50 Check, vi povas efektive realigi la saman praveco provoj 28 00:01:39,000 --> 00:01:42,000 en via propra kodo kiu la instruado uloj kapablas. 29 00:01:42,000 --> 00:01:44,000 Tio ĉi estas komandlinio utileco kiu venas nun en la aparaton 30 00:01:44,000 --> 00:01:46,000 tuj kiam vi faras la update50 kiel por 31 00:01:46,000 --> 00:01:49,000 pset 4 especificaciones, kaj vi uzas ĝin esence kiel tion ĉi. 32 00:01:49,000 --> 00:01:51,000 Vi kuras la komando check50. 33 00:01:51,000 --> 00:01:56,000 Tiam vi pasos en komanda linio argumento, aŭ pli ĝenerale konita kiel ŝaltilo aŭ flago. 34 00:01:56,000 --> 00:01:58,000 Ĝenerale, la aĵoj kiuj havas streketoj estas nomitaj ŝaltilo 35 00:01:58,000 --> 00:02:02,000 al komandlinio programo, tiel c specifas 36 00:02:02,000 --> 00:02:04,000 la ĉekoj, kiujn vi volas kuri. 37 00:02:04,000 --> 00:02:07,000 >> La provoj, kiujn vi volas kuri estas identigitaj unike per ĉi ŝnuroj, 38 00:02:07,000 --> 00:02:10,000 2012/pset4/resize. 39 00:02:10,000 --> 00:02:13,000 En aliaj vortoj, tio estas nur arbitra sed unika linio 40 00:02:13,000 --> 00:02:18,000 ke ni uzas por unike identigi pset 4 de praveco provoj. 41 00:02:18,000 --> 00:02:21,000 Kaj tiam vi specifi spaco disigita listo de la dosieroj, kiujn vi volas alŝuti 42 00:02:21,000 --> 00:02:24,000 al CS50 Check por analizo. 43 00:02:24,000 --> 00:02:29,000 Ekzemple, se mi iros en mian solvon ĉi tie por resize.c- 44 00:02:29,000 --> 00:02:31,000 lasu min malfermi pli granda fina fenestro- 45 00:02:31,000 --> 00:02:42,000 kaj mi iras antaŭen kaj kuri diru check50-c 2012/pset4/resize, 46 00:02:42,000 --> 00:02:46,000 kaj poste mi iras antaŭen kaj specifi la nomoj de la dosieroj, 47 00:02:46,000 --> 00:02:49,000 resize.c, kaj poste batis Entajpu, ĝi kunpremas, 48 00:02:49,000 --> 00:02:53,000 ĝi alŝutoj, ĝi kontrolas, kaj mi simple ne sukcesis tuta amaso de provoj. 49 00:02:53,000 --> 00:02:59,000 La en ruĝa ĉe supre maldekstre diras ke resize.c kaj bmp ekzisti. 50 00:02:59,000 --> 00:03:01,000 Tio estis la provo. Tio estis la demando ni demandis. 51 00:03:01,000 --> 00:03:04,000 Kaj estas malfeliĉa ĉar la respondo estis falsaj. 52 00:03:04,000 --> 00:03:08,000 La blanka suba teksto diras atendis bmp.h ekzisti, kaj tio estas simple mia kulpo. 53 00:03:08,000 --> 00:03:11,000 Mi forgesis alŝuti ĝin, do mi bezonas alŝuti ambaŭ dosieroj, 54 00:03:11,000 --> 00:03:14,000 resize.c kaj bmp.h. 55 00:03:14,000 --> 00:03:17,000 Sed nun rimarki ĉiuj aliaj provoj estas en flava cxar ili ne kuras, 56 00:03:17,000 --> 00:03:21,000 kaj do la smiley vizaĝo estas vertikala ĉar li estas nek feliĉaj nek malgaja, 57 00:03:21,000 --> 00:03:25,000 sed ni devas kompensi ke afero en ruĝa antaŭ tiuj aliaj ĉekojn kuros. 58 00:03:25,000 --> 00:03:27,000 >> Lasu min ripari tion. 59 00:03:27,000 --> 00:03:30,000 Lasu min malzomi kaj rerun ĉi, ĉi-foje kun bmp.h ankaŭ 60 00:03:30,000 --> 00:03:34,000 sur la komanda linio, Enter, kaj nun se ĉiu iras bone, 61 00:03:34,000 --> 00:03:38,000 ĝi tuj kontroli kaj tiam revenu rezulto de-teni vian spiron- 62 00:03:38,000 --> 00:03:42,000 ĉiuj verdaj, kio signifas mi faras vere bone en pset 4 ĝis nun. 63 00:03:42,000 --> 00:03:44,000 Vi povas vidi kaj konkludi el la priskriba teksto tie 64 00:03:44,000 --> 00:03:47,000 ĝuste kio estas ni provis. 65 00:03:47,000 --> 00:03:49,000 Ni provis unue ĉu la dosieroj ekzistas? 66 00:03:49,000 --> 00:03:51,000 Ni tiam provis faras resize.c kompili? 67 00:03:51,000 --> 00:03:58,000 Tiam ni provis faras ĝi ne regrandigi a 1x1 pixeles BMP kiam n, la Regrandigi faktoro, estas 1. 68 00:03:58,000 --> 00:04:01,000 Nun, se vi ne havas ideon kion n estas, vi iam vi plonĝi en pset 4, 69 00:04:01,000 --> 00:04:04,000 sed tio simple estas prudento kontroli por certiĝi, ke vi ne regrandigi 70 00:04:04,000 --> 00:04:08,000 bildo ajn se la Regrandigi faktoro estas 1. 71 00:04:08,000 --> 00:04:14,000 Se, kontraŭe, ĝi resizes a 1x1 bilderoj al 1x1 bilderoj BMP al 2x2 korekte 72 00:04:14,000 --> 00:04:19,000 kiam n estas 2, tiam simile, mia formas laŭe. 73 00:04:19,000 --> 00:04:22,000 >> Unuvorte, tiu celas, oni, prenu la transirante la fingroj 74 00:04:22,000 --> 00:04:25,000 eksteren de la ekvacio ĝuste antaŭ vi proponi vian pset. 75 00:04:25,000 --> 00:04:28,000 Vi scias precize kion vi TF baldaux scios 76 00:04:28,000 --> 00:04:30,000 kiam vi iros sur submeti kelkajn el tiuj problemo aroj, 77 00:04:30,000 --> 00:04:34,000 kaj ankaŭ la pedagogian motivado estas vere meti 78 00:04:34,000 --> 00:04:37,000 la ŝancon antaŭ vi por ke kiam vi scias apriore 79 00:04:37,000 --> 00:04:39,000 ke estas eraroj en via kodo kaj testoj kiuj ne esti aprobita, 80 00:04:39,000 --> 00:04:43,000 vi povas meti en pli efika tempo ĝis fronto por solvi tiujn problemojn 81 00:04:43,000 --> 00:04:45,000 anstataŭ perdi punktoj, get sugestoj de via TF, 82 00:04:45,000 --> 00:04:48,000 kaj poste iru, "Ahh", kiel mi devus pensis, eksteren. 83 00:04:48,000 --> 00:04:50,000 Nun almenaŭ ekzistas ilo por helpi vin trovi tion. 84 00:04:50,000 --> 00:04:52,000 Oni ne tuj atentigi kie la cimo estas, sed rakontos al vi 85 00:04:52,000 --> 00:04:54,000 kio estas sintomático de ĝi. 86 00:04:54,000 --> 00:04:57,000 >> Nun realigi la testoj ne estas nepre ĝisfunda. 87 00:04:57,000 --> 00:04:59,000 Nur ĉar vi ricevas ekranon plenan de verda smiley edroj 88 00:04:59,000 --> 00:05:02,000 ne signifas via kodo estas perfekta, sed ĝi signifas 89 00:05:02,000 --> 00:05:06,000 ke jam pasis unu provoj preskribita de la specifon. 90 00:05:06,000 --> 00:05:08,000 Foje ni ne liberigi ĉekoj. 91 00:05:08,000 --> 00:05:10,000 Ekzemple, whodunit, unu el la aspektoj de pset 4, 92 00:05:10,000 --> 00:05:15,000 estas ia seniluziiga se ni donas al vi 93 00:05:15,000 --> 00:05:18,000 la respondo pri kio ĝi estas, kaj estas pluraj manieroj por malkaŝi 94 00:05:18,000 --> 00:05:21,000 kiu la persono estas en tiu ruĝa bruo. 95 00:05:21,000 --> 00:05:24,000 La specifo ĉiam specifi en la estonteco por pset 5 antaŭen 96 00:05:24,000 --> 00:05:26,000 kio kontrolas ekzistas por vi. 97 00:05:26,000 --> 00:05:28,000 Vi rimarkos ke estas tio blanka URL malsupre. 98 00:05:28,000 --> 00:05:30,000 Por la momento, ĉi tiu estas nur diagnozas eligo. 99 00:05:30,000 --> 00:05:33,000 Se vi vizitas ke URL, vi ricevos tutan faskon da freneza, kripta mesaĝojn 100 00:05:33,000 --> 00:05:36,000 ke vi plene rajtas trarigardi, sed estas plejparte por la personaro 101 00:05:36,000 --> 00:05:41,000 por ke ni povas diagnozi kaj elpurigi erarojn en check50 mem. 102 00:05:41,000 --> 00:05:46,000 >> Sen enkonduko, ni movos al kie ni cxesis. 103 00:05:46,000 --> 00:05:48,000 CS50 biblioteko ni prenis donita por iuj semajnoj, 104 00:05:48,000 --> 00:05:52,000 sed tiam lasta semajno, ni komencis senŝeligi reen de la manteloj de ĝi. 105 00:05:52,000 --> 00:05:55,000 Ni komencis metante flanken string favore kio anstataŭ? 106 00:05:55,000 --> 00:05:57,000 [Studentoj] Char. 107 00:05:57,000 --> 00:05:59,000 Char *, kiu estis char * ĉio ĉi momento, 108 00:05:59,000 --> 00:06:03,000 sed nun ni ne devas ŝajnigi ke ĝi estas reala datumtipo kordoj. 109 00:06:03,000 --> 00:06:06,000 Pli ĝuste, ĝi estas estinta sinonimo de varoj por char *, 110 00:06:06,000 --> 00:06:09,000 kaj linio estas vico de signoj, 111 00:06:09,000 --> 00:06:14,000 do kial ne havas sencon por reprezenti ĉenojn kiel char * s? 112 00:06:14,000 --> 00:06:20,000 Kion oni char * reprezenti en la kunteksto de tiu koncepto de kordoj? 113 00:06:20,000 --> 00:06:23,000 Yeah. >> [Studenta] La unua karaktero. 114 00:06:23,000 --> 00:06:25,000 Nu, la unua signo, sed ne tute la unua karaktero. 115 00:06:25,000 --> 00:06:27,000 Ĝi estas la-[Studentoj] Adreso. 116 00:06:27,000 --> 00:06:29,000 Nu, la adreso de la unua signo. 117 00:06:29,000 --> 00:06:33,000 Ĉio, kion necesas por reprezenti ĉenon en komputilo la memoro 118 00:06:33,000 --> 00:06:36,000 Estas ĝuste la sola adreso de lia unua bitoko. 119 00:06:36,000 --> 00:06:38,000 Vi eĉ ne devos scii kiom longe ĝi estas 120 00:06:38,000 --> 00:06:42,000 ĉar kiel vi povas diveni ke el dinamike? 121 00:06:42,000 --> 00:06:44,000 [Studenta] String longo. 122 00:06:44,000 --> 00:06:48,000 Vi povas nomi ĉenon longo, bonega, sed kio faras string longo laboro? 123 00:06:48,000 --> 00:06:50,000 Kion ĝi faras? Yeah. 124 00:06:50,000 --> 00:06:52,000 [Studenta] Konservu iri ĝis vi ricevas la nula karaktero. 125 00:06:52,000 --> 00:06:54,000 Yeah, precize, ĝi nur iterates kun por ciklo, dum ciklo, 126 00:06:54,000 --> 00:06:57,000 kion ajn el * al la fino, kaj la fino estas reprezentita 127 00:06:57,000 --> 00:07:01,000 per \ 0, la tiel nomata nul karaktero, nul, 128 00:07:01,000 --> 00:07:05,000 ne konfuzi kun nula, kiu estas puntero, 129 00:07:05,000 --> 00:07:07,000 kiu venos en konversacio denove hodiaŭ. 130 00:07:07,000 --> 00:07:11,000 >> Ni senŝeligita reen mantelo de GetInt, kaj tiam ni prenis rigardu GetString, 131 00:07:11,000 --> 00:07:14,000 kaj memorigi, ke ambaŭ tiuj funkcioj, aŭ vere, 132 00:07:14,000 --> 00:07:18,000 GetString, estis uzanta iu funkcio 133 00:07:18,000 --> 00:07:21,000 por fakte analizi, kiu, legu aŭ analizi, la uzanto enigo. 134 00:07:21,000 --> 00:07:25,000 Kaj kio estis tiu nova funkcio? 135 00:07:25,000 --> 00:07:27,000 Scanf aŭ sscanf. Ĝi fakte venas en kelkaj diversaj gustoj. 136 00:07:27,000 --> 00:07:31,000 Estas scanf, ekzistas sscanf, ekzistas fscanf. 137 00:07:31,000 --> 00:07:35,000 Nuntempe, tamen, ni enfokusigas la plej facile ilustrita, 138 00:07:35,000 --> 00:07:38,000 kaj lasu min antaŭeniri kaj malfermu la aparaton 139 00:07:38,000 --> 00:07:41,000 dosiero kiel ĉi tiu, scanf1.c. 140 00:07:41,000 --> 00:07:43,000 Ĉi tiu estas super simpla programo, 141 00:07:43,000 --> 00:07:46,000 sed kiu faras ion, ke ni neniam faris 142 00:07:46,000 --> 00:07:48,000 sen la helpo de la CS50 biblioteko. 143 00:07:48,000 --> 00:07:51,000 Ĉi gets an int de uzanto. Kiel ĝi funkcias? 144 00:07:51,000 --> 00:07:53,000 Nu, en linio 16 tie, 145 00:07:53,000 --> 00:07:56,000 rimarki, ke ni deklaru int nomata x, kaj je ĉi tiu punkto en la historio, 146 00:07:56,000 --> 00:07:58,000 kio estas la valoro de x? 147 00:07:58,000 --> 00:08:00,000 [Inaudible studento respondon] 148 00:08:00,000 --> 00:08:02,000 [Davido M.] Dekstra, kiu scias, iu rubo valoro potenciale, do en 17, ni simple diru al la uzanto 149 00:08:02,000 --> 00:08:06,000 donu al mi numeron, bonvolu, kaj paŝo 18 estas kie alvenas interesa. 150 00:08:06,000 --> 00:08:11,000 Scanf ŝajnas prunteprenos ideon de printf en kiu uzas tiujn formato kodoj en citilojn. 151 00:08:11,000 --> 00:08:13,000 % D estas kompreneble dekuma nombro. 152 00:08:13,000 --> 00:08:21,000 Sed kial mi pasante en & x anstataŭ ĝuste x? 153 00:08:21,000 --> 00:08:24,000 La unua estas ĝusta. Yeah. 154 00:08:24,000 --> 00:08:26,000 [Inaudible studento respondon] 155 00:08:26,000 --> 00:08:31,000 Ĝuste, se la celo de tiu programo, kiel la funkcio GetInt mem, 156 00:08:31,000 --> 00:08:34,000 estas al preni int de la uzanto mi povas pasi funkcioj 157 00:08:34,000 --> 00:08:38,000 ĉiuj variabloj mi volas, sed se mi ne pasi ilin por referenco 158 00:08:38,000 --> 00:08:41,000 aux per adreso aŭ per pointer, ĉiuj sinonimo por la hodiaŭa intencoj, 159 00:08:41,000 --> 00:08:46,000 tiam tiu funkcio ne havas kapablon ŝanĝi la enhavon de tiu variablo. 160 00:08:46,000 --> 00:08:49,000 Tiu pasus en kopio same kiel la kalesxon versio de interŝanĝa 161 00:08:49,000 --> 00:08:51,000 ke ni jam parolis pri kelkaj fojoj nun. 162 00:08:51,000 --> 00:08:54,000 >> Sed anstataŭe, farante & x, mi laŭvorte pasante en kio? 163 00:08:54,000 --> 00:08:57,000 [Studenta] La adreso. >> La adreso de x. 164 00:08:57,000 --> 00:09:01,000 Estas kiel desegni mapon por la funkcio nomita scanf kaj dirante tie, 165 00:09:01,000 --> 00:09:04,000 tiuj estas direktoj por eron de memoro en la komputilo 166 00:09:04,000 --> 00:09:07,000 ke vi povas iri stoki iu entjero in 167 00:09:07,000 --> 00:09:10,000 En ordo por sscanf nun faros tion 168 00:09:10,000 --> 00:09:13,000 kio operatoro, kion peco de sintakso estas ĝi tuj devos uzi 169 00:09:13,000 --> 00:09:19,000 eĉ kvankam ni ne povas vidi ĝin ĉar iu alia skribis ĉi tiun funkcion? 170 00:09:19,000 --> 00:09:21,000 En aliaj vortoj - kio estas tio? 171 00:09:21,000 --> 00:09:23,000 [Studenta] X legi. 172 00:09:23,000 --> 00:09:27,000 Tie tuj estos iuj legado, sed nur rilate al x tie. 173 00:09:27,000 --> 00:09:30,000 Se scanf estas pasis la adreso de x, 174 00:09:30,000 --> 00:09:35,000 sintakse, kion operatoro estas ligita al ekzistas ie 175 00:09:35,000 --> 00:09:38,000 ene de scanf la efektivigo por ke scanf 176 00:09:38,000 --> 00:09:42,000 povas fakte skribi numero 2 al tiu adreso? 177 00:09:42,000 --> 00:09:44,000 Yeah, do la *. 178 00:09:44,000 --> 00:09:47,000 Memoru ke la * estas nia dereference operatoro, kiu esence signifas iri tien. 179 00:09:47,000 --> 00:09:50,000 >> Kiam vi estis transdonita adreson, kiel estas la kazo tie, 180 00:09:50,000 --> 00:09:53,000 scanf probable-se ni efektive rigardis ĉirkaŭ lia fontkodon- 181 00:09:53,000 --> 00:09:59,000 faras * x aŭ la ekvivalento al reale iri al tiu adreso kaj metis kelkajn valoron tie. 182 00:09:59,000 --> 00:10:02,000 Nun, kiel por kiel scanf ricevas enigon el la klavaro, 183 00:10:02,000 --> 00:10:04,000 ni skuu niaj manoj ekster hodiaŭ. 184 00:10:04,000 --> 00:10:07,000 Nur supozi ke la mastruma sistemo permesas sscanf paroli 185 00:10:07,000 --> 00:10:11,000 al la uzanto klavaro, sed en ĉi tiu punkto nun en linio 19, 186 00:10:11,000 --> 00:10:14,000 kiam ni simple presi x, ŝajnas esti la kazo 187 00:10:14,000 --> 00:10:17,000 ke scanf metis an int en x. 188 00:10:17,000 --> 00:10:19,000 Tio estas ĝuste kiel scanf funkcias, kaj memori pasintsemajne 189 00:10:19,000 --> 00:10:25,000 jen precize kiel GetString kaj GetInt kaj lia alia familio de funkcioj 190 00:10:25,000 --> 00:10:28,000 finfine funkcias, kvankam kun malpeza varianco kiel sscanf, 191 00:10:28,000 --> 00:10:31,000 kio signifas skani ĉenon anstataŭ la klavaro. 192 00:10:31,000 --> 00:10:33,000 Sed ni rigardu iom varianco de ĉi. 193 00:10:33,000 --> 00:10:37,000 En scanf2, mi vere ŝraŭbita supren. 194 00:10:37,000 --> 00:10:42,000 Kio estas erara-kaj mi kaŝos la komento klarigas tiel- 195 00:10:42,000 --> 00:10:47,000 kio estas malbone en tiu programo, versio 2? 196 00:10:47,000 --> 00:10:55,000 Estu kiel teknika kiel eble ĉi tiu tempo. 197 00:10:55,000 --> 00:10:57,000 Ĝi aspektas sufiĉe bone. 198 00:10:57,000 --> 00:11:03,000 Ĝi estas bele dentado, sed- 199 00:11:03,000 --> 00:11:07,000 bone, kion pri ni pritrancxu ĝin al pli mallongaj demandoj? 200 00:11:07,000 --> 00:11:17,000 Linio 16. Kio estas linio 16 faras en preciza sed teknika angla? 201 00:11:17,000 --> 00:11:20,000 Ricevas iom mallerta. Jes, Michael. 202 00:11:20,000 --> 00:11:25,000 [Studenta] Oni indikante la unuan literon de kordoj. 203 00:11:25,000 --> 00:11:27,000 >> Konsentite, proksima. Lasu min tweak ke iom. 204 00:11:27,000 --> 00:11:33,000 Indikante la unuan literon de kordoj, vi estas deklari variablon nomis buffer 205 00:11:33,000 --> 00:11:36,000 kiu indikas la unuan adreson de kordoj, 206 00:11:36,000 --> 00:11:39,000 aŭ pli ĝuste, ke notos pli specife al char. 207 00:11:39,000 --> 00:11:42,000 Rimarku ĝi estas fakte ne montrante ie ĉar ne estas asigno operatoro. 208 00:11:42,000 --> 00:11:46,000 Ne egala signo, do ĉiuj ni faras estas atribuo la variablo nomita buffer. 209 00:11:46,000 --> 00:11:49,000 Ĝi okazas al esti 32 bitoj ĉar ĝi estas puntero, 210 00:11:49,000 --> 00:11:52,000 kaj la enhavo de bufro supozeble fine 211 00:11:52,000 --> 00:11:57,000 enhavos adreson de char, sed por nun, kion signifas buffer enhavi? 212 00:11:57,000 --> 00:11:59,000 Nur iuj falsaj, kiu scias, iu rubo valoro, 213 00:11:59,000 --> 00:12:03,000 ĉar ni ne eksplicite inicializado ĝin, do ni ne devus supozi nenion. 214 00:12:03,000 --> 00:12:06,000 Konsentite, tiel nun linio 17 estas-kio ne linion 17 faru? 215 00:12:06,000 --> 00:12:08,000 Eble estos varmigi ĉi supre. 216 00:12:08,000 --> 00:12:10,000 Ĝi presas kordoj, ĉu ne? 217 00:12:10,000 --> 00:12:12,000 Ĝi presas String bonvole. 218 00:12:12,000 --> 00:12:15,000 >> Linio 18 estas speco de familiaraj nun en kiujn ni ĵus vidis varianco de ĉi 219 00:12:15,000 --> 00:12:18,000 sed kun malsama formato kodo, tiel en linio 18, 220 00:12:18,000 --> 00:12:23,000 ni diras scanf jen la adreso de eron de memoro. 221 00:12:23,000 --> 00:12:27,000 Mi volas ke vi sonorigi en ĉeno, kiel implicita de% s, 222 00:12:27,000 --> 00:12:32,000 sed la problemo estas ke ni ne faris kelkajn aferojn tie. 223 00:12:32,000 --> 00:12:35,000 Kio estas unu el la problemoj? 224 00:12:35,000 --> 00:12:38,000 [Studenta] Oni provas dereference nula puntero. 225 00:12:38,000 --> 00:12:41,000 Bona, nula aŭ nur alie nekonataj punteros. 226 00:12:41,000 --> 00:12:45,000 Vi transdonis scanf adreson, sed vi ĵus diris antaŭ momento 227 00:12:45,000 --> 00:12:49,000 ke tiu adreso estas iuj rubo valoron ĉar ni ne reale atribui ĝin al nenion, 228 00:12:49,000 --> 00:12:53,000 kaj tiel vi diras scanf efektive iru metis ĉenon tie, 229 00:12:53,000 --> 00:12:56,000 sed ni ne scias kie tie ankoraux estas, 230 00:12:56,000 --> 00:12:59,000 tial ni ne efektive asignitaj memoron por bufro. 231 00:12:59,000 --> 00:13:03,000 Cetere, kio vi estas ankaŭ eĉ ne diras scanf? 232 00:13:03,000 --> 00:13:06,000 Supozi tio eron de memoro, kaj ne estis rubo valoro, 233 00:13:06,000 --> 00:13:09,000 sed vi ankoraŭ ne rakontis scanf io grava. 234 00:13:09,000 --> 00:13:12,000 [Studenta] Kie fakte estas, la signo. 235 00:13:12,000 --> 00:13:15,000 Ampersand, do en tiu ĉi kazo, ĝi estas bone. 236 00:13:15,000 --> 00:13:18,000 Ĉar buffer jam deklaris kiel puntero 237 00:13:18,000 --> 00:13:22,000 kun la * peco de sintakso, ni ne bezonas uzi signo 238 00:13:22,000 --> 00:13:25,000 ĉar ĝi estas jam adreson, sed mi kredas ke mi aŭdis ĝin ĉi tie. 239 00:13:25,000 --> 00:13:27,000 [Studenta] Kiom granda estas tio? 240 00:13:27,000 --> 00:13:29,000 Bona, ni ne diras scanf kiom granda ĉi buffer estas, 241 00:13:29,000 --> 00:13:32,000 kio signifas eĉ se buffer estis pointer, 242 00:13:32,000 --> 00:13:35,000 ni jene scanf, metis ĉenon tie, 243 00:13:35,000 --> 00:13:38,000 sed tie povis esti 2 bajtoj, povus esti 10 bitokoj, povus esti megabajto. 244 00:13:38,000 --> 00:13:41,000 Scanf havas neniun ideon, kaj ĉar ĉi tiu estas peco de memoro 245 00:13:41,000 --> 00:13:43,000 supozeble, ne ĉenon ankoraŭ. 246 00:13:43,000 --> 00:13:48,000 Tio estas nur linio iam skribas signojn kaj \ 0 tiun eron de memoro. 247 00:13:48,000 --> 00:13:51,000 Nun estas nur iu bloko de memoro. 248 00:13:51,000 --> 00:13:55,000 Scanf ne scias kiam halti skribi al tiu adreso. 249 00:13:55,000 --> 00:13:59,000 >> Se vi memoras iujn ekzemplojn en la pasinteco, kie mi hazarde tajpita sur la klavaro 250 00:13:59,000 --> 00:14:03,000 provante superflui buffer, kaj ni parolis vendrede pri ekzakte tio. 251 00:14:03,000 --> 00:14:07,000 Se kontraŭulo iel injektas en vian programon multe pli grandan vorton 252 00:14:07,000 --> 00:14:10,000 aŭ frazo aŭ frazo tiam vi atendis povas invadita 253 00:14:10,000 --> 00:14:13,000 eron de memoro, kiu povas havi malbonajn konsekvencojn, 254 00:14:13,000 --> 00:14:15,000 kiel porti sur la tuta programo mem. 255 00:14:15,000 --> 00:14:17,000 Ni devas redifini tiun iel. 256 00:14:17,000 --> 00:14:20,000 Lasu min malzomi kaj iru en versio 3 de tiu programo. 257 00:14:20,000 --> 00:14:22,000 Tio estas iomete pli bona. 258 00:14:22,000 --> 00:14:24,000 En ĉi tiu versio, rimarki la diferencon. 259 00:14:24,000 --> 00:14:27,000 En linio 16, mi denove deklari variablon nomis buffer, 260 00:14:27,000 --> 00:14:29,000 sed kio estas tio nun? 261 00:14:29,000 --> 00:14:33,000 Ĝi estas tabelo de 16 signoj. 262 00:14:33,000 --> 00:14:36,000 Ĉi tiu estas bona ĉar tio signifas Mi povas nun diri scanf 263 00:14:36,000 --> 00:14:39,000 jen reala bloko de memoro. 264 00:14:39,000 --> 00:14:42,000 Vi povas preskaŭ pensas pri tabeloj kiel punteros nun, 265 00:14:42,000 --> 00:14:44,000 kvankam ili ne estas reale ekvivalento. 266 00:14:44,000 --> 00:14:47,000 Ili devos konduti malsame en malsamaj kuntekstoj. 267 00:14:47,000 --> 00:14:50,000 Sed estas certe la kazo ke buffer estas referenco 268 00:14:50,000 --> 00:14:53,000 16 apudaj signoj ĉar tio estas kio tabelo estas 269 00:14:53,000 --> 00:14:55,000 kaj estis por iuj semajnoj nun. 270 00:14:55,000 --> 00:14:59,000 >> Ĉi tie, mi diras scanf jen eron de memoro. 271 00:14:59,000 --> 00:15:01,000 Ĉi-foje ĝi estas reale eron de memoro, 272 00:15:01,000 --> 00:15:07,000 sed kial estas tiu programo ankoraŭ explotable? 273 00:15:07,000 --> 00:15:11,000 Kio okazas ankoraŭ? 274 00:15:11,000 --> 00:15:14,000 Mi diris al mi 16 bitokoj sed- 275 00:15:14,000 --> 00:15:16,000 [Studenta] Kio se tajpi en pli ol 16? 276 00:15:16,000 --> 00:15:20,000 Ĝuste, kio okazos se la uzanto tajpas en 17 signoj aŭ 1700 karakteroj? 277 00:15:20,000 --> 00:15:23,000 Fakte, ni vidu, se ni ne povas vojaĝo super ĉi eraro nun. 278 00:15:23,000 --> 00:15:25,000 Estas bona, sed ne perfekta. 279 00:15:25,000 --> 00:15:28,000 Lasu min kaj kuras fari scanf3 kompili tiun programon. 280 00:15:28,000 --> 00:15:34,000 Mi kuros scanf3, String petas: saluton, kaj ni ŝajnas esti bone. 281 00:15:34,000 --> 00:15:37,000 Lasu min provi iomete pli longa unu, saluton tie. 282 00:15:37,000 --> 00:15:42,000 Konsentite, ni do saluton tie kiel vi fartas hodiaŭ, Enter. 283 00:15:42,000 --> 00:15:54,000 Getting ia sorto tie, diru saluton tie kiel vi fartas. 284 00:15:54,000 --> 00:15:56,000 Damn it. 285 00:15:56,000 --> 00:16:03,000 Konsentite, do ni havas bonŝanca. Ni vidu se ni ne povas ripari tion. 286 00:16:03,000 --> 00:16:06,000 Ne, ĝi ne tuj lasu min kopii. 287 00:16:06,000 --> 00:16:09,000 Ni provu ĉi denove. 288 00:16:09,000 --> 00:16:12,000 Bone, staras. 289 00:16:12,000 --> 00:16:20,000 Ni vidos kiel longe mi povas ŝajnigi enfokusigi dum ankoraŭ faras tion. 290 00:16:20,000 --> 00:16:23,000 Damn it. Tio estas iom taŭga, fakte. 291 00:16:23,000 --> 00:16:26,000 Tie ni iru. 292 00:16:26,000 --> 00:16:30,000 Punkto faris. 293 00:16:30,000 --> 00:16:34,000 >> Tiu, hontinda kvankam ankaŭ estas, ĝi estas ankaŭ unu el la fontoj de granda konfuzo 294 00:16:34,000 --> 00:16:38,000 kiam skribas programojn kiuj havas erarojn ĉar ili elmontras sin 295 00:16:38,000 --> 00:16:40,000 nur tempaltempe kelkfoje. 296 00:16:40,000 --> 00:16:43,000 La realaĵo estas, ke eĉ se via kodo estas tute rompita, 297 00:16:43,000 --> 00:16:46,000 eble nur tute rompita tempaltempe 298 00:16:46,000 --> 00:16:49,000 ĉar kelkfoje, esence kio okazas estas la mastruma sistemo allocates 299 00:16:49,000 --> 00:16:52,000 iom pli memoro ol vi vere bezonas ial ajn 300 00:16:52,000 --> 00:16:57,000 kaj tiel neniu alia uzas la memoron dekstra post via bloko de 16 signoj, 301 00:16:57,000 --> 00:17:01,000 do se vi iras al 17, 18, 19, ajn, ne tiom granda interkonsento. 302 00:17:01,000 --> 00:17:04,000 Nun, la komputilo, eĉ se ĝi ne frakasi al tiu punkto, 303 00:17:04,000 --> 00:17:09,000 povus eventuale uzi bajto numero 17 aŭ 18 aŭ 19 por io alia, 304 00:17:09,000 --> 00:17:14,000 je kiu notas viajn datumojn kiujn vi metis tie, kvankam troe longa, 305 00:17:14,000 --> 00:17:18,000 tuj akiri anstataŭigi potenciale per iu alia funkcio. 306 00:17:18,000 --> 00:17:21,000 Oni ne nepre tuj restos nerompita, 307 00:17:21,000 --> 00:17:23,000 sed ne nepre kaŭzas seg kulpo. 308 00:17:23,000 --> 00:17:26,000 Sed en ĉi tiu kazo, mi fine havigis sufiĉe da signoj 309 00:17:26,000 --> 00:17:29,000 ke mi esence superis mian segmento de memoro, kaj bam, 310 00:17:29,000 --> 00:17:33,000 la mastruma sistemo diris: "Pardonu, ke estas nenia bono segmentación kulpo." 311 00:17:33,000 --> 00:17:38,000 >> Kaj ni vidu nun se kio restas tie en mia katalogo- 312 00:17:38,000 --> 00:17:40,000 rimarki, ke mi havas tiun dosieron ĉi tie, kerno. 313 00:17:40,000 --> 00:17:42,000 Rimarku ke tiu estas denove alvokis kernan dump. 314 00:17:42,000 --> 00:17:46,000 Estas esence dosiero kiu enhavas la enhavo de via programo memoro 315 00:17:46,000 --> 00:17:48,000 je la punkto al kiu frakasis, 316 00:17:48,000 --> 00:17:51,000 kaj justa por provi iom ekzemplo tie lasu min iri ĉi tien 317 00:17:51,000 --> 00:17:57,000 kaj kuri gdb en scanf3 kaj tiam specifi tria argumento nomata kerno, 318 00:17:57,000 --> 00:18:01,000 kaj rimarki tie ke se mi printi la kodon, 319 00:18:01,000 --> 00:18:06,000 ni povos kiel kutime kun gdb komenci promenante tra tiu programo, 320 00:18:06,000 --> 00:18:10,000 kaj mi povas ruli ĝin kaj tuj kiam mi batis-kiel kun la paŝo komandon en gdb- 321 00:18:10,000 --> 00:18:13,000 kiam mi batis la potenciale kalesxo linio post tajpi en grandioza kordoj, 322 00:18:13,000 --> 00:18:16,000 Mi povos reale identigi ĝin ĉi tie. 323 00:18:16,000 --> 00:18:19,000 Pli pri tio, tamen, en sekcio en terminoj de kerno vertederos 324 00:18:19,000 --> 00:18:22,000 kaj similaj tiel ke vi povas reale poke ĉirkaŭ interne de la kerno escorial 325 00:18:22,000 --> 00:18:27,000 kaj vidi sur kio linio la programo fiaskis. 326 00:18:27,000 --> 00:18:32,000 Demandojn tiam punteros kaj sur adresoj? 327 00:18:32,000 --> 00:18:36,000 Ĉar hodiaŭ, ni tuj komencos prenante por koncedis, ke tiuj aĵoj ekzistas 328 00:18:36,000 --> 00:18:40,000 kaj ni scias precize, kion ili estas. 329 00:18:40,000 --> 00:18:42,000 Jes. 330 00:18:42,000 --> 00:18:46,000 >> [Studenta] Kiel veni al vi ne devis meti signon apud la parto- 331 00:18:46,000 --> 00:18:48,000 Bona demando. 332 00:18:48,000 --> 00:18:51,000 Kiel veni, mi ne devas meti-simbolo apud la karaktero tabelo kiel mi faris antaŭe 333 00:18:51,000 --> 00:18:53,000 kun la plimulto de niaj ekzemploj? 334 00:18:53,000 --> 00:18:55,000 La mallonga respondo estas tabeloj estas iom speciala. 335 00:18:55,000 --> 00:18:59,000 Vi povas preskaŭ pensas buffer kiel reale esti adreson, 336 00:18:59,000 --> 00:19:03,000 kaj ĝuste tiel okazas al esti la kazo ke la kvadrata krampo skribmaniero 337 00:19:03,000 --> 00:19:06,000 estas oportuneco por ke ni povas iri en krampo 0, krampo 1, 338 00:19:06,000 --> 00:19:10,000 krampo 2, sen devi uzi la * skribmaniero. 339 00:19:10,000 --> 00:19:13,000 Tio estas iom da blanka mensogo ĉar tabeloj kaj punteros 340 00:19:13,000 --> 00:19:17,000 Estas, fakte, iomete malsama, sed ili povas ofte sed ne ĉiam povas uzi sendiference. 341 00:19:17,000 --> 00:19:21,000 Mallonge, kiam funkcio atendas puntero al eron de memoro, 342 00:19:21,000 --> 00:19:24,000 vi povas ĉu pasi ĝin adreson kiu revenis por malloc, 343 00:19:24,000 --> 00:19:29,000 kaj ni vidos malloc denove antaŭ longaj, aŭ vi povas pasi ĝin la nomo de tabelo. 344 00:19:29,000 --> 00:19:32,000 Vi ne devas fari signon kun tabeloj ĉar ili estas jam 345 00:19:32,000 --> 00:19:34,000 esence kiel adresoj. 346 00:19:34,000 --> 00:19:36,000 Tio estas la escepto. 347 00:19:36,000 --> 00:19:39,000 La rektaj krampoj fari ilin speciala. 348 00:19:39,000 --> 00:19:41,000 >> Ĉu vi povas meti signon apud la buffer? 349 00:19:41,000 --> 00:19:43,000 Ne en ĉi tiu kazo. 350 00:19:43,000 --> 00:19:46,000 Tio ne funkcias ĉar, denove, de ĉi tiu angulo kazo 351 00:19:46,000 --> 00:19:49,000 kie tabeloj ne estas sufiĉe reale adresoj. 352 00:19:49,000 --> 00:19:54,000 Sed ni eble revenos al tiu post nelonge kun aliaj ekzemploj. 353 00:19:54,000 --> 00:19:56,000 Ni provu solvi problemon ĉi tie. 354 00:19:56,000 --> 00:20:00,000 Ni havas datumstrukturo kiun ni uzis por iu tempo konata kiel tabelo. 355 00:20:00,000 --> 00:20:02,000 Kazo en punkto, tio estas kio ni ĵus havis. 356 00:20:02,000 --> 00:20:04,000 Sed tabeloj havas iun upsides kaj downsides. 357 00:20:04,000 --> 00:20:06,000 Arrays estas bela kial? 358 00:20:06,000 --> 00:20:11,000 Kio estas unu afero, kiun vi ŝatus-al la mezuro vi ŝatas arrays-pri tabeloj? 359 00:20:11,000 --> 00:20:13,000 Kio estas konvena por ili? Kio estas konvinkaj? 360 00:20:13,000 --> 00:20:18,000 Kial ni enkondukas ilin en la unua loko? 361 00:20:18,000 --> 00:20:20,000 Yeah. 362 00:20:20,000 --> 00:20:27,000 [Studenta] Ili povas stoki multe da datumoj, kaj vi ne devas uzi tutan aferon. 363 00:20:27,000 --> 00:20:29,000 Vi povas uzi sekcio. 364 00:20:29,000 --> 00:20:32,000 Bona, kun tabelo vi povas stoki multe da datumoj, 365 00:20:32,000 --> 00:20:35,000 kaj vi ne nepre devas uzi ĉiuj ĝin, do vi povas overallocate, 366 00:20:35,000 --> 00:20:39,000 kiu povus esti oportune se vi ne scias anticipe kiom de io devas atendi. 367 00:20:39,000 --> 00:20:41,000 >> GetString estas perfekta ekzemplo. 368 00:20:41,000 --> 00:20:44,000 GetString, skribita de ni, ne havas ideon kiom da signoj por atendi, 369 00:20:44,000 --> 00:20:48,000 do la fakto, ke ni povas atribui pecoj de apudaj memoro estas bona. 370 00:20:48,000 --> 00:20:51,000 Arrays ankaŭ solvi problemon ni vidis paron semajnoj nun 371 00:20:51,000 --> 00:20:54,000 kie estas via kodo komencas devolve en iu tre malbone desegnitaj. 372 00:20:54,000 --> 00:20:57,000 Memori, ke mi kreis studento strukturo alvokis Davidon, 373 00:20:57,000 --> 00:21:00,000 kaj do estis fakte alternativo, kvankam, 374 00:21:00,000 --> 00:21:04,000 al havi variablo nomis nomon kaj alia variablo nomas, mi kredas, domo, 375 00:21:04,000 --> 00:21:08,000 kaj alia variablo nomata ID ĉar en tiu rakonto mi tiam volis enkonduki ion alian 376 00:21:08,000 --> 00:21:11,000 kiel Rob en la programo, do tiam mi decidis atendi minuton, 377 00:21:11,000 --> 00:21:13,000 Mi bezonas renomi tiujn variablojn. 378 00:21:13,000 --> 00:21:16,000 Ni nomas mia name1, ID1, house1. 379 00:21:16,000 --> 00:21:20,000 Ni nomas Rob la name2, house2, ID2. 380 00:21:20,000 --> 00:21:22,000 Sed tiam atendi minuton, kio pri Tommy? 381 00:21:22,000 --> 00:21:24,000 Tiam ni havis tri pli variabloj. 382 00:21:24,000 --> 00:21:27,000 Ni enkondukis iu alia, kvar aroj de variabloj. 383 00:21:27,000 --> 00:21:30,000 La mondo komencis akiri senorda tre rapide, 384 00:21:30,000 --> 00:21:33,000 do ni enkondukis structs, kaj kio estas konvinkaj pri struct? 385 00:21:33,000 --> 00:21:39,000 Kion C struct lasu vin fari? 386 00:21:39,000 --> 00:21:42,000 Estas vere mallertaj hodiaŭ. 387 00:21:42,000 --> 00:21:44,000 Kio? >> [Inaudible studento respondon] 388 00:21:44,000 --> 00:21:47,000 Yeah, specife, typedef permesas krei novan datumtipo, 389 00:21:47,000 --> 00:21:51,000 kaj struct, la struct ŝlosilvorto, permesas encapsular 390 00:21:51,000 --> 00:21:54,000 koncepte rilataj pecoj de datumo kune 391 00:21:54,000 --> 00:21:56,000 kaj poste nomi ilin iu kiel studento. 392 00:21:56,000 --> 00:21:58,000 >> Tio estis bona ĉar nun ni povas modeli 393 00:21:58,000 --> 00:22:03,000 multe pli ia koncepte konsekvenca la nocio de studento en variablo 394 00:22:03,000 --> 00:22:07,000 anstataŭ arbitre havi unu por linio, unu por ID, kaj tiel plu. 395 00:22:07,000 --> 00:22:10,000 Arrays estas bela ĉar ili permesas al ni starti purigi nian kodon. 396 00:22:10,000 --> 00:22:13,000 Sed kion estas malavantaĝo nun de tabelo? 397 00:22:13,000 --> 00:22:15,000 Kion vi povas fari? Yeah. 398 00:22:15,000 --> 00:22:17,000 [Studenta] Vi devas scii kiom granda estas. 399 00:22:17,000 --> 00:22:19,000 Vi devas scii kiom granda ĝi estas, tia ĝi estas speco de doloro. 400 00:22:19,000 --> 00:22:21,000 La de vi kun antaŭa programado sperto scias, ke en multaj lingvoj, 401 00:22:21,000 --> 00:22:24,000 kiel Java, vi povas peti eron de memoro, specife tabelo, 402 00:22:24,000 --> 00:22:28,000 kiom granda vi estas, kun longa, posedaĵoj, por tiel diri, kaj tio estas vere oportuna. 403 00:22:28,000 --> 00:22:32,000 En C, oni povas eĉ nomi strlen sur generic tabelo 404 00:22:32,000 --> 00:22:35,000 ĉar strlen, kiel la vorto indikas, estas nur por kordoj, 405 00:22:35,000 --> 00:22:39,000 kaj vi povas diveni la longo de kordoj pro ĉi tiu homa konvencio 406 00:22:39,000 --> 00:22:43,000 havi \ 0, sed tabelo, pli genéricamente, estas nur eron de memoro. 407 00:22:43,000 --> 00:22:46,000 Se estas array de ints, tie ne estas tuj estos iu speciala karaktero 408 00:22:46,000 --> 00:22:48,000 fine atendas vin. 409 00:22:48,000 --> 00:22:50,000 Oni devas memori, la longo de tabelo. 410 00:22:50,000 --> 00:22:54,000 Alia malavantaĝo de tabelo starigis lian kapon en GetString mem. 411 00:22:54,000 --> 00:22:59,000 Kio estas alia malavantaĝo de tabelo? 412 00:22:59,000 --> 00:23:01,000 Sinjoro, nur vi kaj mi hodiaŭ. 413 00:23:01,000 --> 00:23:04,000 [Inaudible studento respondon] >> Estas kio? 414 00:23:04,000 --> 00:23:06,000 Oni deklaris la stako. 415 00:23:06,000 --> 00:23:09,000 Konsentite, deklaris je la stako. Kial vi ne volas tion? 416 00:23:09,000 --> 00:23:13,000 [Studenta] Ĉar ĝi prenas reutilizado. 417 00:23:13,000 --> 00:23:15,000 Ĝi prenas reutilizado. 418 00:23:15,000 --> 00:23:18,000 Konsentite, se vi uzas tabelo destini memoro, 419 00:23:18,000 --> 00:23:21,000 vi ne povas, ekzemple, redoni ĝin ĉar ĝi estas sur la stako. 420 00:23:21,000 --> 00:23:23,000 Konsentite, tio estas malavantaĝo. 421 00:23:23,000 --> 00:23:25,000 Kaj kiel pri unu alia kun tabelo? 422 00:23:25,000 --> 00:23:28,000 Kiam vi destini ĝin, vi estas speco de ŝraŭbita se vi bezonas pli da spaco 423 00:23:28,000 --> 00:23:30,000 ol tiu tabelo havas. 424 00:23:30,000 --> 00:23:34,000 >> Tiam ni enkondukis, revokon, malloc, kiu donis al ni la kapablon dinamike rezervi memoron. 425 00:23:34,000 --> 00:23:37,000 Sed kion se ni provis alian mondon tute? 426 00:23:37,000 --> 00:23:40,000 Kio se ni volis solvi kelkajn el tiuj problemoj 427 00:23:40,000 --> 00:23:45,000 do ni anstataŭ-mia plumo falis dormanta tie- 428 00:23:45,000 --> 00:23:51,000 kio se ni anstataŭ volis esence krei mondo kiu ne plu tiel? 429 00:23:51,000 --> 00:23:56,000 Jen tabelo, kaj, kompreneble, ĉi tiu speco de malboniĝas iam ni batis la fino de la tabelo, 430 00:23:56,000 --> 00:24:00,000 kaj mi nun ne plu havas spacon por alia entjero aŭ alia signo. 431 00:24:00,000 --> 00:24:03,000 Kio se ni ia preemptively diri bone, kial ni ne relax 432 00:24:03,000 --> 00:24:07,000 ĉi tiun kondiĉon, ke ĉiuj tiuj pecoj de memoro estu apudaj malantaŭo al malantaŭo, 433 00:24:07,000 --> 00:24:10,000 kaj kial ne, kiam mi bezonos int aŭ char, 434 00:24:10,000 --> 00:24:12,000 nur donu al mi spacon por unu el ili? 435 00:24:12,000 --> 00:24:14,000 Kaj kiam mi bezonas alian, donu al mi alian spacon, 436 00:24:14,000 --> 00:24:16,000 kaj kiam mi bezonas alian, donu al mi alian spacon. 437 00:24:16,000 --> 00:24:19,000 La avantaĝo de kiu nun estas ke se iu alia 438 00:24:19,000 --> 00:24:21,000 prenas la memoro pri cxi tie, sen granda interkonsento. 439 00:24:21,000 --> 00:24:25,000 Mi prenos tiun plian eron de memoro tie kaj tiam ĉi tiu. 440 00:24:25,000 --> 00:24:28,000 >> Nun, la sola catch tie estas kiu ĉi tiu preskaŭ sentas mi havas 441 00:24:28,000 --> 00:24:30,000 tuta amaso de malsamaj variabloj. 442 00:24:30,000 --> 00:24:33,000 Ĉi sentas kvin malsamaj variabloj potenciale. 443 00:24:33,000 --> 00:24:36,000 Sed kion se ni sxtelus ideon de kordoj 444 00:24:36,000 --> 00:24:41,000 per kiu ni iel ligi tion kune koncepte, kaj kion se mi faris ĉi tion? 445 00:24:41,000 --> 00:24:44,000 Ĉi tio estas mia tre malbone desegnita sago. 446 00:24:44,000 --> 00:24:46,000 Sed supozu ke ĉiu el tiuj pecoj de memoro 447 00:24:46,000 --> 00:24:52,000 punktita al la alia, kaj tiu ulo, kiu ne havas frato al lia dekstra, 448 00:24:52,000 --> 00:24:54,000 havas ne tia sago. 449 00:24:54,000 --> 00:24:56,000 Tiu estas fakte kio nomiĝas ligillisto. 450 00:24:56,000 --> 00:25:00,000 Tio ĉi estas nova datumstrukturo kiu permesas al ni destini eron de memoro, 451 00:25:00,000 --> 00:25:03,000 tiam alia, tiam alia, tiam alia ajn ni volas 452 00:25:03,000 --> 00:25:07,000 dum programo, kaj ni memoru, ke ili estas ĉiuj iel rilataj 453 00:25:07,000 --> 00:25:11,000 per laŭvorte ĉenante ilin kune, kaj ni faris tiun pictóricamente tie kun sago. 454 00:25:11,000 --> 00:25:15,000 Sed en kodo, kio estus la meĥanismo per kiu vi povus iel konekti, 455 00:25:15,000 --> 00:25:20,000 preskaŭ kiel Scratch, unu eron al alia bloko? 456 00:25:20,000 --> 00:25:22,000 Ni povus uzi pointer, ĉu ne? 457 00:25:22,000 --> 00:25:25,000 Ĉar vere la sagon kiu okazas de la supro maldekstro kvadrata, 458 00:25:25,000 --> 00:25:31,000 this guy tie al ĉi tiu, povus enhavi ene de ĉi tiu kvadrata 459 00:25:31,000 --> 00:25:34,000 Ne nur iuj ints, ne nur kelkaj char, sed kio se mi efektive asignitaj 460 00:25:34,000 --> 00:25:37,000 iom superflua spaco por ke nun, 461 00:25:37,000 --> 00:25:41,000 ĉiu el miaj pecoj de memoro, kvankam tiu tuj kostis al mi, 462 00:25:41,000 --> 00:25:45,000 nun aspektas iom pli rektangula kie unu el la pecoj de memoro 463 00:25:45,000 --> 00:25:47,000 estas uzata por nombro, kiel la numero 1, 464 00:25:47,000 --> 00:25:50,000 kaj tiam se ĉi ulo stokas la numero 2, 465 00:25:50,000 --> 00:25:52,000 tiu alia bloko de memoro estas uzata por sago, 466 00:25:52,000 --> 00:25:54,000 aŭ pli konkrete, puntero. 467 00:25:54,000 --> 00:25:59,000 Kaj supozu mi stoki la numero 3 super tie, dum mi uzas tiun noti en tiu ulo, 468 00:25:59,000 --> 00:26:02,000 kaj nun ĉi ulo, ni supozas, ke mi nur volas tri tiaj pecoj de memoro. 469 00:26:02,000 --> 00:26:05,000 Mi desegnas linion tra tiu, indikante nula. 470 00:26:05,000 --> 00:26:07,000 Ne estas plia signo. 471 00:26:07,000 --> 00:26:10,000 >> Efektive, tiu estas kiel ni povas iri sur implementando 472 00:26:10,000 --> 00:26:12,000 iu kiu nomas lerta kunligita. 473 00:26:12,000 --> 00:26:18,000 Al ligitaj listo estas nova datumstrukturo, kaj ĝi estas ŝtupo al 474 00:26:18,000 --> 00:26:21,000 multe amatoro datumstrukturoj kiuj komencas solvi problemojn 475 00:26:21,000 --> 00:26:23,000 laŭ la linioj de Facebook-tipo problemoj kaj Google-tipo problemoj 476 00:26:23,000 --> 00:26:26,000 kie vi havas grandegan datumoj aroj, kaj ĝi ne plu tranĉas ĝin 477 00:26:26,000 --> 00:26:29,000 stoki ĉio contiguously kaj uzi ion kiel lineara serĉo 478 00:26:29,000 --> 00:26:31,000 aŭ eĉ iu kiel duuma serĉo. 479 00:26:31,000 --> 00:26:33,000 Vi volas eĉ pli bone kurante foje. 480 00:26:33,000 --> 00:26:37,000 Fakte, unu el la Sankta Grails ni parolos pri ĝi poste ĉi-semajne aŭ apud 481 00:26:37,000 --> 00:26:41,000 estas algoritmo kies rula tempo estas konstanta. 482 00:26:41,000 --> 00:26:44,000 En aliaj vortoj, ĝi ĉiam havas la saman kvanton de tempo ne gravas 483 00:26:44,000 --> 00:26:47,000 kiel granda la enigo estas, kaj ke ili estas konvinkaj, 484 00:26:47,000 --> 00:26:49,000 eĉ pli ol io logaritma. 485 00:26:49,000 --> 00:26:51,000 Kio estas tio sur la ekrano tie? 486 00:26:51,000 --> 00:26:55,000 Ĉiu el la rektanguloj estas precize kion mi ĵus tiris mane. 487 00:26:55,000 --> 00:26:59,000 Sed la afero tuta vojo maldekstre estas speciala variablo. 488 00:26:59,000 --> 00:27:02,000 Ĝi okazas esti sola puntero ĉar la gotcha 489 00:27:02,000 --> 00:27:04,000 kun ligitaj listo, kiel tion nomas, 490 00:27:04,000 --> 00:27:09,000 estas ke vi devas pendi sur unu fino de la ligitaj listo. 491 00:27:09,000 --> 00:27:13,000 >> Ĝuste kiel kun ĉeno, vi devas scii la adreson de la unua signo. 492 00:27:13,000 --> 00:27:15,000 Sama traktado por ligitaj listoj. 493 00:27:15,000 --> 00:27:19,000 Vi devas scii la adreson de la unua bloko de memoro 494 00:27:19,000 --> 00:27:25,000 ĉar de tie, vi povas atingi ĉiun alia. 495 00:27:25,000 --> 00:27:27,000 Malavantaĝo. 496 00:27:27,000 --> 00:27:30,000 Kio prezo ni pagas por ĉi versatilidad havi dinamike 497 00:27:30,000 --> 00:27:34,000 konsiderinda datumstrukturo ke se ni iam bezonos pli memoro, fajna, 498 00:27:34,000 --> 00:27:37,000 nur atribui pli chunk kaj desegni puntero de 499 00:27:37,000 --> 00:27:39,000 la malnova al la nova vosto de la listo? 500 00:27:39,000 --> 00:27:41,000 Yeah. 501 00:27:41,000 --> 00:27:43,000 [Studenta] Ĝi prenas pri duoble da spaco. 502 00:27:43,000 --> 00:27:45,000 Ĝi prenas duoble da spaco, tiel ke estas definitive malavantaĝo, kaj ni vidis tiun 503 00:27:45,000 --> 00:27:48,000 tradeoff antaŭe inter tempo kaj spaco kaj fleksebleco 504 00:27:48,000 --> 00:27:51,000 kie por nun, ni bezonas ne 32 bitojn por ĉiu el tiuj numeroj. 505 00:27:51,000 --> 00:27:57,000 Ni vere bezonas 64, 32 por la nombro kaj 32 por la puntero. 506 00:27:57,000 --> 00:27:59,000 Sed hey, mi havas 2 gigabajtoj de RAM. 507 00:27:59,000 --> 00:28:02,000 Aldoni alian 32 bitoj tie kaj ĉi tie ne ŝajnas, ke granda de traktadon. 508 00:28:02,000 --> 00:28:05,000 Sed por grandaj datenaroj, ĝi definitive aldonas ĝis laŭvorte duoble da. 509 00:28:05,000 --> 00:28:09,000 Kio estas alia malavantaĝo nun, aŭ kio trajto ni rezignu, 510 00:28:09,000 --> 00:28:12,000 se ni reprezentas lertaj de aĵoj kun ligitaj listo kaj ne tabelo? 511 00:28:12,000 --> 00:28:14,000 [Studenta] Oni ne povas trairi ĝin malantaŭen. 512 00:28:14,000 --> 00:28:16,000 Vi ne povas trairi ĝin malantaŭen, do vi estas speco de ŝraŭbita se vi marŝante 513 00:28:16,000 --> 00:28:19,000 de maldekstre al dekstre uzante por buklo aŭ dum buklo 514 00:28:19,000 --> 00:28:21,000 kaj tiam vi rimarkas, "Ho, mi volas reiri al la komenco de la listo." 515 00:28:21,000 --> 00:28:26,000 Vi ne povas ĉar tiuj indikoj nur iri de maldekstre al dekstre, kiel la sagoj indikas. 516 00:28:26,000 --> 00:28:29,000 >> Nun, vi povus memori la komencon de la listo kun alia variablo, 517 00:28:29,000 --> 00:28:31,000 sed tio estas komplekseco teni en la menso. 518 00:28:31,000 --> 00:28:35,000 Tabelo, ne gravas kiom for you go, vi povas ĉiam fari minus, minus, minus, minus 519 00:28:35,000 --> 00:28:37,000 kaj reiri de kie vi venis. 520 00:28:37,000 --> 00:28:40,000 Kio estas alia malavantaĝo tie? Yeah. 521 00:28:40,000 --> 00:28:43,000 [Inaudible studento demando] 522 00:28:43,000 --> 00:28:47,000 Vi povus, do vi fakte nur proponis datumstrukturo nomata duoble ligitaj listo, 523 00:28:47,000 --> 00:28:50,000 kaj ja, vi aldonus alian sagon al ĉiu el tiuj rektanguloj 524 00:28:50,000 --> 00:28:53,000 kiu iras al la alia direkto, la supra parto de kiuj 525 00:28:53,000 --> 00:28:55,000 estas nun vi povas trairi tien kaj reen, 526 00:28:55,000 --> 00:28:59,000 la malavantaĝo de kiuj estas nun vi uzas trioble tiel memoro kiel ni uzas por 527 00:28:59,000 --> 00:29:04,000 kaj ankaŭ aldoni komplekseco en terminoj de la kodo vi devas skribi por ricevi ĝin dekstre. 528 00:29:04,000 --> 00:29:08,000 Sed tiuj estas ĉiuj eble tre racia tradeoffs, se la renversigon estas pli grava. 529 00:29:08,000 --> 00:29:10,000 Yeah. 530 00:29:10,000 --> 00:29:12,000 [Studenta] Vi ankaŭ povas ne havi 2D ligillisto. 531 00:29:12,000 --> 00:29:16,000 Bona, vi ne povas vere havi 2D ligitaj listo. 532 00:29:16,000 --> 00:29:18,000 Vi povus. Ne preskaŭ tiel facila kiel tabelo. 533 00:29:18,000 --> 00:29:21,000 Kiel tabelo, vi faras malferma krampo, fermita krampo, malferma krampo, fermita krampo, 534 00:29:21,000 --> 00:29:23,000 kaj vi ricevas iun 2-dimensia strukturo. 535 00:29:23,000 --> 00:29:26,000 Vi povus efektivigi 2-dimensia ligitaj listo 536 00:29:26,000 --> 00:29:29,000 se vi faros add-kiel vi proponis-tria puntero al ĉiu el tiuj aĵoj, 537 00:29:29,000 --> 00:29:34,000 kaj se vi pensas pri alia listo venas ĉe vi 3D stilo 538 00:29:34,000 --> 00:29:40,000 de la ekrano al ni ĉiuj, kiu estas nur alia ĉeno de ia. 539 00:29:40,000 --> 00:29:45,000 Ni povus fari ĝin, sed ĝi ne estas tiel simpla kiel tajpi malferma krampo, kvadrata krampo. Yeah. 540 00:29:45,000 --> 00:29:48,000 [Inaudible studento demando] 541 00:29:48,000 --> 00:29:50,000 Bona, do ĉi tiu estas vera kicker. 542 00:29:50,000 --> 00:29:54,000 >> Ĉi tiuj algoritmoj kiuj ni pined super, kiel ho, duuma serĉo, 543 00:29:54,000 --> 00:29:57,000 Vi povas serĉi tabelo de nombroj sur la tabulo 544 00:29:57,000 --> 00:30:01,000 aŭ telefono libro tiom pli rapide se vi uzas dividi kaj venki 545 00:30:01,000 --> 00:30:05,000 kaj duuma serĉo algoritmo, sed duuma serĉo postulis du supozoj. 546 00:30:05,000 --> 00:30:09,000 Unu, kiun la datumoj estis ordo. 547 00:30:09,000 --> 00:30:11,000 Nun, ni povas supozeble teni ĉi ordo, 548 00:30:11,000 --> 00:30:14,000 do eble tio ne maltrankvilo, sed duuma serĉo supozis ankaŭ 549 00:30:14,000 --> 00:30:18,000 ke vi havis hazarda aliro al la listo de nombroj, 550 00:30:18,000 --> 00:30:21,000 kaj tabelo permesas havi senvica atingo, kaj por hazarda aliron, 551 00:30:21,000 --> 00:30:24,000 Mi volas diri, se vi donas tabelo, kiom da tempo estas preni vin 552 00:30:24,000 --> 00:30:26,000 alveni ĝis krampo 0? 553 00:30:26,000 --> 00:30:29,000 Unu operacio, vi simple uzu [0] kaj vi pravas tie. 554 00:30:29,000 --> 00:30:33,000 Kiom da paŝoj necesas por atingi lokon 10? 555 00:30:33,000 --> 00:30:36,000 Unu paŝo, kiun vi ĵus iras al [10] kaj vi estas tie. 556 00:30:36,000 --> 00:30:40,000 Kontraste, kiel vi atingos la 10-a entjero en ligitaj listo? 557 00:30:40,000 --> 00:30:42,000 Vi devas starti komence ĉar vi nur memorante 558 00:30:42,000 --> 00:30:45,000 la komencon de ligitaj listo, nur kiel cxeno estas memoris 559 00:30:45,000 --> 00:30:48,000 per la adreso de lia unua char, kaj trovi ke 10th int 560 00:30:48,000 --> 00:30:53,000 aŭ kiu 10th karaktero en linio, oni devas serĉi la tuta malbenita afero. 561 00:30:53,000 --> 00:30:55,000 >> Denove, ni ne solvanta ĉiu el niaj problemoj. 562 00:30:55,000 --> 00:31:00,000 Ni enkondukante novaj, sed vere dependas de kion vi provas desegni por. 563 00:31:00,000 --> 00:31:04,000 En terminoj de efektivigo de ĉi tiu, ni povas pruntepreni ideon de tiu studento strukturo. 564 00:31:04,000 --> 00:31:07,000 La sintakso estas tre similaj, krom nun, la ideo estas iom pli abstrakta 565 00:31:07,000 --> 00:31:09,000 ol domo kaj nomon kaj IRU. 566 00:31:09,000 --> 00:31:13,000 Sed mi proponas ke ni povus havi datumstrukturo en C 567 00:31:13,000 --> 00:31:17,000 kiu estas nomata nodo, kiel la lasta vorto sur la glito sugestas, 568 00:31:17,000 --> 00:31:21,000 ene de nodo kaj nodo estas nur ĝenerala ujo en komputiko. 569 00:31:21,000 --> 00:31:25,000 Ĝi estas kutime desegnitaj kiel cirklo aŭ kvadrato aŭ rektangulo kiel ni faris. 570 00:31:25,000 --> 00:31:27,000 Kaj en ĉi tiu datumstrukturo, ni havas int, n, 571 00:31:27,000 --> 00:31:29,000 do jen la nombro mi volas konservi. 572 00:31:29,000 --> 00:31:36,000 Sed kio estas tiu dua linio, struct nodo * poste? 573 00:31:36,000 --> 00:31:40,000 Kial estas ĉi ĝentila, aŭ kio rolon faras tion ludo, 574 00:31:40,000 --> 00:31:42,000 kvankam ĝi estas iom enigmaj unuavide? 575 00:31:42,000 --> 00:31:44,000 Yeah. 576 00:31:44,000 --> 00:31:46,000 [Inaudible studento respondon] 577 00:31:46,000 --> 00:31:50,000 Precize, do la * ia boteto ke ĝi estas puntero de iu tipo. 578 00:31:50,000 --> 00:31:53,000 La nomo de ĉi puntero estas arbitre proksima, 579 00:31:53,000 --> 00:32:00,000 sed ni povus esti nomis ion ni volas, sed kion faras ĉi puntero punkto al? 580 00:32:00,000 --> 00:32:03,000 [Studenta] Alia nodo. >> Precize, ĝi notas al alia tia nodo. 581 00:32:03,000 --> 00:32:05,000 >> Nun, ĉi tiu estas speco de vidindaĵo de C. 582 00:32:05,000 --> 00:32:09,000 Rememoru, ke C estas legita de tradukilo supre sube, maldekstre dekstren, 583 00:32:09,000 --> 00:32:13,000 kio signifas se-ĉi estas iom malsama kion ni faris kun la lernanto. 584 00:32:13,000 --> 00:32:16,000 Kiam ni difinis studento, ni efektive ne enmetis vorton tie. 585 00:32:16,000 --> 00:32:18,000 Ĝi simple diris typedef. 586 00:32:18,000 --> 00:32:20,000 Tiam ni havis int id, kordoj nomo, string domo, 587 00:32:20,000 --> 00:32:23,000 kaj tiam studento en la fundo de la struct. 588 00:32:23,000 --> 00:32:26,000 Tiu deklaro estas iom malsama ĉar, 589 00:32:26,000 --> 00:32:28,000 denove, la C-tradukilo estas iom stulta. 590 00:32:28,000 --> 00:32:30,000 Ĝi estas nur tuj legi supre sube, 591 00:32:30,000 --> 00:32:33,000 do se ĝi atingas la 2-a linio tie 592 00:32:33,000 --> 00:32:37,000 kie apud estas deklarita kaj vidas, ho, jen variablo nomas proksima. 593 00:32:37,000 --> 00:32:39,000 Estas puntero al struct nodo. 594 00:32:39,000 --> 00:32:42,000 La tradukilo tuj rimarkas kion estas struct nodo? 595 00:32:42,000 --> 00:32:44,000 Mi neniam aŭdis pri tiu afero antaŭ, 596 00:32:44,000 --> 00:32:47,000 ĉar la vorto nodo eble ne alie aperas 597 00:32:47,000 --> 00:32:49,000 ĝis la fundo, tiel estas ĉi redundo. 598 00:32:49,000 --> 00:32:53,000 Vi devas diri struct nodo tie, kiu povas tiam mallongigi poste 599 00:32:53,000 --> 00:32:56,000 danke al typedef cxi tie, sed ĉi tio estas ĉar 600 00:32:56,000 --> 00:33:02,000 ni referenco la strukturo mem ene de la strukturo. 601 00:33:02,000 --> 00:33:05,000 Tio estas la gotcha tie. 602 00:33:05,000 --> 00:33:07,000 >> Kelkaj interesaj problemoj tuj levigxu. 603 00:33:07,000 --> 00:33:09,000 Ni havas liston de nombroj. Kiel ni enŝovu en ĝin? 604 00:33:09,000 --> 00:33:11,000 Kiel ni serĉi ĝin? Kiel ni forigi el ĝi? 605 00:33:11,000 --> 00:33:13,000 Speciale nun ke ni devas administri ĉiujn tiujn punteros. 606 00:33:13,000 --> 00:33:15,000 Vi pensis punteros estis ia menso-fleksio 607 00:33:15,000 --> 00:33:17,000 kiam vi havis unu el ili nur klopodis legi int al ĝi. 608 00:33:17,000 --> 00:33:20,000 Nun ni devas manipuli ĉiun listo de valoris. 609 00:33:20,000 --> 00:33:22,000 Kial ni ne prenos nian 5-minuta paŭzo tie, kaj tiam ni venigos 610 00:33:22,000 --> 00:33:34,000 iuj homoj sur scenejo fari precize tion. 611 00:33:34,000 --> 00:33:36,000 >> C estas multe pli amuza kiam ĝi agis eksteren. 612 00:33:36,000 --> 00:33:39,000 Kiu laŭvorte ŝatas esti la unua? 613 00:33:39,000 --> 00:33:41,000 Konsentite, venu supren. Vi estas unua. 614 00:33:41,000 --> 00:33:44,000 Kiu ŝatus esti 9? Konsentite, 9. 615 00:33:44,000 --> 00:33:46,000 Kion pri 9? 17? 616 00:33:46,000 --> 00:33:51,000 Iom kliko tie. 22 kaj 26 en tiu unua vico. 617 00:33:51,000 --> 00:33:53,000 Kaj tiam kion pri iu tie esti notita al. 618 00:33:53,000 --> 00:33:57,000 Vi estas 34. Konsentite, 34, venu supren. 619 00:33:57,000 --> 00:33:59,000 Unue estas tie. Konsentite, ĉiuj kvar el vi guys. 620 00:33:59,000 --> 00:34:01,000 Kaj kiu ni ne diras por 9? 621 00:34:01,000 --> 00:34:04,000 Kiu estas nia 9? 622 00:34:04,000 --> 00:34:07,000 Kiu vere volas esti 9? Bone, iras, esti 9. 623 00:34:07,000 --> 00:34:10,000 Ĉi tie ni iru. 624 00:34:10,000 --> 00:34:13,000 34, ni renkontos vin tie. 625 00:34:13,000 --> 00:34:17,000 La unua parto estas fari vin rigardi tiel. 626 00:34:17,000 --> 00:34:21,000 26, 22, 17, bona. 627 00:34:21,000 --> 00:34:25,000 Se vi povas stari sur la flanko, ĉar nin tuj malloc vi en momento. 628 00:34:25,000 --> 00:34:29,000 >> Bona, bona. 629 00:34:29,000 --> 00:34:32,000 Konsentite, bonega, do ni petu kelkajn demandojn tie. 630 00:34:32,000 --> 00:34:34,000 Kaj efektive, kio estas via nomo? >> Anita. 631 00:34:34,000 --> 00:34:37,000 Anita, bone, venu ĉi tien. 632 00:34:37,000 --> 00:34:41,000 Anita tuj por helpi al ni ia solvi unu sufiĉe simpla demando en la komenco, 633 00:34:41,000 --> 00:34:44,000 kiu estas kiel vi trovos ĉu valoro estas en la listo? 634 00:34:44,000 --> 00:34:48,000 Nun, rimarki ke unue, reprezentita tie de Lucas, 635 00:34:48,000 --> 00:34:52,000 estas iom malsamaj, kaj tial lia peco de papero estas intence flanken 636 00:34:52,000 --> 00:34:55,000 ĉar ĝi estas ne tute tiel alta kaj ne prenu tiom da bitoj, 637 00:34:55,000 --> 00:34:58,000 kvankam teknike li havas la saman grandecon de papero nur turnis. 638 00:34:58,000 --> 00:35:01,000 Sed li estas iom malsama en kiu li estas nur 32 bitoj por puntero, 639 00:35:01,000 --> 00:35:05,000 kaj ĉiuj el tiuj infanoj estas 64 bitoj, duono el ili estas la numero, duono el kiuj estas puntero. 640 00:35:05,000 --> 00:35:08,000 Sed la montrilo ne priskribis, do se vi infanoj povis iom mallerte 641 00:35:08,000 --> 00:35:12,000 uzu vian maldekstran manon por noti en la persono apud vi. 642 00:35:12,000 --> 00:35:14,000 Kaj vi estas numero 34. Kio estas via nomo? 643 00:35:14,000 --> 00:35:16,000 Ari. 644 00:35:16,000 --> 00:35:19,000 Ari, do vere, teni la paperon en Via dekstra mano, kaj maldekstra mano iras rekte malsupren. 645 00:35:19,000 --> 00:35:21,000 Vi reprezentas nula maldekstre. 646 00:35:21,000 --> 00:35:24,000 >> Nun nia homa bildo estas tre kohera. 647 00:35:24,000 --> 00:35:26,000 Tiu estas fakte kiel punteros labori. 648 00:35:26,000 --> 00:35:29,000 Kaj se vi povas scrunch iom tiamaniere tiom Mi ne en via vojo. 649 00:35:29,000 --> 00:35:34,000 Anita tie, trovi min la numero 22, 650 00:35:34,000 --> 00:35:40,000 sed supozas limigo de ne homoj tenante supren pecoj de papero, 651 00:35:40,000 --> 00:35:43,000 sed ĉi tiu listo, kaj vi havas nur Lucas komenci kun 652 00:35:43,000 --> 00:35:46,000 ĉar li estas laŭvorte la unua montrilo. 653 00:35:46,000 --> 00:35:51,000 Supozi vi mem estas puntero, kaj tiel vi tro havas la kapablon marki ion. 654 00:35:51,000 --> 00:35:56,000 Kial ne komenci per la atentigo ke precize kion Lucas montrante? 655 00:35:56,000 --> 00:35:58,000 Bona, kaj lasu min proklami ĉi super tie. 656 00:35:58,000 --> 00:36:04,000 Ĝuste pro diskuto, lasu min eltiri supren malplenan paĝon tie. 657 00:36:04,000 --> 00:36:06,000 Kiel vi literumi vian nomon? >> Anita. 658 00:36:06,000 --> 00:36:08,000 Konsentite, Anita. 659 00:36:08,000 --> 00:36:18,000 Diru nodo * Anita = Lucas. 660 00:36:18,000 --> 00:36:22,000 Nu, ni ne nomu vin Lucas. Ni devus voki vin unue. 661 00:36:22,000 --> 00:36:25,000 Kial estas ĉi fakte konsekvenca kun realo ĉi tie? 662 00:36:25,000 --> 00:36:27,000 Unu, unue jam ekzistas. 663 00:36:27,000 --> 00:36:30,000 Unue estis asignitaj supozeble ie ĉi tien. 664 00:36:30,000 --> 00:36:35,000 Nodo * unue, kaj ĝi estas estinta asignitaj listo iel. 665 00:36:35,000 --> 00:36:37,000 Mi ne scias kiel tio okazis. Tio okazis antaux klaso komencis. 666 00:36:37,000 --> 00:36:40,000 Ĉi ligitaj listo de homoj estas kreita. 667 00:36:40,000 --> 00:36:44,000 Kaj nun, je ĉi tiu punkto en la historio-ĉi estas ĉiuj tuj en Facebook ŝajne poste- 668 00:36:44,000 --> 00:36:49,000 en ĉi tiu punkto en la historio, Anita estis inicializado esti egala al la unua, 669 00:36:49,000 --> 00:36:51,000 kio ne signifas ke Anita punktoj je Lucas. 670 00:36:51,000 --> 00:36:53,000 Pli ĝuste, ŝi notas al tio, kion li notas en 671 00:36:53,000 --> 00:36:57,000 ĉar la sama adreso kiu estas interne de Lucas de 32 bitoj - 1, 2, 3 - 672 00:36:57,000 --> 00:37:01,000 nun estas ankaŭ ene de Anita la 32 bitoj - 1, 2, 3. 673 00:37:01,000 --> 00:37:05,000 >> Nun trovi 22. Kiel vi irados tra faras tion? 674 00:37:05,000 --> 00:37:07,000 Kio estas tio? >> Punkto al kiom. 675 00:37:07,000 --> 00:37:11,000 Indikas kion ajn, do iru antaŭen kaj agi ĝin kiel plej bone tie. 676 00:37:11,000 --> 00:37:15,000 Bona, bona, kaj nun vi montras al-kio estas via nomo kun 22? 677 00:37:15,000 --> 00:37:18,000 Rajmondo. >> Rajmondo, tiel Rajmondo estas tenante ĉe 22. 678 00:37:18,000 --> 00:37:20,000 Vi nun faris ĉekon. 679 00:37:20,000 --> 00:37:24,000 Ĉu Rajmondo == 22, kaj se jes, ekzemple, ni povas reveni vera. 680 00:37:24,000 --> 00:37:26,000 Lasu min-dum tiuj infanoj staras tie iom mallerte- 681 00:37:26,000 --> 00:37:32,000 lasu min fari ion rapide kiel bool trovi. 682 00:37:32,000 --> 00:37:37,000 Mi tuj iros antaŭen kaj diru (nodo * listo, int n). 683 00:37:37,000 --> 00:37:39,000 Mi tuj revenis kun you guys. Mi nur devas skribi iom da kodo. 684 00:37:39,000 --> 00:37:45,000 Kaj nun mi iros al faru tion, nodo * Anita = listo. 685 00:37:45,000 --> 00:37:51,000 Kaj mi tuj iros antaŭen kaj diru dum (Anita! = NULL). 686 00:37:51,000 --> 00:37:57,000 >> La metaforo tie ricevas iom streĉita, sed dum (Anita! = NULL), kion mi volas fari? 687 00:37:57,000 --> 00:38:03,000 Mi bezonas iun vojon de referenco 688 00:38:03,000 --> 00:38:05,000 la entjera ke Anita estas montrante. 689 00:38:05,000 --> 00:38:08,000 En la pasinteco, kiam ni havis strukturoj, kiuj nodo estas, 690 00:38:08,000 --> 00:38:11,000 ni uzis la skalara skribmaniero, kaj ni devus diri ion kiel 691 00:38:11,000 --> 00:38:15,000 anita.n, sed la problemo estas, ke Anita ne estas struct per si mem. 692 00:38:15,000 --> 00:38:17,000 Kio ŝi estas? 693 00:38:17,000 --> 00:38:21,000 Ŝi estas puntero, do vere, se ni volas uzi ĉi punkto notacio- 694 00:38:21,000 --> 00:38:23,000 kaj ĉi tuj serĉos intence iom críptico- 695 00:38:23,000 --> 00:38:28,000 ni devas fari ion kiel iri al kiom Anita la maldekstra mano montrante 696 00:38:28,000 --> 00:38:31,000 kaj poste la kampo nomata n. 697 00:38:31,000 --> 00:38:35,000 Anita estas puntero, sed kio estas * Anita? 698 00:38:35,000 --> 00:38:38,000 Kion vi trovos kiam vi iras al kio Anita notas en? 699 00:38:38,000 --> 00:38:42,000 Al struct, nodo, kaj nodo, revokon, havas kampo nomata n 700 00:38:42,000 --> 00:38:47,000 ĉar ĝi, memoras, tiuj 2 kampoj, apud kaj n, 701 00:38:47,000 --> 00:38:50,000 kiun ni vidis antaŭ momento ĉi tie. 702 00:38:50,000 --> 00:38:53,000 >> Por reale imiti tion en kodo, 703 00:38:53,000 --> 00:39:02,000 ni povus fari tion, kaj diru se ((* Anita). n == n), la n kiun Mi serĉas. 704 00:39:02,000 --> 00:39:04,000 Rimarku ke la funkcio estis aprobita en la numero mi zorgas pri. 705 00:39:04,000 --> 00:39:10,000 Tiam mi povas faru iun kiel reveno vera. 706 00:39:10,000 --> 00:39:12,000 Alian, se tio ne estas la kazo, kion mi volas fari? 707 00:39:12,000 --> 00:39:19,000 Kiel mi traduki por kodi kion Anita faris tiel intuicie marŝante tra la listo? 708 00:39:19,000 --> 00:39:26,000 Kion mi faru ĉi tien por simuli Anita porti tiun paŝon al la maldekstro, kiu paŝo al la maldekstra? 709 00:39:26,000 --> 00:39:28,000 [Inaudible studento respondon] >> Kio estas tio? 710 00:39:28,000 --> 00:39:30,000 [Inaudible studento respondon] 711 00:39:30,000 --> 00:39:34,000 Bona, Ne malbona ideo, sed en la pasinteco, kiam ni faris tion, ni faris Anita + + 712 00:39:34,000 --> 00:39:37,000 ĉar tio aldonus la numero 1 al Anita, 713 00:39:37,000 --> 00:39:40,000 kiu tipe notas en la sekvanta persono, kiel Rajmondo, 714 00:39:40,000 --> 00:39:44,000 aŭ la persono apud li, aux la apud li persono laŭ la linio. 715 00:39:44,000 --> 00:39:49,000 Sed tio ne estas sufiĉe bona ĉi tie, ĉar kion signifas tion rigardi kiel en memoro? 716 00:39:49,000 --> 00:39:54,000 Ne tiel. Ni devas malebligi tion. 717 00:39:54,000 --> 00:40:00,000 Ĝi aspektas kiel tiu en la memoro, kaj kvankam mi desegnis 1 kaj 2 kaj 3 proksimaj unu al la alia, 718 00:40:00,000 --> 00:40:03,000 se ni vere simuli ĉi-can you guys, dum ankoraŭ montrante ĉe la sama homo, 719 00:40:03,000 --> 00:40:07,000 povas iujn el vi prenu hazarda retropaŝo, iuj el vi hazarda paŝo antaŭeniras? 720 00:40:07,000 --> 00:40:10,000 >> Ĉi salaton estas ankoraŭ ligillisto, 721 00:40:10,000 --> 00:40:13,000 sed ĉi tiuj infanoj povis esti ie ajn en memoro, 722 00:40:13,000 --> 00:40:15,000 tiel Anita + + ne tuj funkcias kial? 723 00:40:15,000 --> 00:40:19,000 Kio estas en loko Anita + +? 724 00:40:19,000 --> 00:40:21,000 Kiu scias. 725 00:40:21,000 --> 00:40:24,000 Estas kelkaj aliaj valoro kiu ĝuste tiel pasas al intermetis 726 00:40:24,000 --> 00:40:28,000 inter ĉiuj tiuj nodoj hazarde ĉar ni ne uzante tabelo. 727 00:40:28,000 --> 00:40:30,000 Ni destinis ĉiu el tiuj nodoj individue. 728 00:40:30,000 --> 00:40:32,000 Konsentite, se vi infanoj povas purigi vin back up. 729 00:40:32,000 --> 00:40:37,000 Lasu min proponas ke anstataŭ Anita + +, ni anstataŭ fari Anita gets- 730 00:40:37,000 --> 00:40:42,000 bone, kial ni ne iras al kiom Anita estas montrante kaj poste fari. poste? 731 00:40:42,000 --> 00:40:45,000 Alivorte, ni iru al Rajmondo, kiu kaŝas la numero 22, 732 00:40:45,000 --> 00:40:51,000 kaj tiam. sekva estas kvazaŭ Anita estus kopii lian maldekstran manon puntero. 733 00:40:51,000 --> 00:40:54,000 Sed ŝi ne volis iri pli for ol Rajmondo ĉar ni trovis 22. 734 00:40:54,000 --> 00:40:56,000 Sed tio estus la ideo. Nun, ĉi tiu estas dio-terura katastrofo. 735 00:40:56,000 --> 00:40:59,000 Honeste, neniu iam memoras tiun sintakson, kaj tiel dankeme, 736 00:40:59,000 --> 00:41:04,000 ĝi estas fakte iom diskutita-ho, vi ne vere vidi kion mi skribis. 737 00:41:04,000 --> 00:41:08,000 Ĉi tiu estus pli konvinkaj se vi povus. Voila! 738 00:41:08,000 --> 00:41:10,000 >> Malantaŭ la kulisoj, mi solvi la problemon tiel. 739 00:41:10,000 --> 00:41:14,000 Anita, preni tiun paŝon al la maldekstro, 740 00:41:14,000 --> 00:41:18,000 unue, ni iru al la adreso kiun Anita estas montrante 741 00:41:18,000 --> 00:41:23,000 kaj kie ŝi trovos ne nur n, kiun ni ĵus kontrolis por komparo, kalkaj, 742 00:41:23,000 --> 00:41:25,000 sed vi trovos ankaŭ sekva - en ĉi tiu kazo, 743 00:41:25,000 --> 00:41:28,000 Rajmondo la maldekstra mano montrante al la sekvanta nodo en la listo. 744 00:41:28,000 --> 00:41:32,000 Sed ĉi tiu estas la dio terura katastrofo, al kiu mi raportis pli frue, 745 00:41:32,000 --> 00:41:34,000 sed ĝi rezultas C lasas nin simpligi ĉi. 746 00:41:34,000 --> 00:41:40,000 Anstataŭ skribo (* Anita), ni povas anstataŭ simple skribi Anita-> n, 747 00:41:40,000 --> 00:41:45,000 kaj estas la ĝusta sama afero funkcie, sed estas multe pli evidenta, 748 00:41:45,000 --> 00:41:48,000 kaj estas multe pli kohera kun la bildo kiun ni estis desegni 749 00:41:48,000 --> 00:41:50,000 tiel longe uzante sagoj. 750 00:41:50,000 --> 00:41:57,000 >> Fine, kion ni bezonas por fari al la fino de tiu programo? 751 00:41:57,000 --> 00:42:00,000 Estas unu linio de kodo restanton. 752 00:42:00,000 --> 00:42:02,000 Reveno kio? 753 00:42:02,000 --> 00:42:05,000 Falsa, ĉar se ni finos la tutan dum buklo 754 00:42:05,000 --> 00:42:10,000 kaj Anita estas, fakte, nula, kiu signifu ŝi iris tutan vojon al la fino de la listo 755 00:42:10,000 --> 00:42:12,000 kie ŝi notis al-kio estas via nomo denove? 756 00:42:12,000 --> 00:42:15,000 Ari. >> Ari la maldekstra mano, kiu estas nula. 757 00:42:15,000 --> 00:42:18,000 Anita nun nula, kaj mi rimarkas ke vi ĵus staris tie mallerte en la limbo 758 00:42:18,000 --> 00:42:21,000 ĉar mi ekpaŝis sur monologo tie, 759 00:42:21,000 --> 00:42:23,000 sed ni engaĝi vi denove en nur momento. 760 00:42:23,000 --> 00:42:27,000 Anita estas nula en tiu punkto en la historio, do la dum buklo finiĝas, 761 00:42:27,000 --> 00:42:30,000 kaj ni devas reveni malvera ĉar se ŝi atingis la tutan vojon al Ari la nula puntero 762 00:42:30,000 --> 00:42:34,000 tiam ne estis numero kiu ŝi serĉis en la listo. 763 00:42:34,000 --> 00:42:39,000 Ni povas purigi ĉi tro, sed ĉi tiu estas sufiĉe bona apliko tiam 764 00:42:39,000 --> 00:42:43,000 de traversal funkcio, oni trovos funkcio por ligitaj listo. 765 00:42:43,000 --> 00:42:48,000 Estas ankoraŭ lineara serĉo, sed ne estas tiel simpla kiel + + puntero 766 00:42:48,000 --> 00:42:52,000 aŭ + + an i variablon ĉar nun ni ne povas diveni 767 00:42:52,000 --> 00:42:54,000 kie ĉiu de ĉi tiuj nodoj estas en memoro. 768 00:42:54,000 --> 00:42:57,000 Ni devas laŭlitere sekvi la spuron de paderoj aŭ, pli specife, 769 00:42:57,000 --> 00:43:00,000 punteros, por preni de unu vertico al alia. 770 00:43:00,000 --> 00:43:02,000 >> Nun ni provu alian. Anita, ĉu vi volas veni cxi tien? 771 00:43:02,000 --> 00:43:06,000 Kial ni ne iru antaŭen kaj destini unu alia persono de la aŭdienco? 772 00:43:06,000 --> 00:43:08,000 Malloc-kio estas via nomo? >> Rebeka. 773 00:43:08,000 --> 00:43:10,000 Rebeka. Rebecca estis malloced de la publiko, 774 00:43:10,000 --> 00:43:13,000 kaj ŝi nun provizon la numeron 55. 775 00:43:13,000 --> 00:43:17,000 Kaj la golo en mano nun estas por Anita insertar 776 00:43:17,000 --> 00:43:22,000 Rebeka en la ligitaj listo tie en ĝia taŭga loko. 777 00:43:22,000 --> 00:43:24,000 Venu ĉi tien dum momento. 778 00:43:24,000 --> 00:43:28,000 Mi faris ion kiel ĉi tio. 779 00:43:28,000 --> 00:43:32,000 Mi faris nodon *. Kaj kio estas via nomo denove? 780 00:43:32,000 --> 00:43:34,000 Rebeka. >> Rebeka, okay. 781 00:43:34,000 --> 00:43:41,000 Rebecca gets malloc (sizeof (nodo)). 782 00:43:41,000 --> 00:43:44,000 Samkiel ni destinis aĵojn kiel studentoj kaj whatnot en la pasinteco, 783 00:43:44,000 --> 00:43:46,000 ni bezonas la grandeco de la nodo, tial nun Rebeka 784 00:43:46,000 --> 00:43:49,000 notas en kio? 785 00:43:49,000 --> 00:43:52,000 Rebecca havas du kampojn interne de ŝi, unu el kiuj estas 55. 786 00:43:52,000 --> 00:43:55,000 Ni faras kion, rebecca-> = 55. 787 00:43:55,000 --> 00:44:00,000 Sed tiam rebecca-> sekva estu-like nun, ŝia mano estas speco de kiu scias? 788 00:44:00,000 --> 00:44:03,000 Oni montras al iuj rubo valoron, do kial ne por bono mezuro 789 00:44:03,000 --> 00:44:07,000 ni almenaŭ fari tion por ke maldekstra mano estas nun ĉe lia flanko. 790 00:44:07,000 --> 00:44:09,000 Nun Anita, prenu ĝin de tie. 791 00:44:09,000 --> 00:44:11,000 Vi havas Rebeka estinte asignotaj. 792 00:44:11,000 --> 00:44:20,000 Iru antaŭen kaj trovi kie ni devus meti Rebeka. 793 00:44:20,000 --> 00:44:25,000 Bona, tre bona. 794 00:44:25,000 --> 00:44:28,000 Konsentite, bona, kaj nun ni bezonas vin por havigi iom da direkto, 795 00:44:28,000 --> 00:44:30,000 tiel vi atingis Ari. 796 00:44:30,000 --> 00:44:33,000 Lia maldekstra mano estas nula, sed Rebeka klare apartenas al la dekstra, 797 00:44:33,000 --> 00:44:36,000 tiel kiel ni devas ŝanĝi ĉi ligitaj listo 798 00:44:36,000 --> 00:44:38,000 por enmeti Rebecca en la taŭgan lokon? 799 00:44:38,000 --> 00:44:42,000 Se vi povus laŭvorte movi popola maldekstra manoj ĉirkaŭ drajvo, 800 00:44:42,000 --> 00:44:48,000 ni ripari la problemon tiamaniere. 801 00:44:48,000 --> 00:44:52,000 Konsentite, bona, kaj dume, Rebecca maldekstre estas nun apud ŝi. 802 00:44:52,000 --> 00:44:54,000 >> Tio estis tro facila. 803 00:44:54,000 --> 00:44:57,000 Ni provu atribuo-we're preskaŭ farita, 20. 804 00:44:57,000 --> 00:44:59,000 Konsentite, venu supren. 805 00:44:59,000 --> 00:45:04,000 20 estis atribuitaj, do lasu min antaŭeniri kaj diru denove ĉi tie 806 00:45:04,000 --> 00:45:07,000 ni ĵus faris nodon * Saad. 807 00:45:07,000 --> 00:45:11,000 Ni havas malloc (sizeof (nodo)). 808 00:45:11,000 --> 00:45:16,000 Ni tiam fari same ĝusta sintakso kiel ni faris antaŭe por 20, 809 00:45:16,000 --> 00:45:20,000 kaj mi faros = NULL, kaj nun ĝi estas ĝis Anita 810 00:45:20,000 --> 00:45:23,000 insertar vin en la ligitaj listo, se vi povus ludi, ke ĝusta sama rolo. 811 00:45:23,000 --> 00:45:30,000 Ekzekuti. 812 00:45:30,000 --> 00:45:32,000 Konsentite, bona. 813 00:45:32,000 --> 00:45:38,000 Nun zorge pensu antaux vi komencas movi maldekstren manoj ĉirkaŭe. 814 00:45:38,000 --> 00:45:46,000 Vi kun tre atingis la plej mallerta rolon hodiaŭ. 815 00:45:46,000 --> 00:45:59,000 Kies mano devas esti movita unua? 816 00:45:59,000 --> 00:46:02,000 Okay, atendu, mi aŭdis iujn ne-aj jaroj. 817 00:46:02,000 --> 00:46:07,000 Se iuj homoj estus ĝentile ŝatas helpi solvi maloportuna situacio tie. 818 00:46:07,000 --> 00:46:11,000 Kies maldekstra mano estu ĝisdatigita unua eble? Yeah. 819 00:46:11,000 --> 00:46:13,000 [Studenta] Saad aj jaroj. 820 00:46:13,000 --> 00:46:15,000 Konsentite, Saad la, kial, kvankam? 821 00:46:15,000 --> 00:46:17,000 [Inaudible studento respondon] 822 00:46:17,000 --> 00:46:19,000 Bona, ĉar se ni movas-kio estas via nomo? >> Marshall. 823 00:46:19,000 --> 00:46:22,000 Marshall, se ni movas la manon unue malsupren al nula, 824 00:46:22,000 --> 00:46:25,000 nun ni laŭvorte orfoj kvar homoj en tiu listo 825 00:46:25,000 --> 00:46:29,000 cxar li estis la sola afero montrante Rajmondo kaj cxiu al la maldekstra, 826 00:46:29,000 --> 00:46:31,000 tiel ĝisdatigante ke puntero unua estis malbona. 827 00:46:31,000 --> 00:46:33,000 Ni malfari tion. 828 00:46:33,000 --> 00:46:37,000 Bona, kaj nun iru antaŭen kaj movi la taŭga maldekstra mano montrante Rajmondo. 829 00:46:37,000 --> 00:46:39,000 Ĉi sentas iom redunda. 830 00:46:39,000 --> 00:46:41,000 Nun ekzistas du personoj montrante Rajmondo, sed tio estas bone 831 00:46:41,000 --> 00:46:43,000 ĉar nun, kiel ajn ni ĝisdatigi la liston? 832 00:46:43,000 --> 00:46:48,000 Kio aliflanke devas movi? 833 00:46:48,000 --> 00:46:53,000 Bonega, nun ni havas perdis neniun memoro? 834 00:46:53,000 --> 00:46:57,000 Ne, tiel bona, vidu se ni ne povos ignori cxi tiun fojon pli. 835 00:46:57,000 --> 00:47:00,000 >> Mallocing lasta fojo, numero 5. 836 00:47:00,000 --> 00:47:04,000 Tuta vojo en dorso, venu malsupren. 837 00:47:04,000 --> 00:47:08,000 Ĝi estas tre ekscita. 838 00:47:08,000 --> 00:47:15,000 [Aplaŭdo] 839 00:47:15,000 --> 00:47:17,000 Kio estas via nomo? >> Ron. 840 00:47:17,000 --> 00:47:19,000 Ron, bone, vi malloced kiel numero 5. 841 00:47:19,000 --> 00:47:23,000 Ni ĵus ekzekutita kodo kiu estas preskaŭ identa al tiuj 842 00:47:23,000 --> 00:47:26,000 kun nur malsama nomo. 843 00:47:26,000 --> 00:47:28,000 Bonega. 844 00:47:28,000 --> 00:47:38,000 Nun, Anita, bonan sorton enmeto numero 5 en la listo nun. 845 00:47:38,000 --> 00:47:43,000 Nu, kaj? 846 00:47:43,000 --> 00:47:47,000 Bonega, do ĉi tiu estas vere la tria el la tri tuta kazoj. 847 00:47:47,000 --> 00:47:49,000 Ni unue havis iun je la fino, Rebeka. 848 00:47:49,000 --> 00:47:51,000 Ni tiam havis iun en la mezo. 849 00:47:51,000 --> 00:47:53,000 Nun ni havas iun je la komenco, kaj en ĉi tiu ekzemplo, 850 00:47:53,000 --> 00:47:56,000 ni nun devis ĝisdatigi Lucas por la unua fojo 851 00:47:56,000 --> 00:48:00,000 ĉar la unua ero en la listo nun devas atentigi en nova nodo, 852 00:48:00,000 --> 00:48:03,000 kiu, siavice, estas montrante nodo numero 9. 853 00:48:03,000 --> 00:48:06,000 >> Tio estis ege mallerta pruvo, mi certas, 854 00:48:06,000 --> 00:48:08,000 tiel grandan ĉirkaŭvojon de aplaŭdoj por tiuj infanoj, se vi povus. 855 00:48:08,000 --> 00:48:11,000 Bele farita. 856 00:48:11,000 --> 00:48:17,000 Tio estas ĉio. Vi povas konservi viajn pecojn de papero kiel malgranda memoro. 857 00:48:17,000 --> 00:48:22,000 Rezultas ke farante tion en kodo 858 00:48:22,000 --> 00:48:26,000 estas ne tute tiel simpla kiel simple movi manojn ĉirkaŭ 859 00:48:26,000 --> 00:48:28,000 kaj montrante punteros en malsamaj aĵoj. 860 00:48:28,000 --> 00:48:31,000 Sed rimarkas ke kiam temas tempo realigi ion kiel 861 00:48:31,000 --> 00:48:34,000 kunligita listo aŭ varianto de ĝi, se vi enfokusigi vere 862 00:48:34,000 --> 00:48:38,000 tiuj bazaj fundamentojn, la mordo-grandeco problemojn mi devas diveni, 863 00:48:38,000 --> 00:48:43,000 ĉu ĉi mano aŭ tiun manon, rimarkas ke kio estas alia maniero sufiĉe kompleksa programo 864 00:48:43,000 --> 00:48:47,000 povas, fakte, povas redukti al sufiĉe simpla konstruaĵo blokoj ŝatas tion. 865 00:48:47,000 --> 00:48:51,000 >> Ni prenu tion en pli kompleksaj direkto senmova. 866 00:48:51,000 --> 00:48:53,000 Ni nun havas la nocion de la ligitaj listo. 867 00:48:53,000 --> 00:48:57,000 Ni ankaŭ havas-danke al la sugesto reen tie-duoble ligitaj listo, 868 00:48:57,000 --> 00:49:01,000 kiu aspektas preskaŭ la sama, sed nun ni havas du punteros ene de la struct 869 00:49:01,000 --> 00:49:05,000 anstataŭ unu, kaj ni povus probable voki la punteros antaŭa kaj apud 870 00:49:05,000 --> 00:49:08,000 aŭ maldekstra aŭ dekstra, sed ni, fakte, bezonas du el ili. 871 00:49:08,000 --> 00:49:10,000 La kodo estus iom pli implikitaj. 872 00:49:10,000 --> 00:49:12,000 Anita estus devinta fari pli da laboro tie sur la scenejo. 873 00:49:12,000 --> 00:49:15,000 Sed ni povus certe apliki tian strukturon. 874 00:49:15,000 --> 00:49:19,000 En terminoj de rula tempo, tamen, kio estus la rula tempo 875 00:49:19,000 --> 00:49:24,000 por Anita de trovanta nombro n en ligitaj listo nun? 876 00:49:24,000 --> 00:49:27,000 Ankoraŭ granda a de n, do ĝi ne estas pli bona ol lineara serĉo. 877 00:49:27,000 --> 00:49:29,000 Ni ne povas fari duuma serĉo, kvankam, denove. 878 00:49:29,000 --> 00:49:34,000 Kial estis ke la kazo? Vi ne povas salti ĉirkaŭe. 879 00:49:34,000 --> 00:49:36,000 Eĉ kvankam ni evidente vidas ĉiuj homoj sur la scenejo, 880 00:49:36,000 --> 00:49:39,000 kaj Anita povus esti eyeballed ĝin kaj diris: "Jen estas la mezo de la listo," 881 00:49:39,000 --> 00:49:42,000 ŝi ne scius, ke se ŝi estus la komputila programo 882 00:49:42,000 --> 00:49:47,000 ĉar la sola afero devis fermi al la komenco de la scenaro 883 00:49:47,000 --> 00:49:50,000 estis Lucas, kiu estis la unua montrilo. 884 00:49:50,000 --> 00:49:53,000 Ŝi nepre devas sekvi tiujn ligojn, 885 00:49:53,000 --> 00:49:56,000 rakonti sian vojon ĝis ŝi trovis proksimume la mezo, 886 00:49:56,000 --> 00:49:58,000 kaj eĉ tiam, ŝi ne tuj scii kiam ŝi atingis la mezo 887 00:49:58,000 --> 00:50:01,000 krom se ĝi iras tuta vojo al la fino eltrovi kiom da ekzistas, 888 00:50:01,000 --> 00:50:05,000 tiam backtracks, kaj ke estus tro malmola se vi havis 889 00:50:05,000 --> 00:50:07,000 duoble ligitaj listo de ia. 890 00:50:07,000 --> 00:50:10,000 >> Solvi iujn problemojn hodiaŭ, sed enkondukante aliaj. 891 00:50:10,000 --> 00:50:12,000 Kio pri malsama datumstrukturo aro? 892 00:50:12,000 --> 00:50:15,000 Tio estas foto de la pletoj en Mather Domo, 893 00:50:15,000 --> 00:50:19,000 kaj en ĉi tiu kazo, ni havas datumstrukturo ni ankaŭ speco de jam parolas. 894 00:50:19,000 --> 00:50:22,000 Ni parolis pri stako en la kunteksto de memoro, 895 00:50:22,000 --> 00:50:26,000 kaj tio ia intence nomis ĉar pilo en la terminoj de memoro 896 00:50:26,000 --> 00:50:31,000 estas efektive datumstrukturo kiu havas pli kaj pli stuff manteloj sur ĝi. 897 00:50:31,000 --> 00:50:35,000 Sed la interesa afero pri pilo, kiel estas la kazo en realeco, 898 00:50:35,000 --> 00:50:38,000 estas ke ĝi estas speciala speco de datumstrukturo. 899 00:50:38,000 --> 00:50:42,000 Ĝi estas datumstrukturo per kiu la unua elemento en 900 00:50:42,000 --> 00:50:46,000 estas la lasta elemento eksteren. 901 00:50:46,000 --> 00:50:50,000 Se vi estas la unua pleto por esti metita sur la pilo, 902 00:50:50,000 --> 00:50:53,000 vi tuj estos bedaŭrinde la lasta pleto esti demetinta la pilo, 903 00:50:53,000 --> 00:50:55,000 kaj tio ne nepre estas bona afero. 904 00:50:55,000 --> 00:50:58,000 Male, vi povas pensi pri tio la revés, 905 00:50:58,000 --> 00:51:02,000 la lasta en la unua eksteren. 906 00:51:02,000 --> 00:51:05,000 >> Nun, ĉu iu scenaroj venas al la menso kie havi pilo 907 00:51:05,000 --> 00:51:08,000 datumstrukturo kie vi havas tiun propraĵo 908 00:51:08,000 --> 00:51:13,000 de la lasta en, unua el, estas fakte konvinkaj? 909 00:51:13,000 --> 00:51:16,000 Ĉu tio estas bona afero? Ĉu tio estas malbona? 910 00:51:16,000 --> 00:51:19,000 Estas definitive malbona se la pletoj ne estis ĉiuj identa 911 00:51:19,000 --> 00:51:21,000 kaj ili cxiuj estis speciala malsamaj koloroj aŭ whatnot, 912 00:51:21,000 --> 00:51:24,000 kaj la koloron vi volas estas la tuta vojo al la fundo. 913 00:51:24,000 --> 00:51:26,000 Kompreneble, vi ne povas atingi tiun sen granda peno. 914 00:51:26,000 --> 00:51:28,000 Vi devas komenci de la supro kaj labori vian vojon malsupren. 915 00:51:28,000 --> 00:51:31,000 Simile, kio se vi estis unu el tiuj fano infanoj 916 00:51:31,000 --> 00:51:34,000 kiuj atendas la tutan nokton provante atingi iPhone kaj regiono 917 00:51:34,000 --> 00:51:36,000 en loko kiel tiu? 918 00:51:36,000 --> 00:51:40,000 Ĉu ne estus bela se la Apple vendejo 919 00:51:40,000 --> 00:51:42,000 estis stako datumstrukturo? 920 00:51:42,000 --> 00:51:44,000 Yay? Ne? 921 00:51:44,000 --> 00:51:47,000 Estas nur bona por la popolo, kiu aperas en la lasta ebla minuto 922 00:51:47,000 --> 00:51:50,000 kaj tiam preni desxiritan la vico. 923 00:51:50,000 --> 00:51:52,000 Kaj fakte, la fakto ke mi estis tiom emas diri vosto 924 00:51:52,000 --> 00:51:56,000 Estas vere kohera kun kion ni nomas tian datumstrukturo, 925 00:51:56,000 --> 00:51:59,000 en realeco kie la ordo gravas, 926 00:51:59,000 --> 00:52:02,000 kaj vi volas ke la unua en esti la unua el 927 00:52:02,000 --> 00:52:04,000 se nur pro homa justeco. 928 00:52:04,000 --> 00:52:07,000 Ni ĝenerale nomas ke queue datumstrukturo. 929 00:52:07,000 --> 00:52:11,000 >> Ĝi rezultas krom ligitaj listoj, ni povas ekuzi tiujn samajn bazajn ideojn 930 00:52:11,000 --> 00:52:15,000 kaj komenci krei novan kaj diversaj specoj de solvoj al problemoj. 931 00:52:15,000 --> 00:52:19,000 Ekzemple, en la kazo de pilo, ni povus reprezenti stako 932 00:52:19,000 --> 00:52:22,000 uzante datumstrukturo kiel ĉi tiu, mi proponas. 933 00:52:22,000 --> 00:52:26,000 En ĉi tiu kazo, mi deklaris struct, kaj mi diris interne de tiu strukturo 934 00:52:26,000 --> 00:52:30,000 estas tabelo de nombroj kaj poste variablo nomas grandecon, 935 00:52:30,000 --> 00:52:33,000 kaj mi iras por voki ĉi tiun aĵon pilo. 936 00:52:33,000 --> 00:52:35,000 Nun, kial ĉi tiu vere funkcias? 937 00:52:35,000 --> 00:52:43,000 En la kazo de pilo, mi povus desegni ĉi efektive sur la ekrano tiel tablo. 938 00:52:43,000 --> 00:52:47,000 Jen mia pilo. Tiuj estas miaj ciferoj. 939 00:52:47,000 --> 00:52:50,000 Kaj ni desegni ilin kiel ĉi tio, tio, tiu, tio, tiu. 940 00:52:50,000 --> 00:52:53,000 Kaj tiam mi havas iujn aliajn datumojn membro tie, 941 00:52:53,000 --> 00:52:58,000 kiu estas nomata grandeco, do ĉi tiu estas grandeco, kaj ĉi tiu estas nombroj, 942 00:52:58,000 --> 00:53:02,000 kaj kolektive, la tuta iPad tie reprezentas unu pilo strukturo. 943 00:53:02,000 --> 00:53:07,000 Nun, implicite, grandeco supozeble alvenis al inicializado al 0, 944 00:53:07,000 --> 00:53:11,000 kaj kio estas ene de la tabelo de nombroj komence 945 00:53:11,000 --> 00:53:14,000 kiam mi unue atribui tabelo? 946 00:53:14,000 --> 00:53:16,000 Rubo. Kiu scias? Kaj ĝi ne vere gravas. 947 00:53:16,000 --> 00:53:20,000 Ne gravas se tiu estas 1, 2, 3, 4, 5, tute hazarde 948 00:53:20,000 --> 00:53:25,000 por malbona sorto stokitaj en mia strukturon ĉar tiel longe, kiel mi scias, ke la grandeco de la stako 949 00:53:25,000 --> 00:53:29,000 estas 0, tiam mi scias programmatically, ne rigardu iu el la eroj en la tabelo. 950 00:53:29,000 --> 00:53:31,000 Ne gravas kio estas tie. 951 00:53:31,000 --> 00:53:34,000 Ne rigardu ilin, kiel estus la implikaĵon de grandeco de 0. 952 00:53:34,000 --> 00:53:38,000 >> Sed supozu nun mi iras antaŭen kaj enmeti ion en la stako. 953 00:53:38,000 --> 00:53:42,000 Mi volas enmeti la numero 5, do mi metis numero 5 tie, 954 00:53:42,000 --> 00:53:45,000 kaj tiam kion mi metis ĉi tien? 955 00:53:45,000 --> 00:53:48,000 Nun mi fakte sufoki 1 por la grandeco, 956 00:53:48,000 --> 00:53:50,000 kaj nun la pilo estas de amplekso 1. 957 00:53:50,000 --> 00:53:53,000 Kio se mi iras antaŭen kaj enmeti la numeron, diru, 7 poste? 958 00:53:53,000 --> 00:53:57,000 Ĉi tiam gets ĝisdatigita al 2, kaj poste ni faros 9, 959 00:53:57,000 --> 00:54:02,000 kaj tiam ĉi gets ĝisdatigita al 3. 960 00:54:02,000 --> 00:54:05,000 Sed la interesa trajto nun de ĉi pilo estas ke 961 00:54:05,000 --> 00:54:09,000 Mi supozis forigi kion elemento se mi volas popo 962 00:54:09,000 --> 00:54:12,000 io ekstere de la pilo, por tiel diri? 963 00:54:12,000 --> 00:54:14,000 9 estus la unua kiu iri. 964 00:54:14,000 --> 00:54:18,000 Kiel se la bildo ŝanĝi se mi volas popo ero ekstere la pilo, 965 00:54:18,000 --> 00:54:20,000 multe kiel pleto en Mather? 966 00:54:20,000 --> 00:54:22,000 Yeah. >> [Studenta] Ara grandeco al 2. 967 00:54:22,000 --> 00:54:27,000 Ekzakte, ĉiuj mi faras estas metita grandeco al 2, kaj kion mi faras kun la tabelo? 968 00:54:27,000 --> 00:54:29,000 Mi ne devas fari ion. 969 00:54:29,000 --> 00:54:32,000 Mi povus, nur por esti anal, metu 0 tie aŭ -1 aŭ ion por signifi 970 00:54:32,000 --> 00:54:34,000 ke tio ne estas legit valoro, sed ne gravas ĉar 971 00:54:34,000 --> 00:54:37,000 Mi povas gravuri ekster la tabelo mem kiel longe estas 972 00:54:37,000 --> 00:54:41,000 tiel, ke mi konas nur rigardi la du unuaj elementoj en ĉi tiu tabelo. 973 00:54:41,000 --> 00:54:47,000 Nun, se mi iros kaj aldoni la numero 8 al ĉi tabelo, kiel faras la bildo ŝanĝas poste? 974 00:54:47,000 --> 00:54:50,000 Ĉi igas 8, kaj ĉi tiu iĝas 3. 975 00:54:50,000 --> 00:54:52,000 Mi tranĉis kelkaj anguloj tie. 976 00:54:52,000 --> 00:54:56,000 Nun ni havas 5, 7, 8, kaj ni reen al grandecon de 3. 977 00:54:56,000 --> 00:54:58,000 Ĉi tiu estas bela simpla apliki, 978 00:54:58,000 --> 00:55:06,000 sed kiam ni tuj bedaŭras ĉi dezajno decido? 979 00:55:06,000 --> 00:55:09,000 Kiam do aferojn komencos iri tre tre malbone? Yeah. 980 00:55:09,000 --> 00:55:11,000 [Inaudible studento respondon] 981 00:55:11,000 --> 00:55:13,000 Kiam vi volas iri reen kaj akiri la unuan elementon vi enmetita tien 982 00:55:13,000 --> 00:55:18,000 >> Ĝi rezultas tie kvankam pilo estas tabelo sub la kapuĉo, 983 00:55:18,000 --> 00:55:21,000 tiuj datumstrukturoj ni komencis paroli pri ili ankaŭ ĝenerale konata kiel 984 00:55:21,000 --> 00:55:25,000 abstrakta datumstrukturoj per kiom ili estas implementado 985 00:55:25,000 --> 00:55:27,000 estas tute krom la punkto. 986 00:55:27,000 --> 00:55:31,000 Al datumstrukturo kiel stako supozas aldoni subtenon 987 00:55:31,000 --> 00:55:35,000 operaciojn kiel puŝo, kiu pelas pleton sur la pilo, 988 00:55:35,000 --> 00:55:39,000 kaj popo, kiu forprenas ero de la pilo, kaj tio estas ĝi. 989 00:55:39,000 --> 00:55:43,000 Se vi estus por elŝuti de iu alia kodo, kiuj jam implementado 990 00:55:43,000 --> 00:55:46,000 tion nomis pilo, tiu persono estus skribinta 991 00:55:46,000 --> 00:55:49,000 nur du funkcioj por vi, puŝi kaj popo, kies sola celo en la vivo 992 00:55:49,000 --> 00:55:51,000 estus fari precize tion. 993 00:55:51,000 --> 00:55:54,000 Vi aŭ li aŭ ŝi kiu implementado tiu programo 994 00:55:54,000 --> 00:55:58,000 estus estinta tute la decidi kiel apliki 995 00:55:58,000 --> 00:56:00,000 la semantiko de puŝas kaj krevi sub la kapuĉo 996 00:56:00,000 --> 00:56:03,000 aŭ la funkcioj de puŝas kaj krevi. 997 00:56:03,000 --> 00:56:07,000 Kaj mi faris iom miopa decidon ĉi tie 998 00:56:07,000 --> 00:56:10,000 per apliko mia pilo kun tiu simpla datumstrukturo kial? 999 00:56:10,000 --> 00:56:12,000 Kiam tion faras datumstrukturo ripozon? 1000 00:56:12,000 --> 00:56:18,000 Kie estas la limo do mi devas reveni eraron kiam la uzanto vokas puŝo, ekzemple? 1001 00:56:18,000 --> 00:56:20,000 [Studenta] Se ne estas pli da spaco. 1002 00:56:20,000 --> 00:56:23,000 Ĝuste, se estas neniu pli spaco, se mi superis kapablo, 1003 00:56:23,000 --> 00:56:27,000 kiu estas la tuta kaskedoj ĉar ĝi sugestas, ke estas ia tutmonda konstanto. 1004 00:56:27,000 --> 00:56:30,000 Nu, tiam mi simple tuj devos diri: "Pardonu, mi ne povas puŝi alia valoro 1005 00:56:30,000 --> 00:56:32,000 sur la pilo, "multe kiel en Mather. 1006 00:56:32,000 --> 00:56:36,000 >> En iu momento, ili tuj frapis la supera parto de tiu iom kabineto. 1007 00:56:36,000 --> 00:56:39,000 Ne pli spaco aŭ kapablo en la pilo, en kiu punkto ekzistas ia eraro. 1008 00:56:39,000 --> 00:56:42,000 Ili devas meti la elementon en alia loko, la pleto aliloke, 1009 00:56:42,000 --> 00:56:44,000 aŭ nenie ajn. 1010 00:56:44,000 --> 00:56:47,000 Nun, kun vosto, ni povus efektivigi ĝin iom malsame. 1011 00:56:47,000 --> 00:56:50,000 Al vosto estas iom malsama en kiu sub la kapuĉo, ĝi povas esti realigita 1012 00:56:50,000 --> 00:56:54,000 tiel tablo, sed kial, ĉi-kaze, mi proponas 1013 00:56:54,000 --> 00:56:59,000 havi ankaŭ kapon elemento reprezentas la kapo de la listo, 1014 00:56:59,000 --> 00:57:06,000 la fronto de la listo, la unua persono en linio je la Apple vendejo, krom grandeco? 1015 00:57:06,000 --> 00:57:14,000 Kial mi bezonas plian pecon da datumoj tie? 1016 00:57:14,000 --> 00:57:16,000 Pensu reen al kio nombroj estas 1017 00:57:16,000 --> 00:57:18,000 se mi desegnis ĝin jene. 1018 00:57:18,000 --> 00:57:21,000 Supozi ĉi estas nun queue anstataŭ pilo, 1019 00:57:21,000 --> 00:57:24,000 la diferenco-samkiel la Apple vendejo-vosto estas justa. 1020 00:57:24,000 --> 00:57:27,000 La unua persono en linio je la komenco de la listo, numero 5 en ĉi tiu kazo, 1021 00:57:27,000 --> 00:57:30,000 li aŭ ŝi tuj estos enlasitaj sur la vendejo unua. 1022 00:57:30,000 --> 00:57:32,000 Ni faras tion. 1023 00:57:32,000 --> 00:57:35,000 Supozu ke tiu estas la stato de mia vosto en ĉi tiu momento en tempo, kaj nun la Apple vendejo 1024 00:57:35,000 --> 00:57:39,000 malfermas kaj la unua persono, numero 5, estas direktita al la vendejo. 1025 00:57:39,000 --> 00:57:43,000 Kiel mi ŝanĝu la bildon nun ke mi de-vosto la unua persono 1026 00:57:43,000 --> 00:57:47,000 ĉe la fronto de la linio? 1027 00:57:47,000 --> 00:57:50,000 Kio estas tio? >> [Studenta] Ŝanĝi la vico. 1028 00:57:50,000 --> 00:57:52,000 Ŝanĝi la kapon tiel, 5 malaperas. 1029 00:57:52,000 --> 00:57:56,000 Fakte, ĝi estas kvazaŭ-kiel plej bone fari tion? 1030 00:57:56,000 --> 00:58:00,000 Fakte, ĝi estas kvazaŭ tiu ulo malaperas. 1031 00:58:00,000 --> 00:58:03,000 Kion numero 7 fari en reala vendejo? 1032 00:58:03,000 --> 00:58:05,000 Ili prenus grandan paŝon antaŭen. 1033 00:58:05,000 --> 00:58:08,000 >> Sed kion ni venis por estimi kiam temas pri tabeloj 1034 00:58:08,000 --> 00:58:10,000 kaj movante aĵoj ĉirkaŭ? 1035 00:58:10,000 --> 00:58:12,000 Tio estas speco de malŝparo de via tempo, ĉu ne? 1036 00:58:12,000 --> 00:58:16,000 Kial vi devas esti tiel anal kiel havi la unua persono 1037 00:58:16,000 --> 00:58:21,000 je la komenco de la linio je fizike la komenco de la bloko de memoro? 1038 00:58:21,000 --> 00:58:23,000 Tio estas tute nenecesa. Kial? 1039 00:58:23,000 --> 00:58:26,000 Kion mi povus simple memori anstataŭe? >> [Inaudible studento respondon] 1040 00:58:26,000 --> 00:58:30,000 Precize, mi povus simple memori kun ĉi pliaj datumoj membro kapo 1041 00:58:30,000 --> 00:58:34,000 ke nun la estro de la listo ne plu estas 0, kio estis antaŭ momento. 1042 00:58:34,000 --> 00:58:39,000 Nun ĝi estas vere la nombro 1. Tiamaniere, mi alvenas malpeza optimumigo. 1043 00:58:39,000 --> 00:58:44,000 Nur ĉar mi de-vosto iu de linio en la komenco de la linio je la Apple vendejo 1044 00:58:44,000 --> 00:58:47,000 ne signifas ke ĉiuj devas ŝanĝi, kiu memoros estas lineara operacio. 1045 00:58:47,000 --> 00:58:50,000 Mi povas anstataŭ pasi konstanta tempo nur 1046 00:58:50,000 --> 00:58:53,000 kaj atingi tiam multe pli rapida respondo. 1047 00:58:53,000 --> 00:58:56,000 Sed la prezo Mi pagas estas kion gajni ke plia agado 1048 00:58:56,000 --> 00:58:58,000 kaj ne devi ŝanĝi ĉiuj? 1049 00:58:58,000 --> 00:59:01,000 Yeah. >> [Inaudible studento respondon] 1050 00:59:01,000 --> 00:59:04,000 Povas aldoni pli da homoj, nu, tiu problemo estas perpendikulara 1051 00:59:04,000 --> 00:59:07,000 al la fakto ke ni ne ŝanĝante homoj ĉirkaŭe. 1052 00:59:07,000 --> 00:59:11,000 Estas ankoraŭ tabelo, do ĉu ni ŝanĝi ĉiuj aŭ ne- 1053 00:59:11,000 --> 00:59:13,000 ho, mi vidas tion, kion vi volas diri, okay. 1054 00:59:13,000 --> 00:59:16,000 Efektive, mi konsentas kun kion vi diris en tiu estas preskaŭ kvazaŭ 1055 00:59:16,000 --> 00:59:19,000 ni nun neniam tuj uzos la komenco de ĉi tiu tabelo plu 1056 00:59:19,000 --> 00:59:22,000 ĉar se mi forpelus 5, tiam mi forigi 7. 1057 00:59:22,000 --> 00:59:24,000 Sed mi nur metis la homo al la dekstra. 1058 00:59:24,000 --> 00:59:28,000 >> Sentas mi malŝparas spacon, kaj eventuale mia vosto malintegras en nenion, 1059 00:59:28,000 --> 00:59:31,000 do ni povus simple devas homoj wraparound, 1060 00:59:31,000 --> 00:59:35,000 kaj ni povus pensi pri tiu tabelo vere kiel ia cirkla strukturo, 1061 00:59:35,000 --> 00:59:38,000 sed ni uzas kion operatoro en C por fari tiajn wraparound? 1062 00:59:38,000 --> 00:59:40,000 [Inaudible studento respondon] >> La module operatoro. 1063 00:59:40,000 --> 00:59:43,000 Estus iom ĝena pensi tra how do you do la wraparound, 1064 00:59:43,000 --> 00:59:46,000 sed ni povus fari gxin, kaj ni povus komenci meti homojn je kioma kutimis esti la fronto de la linio, 1065 00:59:46,000 --> 00:59:52,000 sed ni nur memoras kun tiu kapo variablo kiu estas la reala kapo de la linio estas. 1066 00:59:52,000 --> 00:59:57,000 Kio se, anstataŭe, nia celo finfine, tamen, 1067 00:59:57,000 --> 01:00:00,000 estis serĉi nombroj, kiel ni faris ĉi tie sur la scenejo kun Anita, 1068 01:00:00,000 --> 01:00:02,000 sed ni vere volas la plej bonan el cxiuj tiuj mondoj? 1069 01:00:02,000 --> 01:00:05,000 Ni volas pli sofisticación ol tabelo permesas 1070 01:00:05,000 --> 01:00:09,000 ĉar ni deziras la kapablon dinamike kreski la datumstrukturo. 1071 01:00:09,000 --> 01:00:12,000 Sed ni ne volas havi recurrir al iu kiun ni atentigis 1072 01:00:12,000 --> 01:00:15,000 en la unua prelego ne estis optimuma algoritmo, 1073 01:00:15,000 --> 01:00:17,000 tiu de lineara serĉo. 1074 01:00:17,000 --> 01:00:21,000 Rezultas, ke vi povas, fakte, atingi 1075 01:00:21,000 --> 01:00:24,000 aŭ almenaŭ proksime al konstanta tempo, per kiu iu kiel Anita, 1076 01:00:24,000 --> 01:00:27,000 se ŝi configures ŝi datumstrukturo ne esti ligillisto, 1077 01:00:27,000 --> 01:00:30,000 ne esti pilo, ne esti vosto, povus, fakte, 1078 01:00:30,000 --> 01:00:33,000 supreniru kun datumstrukturo kiu permesas sxin rigardi aferojn, 1079 01:00:33,000 --> 01:00:37,000 eĉ vortoj, ne nur numeroj, en kio ni vokos konstanta tempo. 1080 01:00:37,000 --> 01:00:40,000 >> Kaj fakte, rigardante antaŭen, unu el la psets en ĉi klaso estas preskaŭ ĉiam 1081 01:00:40,000 --> 01:00:43,000 realigo de literumilo, per kiu 1082 01:00:43,000 --> 01:00:46,000 ni donu al vi denove iuj 150.000 anglaj vortoj kaj la celo estas 1083 01:00:46,000 --> 01:00:51,000 montru tiujn en memoron kaj rapide povos respondi al demandoj de la formo 1084 01:00:51,000 --> 01:00:54,000 Estas ĉi tiu vorto ĝuste literumita? 1085 01:00:54,000 --> 01:00:58,000 Kaj ĝi vere suck se vi havis ankaŭ persisti tra ĉiuj 150.000 vortojn por respondi. 1086 01:00:58,000 --> 01:01:02,000 Sed, fakte, ni vidos, ke ni povas fari ĝin en tre, tre rapida tempo. 1087 01:01:02,000 --> 01:01:06,000 Kaj tuj engaĝi implementando iu nomita hash tablo, 1088 01:01:06,000 --> 01:01:09,000 kaj kvankam unuavide tiu afero nomata hash tablo tuj 1089 01:01:09,000 --> 01:01:12,000 ni atingi tiujn super rapida respondo tempoj, 1090 01:01:12,000 --> 01:01:18,000 ĝi rezultas ke tie estas fakte problemo. 1091 01:01:18,000 --> 01:01:23,000 Kiam temas tempo realigi tiun aferon nomita-denove, mi faras ĝin denove. 1092 01:01:23,000 --> 01:01:25,000 Mi estas la sola ĉi tie. 1093 01:01:25,000 --> 01:01:28,000 Kiam temas tempon por efektivigi tion nomas hash tablo, 1094 01:01:28,000 --> 01:01:30,000 ni tuj devos preni decidon. 1095 01:01:30,000 --> 01:01:32,000 Kiel granda devas tion efektive estus? 1096 01:01:32,000 --> 01:01:36,000 Kaj kiam ni komencos enmeto nombroj en ĉi hash tablo, 1097 01:01:36,000 --> 01:01:38,000 kiel ni por stoki ilin en tia maniero 1098 01:01:38,000 --> 01:01:42,000 ke ni povas atingi ilin el tiel rapide kiel ni ricevis ilin en? 1099 01:01:42,000 --> 01:01:45,000 Sed ni vidos antaux longe ke tiu demando pri 1100 01:01:45,000 --> 01:01:48,000 kiam ĉies naskiĝtago estas en la klaso estos sufiĉe germane. 1101 01:01:48,000 --> 01:01:51,000 Rezultas, ke en ĉi tiu ĉambro, ni havas kelkajn cent homoj, 1102 01:01:51,000 --> 01:01:56,000 do la probablo ke du el ni havas la saman naskiĝtagon estas probable sufiĉe alta. 1103 01:01:56,000 --> 01:01:58,000 Kio se estis nur 40 el ni en tiu ĉambro? 1104 01:01:58,000 --> 01:02:02,000 Kio estas la probablo de du personoj havanta la saman naskiĝtagon? 1105 01:02:02,000 --> 01:02:04,000 [Studentoj] Pli ol 50%. 1106 01:02:04,000 --> 01:02:06,000 Yeah, super 50%. Fakte, mi eĉ kunportis abako. 1107 01:02:06,000 --> 01:02:08,000 Ĝi rezultas-kaj ĉi tiu estas vere nur sneak antaŭmontro- 1108 01:02:08,000 --> 01:02:12,000 se estas nur 58 el ni en tiu ĉambro, la probablo de 2 el ni 1109 01:02:12,000 --> 01:02:16,000 havante la saman naskiĝtagon estas ege alta, preskaŭ 100%, 1110 01:02:16,000 --> 01:02:20,000 kaj tio tuj kaŭzos tuta amaso de vundita por ni merkredon. 1111 01:02:20,000 --> 01:02:24,000 >> Kun kiu diris, ni adjourn tie. Ni vidos vin merkredon. 1112 01:02:24,000 --> 01:02:28,000 [Aplaŭdo] 1113 01:02:28,000 --> 01:02:30,000 [CS50.TV]