1 00:00:00,000 --> 00:00:02,000 [Powered by Google Translate] [Tjedan 6] 2 00:00:02,000 --> 00:00:04,000 [David J. Malan] [Sveučilište Harvard] 3 00:00:04,000 --> 00:00:08,000 [Ovo je CS50.] [CS50.TV] 4 00:00:08,000 --> 00:00:12,000 >> Ovo je CS50, a to je početak tjedna 6, 5 00:00:12,000 --> 00:00:16,000 tako par novih alata su sada dostupne za vas iskoristiti, 6 00:00:16,000 --> 00:00:19,000 od kojih je prvi se zove CS50 stil. 7 00:00:19,000 --> 00:00:22,000 Tečajevi su, ako ste poput mene, ili bilo koji od nastavnih bližnjima, 8 00:00:22,000 --> 00:00:26,000 Vjerojatno ste vidjeli program čiji stil izgleda malo nešto ovako. 9 00:00:26,000 --> 00:00:30,000 Možda ćete početi rezanje neke kutove kasno noću, ili ćete se nositi s njom kasnije, 10 00:00:30,000 --> 00:00:32,000 i onda TF ili CA dolazi preko za vrijeme radnog vremena. 11 00:00:32,000 --> 00:00:34,000 Tada je teško za nas čitati. 12 00:00:34,000 --> 00:00:38,000 Pa, ovaj broj je sintaktički ispravan, a to će sastaviti, a to će zapravo pokrenuti. 13 00:00:38,000 --> 00:00:40,000 Ali to definitivno nije 5 za stil. 14 00:00:40,000 --> 00:00:45,000 >> Ali sada, ako idemo u ovaj direktorij ovdje- 15 00:00:45,000 --> 00:00:48,000 i primjetiti da imam conditions2.c- 16 00:00:48,000 --> 00:00:55,000 i ja pokrenuti tu novu naredbu, style50, na ovoj datoteci conditions2.c, Enter 17 00:00:55,000 --> 00:00:57,000 primijetiti da me obavijestio da je stilizirana. 18 00:00:57,000 --> 00:01:00,000 Gedit primijetio da je datoteka izmijenjena na disku, 19 00:01:00,000 --> 00:01:08,000 a ako ja kliknite reload, svi vaši problemi sada su automatizirani. 20 00:01:08,000 --> 00:01:15,000 [Pljesak] 21 00:01:15,000 --> 00:01:17,000 To je jedna od stvari koje smo učinili ovaj vikend. 22 00:01:17,000 --> 00:01:20,000 Shvatite da je nesavršena, jer postoje neki kod 23 00:01:20,000 --> 00:01:23,000 da to jednostavno neće moći stilizovati savršeno, 24 00:01:23,000 --> 00:01:26,000 ali shvatite ovo je sada alat možete iskoristiti 25 00:01:26,000 --> 00:01:33,000 ako je samo pospremiti neke od više errantly stavljen vitičastih zagrada i slično. 26 00:01:33,000 --> 00:01:36,000 >> Ali više uvjerljiv sada je CS50 Provjeri. 27 00:01:36,000 --> 00:01:39,000 S CS50 provjera, što zapravo može obavljati iste testove ispravnosti 28 00:01:39,000 --> 00:01:42,000 na svoj kodu da nastavna momci su u mogućnosti. 29 00:01:42,000 --> 00:01:44,000 To je uslužni program naredbenog retka koji dolazi sada u aparatu 30 00:01:44,000 --> 00:01:46,000 čim učiniti update50 kao i po 31 00:01:46,000 --> 00:01:49,000 pset četiri specifikacije, te ga koristiti u suštini ovako. 32 00:01:49,000 --> 00:01:51,000 Možete pokrenuti naredbu check50. 33 00:01:51,000 --> 00:01:56,000 Tada ćete proći u argument naredbenog retka, ili više obično poznat kao prekidač ili zastavu. 34 00:01:56,000 --> 00:01:58,000 Općenito, stvari koje imaju crtice su pozvani prekidač 35 00:01:58,000 --> 00:02:02,000 na programu naredbenog retka, tako-c određuje 36 00:02:02,000 --> 00:02:04,000 provjere koje želite pokrenuti. 37 00:02:04,000 --> 00:02:07,000 >> Testovi koje želite pokrenuti su identificirani jedinstveno ovog niza, 38 00:02:07,000 --> 00:02:10,000 2012/pset4/resize. 39 00:02:10,000 --> 00:02:13,000 Drugim riječima, to je samo proizvoljna, ali jedinstven niz 40 00:02:13,000 --> 00:02:18,000 da mi koristiti za jedinstveno identificiranje pset 4 je ispravnosti ispitivanja. 41 00:02:18,000 --> 00:02:21,000 I onda odrediti prostor odvojen popis datoteka koje želite prenijeti 42 00:02:21,000 --> 00:02:24,000 do CS50 provjera za analizu. 43 00:02:24,000 --> 00:02:29,000 Na primjer, ako odem u moje rješenje ovdje za resize.c- 44 00:02:29,000 --> 00:02:31,000 neka mi otvoriti veći terminal prozor- 45 00:02:31,000 --> 00:02:42,000 i ja ići naprijed i pokrenuti recimo check50-c 2012/pset4/resize, 46 00:02:42,000 --> 00:02:46,000 i onda sam ići naprijed i navesti imena datoteka, 47 00:02:46,000 --> 00:02:49,000 resize.c, a zatim pritisnite Enter, komprimira, 48 00:02:49,000 --> 00:02:53,000 to slike, to provjerava, a ja sam samo propustio hrpu testova. 49 00:02:53,000 --> 00:02:59,000 Jedna u crvenom, na gornjem lijevom kaže da resize.c i BMP postoji. 50 00:02:59,000 --> 00:03:01,000 To je bio test. To je pitanje. 51 00:03:01,000 --> 00:03:04,000 I to je nesretan jer je odgovor bio lažan. 52 00:03:04,000 --> 00:03:08,000 Bijeli tekst ispod njega, kaže očekuje bmp.h da postoje, i to je jednostavno moja krivnja. 53 00:03:08,000 --> 00:03:11,000 Zaboravio sam ga upload, tako da moram uploadati obje datoteke, 54 00:03:11,000 --> 00:03:14,000 resize.c i bmp.h. 55 00:03:14,000 --> 00:03:17,000 Ali sada primjetiti sve ostale testove su u žuto, jer oni nisu pokrenuti, 56 00:03:17,000 --> 00:03:21,000 i tako smješko je okomita jer je ni sretan ni tužan, 57 00:03:21,000 --> 00:03:25,000 ali moramo zadovoljštinu taj problem u crveno prije one druge provjere će se izvoditi. 58 00:03:25,000 --> 00:03:27,000 >> Dopustite mi da ovo popraviti. 59 00:03:27,000 --> 00:03:30,000 Dopustite mi da smanjivanje i reprizu to, ovaj put s bmp.h također 60 00:03:30,000 --> 00:03:34,000 na naredbenog retka, Enter, a sada ako sve ide dobro, 61 00:03:34,000 --> 00:03:38,000 to će provjeriti i zatim vratiti rezultat od-zadržite dah- 62 00:03:38,000 --> 00:03:42,000 sva zelena, što znači da radim jako dobro na pset 4 do sada. 63 00:03:42,000 --> 00:03:44,000 Možete vidjeti i zaključiti iz opisnog teksta ovdje 64 00:03:44,000 --> 00:03:47,000 točno ono što je testirali smo. 65 00:03:47,000 --> 00:03:49,000 Testirali smo prvi ne datoteke postoje? 66 00:03:49,000 --> 00:03:51,000 Mi smo tada testirani radi resize.c sastaviti? 67 00:03:51,000 --> 00:03:58,000 Onda smo testirali to nije veličinu 1x1 piksela BMP kada n, veličinu faktor, je jedan. 68 00:03:58,000 --> 00:04:01,000 Sada, ako nemate pojma što je n, možete odjednom ćete zaroniti u pset 4, 69 00:04:01,000 --> 00:04:04,000 ali to jednostavno razum provjeriti kako bi bili sigurni da niste resize 70 00:04:04,000 --> 00:04:08,000 slika na sve ako promjene veličine faktor je 1. 71 00:04:08,000 --> 00:04:14,000 Ako, s druge strane, ona mijenja veličinu 1x1 piksel na 1x1 piksela BMP za 2x2 ispravno 72 00:04:14,000 --> 00:04:19,000 kada n je 2, tada je na sličan način, mina tvori skladu s tim. 73 00:04:19,000 --> 00:04:22,000 >> Ukratko, to je značilo da, jednom, poduzeti prelaze prste 74 00:04:22,000 --> 00:04:25,000 iz jednadžbe pravo prije nego što pošaljete svoje pset. 75 00:04:25,000 --> 00:04:28,000 Vi ćete znati točno što vaš TF uskoro će se znati 76 00:04:28,000 --> 00:04:30,000 kad idete o podnošenju neke od tih problema skupova, 77 00:04:30,000 --> 00:04:34,000 i pedagoški motivacija je stvarno staviti 78 00:04:34,000 --> 00:04:37,000 prilika ispred vas tako da kada znaš a priori 79 00:04:37,000 --> 00:04:39,000 da postoji bugove u kodu i ispitivanja koje se ne prenose, 80 00:04:39,000 --> 00:04:43,000 možete staviti u učinkovitijem vremena do pred riješiti te probleme 81 00:04:43,000 --> 00:04:45,000 nego izgubiti bodove, dobiti povratnu informaciju od svog TF, 82 00:04:45,000 --> 00:04:48,000 i onda ići, "ahh", kao što sam trebao shvatio da van. 83 00:04:48,000 --> 00:04:50,000 Sada barem postoji alat će vam pomoći da otkrijete da. 84 00:04:50,000 --> 00:04:52,000 To se neće ukazati gdje je bug, ali to će vam reći 85 00:04:52,000 --> 00:04:54,000 što je simptomatično to. 86 00:04:54,000 --> 00:04:57,000 >> Sada shvatili su testovi nisu nužno iscrpan. 87 00:04:57,000 --> 00:04:59,000 Samo zato što ste dobili ekran pun zelenog smješko lica 88 00:04:59,000 --> 00:05:02,000 ne znači vaš broj nije savršen, ali to ne znači 89 00:05:02,000 --> 00:05:06,000 da je prošao određene testove propisane spec.. 90 00:05:06,000 --> 00:05:08,000 Ponekad mi neće objaviti provjere. 91 00:05:08,000 --> 00:05:10,000 Na primjer, detektivski roman, jedan od aspekata pset 4, 92 00:05:10,000 --> 00:05:15,000 je vrsta razočaravajuće ako vam 93 00:05:15,000 --> 00:05:18,000 odgovor kao što je to, a tu je broj načina da se otkrivaju 94 00:05:18,000 --> 00:05:21,000 tko je osoba koja je u tom crvenom buke. 95 00:05:21,000 --> 00:05:24,000 Spektri uvijek će odrediti u budućnosti za pset 5 nadalje 96 00:05:24,000 --> 00:05:26,000 ono što provjerava postoje za vas. 97 00:05:26,000 --> 00:05:28,000 Primijetit ćete da je ovaj bijeli URL na dnu. 98 00:05:28,000 --> 00:05:30,000 Za sada, ovo je samo dijagnostički izlaz. 99 00:05:30,000 --> 00:05:33,000 Ako posjetite taj URL, dobit ćete cijelu hrpu ludih, kriptične poruke 100 00:05:33,000 --> 00:05:36,000 da ste dobrodošli gledati kroz, ali to je uglavnom za osoblje 101 00:05:36,000 --> 00:05:41,000 tako da možemo dijagnosticirati i ispravljanje bugova u check50 sama. 102 00:05:41,000 --> 00:05:46,000 >> Bez teškoća, krenimo na kojoj smo stali. 103 00:05:46,000 --> 00:05:48,000 CS50 knjižnica smo uzeli zdravo za gotovo za nekoliko tjedana, 104 00:05:48,000 --> 00:05:52,000 ali onda prošlog tjedna, počeli smo piling natrag jedan od slojeva njega. 105 00:05:52,000 --> 00:05:55,000 Počeli smo stavljajući na stranu niz u korist onoga što umjesto? 106 00:05:55,000 --> 00:05:57,000 [Studenti] Char. 107 00:05:57,000 --> 00:05:59,000 Char *, koji je bio char * sve ovo vrijeme, 108 00:05:59,000 --> 00:06:03,000 ali sada nemamo se pretvarati da je stvarna vrsta podataka string. 109 00:06:03,000 --> 00:06:06,000 Umjesto toga, to je bio sinonim sorti za char *, 110 00:06:06,000 --> 00:06:09,000 a niz je niz znakova, 111 00:06:09,000 --> 00:06:14,000 pa zašto nema smisla da predstavljaju nizove kao char * s? 112 00:06:14,000 --> 00:06:20,000 Što char * predstavljaju u kontekstu ovog koncepta niza? 113 00:06:20,000 --> 00:06:23,000 Da. >> [Studentski] Prvi znak. 114 00:06:23,000 --> 00:06:25,000 Dobar, prvi znak, ali ne sasvim prvi znak. 115 00:06:25,000 --> 00:06:27,000 To su-[Studenti] Adresa. 116 00:06:27,000 --> 00:06:29,000 Dobro, adresa prvog karaktera. 117 00:06:29,000 --> 00:06:33,000 Sve što je potrebno da predstavljaju niz u memoriju računala 118 00:06:33,000 --> 00:06:36,000 je samo jedinstvenu adresu svog prvog bajta. 119 00:06:36,000 --> 00:06:38,000 Vi čak ne morate znati koliko dugo to je 120 00:06:38,000 --> 00:06:42,000 jer kako možete shvatiti da se dinamički? 121 00:06:42,000 --> 00:06:44,000 [Studentski] Gudački dužina. 122 00:06:44,000 --> 00:06:48,000 Možete nazvati string duljine, odličan, ali kako se posao duljine niza? 123 00:06:48,000 --> 00:06:50,000 Što to učiniti? Da. 124 00:06:50,000 --> 00:06:52,000 [Studentski] Nastavite dok ne dobijete null karakter. 125 00:06:52,000 --> 00:06:54,000 Da, točno, to samo ponovi s for petlji, while petlja, 126 00:06:54,000 --> 00:06:57,000 god od * do kraja, a kraj je zastupljena 127 00:06:57,000 --> 00:07:01,000 po \ 0, tzv NUL znak, nul, 128 00:07:01,000 --> 00:07:05,000 ne treba brkati s null, koji je pokazivač, 129 00:07:05,000 --> 00:07:07,000 koji će se u razgovoru opet danas. 130 00:07:07,000 --> 00:07:11,000 >> Mi ljušteno natrag sloj GetInt, a onda mi je uzeo pogledati GetString, 131 00:07:11,000 --> 00:07:14,000 i podsjetiti da su od tih funkcija, ili stvarno, 132 00:07:14,000 --> 00:07:18,000 GetString, bio koristeći određenu funkciju 133 00:07:18,000 --> 00:07:21,000 zapravo analizirati, da se, čitati ili analizirati, korisnikov ulaz. 134 00:07:21,000 --> 00:07:25,000 A što je to nova funkcija? 135 00:07:25,000 --> 00:07:27,000 Scanf ili sscanf. To je zapravo dolazi u nekoliko različitih okusa. 136 00:07:27,000 --> 00:07:31,000 Tu je scanf, tu je sscanf, tu je fscanf. 137 00:07:31,000 --> 00:07:35,000 Za sada, međutim, ajmo se usredotočiti na ono najlakše ilustrirati, 138 00:07:35,000 --> 00:07:38,000 i pusti me naprijed i otvoriti u aparatu 139 00:07:38,000 --> 00:07:41,000 file ovako, scanf1.c. 140 00:07:41,000 --> 00:07:43,000 To je super jednostavan program, 141 00:07:43,000 --> 00:07:46,000 ali da učini nešto što nikada nismo učinili 142 00:07:46,000 --> 00:07:48,000 bez pomoć CS50 knjižnice. 143 00:07:48,000 --> 00:07:51,000 To dobiva int od korisnika. Kako se to radi? 144 00:07:51,000 --> 00:07:53,000 Pa, u skladu 16 postoji, 145 00:07:53,000 --> 00:07:56,000 primijetiti da smo proglasi int nazvan x, au ovom trenutku u priči, 146 00:07:56,000 --> 00:07:58,000 što je vrijednost x? 147 00:07:58,000 --> 00:08:00,000 [Nečujno učenik odgovor] 148 00:08:00,000 --> 00:08:02,000 [David M.] Točno, tko zna, neka vrijednost smeće potencijalno, pa je tako u 17, samo mi recite korisnika 149 00:08:02,000 --> 00:08:06,000 daj mi broj, molim vas, i korak 18 je mjesto gdje se dobiva zanimljiv. 150 00:08:06,000 --> 00:08:11,000 Scanf čini posuditi ideju s printf u da koristi ove formata kodove u navodnike. 151 00:08:11,000 --> 00:08:13,000 % D je naravno decimalni broj. 152 00:08:13,000 --> 00:08:21,000 Ali zašto sam ja prolazio & X umjesto samo x? 153 00:08:21,000 --> 00:08:24,000 Bivši je ispravan. Da. 154 00:08:24,000 --> 00:08:26,000 [Nečujno učenik odgovor] 155 00:08:26,000 --> 00:08:31,000 Točno, ako je cilj ovog programa, kao i funkcije GetInt sama, 156 00:08:31,000 --> 00:08:34,000 se dobiti int od korisnika mogu proći funkcije 157 00:08:34,000 --> 00:08:38,000 sve varijable želim, ali ako ja ih ne prođe upućivanjem 158 00:08:38,000 --> 00:08:41,000 ili adresu ili pokazivač, sve sinonim za današnje potrebe, 159 00:08:41,000 --> 00:08:46,000 zatim da funkcija nema sposobnost da promijeni sadržaj te varijable. 160 00:08:46,000 --> 00:08:49,000 To će proći u kopiji baš kao lud verziji swapa 161 00:08:49,000 --> 00:08:51,000 da smo razgovarali o nekoliko puta sada. 162 00:08:51,000 --> 00:08:54,000 >> No, umjesto toga, radeći & x, doslovno sam ja prolazi u što? 163 00:08:54,000 --> 00:08:57,000 [Studentski] adresa. >> Adresu x. 164 00:08:57,000 --> 00:09:01,000 To je kao crtež kartu za funkciju zove scanf i ovdje govori, 165 00:09:01,000 --> 00:09:04,000 to su pravci na komad memorije u računalu 166 00:09:04,000 --> 00:09:07,000 da možete ići spremiti neke cijeli u. 167 00:09:07,000 --> 00:09:10,000 Da bi sscanf sada to učiniti 168 00:09:10,000 --> 00:09:13,000 što operater, ono komad sintakse će to morati koristiti 169 00:09:13,000 --> 00:09:19,000 iako ne možemo ga vidjeti jer je netko napisao tu funkciju? 170 00:09:19,000 --> 00:09:21,000 Drugim riječima - što je to? 171 00:09:21,000 --> 00:09:23,000 [Studentski] X pročitati. 172 00:09:23,000 --> 00:09:27,000 Tu će biti nekih čitanje, ali samo s obzirom na x ovdje. 173 00:09:27,000 --> 00:09:30,000 Ako scanf se prošli adresu x, 174 00:09:30,000 --> 00:09:35,000 sintaktički, što operater je dužan da postoji negdje 175 00:09:35,000 --> 00:09:38,000 unutar scanf provedbi tako da scanf 176 00:09:38,000 --> 00:09:42,000 zapravo može napisati broj dva na tu adresu? 177 00:09:42,000 --> 00:09:44,000 Da, tako *. 178 00:09:44,000 --> 00:09:47,000 Sjetite se da je naš * dereference operater, koji u suštini znači ići tamo. 179 00:09:47,000 --> 00:09:50,000 >> Nakon što ste se predao adresu, kao što je to ovdje slučaj, 180 00:09:50,000 --> 00:09:53,000 scanf je vjerojatno, ako smo zapravo gledao oko svoje izvornog koda- 181 00:09:53,000 --> 00:09:59,000 radi * x ili njegov ekvivalent zapravo ide na tu adresu i staviti neku vrijednost tamo. 182 00:09:59,000 --> 00:10:02,000 Sada, kao i za koliko scanf dobiva ulaz na tipkovnici, 183 00:10:02,000 --> 00:10:04,000 ćemo mahati naše ruke za danas. 184 00:10:04,000 --> 00:10:07,000 Samo pretpostaviti da operativni sustav omogućuje sscanf razgovarati 185 00:10:07,000 --> 00:10:11,000 na korisnikov tipkovnici, ali u ovom trenutku je sada u skladu 19, 186 00:10:11,000 --> 00:10:14,000 kada smo jednostavno isprintati x, čini se da je slučaj 187 00:10:14,000 --> 00:10:17,000 da scanf je staviti int u x. 188 00:10:17,000 --> 00:10:19,000 To je točno kako scanf radi, a podsjetimo prošlog tjedna 189 00:10:19,000 --> 00:10:25,000 da je točno kako GetString i GetInt i njegova druga obitelj funkcija 190 00:10:25,000 --> 00:10:28,000 u konačnici radi, iako s blagim varijance poput sscanf, 191 00:10:28,000 --> 00:10:31,000 što znači skeniranje niz umjesto tipkovnice. 192 00:10:31,000 --> 00:10:33,000 Ali ajmo pogledati malo varijance to. 193 00:10:33,000 --> 00:10:37,000 U scanf2, zapravo sam zeznuo. 194 00:10:37,000 --> 00:10:42,000 Što je krivo, a ja ću sakriti komentar koji objašnjava koliko- 195 00:10:42,000 --> 00:10:47,000 što je krivo s ovim programom, verzija 2? 196 00:10:47,000 --> 00:10:55,000 Budite kao tehnički moguće ovom trenutku. 197 00:10:55,000 --> 00:10:57,000 To izgleda prilično dobro. 198 00:10:57,000 --> 00:11:03,000 To je lijepo razvedena, ali- 199 00:11:03,000 --> 00:11:07,000 ok, o tome kako ćemo ga orezati do kraćih pitanja? 200 00:11:07,000 --> 00:11:17,000 Linija 16. Što je linija 16 radi u preciznom, ali tehnički engleski? 201 00:11:17,000 --> 00:11:20,000 Dobivanje malo nespretan. Da, Michael. 202 00:11:20,000 --> 00:11:25,000 [Studentski] To ukazuje na prvom slovu nizu. 203 00:11:25,000 --> 00:11:27,000 >> Ok, u neposrednoj blizini. Dopustite mi da uštinuti malo. 204 00:11:27,000 --> 00:11:33,000 Ukazujući na prvom slovu nizu, ti si deklariranje varijable zove tampon 205 00:11:33,000 --> 00:11:36,000 koji će ukazati na prvom adresu niza, 206 00:11:36,000 --> 00:11:39,000 odnosno, da će ukazati točnije na char. 207 00:11:39,000 --> 00:11:42,000 Obavijest to nije zapravo pokazuje nigdje jer ne postoji operator pridruživanja. 208 00:11:42,000 --> 00:11:46,000 Nema znak jednakosti, tako da sve radimo je dodjeljivanje varijable tzv tampon. 209 00:11:46,000 --> 00:11:49,000 To se događa da se 32 bita jer je pokazivač, 210 00:11:49,000 --> 00:11:52,000 i sadržaj međuspremnika vjerojatno na kraju 211 00:11:52,000 --> 00:11:57,000 će sadržavati adresu char, ali za sada, što ne sadrže tampon? 212 00:11:57,000 --> 00:11:59,000 Samo neki lažan, tko zna, neko smeće vrijednost, 213 00:11:59,000 --> 00:12:03,000 jer nismo izričito inicijaliziran, tako da mi ne bi trebali pretpostavljati ništa. 214 00:12:03,000 --> 00:12:06,000 Ok, tako da sada linija 17 se-što ne crta 17 učiniti? 215 00:12:06,000 --> 00:12:08,000 Možda da će zagrijati ovo gore. 216 00:12:08,000 --> 00:12:10,000 Ona ispisuje niz, zar ne? 217 00:12:10,000 --> 00:12:12,000 Ona ispisuje Gudački molim. 218 00:12:12,000 --> 00:12:15,000 >> Linija 18 je vrsta poznata sada u koje smo upravo vidjeli varijancu ove 219 00:12:15,000 --> 00:12:18,000 ali s drukčijim kodom formatiranja, pa je u skladu 18, 220 00:12:18,000 --> 00:12:23,000 mi govori scanf ovdje je adresa komad memorije. 221 00:12:23,000 --> 00:12:27,000 Želim da zvoni u nizu, kao implicira% s, 222 00:12:27,000 --> 00:12:32,000 ali problem je u tome što nismo učinili par stvari ovdje. 223 00:12:32,000 --> 00:12:35,000 Što je jedan od problema? 224 00:12:35,000 --> 00:12:38,000 [Studentski] To pokušava dereference null pokazivač. 225 00:12:38,000 --> 00:12:41,000 Dobro, null ili samo drugačije nepoznato pokazivače. 226 00:12:41,000 --> 00:12:45,000 Vi ste predaje scanf adresu, ali samo rekao maloprije 227 00:12:45,000 --> 00:12:49,000 da je adresa je neko smeće vrijednost jer nismo zapravo je dodijeliti ništa, 228 00:12:49,000 --> 00:12:53,000 i tako si govorio scanf učinkovito ići staviti string ovdje, 229 00:12:53,000 --> 00:12:56,000 ali ne znamo gdje je ovdje ipak je, 230 00:12:56,000 --> 00:12:59,000 pa nismo zapravo dodjeljuje memoriju za tampon. 231 00:12:59,000 --> 00:13:03,000 Štoviše, što su također ni reći scanf? 232 00:13:03,000 --> 00:13:06,000 Pretpostavimo da je to komad memorije, a to nije bilo smeća vrijednost, 233 00:13:06,000 --> 00:13:09,000 ali još uvijek ne govori scanf nešto važno. 234 00:13:09,000 --> 00:13:12,000 [Studentski] Gdje je to zapravo, znak za struju. 235 00:13:12,000 --> 00:13:15,000 Ampersand, tako da u ovom slučaju, to je u redu. 236 00:13:15,000 --> 00:13:18,000 Zbog tampon već je proglašen kao pokazivač 237 00:13:18,000 --> 00:13:22,000 s * komad sintakse, ne trebamo koristiti ampersand 238 00:13:22,000 --> 00:13:25,000 jer to je već adresa, ali mislim da sam ga čuo ovdje. 239 00:13:25,000 --> 00:13:27,000 [Studentski] Koliki je to? 240 00:13:27,000 --> 00:13:29,000 Dobro, nećemo reći scanf koliko je velika ta tampon je, 241 00:13:29,000 --> 00:13:32,000 što znači da čak i ako su tampon pokazivač, 242 00:13:32,000 --> 00:13:35,000 Mi tvrdimo scanf, staviti string ovdje, 243 00:13:35,000 --> 00:13:38,000 ali ovdje bi mogao biti dva bajta, to bi mogao biti 10 bajtova, to bi mogao biti megabajta. 244 00:13:38,000 --> 00:13:41,000 Scanf nema pojma, i jer je to komad memorije 245 00:13:41,000 --> 00:13:43,000 vjerojatno, to nije niz gostiju. 246 00:13:43,000 --> 00:13:48,000 To je samo niz jednom pišete znakove i \ 0 do tog komad memorije. 247 00:13:48,000 --> 00:13:51,000 Sada je samo neki komad memorije. 248 00:13:51,000 --> 00:13:55,000 Scanf neće znati kada prestati pisati na tu adresu. 249 00:13:55,000 --> 00:13:59,000 >> Ako podsjetiti na neke primjere u prošlosti, gdje sam slučajno upisali na tipkovnici 250 00:13:59,000 --> 00:14:03,000 pokušava prelijevati tampon, a razgovarali smo u petak oko upravo to. 251 00:14:03,000 --> 00:14:07,000 Ako protivnik nekako ubrizgava u svoj program puno veću riječ 252 00:14:07,000 --> 00:14:10,000 ili rečenica ili fraza onda su očekivali možete prekoračenje 253 00:14:10,000 --> 00:14:13,000 komad memorije, što može imati loše posljedice, 254 00:14:13,000 --> 00:14:15,000 kao što je uzimanje tijekom cijelog samog programa. 255 00:14:15,000 --> 00:14:17,000 Moramo to popraviti nekako. 256 00:14:17,000 --> 00:14:20,000 Dopustite mi da smanjivanje i ići u verziji 3 ovog programa. 257 00:14:20,000 --> 00:14:22,000 To je malo bolje. 258 00:14:22,000 --> 00:14:24,000 U ovoj verziji, primijetiti razliku. 259 00:14:24,000 --> 00:14:27,000 U skladu 16, ja opet sam deklariranje varijable zove tampon, 260 00:14:27,000 --> 00:14:29,000 ali ono što je sada? 261 00:14:29,000 --> 00:14:33,000 To je niz od 16 znakova. 262 00:14:33,000 --> 00:14:36,000 To je dobro, jer to znači da ja sada mogu reći scanf 263 00:14:36,000 --> 00:14:39,000 ovdje je stvarni komad memorije. 264 00:14:39,000 --> 00:14:42,000 Gotovo da možete misliti polja kao pokazivače sada, 265 00:14:42,000 --> 00:14:44,000 iako oni zapravo ne odgovara. 266 00:14:44,000 --> 00:14:47,000 Oni će se ponašati različito u različitim kontekstima. 267 00:14:47,000 --> 00:14:50,000 No, to je svakako slučaj da se pufer pozivom 268 00:14:50,000 --> 00:14:53,000 16 susjedni znakovi, jer to je ono što je niz 269 00:14:53,000 --> 00:14:55,000 te je za nekoliko tjedana sada. 270 00:14:55,000 --> 00:14:59,000 >> Evo, ja govorim scanf evo komad memorije. 271 00:14:59,000 --> 00:15:01,000 Ovaj put, to je zapravo komad memorije, 272 00:15:01,000 --> 00:15:07,000 ali zašto je ovaj program još uvijek iskoristiv? 273 00:15:07,000 --> 00:15:11,000 Što je krivo dalje? 274 00:15:11,000 --> 00:15:14,000 Ja sam rekao, dajte mi 16 bajtova, ali- 275 00:15:14,000 --> 00:15:16,000 [Studentski] Što ako se upisati u više od 16? 276 00:15:16,000 --> 00:15:20,000 Točno, što ako korisnik upiše u 17 znakova ili 1700 znakova? 277 00:15:20,000 --> 00:15:23,000 U stvari, neka je vidjeti ako ne možemo spotaknuti ovu pogrešku sada. 278 00:15:23,000 --> 00:15:25,000 To je bolje, ali ne i savršena. 279 00:15:25,000 --> 00:15:28,000 Pusti me naprijed i pokrenuti napraviti scanf3 sastaviti ovaj program. 280 00:15:28,000 --> 00:15:34,000 Dopustite mi pokrenuti scanf3, Gudački molim: Pozdrav, i mi se čini da biti u redu. 281 00:15:34,000 --> 00:15:37,000 Dopustite mi da pokušam nešto duža jedan, Hello there. 282 00:15:37,000 --> 00:15:42,000 Ok, ajmo halo ne postoji kako ste danas, Enter. 283 00:15:42,000 --> 00:15:54,000 Dobivanje vrste sretan ovdje, recimo Hello there kako ste. 284 00:15:54,000 --> 00:15:56,000 Dovraga. 285 00:15:56,000 --> 00:16:03,000 Ok, tako da smo se posrećilo. Hajdemo vidjeti ako ne možemo popraviti. 286 00:16:03,000 --> 00:16:06,000 Ne, to neće pustiti mene kopirati. 287 00:16:06,000 --> 00:16:09,000 Pokušajmo ovo ponovno. 288 00:16:09,000 --> 00:16:12,000 U redu, stand by. 289 00:16:12,000 --> 00:16:20,000 Vidjet ćemo koliko dugo mogu pretvarati da se usredotoče dok je još to. 290 00:16:20,000 --> 00:16:23,000 Dovraga. To je prilično prikladno, zapravo. 291 00:16:23,000 --> 00:16:26,000 Tu ćemo ići. 292 00:16:26,000 --> 00:16:30,000 Točka napravio. 293 00:16:30,000 --> 00:16:34,000 >> To je, neugodno iako to također, to je također jedan od izvora velike konfuzije 294 00:16:34,000 --> 00:16:38,000 prilikom pisanja programa koji imaju bugove, jer oni se manifestiraju 295 00:16:38,000 --> 00:16:40,000 samo jednom u neko vrijeme ponekad. 296 00:16:40,000 --> 00:16:43,000 Realnost je da čak i ako je vaš broj je potpuno razbijen, 297 00:16:43,000 --> 00:16:46,000 to samo može biti potpuno slomljena jednom u neko vrijeme 298 00:16:46,000 --> 00:16:49,000 jer ponekad, bitno ono što se događa je operativni sustav dodijeli 299 00:16:49,000 --> 00:16:52,000 malo više memorije nego što je zapravo potrebno za bilo kojeg razloga, 300 00:16:52,000 --> 00:16:57,000 i tako nitko drugi ne koristi memoriju odmah nakon komad 16 znakova, 301 00:16:57,000 --> 00:17:01,000 tako da ako idete na 17, 18, 19, god, to nije tako velika stvar. 302 00:17:01,000 --> 00:17:04,000 Sada, računalo, čak i ako to ne srušiti u tom trenutku, 303 00:17:04,000 --> 00:17:09,000 Možda eventualno koristiti byte broj 17 ili 18 ili 19 za nešto drugo, 304 00:17:09,000 --> 00:17:14,000 na kojima ističu svoje podatke koje ste stavili tamo, iako pretjerano dugo, 305 00:17:14,000 --> 00:17:18,000 će dobiti prebrisana potencijalno nekom drugom funkcijom. 306 00:17:18,000 --> 00:17:21,000 To nije nužno će ostati netaknut, 307 00:17:21,000 --> 00:17:23,000 ali to ne mora nužno će izazvati SEG kvar. 308 00:17:23,000 --> 00:17:26,000 No, u ovom slučaju, napokon sam pod uvjetom dovoljno znakova 309 00:17:26,000 --> 00:17:29,000 da sam u suštini premašila moj segment memorije, i bam, 310 00:17:29,000 --> 00:17:33,000 operativni sustav je rekao, "Žao mi je, to nije dobro, segmentacija krivnja." 311 00:17:33,000 --> 00:17:38,000 >> I neka je vidjeti ako sada ono što ostaje ovdje u mom imeniku- 312 00:17:38,000 --> 00:17:40,000 primijetiti da imam ovu sliku ovdje, jezgru. 313 00:17:40,000 --> 00:17:42,000 Primijetit ćete da je ovo opet se zove temeljni deponij. 314 00:17:42,000 --> 00:17:46,000 To je u osnovi datoteka koja sadrži sadržaj svog programa u memoriju 315 00:17:46,000 --> 00:17:48,000 na mjestu na kojem se srušio, 316 00:17:48,000 --> 00:17:51,000 i samo pokušati malo primjer ovdje me pusti unutra 317 00:17:51,000 --> 00:17:57,000 i pokrenuti gdb na scanf3 a zatim odredite trećine argument zove jezgra, 318 00:17:57,000 --> 00:18:01,000 i primijetiti da se ovdje, ako sam popis kôd, 319 00:18:01,000 --> 00:18:06,000 moći ćemo kao i obično sa gdb za početak hodanja kroz ovaj program, 320 00:18:06,000 --> 00:18:10,000 i ja mogu ga pokrenuti i čim sam pogodio-kao s korak zapovjedništvom u gdb- 321 00:18:10,000 --> 00:18:13,000 čim sam pogodio potencijalno lud liniju nakon upišete u veliki niz, 322 00:18:13,000 --> 00:18:16,000 Ja ću biti u mogućnosti da se zapravo to prepoznati ovdje. 323 00:18:16,000 --> 00:18:19,000 Više o tome, međutim, u dijelu u smislu temeljnih deponija 324 00:18:19,000 --> 00:18:22,000 i sviđa, tako da možete zapravo džaku okolo unutar jezgre deponij 325 00:18:22,000 --> 00:18:27,000 i vidjeti na što linija program vam nije uspjelo. 326 00:18:27,000 --> 00:18:32,000 Sva pitanja onda na pokazivače i na adrese? 327 00:18:32,000 --> 00:18:36,000 Budući da je danas na, idemo početi uzimati zdravo za gotovo da se takve stvari postoje 328 00:18:36,000 --> 00:18:40,000 i točno znamo što su oni. 329 00:18:40,000 --> 00:18:42,000 Da. 330 00:18:42,000 --> 00:18:46,000 >> [Studentski] Kako doći nisi morati staviti ampersand pored dijela- 331 00:18:46,000 --> 00:18:48,000 Dobro pitanje. 332 00:18:48,000 --> 00:18:51,000 Kako doći Nisam morati staviti ampersand pored znaka niz kao što sam učinio prije 333 00:18:51,000 --> 00:18:53,000 s većinom naših primjera? 334 00:18:53,000 --> 00:18:55,000 Kratak odgovor je nizovi su malo posebna. 335 00:18:55,000 --> 00:18:59,000 Gotovo da možete misliti tampon kao zapravo se adresa, 336 00:18:59,000 --> 00:19:03,000 i to samo tako dogodi da se slučaj da uglata zagrada zapis 337 00:19:03,000 --> 00:19:06,000 je praktičnost, tako da možemo ići u konzolu 0, noseći 1, 338 00:19:06,000 --> 00:19:10,000 Nosač 2, bez potrebe za korištenje * zapis. 339 00:19:10,000 --> 00:19:13,000 To je malo bijelog laži, jer nizovi i pokazivače 340 00:19:13,000 --> 00:19:17,000 su, u stvari, malo drugačiji, ali oni mogu često, ali ne uvijek se koriste naizmjenično. 341 00:19:17,000 --> 00:19:21,000 Ukratko, kada funkcija očekuje pokazivač na komad memorije, 342 00:19:21,000 --> 00:19:24,000 možete ili proći ga adresu koja je vratio malloc, 343 00:19:24,000 --> 00:19:29,000 pa ćemo vidjeti malloc opet prije dugo, ili možete proći mu ime niza. 344 00:19:29,000 --> 00:19:32,000 Vi ne morate učiniti ampersand s polja jer su već 345 00:19:32,000 --> 00:19:34,000 bitno mi adrese. 346 00:19:34,000 --> 00:19:36,000 To je jedna iznimka. 347 00:19:36,000 --> 00:19:39,000 Uglatih zagrada bi ih posebno. 348 00:19:39,000 --> 00:19:41,000 >> Možete li staviti ampersand uz tampon? 349 00:19:41,000 --> 00:19:43,000 Ne u ovom slučaju. 350 00:19:43,000 --> 00:19:46,000 To neće raditi jer, opet, ove kutak slučaju 351 00:19:46,000 --> 00:19:49,000 gdje nizovi nisu sasvim zapravo adrese. 352 00:19:49,000 --> 00:19:54,000 Ali mi možda ću se vratiti na to prije dugo s drugim primjerima. 353 00:19:54,000 --> 00:19:56,000 Idemo pokušati riješiti problem ovdje. 354 00:19:56,000 --> 00:20:00,000 Imamo strukturu podataka koje smo koristeći za neko vrijeme poznat kao polje. 355 00:20:00,000 --> 00:20:02,000 Slučaj u točki, to je ono što smo upravo imali. 356 00:20:02,000 --> 00:20:04,000 Ali polja imaju neke odlika i nedostataka. 357 00:20:04,000 --> 00:20:06,000 Nizovi su lijepe zašto? 358 00:20:06,000 --> 00:20:11,000 Što je jedna stvar koja vam se sviđa, u mjeri u kojoj vam se sviđa polja-o nizovima? 359 00:20:11,000 --> 00:20:13,000 Što je povoljno o njima? Što je uvjerljiv? 360 00:20:13,000 --> 00:20:18,000 Zašto smo ih predstaviti na prvom mjestu? 361 00:20:18,000 --> 00:20:20,000 Da. 362 00:20:20,000 --> 00:20:27,000 [Studentski] Oni mogu pohraniti mnogo podataka, a da ne morate koristiti cijelu stvar. 363 00:20:27,000 --> 00:20:29,000 Možete koristiti sekciju. 364 00:20:29,000 --> 00:20:32,000 Dobro, s nizom možete pohraniti mnogo podataka, 365 00:20:32,000 --> 00:20:35,000 i ne moraju nužno koristiti sve to, tako da možete overallocate, 366 00:20:35,000 --> 00:20:39,000 što bi moglo biti praktično ako ne znate unaprijed koliko nešto očekivati. 367 00:20:39,000 --> 00:20:41,000 >> GetString je savršen primjer. 368 00:20:41,000 --> 00:20:44,000 GetString, napisao nas, nema pojma koliko znakova za očekivati, 369 00:20:44,000 --> 00:20:48,000 tako je činjenica da možemo izdvojiti komade memorijskog je dobro. 370 00:20:48,000 --> 00:20:51,000 Nizovi i riješiti problem što smo vidjeli prije par tjedana sada 371 00:20:51,000 --> 00:20:54,000 gdje je vaš broj počinje prenijeti u nešto vrlo loše dizajniran. 372 00:20:54,000 --> 00:20:57,000 Sjetite se da sam stvorio studentski strukturu zove David, 373 00:20:57,000 --> 00:21:00,000 a zatim da je zapravo alternativa, iako, 374 00:21:00,000 --> 00:21:04,000 da imaju promjenjivu zove ime i drugu varijablu zove, mislim, kuća, 375 00:21:04,000 --> 00:21:08,000 i još jedna varijabla zove ID, jer je u toj priči onda sam htio uvesti nešto drugo 376 00:21:08,000 --> 00:21:11,000 sviđa Rob u program, pa onda sam odlučio pričekati minutu, 377 00:21:11,000 --> 00:21:13,000 Moram preimenovati te varijable. 378 00:21:13,000 --> 00:21:16,000 Nazovimo minu NAME1, ID1, house1. 379 00:21:16,000 --> 00:21:20,000 Nazovimo Rob je NAME2, house2, ID2. 380 00:21:20,000 --> 00:21:22,000 Ali onda čekaj malo, što je Tommy? 381 00:21:22,000 --> 00:21:24,000 Tada smo imali još tri varijable. 382 00:21:24,000 --> 00:21:27,000 Uveli smo netko drugi, četiri seta varijabli. 383 00:21:27,000 --> 00:21:30,000 Svijet se počeo neuredan vrlo brzo, 384 00:21:30,000 --> 00:21:33,000 tako da smo uveli tvorevina, a ono što je uvjerljiv o struct? 385 00:21:33,000 --> 00:21:39,000 Što znači C struct neka vam je činiti? 386 00:21:39,000 --> 00:21:42,000 To je stvarno neugodno danas. 387 00:21:42,000 --> 00:21:44,000 Što? >> [Nečujno učenik odgovor] 388 00:21:44,000 --> 00:21:47,000 Da, posebno, typedef vam omogućuje da stvorite novu vrstu podataka, 389 00:21:47,000 --> 00:21:51,000 i rekonstruirati struct ključna riječ, omogućuje vam da zatvoriti u kućište 390 00:21:51,000 --> 00:21:54,000 koncepcijski vezane komada podataka zajedno 391 00:21:54,000 --> 00:21:56,000 , a nakon toga ih nazvati nešto kao student. 392 00:21:56,000 --> 00:21:58,000 >> To je dobro, jer sada možemo modelirati 393 00:21:58,000 --> 00:22:03,000 mnogo vrsta koncepcijski dosljedno pojam student u varijablu 394 00:22:03,000 --> 00:22:07,000 nego proizvoljno ima jedna za nizu, jedan za ID, i tako dalje. 395 00:22:07,000 --> 00:22:10,000 Nizovi su lijepe jer su nam omogućiti početak čišćenja naš kod. 396 00:22:10,000 --> 00:22:13,000 No, ono što je minus od sada niz? 397 00:22:13,000 --> 00:22:15,000 Što možete učiniti ne? Da. 398 00:22:15,000 --> 00:22:17,000 [Studentski] Morate znati koliko je velika. 399 00:22:17,000 --> 00:22:19,000 Morate znati koliko je velika, tako da je vrsta boli. 400 00:22:19,000 --> 00:22:21,000 Oni od vas s prethodnom programskom iskustva znam da u puno jezika, 401 00:22:21,000 --> 00:22:24,000 poput Jave, možete pitati komad memorije, posebno polje, 402 00:22:24,000 --> 00:22:28,000 koliki su vam, s dužinom, nekretnina, tako da se govori, a to je stvarno zgodan. 403 00:22:28,000 --> 00:22:32,000 U C, ne možete ni nazvati strlen na generičke niz 404 00:22:32,000 --> 00:22:35,000 jer strlen, kao riječ implicira, je samo za gudače, 405 00:22:35,000 --> 00:22:39,000 i možete shvatiti duljinu niza zbog ovog ljudskog konvencije 406 00:22:39,000 --> 00:22:43,000 posjedovanja \ 0, ali lepezu, više općenito, je samo komad memorije. 407 00:22:43,000 --> 00:22:46,000 Ako je niz Ints, tamo neće biti neki poseban lik 408 00:22:46,000 --> 00:22:48,000 na kraju vas čeka. 409 00:22:48,000 --> 00:22:50,000 Morate zapamtiti duljinu niza. 410 00:22:50,000 --> 00:22:54,000 Drugi downside niz uzgajaju svoju glavu u sebe GetString. 411 00:22:54,000 --> 00:22:59,000 Što je još jedan downside niz? 412 00:22:59,000 --> 00:23:01,000 Gospodine, samo ti i ja danas. 413 00:23:01,000 --> 00:23:04,000 [Nečujno učenik odgovor] >> To je ono što? 414 00:23:04,000 --> 00:23:06,000 To je izjavio na stog. 415 00:23:06,000 --> 00:23:09,000 Ok, izjavio je na stogu. Zašto ne sviđa? 416 00:23:09,000 --> 00:23:13,000 [Studentski] Zato što dobiva ponovno. 417 00:23:13,000 --> 00:23:15,000 Ona dobiva ponovno. 418 00:23:15,000 --> 00:23:18,000 Ok, ako koristite niz alocirati memoriju, 419 00:23:18,000 --> 00:23:21,000 ne možete, na primjer, da ga vratite, jer je na stogu. 420 00:23:21,000 --> 00:23:23,000 Ok, to je nedostatak. 421 00:23:23,000 --> 00:23:25,000 A o tome kako jedna druga s nizom? 422 00:23:25,000 --> 00:23:28,000 Nakon što ga izdvojiti, ti si vrsta pijan ako trebate više prostora 423 00:23:28,000 --> 00:23:30,000 nego da ima niz. 424 00:23:30,000 --> 00:23:34,000 >> Zatim smo uveli, podsjetimo, malloc, koji nam je dao mogućnost da dinamički alocirati memoriju. 425 00:23:34,000 --> 00:23:37,000 No, što ako smo pokušali drugačiji svijet uopce? 426 00:23:37,000 --> 00:23:40,000 Što ako smo htjeli riješiti nekoliko tih problema 427 00:23:40,000 --> 00:23:45,000 pa smo umjesto-moja olovka je zaspao ovdje- 428 00:23:45,000 --> 00:23:51,000 što ako smo umjesto htjeli biti stvoriti svijet koji je više ovako? 429 00:23:51,000 --> 00:23:56,000 To je niz, i, naravno, ova vrsta pogoršava kad smo udarili kraj niza, 430 00:23:56,000 --> 00:24:00,000 i ja sada više nemaju prostora za još cijeli ili drugog karaktera. 431 00:24:00,000 --> 00:24:03,000 Što ako smo vrsta preventivno reći dobro, zašto ne bismo opustiti 432 00:24:03,000 --> 00:24:07,000 ovaj uvjet da su svi ti komadi memorije biti neprekinut natrag na leđa, 433 00:24:07,000 --> 00:24:10,000 i zašto ne, kad trebam int ili char, 434 00:24:10,000 --> 00:24:12,000 daj mi prostor za jednu od njih? 435 00:24:12,000 --> 00:24:14,000 A kad trebam drugi, dajte mi još jedan prostor, 436 00:24:14,000 --> 00:24:16,000 i kad trebam drugi, dajte mi još jedan prostor. 437 00:24:16,000 --> 00:24:19,000 Prednost koja je sada da ako netko drugi 438 00:24:19,000 --> 00:24:21,000 uzima memoriju ovamo, nije velika stvar. 439 00:24:21,000 --> 00:24:25,000 Ja ću uzeti ovaj dodatni komad memorije ovdje i onda ovaj jedan. 440 00:24:25,000 --> 00:24:28,000 >> Sada, samo kvaka je u tome što je ovo gotovo osjeća kao da imam 441 00:24:28,000 --> 00:24:30,000 cijela hrpa različitih varijabli. 442 00:24:30,000 --> 00:24:33,000 To se osjeća kao pet različitih varijabli potencijalno. 443 00:24:33,000 --> 00:24:36,000 No, što ako mi ukrade ideju od žice 444 00:24:36,000 --> 00:24:41,000 pri čemu smo nekako povezati ove stvari zajedno konceptualno, a što ako sam to učinio? 445 00:24:41,000 --> 00:24:44,000 Ovo je moj jako slabo nacrtana strelica. 446 00:24:44,000 --> 00:24:46,000 Ali pretpostavimo da je svaki od tih komade memorije 447 00:24:46,000 --> 00:24:52,000 ukazao na drugu, a ovaj momak, koji nema sestru na svojoj desnoj strani, 448 00:24:52,000 --> 00:24:54,000 nema takve strelicu. 449 00:24:54,000 --> 00:24:56,000 To je u stvari ono što se zove linked list. 450 00:24:56,000 --> 00:25:00,000 Ovo je nova struktura podataka koji nam omogućava da dodijeli komad memorije, 451 00:25:00,000 --> 00:25:03,000 zatim još jedan, pa još jedan, pa još jedan, u bilo koje vrijeme želimo 452 00:25:03,000 --> 00:25:07,000 tijekom programa, a mi ne zaboravite da su svi nekako povezano 453 00:25:07,000 --> 00:25:11,000 doslovno ulančavanje ih zajedno, a mi to učinio slikovito ovdje sa strelicom. 454 00:25:11,000 --> 00:25:15,000 No, u kodu, što će biti mehanizam putem kojeg nekako mogao spojiti, 455 00:25:15,000 --> 00:25:20,000 gotovo kao Scratch, jedan komad na drugi komad? 456 00:25:20,000 --> 00:25:22,000 Mogli bismo koristiti pokazivač, zar ne? 457 00:25:22,000 --> 00:25:25,000 Jer stvarno strelica koja ide od gornjeg lijevog kvadrata, 458 00:25:25,000 --> 00:25:31,000 ovaj tip ovdje na ovaj jedan, mogao sadržavati unutar ovog trga 459 00:25:31,000 --> 00:25:34,000 ne samo neke Ints, a ne samo neke char, ali što ako sam zapravo dodijeljena 460 00:25:34,000 --> 00:25:37,000 malo dodatni prostor, tako da sada, 461 00:25:37,000 --> 00:25:41,000 svaki od mojih komade memorije, iako će to trošak mene, 462 00:25:41,000 --> 00:25:45,000 sada izgleda malo više pravokutnog gdje je jedan od komade memorije 463 00:25:45,000 --> 00:25:47,000 koristi se za broj, kao i broj 1, 464 00:25:47,000 --> 00:25:50,000 i onda ako taj tip pohranjuje broj 2, 465 00:25:50,000 --> 00:25:52,000 ovaj drugi blok memorije se koristi za strelice, 466 00:25:52,000 --> 00:25:54,000 ili konkretnije, pokazivač. 467 00:25:54,000 --> 00:25:59,000 I pretpostavljam da pohraniti broj 3 ovamo dok sam koristiti ovaj ukazati na tog momka, 468 00:25:59,000 --> 00:26:02,000 i sad taj tip, pretpostavimo samo želim tri takve komade memorije. 469 00:26:02,000 --> 00:26:05,000 Ja ću povući crtu preko toga, što ukazuje null. 470 00:26:05,000 --> 00:26:07,000 Nema dodatnih znakova. 471 00:26:07,000 --> 00:26:10,000 >> Doista, to je način kako možemo ići o provedbi 472 00:26:10,000 --> 00:26:12,000 nešto što se zove linked list. 473 00:26:12,000 --> 00:26:18,000 Povezani popis je nova struktura podataka, a to je odskočna daska prema 474 00:26:18,000 --> 00:26:21,000 puno luksuznijih strukture podataka koje počinju za rješavanje problema 475 00:26:21,000 --> 00:26:23,000 na tragu Facebook-tipa problema i Google tipa problema 476 00:26:23,000 --> 00:26:26,000 gdje imate ogromne skupove podataka, i to više ne reže 477 00:26:26,000 --> 00:26:29,000 pohraniti sve contiguously i koristiti nešto poput linearnog pretraživanja 478 00:26:29,000 --> 00:26:31,000 ili čak nešto poput binarnog pretraživanja. 479 00:26:31,000 --> 00:26:33,000 Želite još bolje izvodi puta. 480 00:26:33,000 --> 00:26:37,000 U stvari, jedan od svetih gralova ćemo razgovarati o kasnije ovaj tjedan ili sljedeći 481 00:26:37,000 --> 00:26:41,000 je algoritam čije trajanje je konstanta. 482 00:26:41,000 --> 00:26:44,000 Drugim riječima, ona uvijek ima istu količinu vremena bez obzira na 483 00:26:44,000 --> 00:26:47,000 koliki je ulaz, a da bi doista biti uvjerljiv, 484 00:26:47,000 --> 00:26:49,000 čak i više nego nešto logaritamske. 485 00:26:49,000 --> 00:26:51,000 Što je to na zaslonu ovdje? 486 00:26:51,000 --> 00:26:55,000 Svaka od pravokutnika je točno ono što sam nacrtao rukom. 487 00:26:55,000 --> 00:26:59,000 Ali stvar skroz na lijevoj strani je posebna varijabla. 488 00:26:59,000 --> 00:27:02,000 To će biti jedan pokazivač jer jedan Gotcha 489 00:27:02,000 --> 00:27:04,000 s povezanog popisa, kao što su ove stvari zove, 490 00:27:04,000 --> 00:27:09,000 je da morate objesiti na jednom kraju povezana popisa. 491 00:27:09,000 --> 00:27:13,000 >> Baš kao i kod niza, morate znati adresu prvog char. 492 00:27:13,000 --> 00:27:15,000 Sve posao za povezane liste. 493 00:27:15,000 --> 00:27:19,000 Morate znati adresu prvog komad memorije 494 00:27:19,000 --> 00:27:25,000 jer od tamo, možete doći svaki drugi jedan. 495 00:27:25,000 --> 00:27:27,000 Downside. 496 00:27:27,000 --> 00:27:30,000 Što cijena plaćamo za tu svestranost ima dinamički 497 00:27:30,000 --> 00:27:34,000 poveliki struktura podataka da ako mi zatreba više memorije, fino, 498 00:27:34,000 --> 00:27:37,000 samo izdvojiti još jedan komad i izvući pokazivač iz 499 00:27:37,000 --> 00:27:39,000 starog na novi rep popisu? 500 00:27:39,000 --> 00:27:41,000 Da. 501 00:27:41,000 --> 00:27:43,000 [Studentski] To traje oko dva puta onoliko prostora. 502 00:27:43,000 --> 00:27:45,000 To traje duplo puno prostora, tako da je definitivno mana, a vidjeli smo to 503 00:27:45,000 --> 00:27:48,000 tradeoff prije između vremena i prostora i fleksibilnosti 504 00:27:48,000 --> 00:27:51,000 gdje je do sada, ne trebamo 32 bita za svaki od tih brojeva. 505 00:27:51,000 --> 00:27:57,000 Mi stvarno trebamo 64, 32 za broj i 32 za pointer. 506 00:27:57,000 --> 00:27:59,000 Ali hej, ja imam dva gigabajta RAM-a. 507 00:27:59,000 --> 00:28:02,000 Dodavanje još 32 bita ovdje i ovdje se ne čini da je velika stvar. 508 00:28:02,000 --> 00:28:05,000 No, za velike skupove podataka, to je definitivno dodaje do doslovno duplo više. 509 00:28:05,000 --> 00:28:09,000 Što je još jedan minus sada, ili što igrani mi odustati, 510 00:28:09,000 --> 00:28:12,000 ako mi predstavljaju popise stvari s popisa povezane, a ne polje? 511 00:28:12,000 --> 00:28:14,000 [Studentski] Vi ne možete prijeći unatrag. 512 00:28:14,000 --> 00:28:16,000 Vi ne možete prijeći unatrag, tako da ste vrsta pijan ako ste hodanje 513 00:28:16,000 --> 00:28:19,000 s lijeva na desno pomoću for petlje ili while petlja 514 00:28:19,000 --> 00:28:21,000 i onda ste shvatili, "Oh, želim se vratiti na početak popisa." 515 00:28:21,000 --> 00:28:26,000 Vi ne možete jer ti upućuje samo ići s lijeva na desno, kao strelice pokazuju. 516 00:28:26,000 --> 00:28:29,000 >> Sada, mogao sjetiti početak popisa s nekom drugom varijablom, 517 00:28:29,000 --> 00:28:31,000 ali da je složenost imati na umu. 518 00:28:31,000 --> 00:28:35,000 Polje, bez obzira koliko daleko idete, uvijek možete napraviti minus, minus, minus, minus 519 00:28:35,000 --> 00:28:37,000 i vratiti se odakle si došao. 520 00:28:37,000 --> 00:28:40,000 Što je još jedan minus ovdje? Da. 521 00:28:40,000 --> 00:28:43,000 [Nečujno učenik pitanje] 522 00:28:43,000 --> 00:28:47,000 Ti bi mogao, tako da ste zapravo samo predložio strukturu podataka zove dvostruko povezana lista, 523 00:28:47,000 --> 00:28:50,000 i doista, što bi dodati još jedan pokazivač na svaki od tih pravokutnika 524 00:28:50,000 --> 00:28:53,000 koji ide u drugom smjeru, naopako koji 525 00:28:53,000 --> 00:28:55,000 Sada je možete proći naprijed i natrag, 526 00:28:55,000 --> 00:28:59,000 downside koji sada koristite tri puta više memorije kako smo 527 00:28:59,000 --> 00:29:04,000 i dodao složenosti u smislu koda morate napisati da se to pravo. 528 00:29:04,000 --> 00:29:08,000 No, sve su to možda vrlo razumne kompromise, ako preokret je važnije. 529 00:29:08,000 --> 00:29:10,000 Da. 530 00:29:10,000 --> 00:29:12,000 [Studentski] Također, ne možete imati 2D povezanu listu. 531 00:29:12,000 --> 00:29:16,000 Dobro, ne možete stvarno imati 2D povezanog popisa. 532 00:29:16,000 --> 00:29:18,000 Ti bi mogao. To nije gotovo kao jednostavan kao polje. 533 00:29:18,000 --> 00:29:21,000 Kao i niz, što učiniti otvorenu zagradu, zatvorena zagrada, otvoren nosač, zatvorena zagrada, 534 00:29:21,000 --> 00:29:23,000 i vi dobiti neke 2-dimenzionalnu strukturu. 535 00:29:23,000 --> 00:29:26,000 Ti bi mogao provesti 2-dimenzionalni povezanog popisa 536 00:29:26,000 --> 00:29:29,000 ako to ne učinite dodatak kao što predlaže-trećine pokazivač na svaki od tih stvari, 537 00:29:29,000 --> 00:29:34,000 i ako mislite o drugom popisu dolaze na vas 3D stil 538 00:29:34,000 --> 00:29:40,000 na zaslonu za sve nas, što je samo još jedan lanac neke vrste. 539 00:29:40,000 --> 00:29:45,000 Možemo to učiniti, ali to nije tako jednostavno kao tipkati otvorenu zagradu, Trg nosača. Da. 540 00:29:45,000 --> 00:29:48,000 [Nečujno učenik pitanje] 541 00:29:48,000 --> 00:29:50,000 Dobro, tako da je ovo pravi udarač. 542 00:29:50,000 --> 00:29:54,000 >> Ovi algoritmi koje smo pined više, kao i oh, binarno pretraživanje, 543 00:29:54,000 --> 00:29:57,000 možete pretraživati ​​niz brojeva na ploči 544 00:29:57,000 --> 00:30:01,000 ili adresar tako puno brže ako koristite podijeli pa vladaj 545 00:30:01,000 --> 00:30:05,000 i binarni algoritam za pretraživanje, ali binarno pretraživanje potrebne dvije pretpostavke. 546 00:30:05,000 --> 00:30:09,000 Jedan od njih, koji su podaci razvrstani. 547 00:30:09,000 --> 00:30:11,000 Sada smo vjerojatno može zadržati ovu razvrstani, 548 00:30:11,000 --> 00:30:14,000 pa možda to nije briga, ali binarno pretraživanje također pretpostavlja 549 00:30:14,000 --> 00:30:18,000 da ste imali slučajni pristup popisu brojeva, 550 00:30:18,000 --> 00:30:21,000 i niz vam omogućuje da imaju slučajni pristup, te izravnim pristupom, 551 00:30:21,000 --> 00:30:24,000 Mislim, ako ste s obzirom niz, koliko vremena to vas odvesti 552 00:30:24,000 --> 00:30:26,000 doći do nosača 0? 553 00:30:26,000 --> 00:30:29,000 Jedna operacija, samo koristiti [0] i ti si tamo. 554 00:30:29,000 --> 00:30:33,000 Koliko koraka je potrebno da biste dobili na lokaciji 10? 555 00:30:33,000 --> 00:30:36,000 Jedan korak, možete samo ići na [10] a ti si tamo. 556 00:30:36,000 --> 00:30:40,000 Nasuprot tome, kako ste dobili na 10. cijeli u povezanoj listi? 557 00:30:40,000 --> 00:30:42,000 Morate početi na početku, jer ste samo sjećanja 558 00:30:42,000 --> 00:30:45,000 početak povezane liste, baš kao i niza se sjetio 559 00:30:45,000 --> 00:30:48,000 po adresu svog prvog char, i naći taj 10. int 560 00:30:48,000 --> 00:30:53,000 ili da 10. znak u nizu, morate tražiti cijeli prokletu stvar. 561 00:30:53,000 --> 00:30:55,000 >> Opet, nismo rješavanje svih naših problema. 562 00:30:55,000 --> 00:31:00,000 Mi smo uvođenjem novih, ali to stvarno ovisi o tome što pokušavate dizajn za. 563 00:31:00,000 --> 00:31:04,000 U pogledu provedbe toga, možemo posuditi ideju iz tog studentskog strukture. 564 00:31:04,000 --> 00:31:07,000 Sintaksa je vrlo sličan, osim sada, ideja je malo više apstraktna 565 00:31:07,000 --> 00:31:09,000 od kuća i ime i ID. 566 00:31:09,000 --> 00:31:13,000 Ali ja predlažem da bismo mogli imati strukturu podataka u C 567 00:31:13,000 --> 00:31:17,000 koji se zove čvor, kao posljednja riječ na slajdu sugerira, 568 00:31:17,000 --> 00:31:21,000 unutar čvora, a čvor je samo generički kontejner u informatici. 569 00:31:21,000 --> 00:31:25,000 To je obično nacrtana kao krug ili kvadrat ili pravokutnik kao što smo učinili. 570 00:31:25,000 --> 00:31:27,000 I u ovom strukture podataka, imamo int, n, 571 00:31:27,000 --> 00:31:29,000 tako da je broj Želim pohraniti. 572 00:31:29,000 --> 00:31:36,000 No, ono što je ova druga linija, struct node * sljedeći? 573 00:31:36,000 --> 00:31:40,000 Zašto je to točno, ili koja je uloga ova stvar igra, 574 00:31:40,000 --> 00:31:42,000 iako je to malo zagonetan na prvi pogled? 575 00:31:42,000 --> 00:31:44,000 Da. 576 00:31:44,000 --> 00:31:46,000 [Nečujno učenik odgovor] 577 00:31:46,000 --> 00:31:50,000 Točno, tako * vrsta plijena da je pokazivač neke vrste. 578 00:31:50,000 --> 00:31:53,000 Ime ovog pokazivač je samovoljno sljedeći, 579 00:31:53,000 --> 00:32:00,000 ali mogli smo ga zvali sve što želimo, ali što to pokazivač točka? 580 00:32:00,000 --> 00:32:03,000 [Studentski] Drugi čvor. >> Točno, to ukazuje na drugom takvom čvoru. 581 00:32:03,000 --> 00:32:05,000 >> Sada, ovo je neka vrsta znatiželje C. 582 00:32:05,000 --> 00:32:09,000 Podsjetimo da je C pročitati prevodilac vrha do dna, s lijeva na desno, 583 00:32:09,000 --> 00:32:13,000 što znači da ako-to je malo drugačije od onoga što smo radili s učenikom. 584 00:32:13,000 --> 00:32:16,000 Kada smo definirali student, mi zapravo nisam stavio riječ postoji. 585 00:32:16,000 --> 00:32:18,000 To je samo rekao typedef. 586 00:32:18,000 --> 00:32:20,000 Tada smo imali int id, string ime, string kuću, 587 00:32:20,000 --> 00:32:23,000 a zatim student na dnu struct. 588 00:32:23,000 --> 00:32:26,000 Ova izjava je malo drugačiji, jer, 589 00:32:26,000 --> 00:32:28,000 opet, C prevodilac je malo glupo. 590 00:32:28,000 --> 00:32:30,000 To samo ide na čitanje vrha do dna, 591 00:32:30,000 --> 00:32:33,000 pa ako dođe do 2. liniju ovdje 592 00:32:33,000 --> 00:32:37,000 gdje pored je proglašen i to vidi, oh, ovdje je varijabla zove sljedeći. 593 00:32:37,000 --> 00:32:39,000 To je pokazivač na struct čvora. 594 00:32:39,000 --> 00:32:42,000 Prevodilac će ostvariti ono što je struct čvor? 595 00:32:42,000 --> 00:32:44,000 Nikad nisam čuo tu stvar prije, 596 00:32:44,000 --> 00:32:47,000 jer čvor riječ inače ne bi mogli pojaviti 597 00:32:47,000 --> 00:32:49,000 do dna, tako da je to redundancija. 598 00:32:49,000 --> 00:32:53,000 Morate reći struct čvor ovdje, koje zatim možete skratiti kasnije 599 00:32:53,000 --> 00:32:56,000 zahvaljujući typedef ovdje dolje, ali to je zato 600 00:32:56,000 --> 00:33:02,000 mi smo s pozivom na strukturu sama unutar strukture. 601 00:33:02,000 --> 00:33:05,000 To je jedan Gotcha tamo. 602 00:33:05,000 --> 00:33:07,000 >> Neke zanimljive problemi će nastati. 603 00:33:07,000 --> 00:33:09,000 Imamo popis brojeva. Kako umetnuti u njega? 604 00:33:09,000 --> 00:33:11,000 Kako ćemo ga traži? Kako ćemo izbrisati iz njega? 605 00:33:11,000 --> 00:33:13,000 Pogotovo sada kada imamo upravljati svim tim pokazivače. 606 00:33:13,000 --> 00:33:15,000 Mislili ste pokazivače su vrsta um-savijanje 607 00:33:15,000 --> 00:33:17,000 kada je imao jedan od njih samo pokušava pročitati int na njega. 608 00:33:17,000 --> 00:33:20,000 Sada moramo manipulirati cijeli popis vrijedi. 609 00:33:20,000 --> 00:33:22,000 Zašto ne uzimamo naš 5-minutni predah ovdje, a onda ćemo donijeti 610 00:33:22,000 --> 00:33:34,000 neki ljudi na pozornici učiniti upravo to. 611 00:33:34,000 --> 00:33:36,000 >> C je puno zabavnije kada je glumio. 612 00:33:36,000 --> 00:33:39,000 Tko doslovno bih biti prvi? 613 00:33:39,000 --> 00:33:41,000 Ok, dođi na gore. Vi ste na prvom mjestu. 614 00:33:41,000 --> 00:33:44,000 Tko želi biti 9? Ok, devet. 615 00:33:44,000 --> 00:33:46,000 Kako o 9? 17? 616 00:33:46,000 --> 00:33:51,000 Malo klika ovdje. 22 i 26 u tom prvom redu. 617 00:33:51,000 --> 00:33:53,000 I kako se onda o nekome tamo se istaknuo u. 618 00:33:53,000 --> 00:33:57,000 Vi ste 34. Ok, 34, dolaze na gore. 619 00:33:57,000 --> 00:33:59,000 Prvo je tamo. Ok, sve četiri od vas dečki. 620 00:33:59,000 --> 00:34:01,000 A tko nije kažemo za 9? 621 00:34:01,000 --> 00:34:04,000 Tko je naša 9? 622 00:34:04,000 --> 00:34:07,000 Tko doista želi biti 9? Dobro, hajde, biti devet. 623 00:34:07,000 --> 00:34:10,000 Ovdje ćemo ići. 624 00:34:10,000 --> 00:34:13,000 34, mi ćemo vas upoznati tamo. 625 00:34:13,000 --> 00:34:17,000 Prvi dio je napraviti sami izgledaju kao da. 626 00:34:17,000 --> 00:34:21,000 26, 22, 17, dobro. 627 00:34:21,000 --> 00:34:25,000 Ako možete stajati sa strane, jer ćemo vas malloc u trenutku. 628 00:34:25,000 --> 00:34:29,000 >> Dobro, dobro. 629 00:34:29,000 --> 00:34:32,000 Ok, odličan, pa ajmo postaviti nekoliko pitanja ovdje. 630 00:34:32,000 --> 00:34:34,000 I zapravo, ono što je vaše ime? >> Anita. 631 00:34:34,000 --> 00:34:37,000 Anita, ok, dođi ovamo. 632 00:34:37,000 --> 00:34:41,000 Anita će nam pomoći vrsta riješiti jedan prilično jednostavno pitanje u prvom, 633 00:34:41,000 --> 00:34:44,000 koji je kako vam li ili ne vrijednost na popisu? 634 00:34:44,000 --> 00:34:48,000 Sada, primijetite da je prvi, i ovdje su zastupljeni Lucas, 635 00:34:48,000 --> 00:34:52,000 je malo drugačiji, pa mu je komad papira je namjerno bočno 636 00:34:52,000 --> 00:34:55,000 jer to nije sasvim kao visok i ne zauzimaju onoliko bitova, 637 00:34:55,000 --> 00:34:58,000 iako tehnički ima istu veličinu papira samo okretati. 638 00:34:58,000 --> 00:35:01,000 Ali on je malo drugačiji u smislu da je samo 32 bita za pokazivač, 639 00:35:01,000 --> 00:35:05,000 i svi ovi dečki su 64 bita, od kojih polovica je broj, od kojih polovica je pokazivač. 640 00:35:05,000 --> 00:35:08,000 Ali pokazivač nije prikazano, pa ako vi mogli nešto nespretno 641 00:35:08,000 --> 00:35:12,000 koristiti lijevu ruku ukazati na osobu pored vas. 642 00:35:12,000 --> 00:35:14,000 A ti si broj 34. Koje je vaše ime? 643 00:35:14,000 --> 00:35:16,000 Ari. 644 00:35:16,000 --> 00:35:19,000 Ari, tako da zapravo, držite papir u desnoj ruci, a lijevom rukom ide ravno prema dolje. 645 00:35:19,000 --> 00:35:21,000 Vi predstavljate null na lijevoj strani. 646 00:35:21,000 --> 00:35:24,000 >> Sada naša ljudska slika je vrlo dosljedan. 647 00:35:24,000 --> 00:35:26,000 To je zapravo kako upućuje raditi. 648 00:35:26,000 --> 00:35:29,000 I ako možete stiskati malo na ovaj način, tako da nisam u svoj način. 649 00:35:29,000 --> 00:35:34,000 Anita ovdje, naći mi broj 22, 650 00:35:34,000 --> 00:35:40,000 ali pretpostavljaju ograničenje ne ljudi drži do komada papira, 651 00:35:40,000 --> 00:35:43,000 ali ovo je popis, a imate samo Lucas početi s 652 00:35:43,000 --> 00:35:46,000 jer on je doslovno prvi pokazivač. 653 00:35:46,000 --> 00:35:51,000 Pretpostavimo da ste sami pokazivač, pa vi imate mogućnost da pokazuje na nešto. 654 00:35:51,000 --> 00:35:56,000 Zašto ne započeti ukazujući na upravo ono što je Lucas pokazujući na? 655 00:35:56,000 --> 00:35:58,000 Dobro, i neka mi donese ovo ovdje. 656 00:35:58,000 --> 00:36:04,000 Samo radi rasprave, neka mi podići praznu stranicu ovdje. 657 00:36:04,000 --> 00:36:06,000 Kako se piše vaše ime? >> Anita. 658 00:36:06,000 --> 00:36:08,000 Ok, Anita. 659 00:36:08,000 --> 00:36:18,000 Recimo čvor * Anita = Lucasa. 660 00:36:18,000 --> 00:36:22,000 Pa, mi ne bi trebali zvati Lucas. Trebali bismo nazvati prvi. 661 00:36:22,000 --> 00:36:25,000 Zašto je to u stvari dosljedan sa stvarnošću ovdje? 662 00:36:25,000 --> 00:36:27,000 Jedan od njih, prvi već postoji. 663 00:36:27,000 --> 00:36:30,000 Prvo je dodijeljeno vjerojatno negdje ovdje. 664 00:36:30,000 --> 00:36:35,000 Čvor * prvi, i to je bio dodijeljen popis nekako. 665 00:36:35,000 --> 00:36:37,000 Ne znam kako se to dogodilo. To se dogodilo prije sat počeo. 666 00:36:37,000 --> 00:36:40,000 Ovo povezani popis ljudi je stvorio. 667 00:36:40,000 --> 00:36:44,000 I sada u ovom trenutku u priču-to sve ide na Facebook-u očito kasnije 668 00:36:44,000 --> 00:36:49,000 U ovom trenutku u priči, Anita je inicijalizirana biti jednaka prvi, 669 00:36:49,000 --> 00:36:51,000 što ne znači da je Anita bodova na Lucasa. 670 00:36:51,000 --> 00:36:53,000 Umjesto toga, ona ukazuje na ono što on ukazuje na 671 00:36:53,000 --> 00:36:57,000 jer ista adresa koja je unutar Lucas je 32 bita - 1, 2, 3 - 672 00:36:57,000 --> 00:37:01,000 Sada je također unutar Anita je 32 bita - 1, 2, 3. 673 00:37:01,000 --> 00:37:05,000 >> Sada pronaći 22. Kako bi vam ići oko radiš? 674 00:37:05,000 --> 00:37:07,000 Što je to? >> Rose što god. 675 00:37:07,000 --> 00:37:11,000 Pokažite što god, pa ići naprijed i djelovati najbolje što možete ovdje. 676 00:37:11,000 --> 00:37:15,000 Dobro, dobro, a sada ste pokazujući na-ono što je vaše ime sa 22? 677 00:37:15,000 --> 00:37:18,000 Ramon. >> Ramon, pa Ramon drži do 22. 678 00:37:18,000 --> 00:37:20,000 Sada ste učinili ček. 679 00:37:20,000 --> 00:37:24,000 Da li Ramon == 22, i ako je tako, na primjer, možemo se vratiti istina. 680 00:37:24,000 --> 00:37:26,000 Me-a Neka ti dečki ovdje stajati nešto nespretno- 681 00:37:26,000 --> 00:37:32,000 neka mi nešto učiniti brzo kao bool pronaći. 682 00:37:32,000 --> 00:37:37,000 Ja ću ići naprijed i reći (čvor * lista, int n). 683 00:37:37,000 --> 00:37:39,000 Odmah ću se vratiti s vama. Moram samo napisati neki kod. 684 00:37:39,000 --> 00:37:45,000 A sada ću ići naprijed i učiniti ovu, čvor * Anita = popis. 685 00:37:45,000 --> 00:37:51,000 I ja ću ići naprijed i reći dok (anita! = NULL). 686 00:37:51,000 --> 00:37:57,000 >> Metafora ovdje je uzimajući malo nategnut, ali dok (anita! = NULL), što želim učiniti? 687 00:37:57,000 --> 00:38:03,000 Trebam neki način referenciranje 688 00:38:03,000 --> 00:38:05,000 cijeli broj koji je Anita pokazujući na. 689 00:38:05,000 --> 00:38:08,000 U prošlosti, kada smo imali strukture, koja čvor, 690 00:38:08,000 --> 00:38:11,000 koristili smo dot zapis, a mi bi reći nešto poput 691 00:38:11,000 --> 00:38:15,000 anita.n, ali problem ovdje je da Anita nije struct po sebi. 692 00:38:15,000 --> 00:38:17,000 Što je ona? 693 00:38:17,000 --> 00:38:21,000 Ona je pokazivač, tako da stvarno, ako želimo koristiti ovaj dot-notaciju 694 00:38:21,000 --> 00:38:23,000 i to će izgledati namjerno malo grobni- 695 00:38:23,000 --> 00:38:28,000 moramo učiniti nešto slično ići na ono što Anita lijevoj ruci je pokazujući na 696 00:38:28,000 --> 00:38:31,000 i onda se polje pod nazivom n. 697 00:38:31,000 --> 00:38:35,000 Anita je pokazivač, ali ono što je * anita? 698 00:38:35,000 --> 00:38:38,000 Što vam kad idete na ono što Anita pokazujući na? 699 00:38:38,000 --> 00:38:42,000 Rekonstruirati čvor, i čvora, povlačenje, ima polje zove n 700 00:38:42,000 --> 00:38:47,000 jer je, podsjetimo, ove dvije stavke, sljedeći i n, 701 00:38:47,000 --> 00:38:50,000 da smo vidjeli maloprije ovdje. 702 00:38:50,000 --> 00:38:53,000 >> Da zapravo oponašaju to u kodu, 703 00:38:53,000 --> 00:39:02,000 bismo mogli to učiniti i reći: if ((* anita). n == n), n da sam u potrazi za. 704 00:39:02,000 --> 00:39:04,000 Primijetite da funkcija donesen u broju mi ​​je stalo. 705 00:39:04,000 --> 00:39:10,000 Zatim Ja mogu ići naprijed i učiniti nešto poput povratka pravu. 706 00:39:10,000 --> 00:39:12,000 Inače, ako to nije slučaj, što ne želim raditi? 707 00:39:12,000 --> 00:39:19,000 Kako prevesti kodirati ono što Anita učinio intuitivno šetnjom kroz popisu? 708 00:39:19,000 --> 00:39:26,000 Što bih trebao učiniti ovdje simulirati Anita uzimajući taj korak s lijeve strane, taj korak u lijevo? 709 00:39:26,000 --> 00:39:28,000 [Nečujno učenik odgovor] >> Što je to? 710 00:39:28,000 --> 00:39:30,000 [Nečujno učenik odgovor] 711 00:39:30,000 --> 00:39:34,000 Dobro, nije loša ideja, ali u prošlosti, kada smo to učinili, što smo učinili anita + + 712 00:39:34,000 --> 00:39:37,000 jer da bi dodali na broj jedan na Anita, 713 00:39:37,000 --> 00:39:40,000 koji bi obično upućuju na sljedeću osobu, kao što su Ramon, 714 00:39:40,000 --> 00:39:44,000 ili osoba pored njega, ili pored njega osoba niz liniju. 715 00:39:44,000 --> 00:39:49,000 No, to nije sasvim dobro ovdje, jer ono to stvar izgledati u sjećanju? 716 00:39:49,000 --> 00:39:54,000 Nije da. Moramo onemogućiti da. 717 00:39:54,000 --> 00:40:00,000 To izgleda ovako u memoriji, i iako sam nacrtana 1 i 2 i 3 blizu jedna drugoj, 718 00:40:00,000 --> 00:40:03,000 ako smo stvarno simuliraju to-mogu ti dečki, dok je još uvijek pokazujući na istim ljudima, 719 00:40:03,000 --> 00:40:07,000 može neki od vas uzeti slučajni korak natrag, neki od vas slučajni korak naprijed? 720 00:40:07,000 --> 00:40:10,000 >> Ovaj nered je još uvijek povezana lista, 721 00:40:10,000 --> 00:40:13,000 ali ovi momci bi mogao biti bilo gdje u memoriji, 722 00:40:13,000 --> 00:40:15,000 tako anita + + ne ide raditi zašto? 723 00:40:15,000 --> 00:40:19,000 Što je na lokalitetu Anita + +? 724 00:40:19,000 --> 00:40:21,000 Tko zna. 725 00:40:21,000 --> 00:40:24,000 To je neka druga vrijednost koja samo tako dogodi da se umetnuo 726 00:40:24,000 --> 00:40:28,000 među svim tim čvorova slučajno, jer mi ne koristimo niz. 727 00:40:28,000 --> 00:40:30,000 Mi dodjeljuje svake od tih čvorova pojedinačno. 728 00:40:30,000 --> 00:40:32,000 Dobro, ako vi možete sami očistiti natrag gore. 729 00:40:32,000 --> 00:40:37,000 Dopustite mi predložiti da se umjesto anita + +, umjesto toga učiniti Anita dobiva- 730 00:40:37,000 --> 00:40:42,000 dobro, zašto ne idemo na ono što Anita pokazujući na, a zatim učinite. sljedeći? 731 00:40:42,000 --> 00:40:45,000 Drugim riječima, idemo na Ramon, koji je drži broj 22, 732 00:40:45,000 --> 00:40:51,000 i onda. sljedeći je kao da Anita bi se kopiranje lijevoj ruci pokazivač. 733 00:40:51,000 --> 00:40:54,000 Ali ona neće ići dalje od Ramon jer smo pronašli 22. 734 00:40:54,000 --> 00:40:56,000 No, da bi se ideja. Sada, to je bog-strašno nered. 735 00:40:56,000 --> 00:40:59,000 Iskreno, nitko neće pamtiti ovu sintaksu, pa hvala bogu, 736 00:40:59,000 --> 00:41:04,000 to je zapravo malo namjerno-oh, niste zapravo vidjeli ono što sam napisao. 737 00:41:04,000 --> 00:41:08,000 To će biti uvjerljiviji ako bi mogao. Voila! 738 00:41:08,000 --> 00:41:10,000 >> Iza kulisa, bio sam riješiti problem na ovaj način. 739 00:41:10,000 --> 00:41:14,000 Anita, poduzeti taj korak s lijeve strane, 740 00:41:14,000 --> 00:41:18,000 prvo, mi ne idu na adresu koju je Anita pokazujući na 741 00:41:18,000 --> 00:41:23,000 i gdje će se naći ne samo n, koje smo upravo provjerava Usporedbe radi, 742 00:41:23,000 --> 00:41:25,000 ali ćete također pronaći sljedeći - u ovom slučaju, 743 00:41:25,000 --> 00:41:28,000 Ramon je lijeva ruka pokazuje na sljedeći čvor u popisu. 744 00:41:28,000 --> 00:41:32,000 Ali ovo je bog-strašno nered koji sam spomenuo ranije, 745 00:41:32,000 --> 00:41:34,000 ali ispada C omogućuje nam pojednostaviti ovaj. 746 00:41:34,000 --> 00:41:40,000 Umjesto pisanja (* anita), umjesto toga možete samo napisati Anita-> N, 747 00:41:40,000 --> 00:41:45,000 i to je točno ista stvar funkcionalno, ali to je puno više intuitivan, 748 00:41:45,000 --> 00:41:48,000 i to je puno više u skladu sa slikom da smo crtanje 749 00:41:48,000 --> 00:41:50,000 sve ovo vrijeme koristeći strelice. 750 00:41:50,000 --> 00:41:57,000 >> Na kraju, ono što trebamo učiniti na kraju ovog programa? 751 00:41:57,000 --> 00:42:00,000 Postoji jedna linija koda preostale. 752 00:42:00,000 --> 00:42:02,000 Povratak što? 753 00:42:02,000 --> 00:42:05,000 Netočno, jer ako smo dobili kroz cijelu while petlja 754 00:42:05,000 --> 00:42:10,000 i Anita je, u stvari, null, to znači da je otišla sve do kraja popisa 755 00:42:10,000 --> 00:42:12,000 gdje je pokazujući na-ono zoveš? 756 00:42:12,000 --> 00:42:15,000 Ari. >> Ari je lijeva ruka, koja je null. 757 00:42:15,000 --> 00:42:18,000 Anita je sada null, i shvaćam da ste samo stajati ovdje nespretno u limbu 758 00:42:18,000 --> 00:42:21,000 jer ću off na monolog ovdje, 759 00:42:21,000 --> 00:42:23,000 ali mi ćemo vas uključiti opet u samo trenutak. 760 00:42:23,000 --> 00:42:27,000 Anita je nula u tom trenutku u priči, tako da while petlja završava, 761 00:42:27,000 --> 00:42:30,000 i moramo se vratiti lažna jer ako je dobio sve do Ari je NULL pokazivač 762 00:42:30,000 --> 00:42:34,000 tada nije bilo broj koji je tražio u popisu. 763 00:42:34,000 --> 00:42:39,000 Možemo očistiti ovo gore previše, ali to je prilično dobra provedba zatim 764 00:42:39,000 --> 00:42:43,000 od obuhvaćanje funkcije, pronaći funkciju za povezane popisa. 765 00:42:43,000 --> 00:42:48,000 To je još uvijek linearno pretraživanje, ali to nije tako jednostavno kao + + pokazivač 766 00:42:48,000 --> 00:42:52,000 ili + + ja promjenjiva jer sada ne možemo nagađati 767 00:42:52,000 --> 00:42:54,000 gdje je svaki od tih čvorova su u memoriji. 768 00:42:54,000 --> 00:42:57,000 Moramo doslovno slijediti trag mrvice ili, točnije, 769 00:42:57,000 --> 00:43:00,000 upućuje, da se iz jednog čvora na drugi. 770 00:43:00,000 --> 00:43:02,000 >> Sada ćemo pokušati još jednom. Anita, hoćeš doći ovamo? 771 00:43:02,000 --> 00:43:06,000 Zašto ne možemo ići naprijed i dodijeliti jedna drugu osobu iz publike? 772 00:43:06,000 --> 00:43:08,000 Malloc-ono što je vaše ime? >> Rebecca. 773 00:43:08,000 --> 00:43:10,000 Rebecca. Rebecca je malloced iz publike, 774 00:43:10,000 --> 00:43:13,000 i ona je sada pohranu broj 55. 775 00:43:13,000 --> 00:43:17,000 A cilj pri ruci sada je za Anita umetnuti 776 00:43:17,000 --> 00:43:22,000 Rebecca u povezanoj listi ovdje u svojoj odgovarajuće mjesto. 777 00:43:22,000 --> 00:43:24,000 Dođi ovamo na trenutak. 778 00:43:24,000 --> 00:43:28,000 Učinio sam nešto ovako. 779 00:43:28,000 --> 00:43:32,000 Ja sam učinio čvor *. I ono što je vaše ime ponovno? 780 00:43:32,000 --> 00:43:34,000 Rebecca. >> Rebecca, ok. 781 00:43:34,000 --> 00:43:41,000 Rebecca dobiva malloc (sizeof (čvor)). 782 00:43:41,000 --> 00:43:44,000 Baš kao što smo izdvojili stvari kao što su učenike i sitnica u prošlosti, 783 00:43:44,000 --> 00:43:46,000 trebamo veličinu čvora, tako da sada Rebecca 784 00:43:46,000 --> 00:43:49,000 pokazuje na što? 785 00:43:49,000 --> 00:43:52,000 Rebecca ima dva polja unutar nje, od kojih je jedan 55. 786 00:43:52,000 --> 00:43:55,000 Idemo raditi ono, rebecca-> = 55. 787 00:43:55,000 --> 00:44:00,000 Ali onda rebecca-> next treba-mi upravo sada, njezina ruka je vrsta, tko zna? 788 00:44:00,000 --> 00:44:03,000 To je pokazujući na nekom smeće vrijednosti, pa zašto ne za dobru mjeru 789 00:44:03,000 --> 00:44:07,000 mi barem to učiniti, tako da lijeva ruka je sada na njezinoj strani. 790 00:44:07,000 --> 00:44:09,000 Sada Anita, uzmi ga ovdje. 791 00:44:09,000 --> 00:44:11,000 Imate Rebecca što je dodijeljeno. 792 00:44:11,000 --> 00:44:20,000 Idi naprijed i naći gdje smo trebali staviti Rebeccu. 793 00:44:20,000 --> 00:44:25,000 Dobro, vrlo dobro. 794 00:44:25,000 --> 00:44:28,000 Dobro, dobro, a sada trebamo li osigurati malo smjeru, 795 00:44:28,000 --> 00:44:30,000 tako da ste postigli Arija. 796 00:44:30,000 --> 00:44:33,000 Njegova mi je lijeva ruka null, ali Rebecca jasno pripada pravo, 797 00:44:33,000 --> 00:44:36,000 pa kako ne moramo mijenjati ovu povezan popis 798 00:44:36,000 --> 00:44:38,000 kako bi se umetnuti Rebeccu u odgovarajućem mjestu? 799 00:44:38,000 --> 00:44:42,000 Ako doslovno mogao pomaknuti tuđe lijeve ruke oko po potrebi, 800 00:44:42,000 --> 00:44:48,000 ćemo riješiti problem na taj način. 801 00:44:48,000 --> 00:44:52,000 Dobro, dobro, au međuvremenu, Rebecca je lijeva ruka je sada uz nju. 802 00:44:52,000 --> 00:44:54,000 >> To je bilo previše lako. 803 00:44:54,000 --> 00:44:57,000 Pokušajmo dodjele-Mi smo gotovi, 20. 804 00:44:57,000 --> 00:44:59,000 Ok, dođi na gore. 805 00:44:59,000 --> 00:45:04,000 20 je dodijeljeno, pa neka mi ići naprijed i opet reći ovdje 806 00:45:04,000 --> 00:45:07,000 upravo smo učinili Saad čvor *. 807 00:45:07,000 --> 00:45:11,000 Imamo malloc (sizeof (čvor)). 808 00:45:11,000 --> 00:45:16,000 Mi smo tada učiniti isto točno sintaksu kao što smo radili prije za 20, 809 00:45:16,000 --> 00:45:20,000 i ja ću učiniti sljedeći = null, a sada je do Anita 810 00:45:20,000 --> 00:45:23,000 umetnuti ste u povezane liste, ako bi mogao igrati taj isti ulogu. 811 00:45:23,000 --> 00:45:30,000 Izvrši. 812 00:45:30,000 --> 00:45:32,000 Dobro, dobro. 813 00:45:32,000 --> 00:45:38,000 Sada razmislite prije nego što počnete se kreće lijevo oko ruke. 814 00:45:38,000 --> 00:45:46,000 Vi daleko dobio najviše neugodan ulogu danas. 815 00:45:46,000 --> 00:45:59,000 Čiju ruku treba biti premještena prvi? 816 00:45:59,000 --> 00:46:02,000 Ok, čekajte, ja sam čuo neke ne-a. 817 00:46:02,000 --> 00:46:07,000 Ako neki ljudi pristojno željeli pomoći riješiti neugodne situacije ovdje. 818 00:46:07,000 --> 00:46:11,000 Čija lijeva ruka treba ažurirati prvi možda? Da. 819 00:46:11,000 --> 00:46:13,000 [Studentski] Saad-a. 820 00:46:13,000 --> 00:46:15,000 Ok, Saad je, zašto, iako? 821 00:46:15,000 --> 00:46:17,000 [Nečujno učenik odgovor] 822 00:46:17,000 --> 00:46:19,000 Dobro, jer ako se krećemo-ono što je vaše ime? >> Marshall. 823 00:46:19,000 --> 00:46:22,000 Marshall, ako idemo ruku prvi dolje na nulu, 824 00:46:22,000 --> 00:46:25,000 sada doslovno smo siročad četvero ljudi na ovom popisu 825 00:46:25,000 --> 00:46:29,000 jer je bio jedina stvar ukazujući na Ramon i svatko na lijevoj strani, 826 00:46:29,000 --> 00:46:31,000 tako da je pokazivač ažuriranja prvi je bio loš. 827 00:46:31,000 --> 00:46:33,000 Ajmo poništiti to. 828 00:46:33,000 --> 00:46:37,000 Dobro, a sada ići naprijed i premjestiti na odgovarajuću lijevu ruku pokazujući na Ramon. 829 00:46:37,000 --> 00:46:39,000 To se osjeća malo suvišnim. 830 00:46:39,000 --> 00:46:41,000 Sada postoje dvije osobe upućuju na Ramon, ali to je u redu 831 00:46:41,000 --> 00:46:43,000 jer sada kako drukčije ne možemo ažurirati popis? 832 00:46:43,000 --> 00:46:48,000 Što druge strane mora premjestiti? 833 00:46:48,000 --> 00:46:53,000 Izvrsno, sad imamo izgubio pamćenje? 834 00:46:53,000 --> 00:46:57,000 Ne, tako dobro, neka je vidjeti ako ne možemo razbiti još jednom. 835 00:46:57,000 --> 00:47:00,000 >> Mallocing jedan posljednji put, broj 5. 836 00:47:00,000 --> 00:47:04,000 Sve način na leđima, hajde dolje. 837 00:47:04,000 --> 00:47:08,000 To je vrlo uzbudljivo. 838 00:47:08,000 --> 00:47:15,000 [Pljesak] 839 00:47:15,000 --> 00:47:17,000 Koje je vaše ime? >> Ron. 840 00:47:17,000 --> 00:47:19,000 Ron, ok, ti ​​si malloced kao broj pet. 841 00:47:19,000 --> 00:47:23,000 Upravo smo izvršiti kod koji je gotovo identičan njih 842 00:47:23,000 --> 00:47:26,000 sa samo pod drugim imenom. 843 00:47:26,000 --> 00:47:28,000 Izvrsno. 844 00:47:28,000 --> 00:47:38,000 Sada, Anita, sretno umetanjem broj 5 u popis sada. 845 00:47:38,000 --> 00:47:43,000 Dobro, i? 846 00:47:43,000 --> 00:47:47,000 Izvrsno, tako da je ovo stvarno treći od tri ukupnih slučajeva. 847 00:47:47,000 --> 00:47:49,000 Mi smo prvi put imali nekoga na kraju, Rebecca. 848 00:47:49,000 --> 00:47:51,000 Mi smo tada imali nekoga u sredini. 849 00:47:51,000 --> 00:47:53,000 Sada imamo nekoga na početku, iu ovom primjeru, 850 00:47:53,000 --> 00:47:56,000 sada smo morali ažurirati Lucas po prvi put 851 00:47:56,000 --> 00:48:00,000 jer je prvi element u popisu sada ima ukazati na novi čvor, 852 00:48:00,000 --> 00:48:03,000 koji je, pak, pokazujući na čvoru broj 9. 853 00:48:03,000 --> 00:48:06,000 >> To je bio iznimno neugodan demonstracija, siguran sam, 854 00:48:06,000 --> 00:48:08,000 tako veliki aplauz za ove dečke, ako bi mogao. 855 00:48:08,000 --> 00:48:11,000 Lijepo učinjeno. 856 00:48:11,000 --> 00:48:17,000 To je sve. Možete zadržati svoje papiriće kao malo memorije. 857 00:48:17,000 --> 00:48:22,000 Ispada da je to u kodu 858 00:48:22,000 --> 00:48:26,000 nije baš tako jednostavno kao samo pomicanjem ruke oko 859 00:48:26,000 --> 00:48:28,000 i pokazujući upućuje na različite stvari. 860 00:48:28,000 --> 00:48:31,000 Ali shvatiti da kada je u pitanju vrijeme provesti nešto poput 861 00:48:31,000 --> 00:48:34,000 povezani popis ili varijanta ako se usredotočiti na stvarno 862 00:48:34,000 --> 00:48:38,000 ove osnovne osnove, i veličine zalogaja problemi moram shvatiti, 863 00:48:38,000 --> 00:48:43,000 je ova ruka ili ova ruka, shvatite da je ono što je inače prilično složen program 864 00:48:43,000 --> 00:48:47,000 može, u stvari, biti smanjen na relativno jednostavnih građevnih blokova kao što je ovaj. 865 00:48:47,000 --> 00:48:51,000 >> Ajmo uzeti stvari u sofisticiranijim smjeru dalje. 866 00:48:51,000 --> 00:48:53,000 Mi sada imamo pojam povezan popisu. 867 00:48:53,000 --> 00:48:57,000 Također imamo-zahvaljujući prijedlog tamo-dvostruko povezana lista, 868 00:48:57,000 --> 00:49:01,000 koji izgleda gotovo isto, ali sada imamo dva pokazivača unutar struct 869 00:49:01,000 --> 00:49:05,000 umjesto jednog, a vjerojatno ćemo se mogli nazvati one pokazivače prethodni i sljedeći 870 00:49:05,000 --> 00:49:08,000 ili lijevo ili desno, ali mi, u stvari, trebati dva od njih. 871 00:49:08,000 --> 00:49:10,000 Kod će biti malo više uključeni. 872 00:49:10,000 --> 00:49:12,000 Anita bi morao učiniti više raditi ovdje na sceni. 873 00:49:12,000 --> 00:49:15,000 No, svakako bi mogao provoditi takvu strukturu. 874 00:49:15,000 --> 00:49:19,000 U smislu trčanje vremena, iako, što će biti trčanje vrijeme 875 00:49:19,000 --> 00:49:24,000 za Anita pronalaženja broj n u povezanoj listi sada? 876 00:49:24,000 --> 00:49:27,000 Ipak veliki O n, tako da je nema boljeg od linearnog pretraživanja. 877 00:49:27,000 --> 00:49:29,000 Mi ne možemo učiniti binarnog pretraživanja, međutim, opet. 878 00:49:29,000 --> 00:49:34,000 Zašto je to tako? Vi ne možete skakati okolo. 879 00:49:34,000 --> 00:49:36,000 Iako smo očito vidi sve ljude na pozornici, 880 00:49:36,000 --> 00:49:39,000 i Anita mogao ga eyeballed i rekao: "Ovdje je sredinom popisu" 881 00:49:39,000 --> 00:49:42,000 ona ne bi znali da li je ona bila računalni program 882 00:49:42,000 --> 00:49:47,000 jer je jedino ona je morala uskladiti s početkom u scenariju 883 00:49:47,000 --> 00:49:50,000 bio je Lucas, koji je bio prvi pokazivač. 884 00:49:50,000 --> 00:49:53,000 Ona bi nužno moraju slijediti te veze, 885 00:49:53,000 --> 00:49:56,000 računajući svoj put do našla otprilike u sredini, 886 00:49:56,000 --> 00:49:58,000 pa čak i onda, ona neće znati kada je ona dosegla sredini 887 00:49:58,000 --> 00:50:01,000 osim ako ona ide skroz do kraja shvatiti koliko postoje, 888 00:50:01,000 --> 00:50:05,000 onda backtracks, i da je bilo teško, osim ako je 889 00:50:05,000 --> 00:50:07,000 dvostruko povezana lista neke vrste. 890 00:50:07,000 --> 00:50:10,000 >> Rješavanje neke probleme i danas, ali uvođenjem druge. 891 00:50:10,000 --> 00:50:12,000 Što o različitim strukture podataka uopce? 892 00:50:12,000 --> 00:50:15,000 Ovo je fotografija od ladica u Mather House, 893 00:50:15,000 --> 00:50:19,000 i, u ovom slučaju, imamo strukturu podataka smo također vrsta već pričaju. 894 00:50:19,000 --> 00:50:22,000 Razgovarali smo o hrpi u kontekstu memorije, 895 00:50:22,000 --> 00:50:26,000 i to je neka vrsta namjerno zove jer stog u smislu memorije 896 00:50:26,000 --> 00:50:31,000 je učinkovito struktura podataka koji ima sve više i više stvari slojevita na vrhu. 897 00:50:31,000 --> 00:50:35,000 No zanimljiva stvar o hrpi, kao što je slučaj u stvarnosti, 898 00:50:35,000 --> 00:50:38,000 je da je to posebna vrsta podataka strukture. 899 00:50:38,000 --> 00:50:42,000 To je struktura podataka kojom prvi element u 900 00:50:42,000 --> 00:50:46,000 je posljednji elemenat van. 901 00:50:46,000 --> 00:50:50,000 Ako ste prvi ladica da se stavi na hrpu, 902 00:50:50,000 --> 00:50:53,000 ćeš biti nažalost posljednji pladanj biti skinut snop, 903 00:50:53,000 --> 00:50:55,000 i to nije nužno dobra stvar. 904 00:50:55,000 --> 00:50:58,000 Isto tako, možete misliti o tome obrnuto, 905 00:50:58,000 --> 00:51:02,000 posljednja u je prvi van. 906 00:51:02,000 --> 00:51:05,000 >> Sada, ne bilo scenariji dolaze u obzir gdje ima hrpu 907 00:51:05,000 --> 00:51:08,000 struktura podataka u kojoj imate tu imovinu 908 00:51:08,000 --> 00:51:13,000 od posljednjih u, prvi van, zapravo uvjerljiv? 909 00:51:13,000 --> 00:51:16,000 Je li to dobra stvar? Je li to loše? 910 00:51:16,000 --> 00:51:19,000 To je definitivno loša stvar ako ladice nisu svi jednaki 911 00:51:19,000 --> 00:51:21,000 i svi su bili posebni različite boje ili sitnica, 912 00:51:21,000 --> 00:51:24,000 i boju koju želite je skroz na dnu. 913 00:51:24,000 --> 00:51:26,000 Naravno, ne možete dobiti da bez velikog truda. 914 00:51:26,000 --> 00:51:28,000 Morate početi od vrha i raditi svoj put prema dolje. 915 00:51:28,000 --> 00:51:31,000 Isto tako, što ako ste bili jedan od tih navijačkih dječaka 916 00:51:31,000 --> 00:51:34,000 tko čeka cijelu noć pokušavao dobiti iPhone i linije gore 917 00:51:34,000 --> 00:51:36,000 na ovakvom mjestu? 918 00:51:36,000 --> 00:51:40,000 Zar ne bi bilo lijepo ako Apple store 919 00:51:40,000 --> 00:51:42,000 bili struktura stog podataka? 920 00:51:42,000 --> 00:51:44,000 Jupi? Naprotiv? 921 00:51:44,000 --> 00:51:47,000 To je jedino dobro za ljude koji pokazuju prema gore u zadnji mogući tren 922 00:51:47,000 --> 00:51:50,000 i onda se izvukao off red. 923 00:51:50,000 --> 00:51:52,000 A u stvari, činjenica da sam toliko bio sklon reći red 924 00:51:52,000 --> 00:51:56,000 je zapravo u skladu s onim što bismo mogli nazvati ova vrsta strukture podataka, 925 00:51:56,000 --> 00:51:59,000 jedan u stvarnosti u kojoj bi se stvar, 926 00:51:59,000 --> 00:52:02,000 i želite prvi u biti prvi jedan od 927 00:52:02,000 --> 00:52:04,000 ako se samo radi o ljudskoj pravednosti. 928 00:52:04,000 --> 00:52:07,000 Mi općenito ću nazvati da struktura red podataka. 929 00:52:07,000 --> 00:52:11,000 >> Ispada osim povezane liste, možemo početi koristiti iste osnovne ideje 930 00:52:11,000 --> 00:52:15,000 i početi stvarati nove i drugačije vrste rješenja problema. 931 00:52:15,000 --> 00:52:19,000 Na primjer, u slučaju hrpu, možemo predstavljaju snop 932 00:52:19,000 --> 00:52:22,000 pomoću strukturu podataka kao što je ovaj, ja bih predložiti. 933 00:52:22,000 --> 00:52:26,000 U ovom slučaju, ja sam proglašen struct, a ja sam rekao unutar ove strukture 934 00:52:26,000 --> 00:52:30,000 je niz brojeva, a zatim varijablu veličine, 935 00:52:30,000 --> 00:52:33,000 i ja ću nazvati ovu stvar hrpu. 936 00:52:33,000 --> 00:52:35,000 Sada, zašto se to zapravo radi? 937 00:52:35,000 --> 00:52:43,000 U slučaju hrpu, mogao sam izvući ovu učinkovito na zaslonu kao niz. 938 00:52:43,000 --> 00:52:47,000 Ovdje je moj stog. To su moji brojevi. 939 00:52:47,000 --> 00:52:50,000 A mi ćemo ih povući, jer to, to, to, to, to. 940 00:52:50,000 --> 00:52:53,000 I onda imam neke druge podatke član ovdje, 941 00:52:53,000 --> 00:52:58,000 koji se zove veličina, tako da je ovo veličina, a to je broj, 942 00:52:58,000 --> 00:53:02,000 i kolektivno, cijela ipad ovdje predstavlja jedan slog strukturu. 943 00:53:02,000 --> 00:53:07,000 Sada, po defaultu, veličina vjerojatno je dobio inicijalizirane na 0, 944 00:53:07,000 --> 00:53:11,000 i ono što je unutar niza brojeva početku 945 00:53:11,000 --> 00:53:14,000 kad sam prvi put dodijeliti niz? 946 00:53:14,000 --> 00:53:16,000 Odvoz. Tko zna? I to zapravo ne smeta. 947 00:53:16,000 --> 00:53:20,000 Nije važno ako je to 1, 2, 3, 4, 5, potpuno slučajno 948 00:53:20,000 --> 00:53:25,000 po peh pohranjene u mojoj strukturi, jer tako dugo kao što ja znam da je veličina dimnjaka 949 00:53:25,000 --> 00:53:29,000 je 0, onda znam programatski, ne gledati na bilo koji od elemenata u nizu. 950 00:53:29,000 --> 00:53:31,000 Nije važno što je tamo. 951 00:53:31,000 --> 00:53:34,000 Ne gledaj na njih, kao što će biti implikacija veličine od 0. 952 00:53:34,000 --> 00:53:38,000 >> Ali pretpostavimo da sada idem naprijed i umetnite nešto u dimnjaku. 953 00:53:38,000 --> 00:53:42,000 Želim umetnuti broj 5, pa sam stavio broj 5 ovdje, 954 00:53:42,000 --> 00:53:45,000 i onda što sam stavio ovdje dolje? 955 00:53:45,000 --> 00:53:48,000 Sada sam zapravo bi spustio jedan za veličinu, 956 00:53:48,000 --> 00:53:50,000 i sada stog je veličine jedan. 957 00:53:50,000 --> 00:53:53,000 Što ako sam ići naprijed i umetnuti broj, recimo, sedam sljedeći? 958 00:53:53,000 --> 00:53:57,000 To onda dobiva obnovljeno za dva, a onda ćemo napraviti 9, 959 00:53:57,000 --> 00:54:02,000 a onda se dobiva obnovljeno do 3. 960 00:54:02,000 --> 00:54:05,000 No, zanimljiva je značajka sada ove stog je da 961 00:54:05,000 --> 00:54:09,000 Trebao sam to maknuti element koji, ako želim pop 962 00:54:09,000 --> 00:54:12,000 nešto izvan dimnjaka, da se tako izrazim? 963 00:54:12,000 --> 00:54:14,000 9 će biti prva stvar ići. 964 00:54:14,000 --> 00:54:18,000 Kako bi se slika promijeniti ako želim pop element izvan dimnjaka, 965 00:54:18,000 --> 00:54:20,000 volio ladicu u Mather? 966 00:54:20,000 --> 00:54:22,000 Da. >> [Studentski] Set veličina za dva. 967 00:54:22,000 --> 00:54:27,000 Točno, sve sam učiniti je postaviti veličinu 2, i što da radim s nizom? 968 00:54:27,000 --> 00:54:29,000 Nemam ništa učiniti. 969 00:54:29,000 --> 00:54:32,000 Mogao bih, samo da bi se analni, staviti 0 tamo ili -1 ili nešto da označi 970 00:54:32,000 --> 00:54:34,000 da to nije čitljiv vrijednost, ali to ne smeta jer 971 00:54:34,000 --> 00:54:37,000 Ja mogu snimati izvan polja sama koliko je to 972 00:54:37,000 --> 00:54:41,000 tako da znam samo pogledate prva dva elementa u ovom polju. 973 00:54:41,000 --> 00:54:47,000 Sada, ako odem i dodati broj 8 na ovom polju, kako se slika promijeniti sljedeće? 974 00:54:47,000 --> 00:54:50,000 To postaje 8, a to postaje tri. 975 00:54:50,000 --> 00:54:52,000 Ja sam rezanje nekoliko ugla ovdje. 976 00:54:52,000 --> 00:54:56,000 Sada imamo pet, sedam, osam, a mi smo se vratili na veličinu tri. 977 00:54:56,000 --> 00:54:58,000 To je prilično jednostavan za implementaciju, 978 00:54:58,000 --> 00:55:06,000 ali kad ćemo požaliti ovaj dizajn odluku? 979 00:55:06,000 --> 00:55:09,000 Kada stvari počnu ići jako, jako krivo? Da. 980 00:55:09,000 --> 00:55:11,000 [Nečujno učenik odgovor] 981 00:55:11,000 --> 00:55:13,000 Kada želite vratiti i dobiti prvi element ste stavili u. 982 00:55:13,000 --> 00:55:18,000 >> Ispada ovdje iako stog je niz ispod haube, 983 00:55:18,000 --> 00:55:21,000 ove strukture podataka koje smo počeli govoriti o također su općenito poznat kao 984 00:55:21,000 --> 00:55:25,000 apstraktne strukture podataka kojim kako oni provode 985 00:55:25,000 --> 00:55:27,000 potpuno je osim točke. 986 00:55:27,000 --> 00:55:31,000 Struktura podataka kao stog je trebao dodati podršku 987 00:55:31,000 --> 00:55:35,000 Operacije poput pritiskom, koji gura u ladicu na stog, 988 00:55:35,000 --> 00:55:39,000 i pop, koji uklanja element iz dimnjaka, i to je to. 989 00:55:39,000 --> 00:55:43,000 Ako ste bili na preuzimanje tuđe kôd koji se već provodi 990 00:55:43,000 --> 00:55:46,000 ova stvar zove snop, ta osoba bi napisao 991 00:55:46,000 --> 00:55:49,000 samo dvije funkcije za vas, gurati i pop, čiji je jedini cilj u životu 992 00:55:49,000 --> 00:55:51,000 bi učiniti upravo to. 993 00:55:51,000 --> 00:55:54,000 Vi ili njega ili nju koji provodi taj program 994 00:55:54,000 --> 00:55:58,000 bi bio u potpunosti jednom odlučiti kako će provesti 995 00:55:58,000 --> 00:56:00,000 semantika guranje i iskakanje ispod haube 996 00:56:00,000 --> 00:56:03,000 ili funkcionalnost guranje i iskakanje. 997 00:56:03,000 --> 00:56:07,000 I ja sam napravio nešto kratkovidan odluku ovdje 998 00:56:07,000 --> 00:56:10,000 provođenjem moj snop s ovom jednostavnom strukturom podataka zašto? 999 00:56:10,000 --> 00:56:12,000 Kada se ovaj pauzu struktura podataka? 1000 00:56:12,000 --> 00:56:18,000 U kojoj točki moram se vratiti na pogrešku kada korisnik traži pritisak, na primjer? 1001 00:56:18,000 --> 00:56:20,000 [Studentski] Ako nema više prostora. 1002 00:56:20,000 --> 00:56:23,000 Točno, ako nema više prostora, ako sam premašio kapacitet, 1003 00:56:23,000 --> 00:56:27,000 što je sve kape, jer to sugerira da je to neka vrsta globalne konstante. 1004 00:56:27,000 --> 00:56:30,000 Pa, onda sam samo ću reći, "Žao mi je, ne mogu gurnuti još jednu vrijednost 1005 00:56:30,000 --> 00:56:32,000 na dimnjak, "volio u Mather. 1006 00:56:32,000 --> 00:56:36,000 >> U nekom trenutku, oni će pogoditi gornji dio tog malog kabineta. 1007 00:56:36,000 --> 00:56:39,000 Nema više prostora ili kapaciteta u snopu, u kojem trenutku postoji neka vrsta pogreške. 1008 00:56:39,000 --> 00:56:42,000 Oni moraju staviti element negdje drugdje, pladanj negdje drugdje, 1009 00:56:42,000 --> 00:56:44,000 ili nigdje na sve. 1010 00:56:44,000 --> 00:56:47,000 Sada, s red, mogli bismo provesti ga malo drugačije. 1011 00:56:47,000 --> 00:56:50,000 Red je malo drugačije u da se ispod haube, to može biti implementiran 1012 00:56:50,000 --> 00:56:54,000 kao polje, ali zašto, u ovom slučaju, ja predlaganje 1013 00:56:54,000 --> 00:56:59,000 da imaju glavu elementa koji predstavlja glavu na popisu, 1014 00:56:59,000 --> 00:57:06,000 Prednji dio popisa, prva osoba u redu u Apple trgovini, osim veličine? 1015 00:57:06,000 --> 00:57:14,000 Zašto trebam dodatni dio podataka ovdje? 1016 00:57:14,000 --> 00:57:16,000 Sjetite se što je broj 1017 00:57:16,000 --> 00:57:18,000 ako sam nacrtana je kako slijedi. 1018 00:57:18,000 --> 00:57:21,000 Pretpostavimo da je to sada red umjesto stog, 1019 00:57:21,000 --> 00:57:24,000 razlika se, baš kao što su Apple store-red je pošteno. 1020 00:57:24,000 --> 00:57:27,000 Prva osoba u redu na početku popisa, broj 5, u ovom slučaju, 1021 00:57:27,000 --> 00:57:30,000 on ili ona će se pustiti u trgovini na prvom mjestu. 1022 00:57:30,000 --> 00:57:32,000 Ajmo to učiniti. 1023 00:57:32,000 --> 00:57:35,000 Pretpostavimo da je to stanje mog red u ovom trenutku u vremenu, a sada Apple store 1024 00:57:35,000 --> 00:57:39,000 otvara i prva osoba, broj 5, je vodio u trgovini. 1025 00:57:39,000 --> 00:57:43,000 Kako mogu promijeniti sliku sada da sam de-čekanje prvu osobu 1026 00:57:43,000 --> 00:57:47,000 na ispred linije? 1027 00:57:47,000 --> 00:57:50,000 Što je to? >> [Student] Promjena red. 1028 00:57:50,000 --> 00:57:52,000 Promjena glavu, pa pet nestaje. 1029 00:57:52,000 --> 00:57:56,000 U stvarnosti, to je kao da-kako najbolje to učiniti? 1030 00:57:56,000 --> 00:58:00,000 U stvarnosti, to je kao da taj čovjek nestane. 1031 00:58:00,000 --> 00:58:03,000 Što bi broj 7 učiniti u stvarnoj trgovini? 1032 00:58:03,000 --> 00:58:05,000 Oni bi veliki korak naprijed. 1033 00:58:05,000 --> 00:58:08,000 >> No, ono što smo došli da cijenimo kada je u pitanju polja 1034 00:58:08,000 --> 00:58:10,000 i premještati okolo stvari? 1035 00:58:10,000 --> 00:58:12,000 To je vrsta otpada svoje vrijeme, zar ne? 1036 00:58:12,000 --> 00:58:16,000 Zašto moraš biti tako analni kao da imaju prvu osobu 1037 00:58:16,000 --> 00:58:21,000 na početku linije na fizički početku komad memorije? 1038 00:58:21,000 --> 00:58:23,000 To je potpuno nepotrebno. Zašto? 1039 00:58:23,000 --> 00:58:26,000 Što sam mogao samo sjetiti umjesto toga? >> [Nečujno učenik odgovor] 1040 00:58:26,000 --> 00:58:30,000 Točno, samo sam se mogao sjetiti s ovim dodatnim podacima član glave 1041 00:58:30,000 --> 00:58:34,000 da je sada na čelu popisa više nije 0, što je bio trenutak prije. 1042 00:58:34,000 --> 00:58:39,000 Sada je zapravo broj 1. Na taj način, JA dobiti blagi optimizaciju. 1043 00:58:39,000 --> 00:58:44,000 Samo zato što sam de-čekanje nekoga od linije na početku linije na Apple Store 1044 00:58:44,000 --> 00:58:47,000 ne znači da svatko ima pomak, koji je opoziv linearna operacija. 1045 00:58:47,000 --> 00:58:50,000 Ja umjesto toga može provesti stalnu vrijeme samo 1046 00:58:50,000 --> 00:58:53,000 i postići onda puno brži odgovor. 1047 00:58:53,000 --> 00:58:56,000 Ali cijena plaćam je ono što se dobije taj dodatni rad 1048 00:58:56,000 --> 00:58:58,000 a ne da se pomaknuti sve? 1049 00:58:58,000 --> 00:59:01,000 Da. >> [Nečujno učenik odgovor] 1050 00:59:01,000 --> 00:59:04,000 Mogu dodati više ljudi, dobro, to je problem ortogonalna 1051 00:59:04,000 --> 00:59:07,000 na činjenicu da nismo pomicanja ljude oko sebe. 1052 00:59:07,000 --> 00:59:11,000 To je još uvijek polje, pa da li ili ne možemo pomaknuti sve ili ne- 1053 00:59:11,000 --> 00:59:13,000 oh, vidim ono što misliš, ok. 1054 00:59:13,000 --> 00:59:16,000 Zapravo, slažem se s onim što si rekao u da je to gotovo kao da 1055 00:59:16,000 --> 00:59:19,000 mi smo sada nikada neće koristiti početak ovog niza više 1056 00:59:19,000 --> 00:59:22,000 jer ako sam ukloniti pet, onda sam ukloniti sedam. 1057 00:59:22,000 --> 00:59:24,000 Ali ja sam samo staviti ljude na desno. 1058 00:59:24,000 --> 00:59:28,000 >> To se osjeća kao da sam gubit prostor, i na kraju moj red dezintegrira u ništa at svi, 1059 00:59:28,000 --> 00:59:31,000 tako da smo samo mogli imati ljudi spustili, 1060 00:59:31,000 --> 00:59:35,000 i da bismo mogli razmišljati o tom obilju stvarno kao neka vrsta kružnog strukture, 1061 00:59:35,000 --> 00:59:38,000 ali mi koristimo što operator u C učiniti takvo spustili? 1062 00:59:38,000 --> 00:59:40,000 [Nečujno učenik odgovor] >> modulo operator. 1063 00:59:40,000 --> 00:59:43,000 To bi bilo malo neugodno razmisliti kako ćete učiniti na spustili, 1064 00:59:43,000 --> 00:59:46,000 ali možemo to učiniti, i da bismo mogli početi stavljanjem ljude na ono što je nekad bila ispred linije, 1065 00:59:46,000 --> 00:59:52,000 ali mi samo sjetiti s ovim glave varijable koji je stvarni šef liniji zapravo je. 1066 00:59:52,000 --> 00:59:57,000 Što ako, umjesto toga, naš cilj u konačnici, ipak, 1067 00:59:57,000 --> 01:00:00,000 je potražiti brojeve, kao što smo učinili ovdje na pozornici s Anita, 1068 01:00:00,000 --> 01:00:02,000 ali mi stvarno želite najbolje od svih tih svjetova? 1069 01:00:02,000 --> 01:00:05,000 Želimo više sofisticiranosti nego niz dopušta 1070 01:00:05,000 --> 01:00:09,000 jer želimo sposobnost dinamički raste strukturu podataka. 1071 01:00:09,000 --> 01:00:12,000 No, mi ne želimo da morati posegnuti za nečim što smo istaknuli 1072 01:00:12,000 --> 01:00:15,000 u prvom predavanju nije bio optimalan algoritam, 1073 01:00:15,000 --> 01:00:17,000 da linearnog pretraživanja. 1074 01:00:17,000 --> 01:00:21,000 Ispada da možete, u stvari, postigla 1075 01:00:21,000 --> 01:00:24,000 ili barem blizu stalnom vrijeme, pri čemu netko poput Anita, 1076 01:00:24,000 --> 01:00:27,000 ako ona konfigurira joj strukturu podataka neće biti povezana lista, 1077 01:00:27,000 --> 01:00:30,000 ne biti stog, da ne bude red, mogao, u stvari, 1078 01:00:30,000 --> 01:00:33,000 dolazi do strukture podataka koji omogućuje joj da izgleda gore stvari, 1079 01:00:33,000 --> 01:00:37,000 čak i riječi, a ne samo brojevi, u kojoj ćemo pozvati stalnu vremena. 1080 01:00:37,000 --> 01:00:40,000 >> A u stvari, gleda naprijed, jedan od psets u ovoj klasi je gotovo uvijek 1081 01:00:40,000 --> 01:00:43,000 provedba provjere pravopisa, kojim 1082 01:00:43,000 --> 01:00:46,000 mi vam dati opet neke 150.000 engleskih riječi, a cilj je da 1083 01:00:46,000 --> 01:00:51,000 učitavanje onima u memoriju i brzo biti u mogućnosti odgovoriti na pitanja u obrascu 1084 01:00:51,000 --> 01:00:54,000 je ova riječ ispravno napisane? 1085 01:00:54,000 --> 01:00:58,000 I to bi stvarno sisati ako ste morali ponoviti kroz sve 150.000 riječima odgovoriti. 1086 01:00:58,000 --> 01:01:02,000 Ali, u stvari, vidjet ćemo što možemo učiniti u vrlo, vrlo kratkom vremenu. 1087 01:01:02,000 --> 01:01:06,000 I to će uključivati ​​provedbene nešto što se zove hash tablicu, 1088 01:01:06,000 --> 01:01:09,000 i iako na prvi pogled ova stvar zove hash tablicu će se 1089 01:01:09,000 --> 01:01:12,000 neka nam se postigla ove super brzi odgovor puta, 1090 01:01:12,000 --> 01:01:18,000 Ispada da je u stvari problem. 1091 01:01:18,000 --> 01:01:23,000 Kada dođe vrijeme za provedbu ovu stvar zvanu-opet, ja ću to opet. 1092 01:01:23,000 --> 01:01:25,000 Ja sam jedini ovdje. 1093 01:01:25,000 --> 01:01:28,000 Kad je u pitanju vrijeme za provedbu ovu stvar zove hash tablicu, 1094 01:01:28,000 --> 01:01:30,000 ćemo morati donijeti odluku. 1095 01:01:30,000 --> 01:01:32,000 Koliki bi ova stvar zapravo biti? 1096 01:01:32,000 --> 01:01:36,000 A kad počnemo umetanje brojeva u ovom hash tablicu, 1097 01:01:36,000 --> 01:01:38,000 kako ćemo ih pohraniti na takav način 1098 01:01:38,000 --> 01:01:42,000 da ih možemo dobiti natrag kao brzo kao što smo ih dobili u? 1099 01:01:42,000 --> 01:01:45,000 No, vidjet ćemo još mnogo prije nego što je to pitanje od 1100 01:01:45,000 --> 01:01:48,000 kada svačija rođendan je u razredu će biti vrlo povezan. 1101 01:01:48,000 --> 01:01:51,000 Ispada da je u ovoj sobi, imamo nekoliko stotina ljudi, 1102 01:01:51,000 --> 01:01:56,000 pa su izgledi da nas dvoje imaju isti rođendan je vjerojatno prilično visoka. 1103 01:01:56,000 --> 01:01:58,000 Što ako je bilo samo 40 od ​​nas u ovoj sobi? 1104 01:01:58,000 --> 01:02:02,000 Kakvi su izgledi za dvije osobe imaju isti rođendan? 1105 01:02:02,000 --> 01:02:04,000 [Studenti] Preko 50%. 1106 01:02:04,000 --> 01:02:06,000 Da, preko 50%. U stvari, čak sam donio grafikona. 1107 01:02:06,000 --> 01:02:08,000 Ispada, a to je zapravo samo doušnik pregled- 1108 01:02:08,000 --> 01:02:12,000 ako postoji samo 58 od nas u ovoj sobi, vjerojatnost dvije od nas 1109 01:02:12,000 --> 01:02:16,000 imaju isti rođendan je iznimno visoka, gotovo 100%, 1110 01:02:16,000 --> 01:02:20,000 i da će izazvati hrpu ozlijeđen za nas u srijedu. 1111 01:02:20,000 --> 01:02:24,000 >> Sa taj je rekao, hajdemo odgoditi ovdje. Vidimo se u srijedu. 1112 01:02:24,000 --> 01:02:28,000 [Pljesak] 1113 01:02:28,000 --> 01:02:30,000 [CS50.TV]