1 00:00:00,000 --> 00:00:00,500 2 00:00:00,500 --> 00:00:01,900 [CHWARAE CERDDORIAETH] 3 00:00:01,900 --> 00:00:05,710 4 00:00:05,710 --> 00:00:09,150 >> DOUG LLOYD: Erbyn hyn yr ydych yn gwybod llawer am araeau, 5 00:00:09,150 --> 00:00:11,610 a ydych yn gwybod llawer am restrau cysylltiedig. 6 00:00:11,610 --> 00:00:13,650 Ac rydym wedi trafod y manteision ac anfanteision, rydym wedi 7 00:00:13,650 --> 00:00:16,620 trafodwyd a oedd yn cysylltu rhestri yn gallu cael mwy a llai, 8 00:00:16,620 --> 00:00:18,630 ond maent yn cymryd mwy maint. 9 00:00:18,630 --> 00:00:22,359 Araeau yn llawer mwy syml i'w defnyddio, ond maent yn gyfyngol mewn cymaint 10 00:00:22,359 --> 00:00:24,900 fel yr ydym wedi gosod maint yr amrywiaeth ar y cychwyn cyntaf 11 00:00:24,900 --> 00:00:26,910 ac yna rydym yn sownd ag ef. 12 00:00:26,910 --> 00:00:30,470 >> Ond dyna, rydym wedi 'n bert lawer dihysbyddu ein holl bynciau 13 00:00:30,470 --> 00:00:33,040 am restrau cysylltiedig a arrays. 14 00:00:33,040 --> 00:00:34,950 Neu mae'n rhaid i ni? 15 00:00:34,950 --> 00:00:37,720 Efallai y gallwn wneud rhywbeth hyd yn oed yn fwy creadigol. 16 00:00:37,720 --> 00:00:40,950 A'r math yna o benthyg y syniad o dabl hash. 17 00:00:40,950 --> 00:00:46,680 >> Felly, mewn tabl hash rydyn ni'n mynd i roi cynnig ar cyfuno amrywiaeth gyda rhestr cysylltiedig. 18 00:00:46,680 --> 00:00:49,520 Rydym yn mynd i gymryd y manteision y rhesi, fel mynediad ar hap, 19 00:00:49,520 --> 00:00:53,510 y gallu i jyst yn mynd i amrywiaeth Elfen 4 neu array elfen 8 20 00:00:53,510 --> 00:00:55,560 heb orfod ailadrodd ar draws. 21 00:00:55,560 --> 00:00:57,260 Dyna 'n bert gyflym, dde? 22 00:00:57,260 --> 00:01:00,714 >> Ond rydym hefyd eisiau cael ein data strwythur yn gallu tyfu ac yn crebachu. 23 00:01:00,714 --> 00:01:02,630 Nid oes angen i ni, nid ydym yn ei wneud eisiau cael eu cyfyngu. 24 00:01:02,630 --> 00:01:04,588 Ac rydym am fod yn gallu i ychwanegu a dileu pethau 25 00:01:04,588 --> 00:01:08,430 yn hawdd iawn, ac os ydych yn cofio, yn gymhleth iawn gydag amrywiaeth. 26 00:01:08,430 --> 00:01:11,650 A gall rydym yn galw hyn beth newydd tabl hash. 27 00:01:11,650 --> 00:01:15,190 >> Ac os gweithredu'n gywir, rydym yn fath o gymryd 28 00:01:15,190 --> 00:01:18,150 y manteision o ddau ddata strwythurau rydych chi wedi gweld yn barod, 29 00:01:18,150 --> 00:01:19,880 araeau a rhestrau cysylltiedig. 30 00:01:19,880 --> 00:01:23,070 Gall Mewnosod ddechrau yn tueddu tuag at theta o 1. 31 00:01:23,070 --> 00:01:26,207 Theta nid ydym wedi trafod mewn gwirionedd, ond theta yn unig yw yr achos ar gyfartaledd, 32 00:01:26,207 --> 00:01:27,540 beth mewn gwirionedd yn mynd i ddigwydd. 33 00:01:27,540 --> 00:01:29,680 Nid ydych bob amser yn mynd i yn cael y sefyllfa waethaf, 34 00:01:29,680 --> 00:01:32,555 ac nad ydych yn bob amser yn mynd i gael y senario achos gorau, felly beth 35 00:01:32,555 --> 00:01:33,900 y senario ar gyfartaledd? 36 00:01:33,900 --> 00:01:36,500 >> Wel mae mewnosod ar gyfartaledd mewn tabl hash 37 00:01:36,500 --> 00:01:39,370 Gall dechrau i ddod yn agos i'w gilydd yn gyson. 38 00:01:39,370 --> 00:01:41,570 A gall dileu gael cau i dro cyson. 39 00:01:41,570 --> 00:01:44,440 A gall ei gael am-edrych cau i dro cyson. 40 00:01:44,440 --> 00:01:48,600 That's-- nid oes gennym ddata strwythur eto a all wneud hynny, 41 00:01:48,600 --> 00:01:51,180 ac felly mae hyn eisoes yn swnio fel rhywbeth 'n bert da. 42 00:01:51,180 --> 00:01:57,010 Rydym wedi lliniaru mewn gwirionedd yn y anfanteision pob un ar ei ben ei hun. 43 00:01:57,010 --> 00:01:59,160 >> I gael y perfformiad hwn uwchraddio fodd bynnag, rydym yn 44 00:01:59,160 --> 00:02:03,580 angen i ni ailystyried sut rydym yn ychwanegu data i mewn i'r strwythur. 45 00:02:03,580 --> 00:02:07,380 Yn benodol rydym am i'r data ei hun i ddweud wrthym 46 00:02:07,380 --> 00:02:09,725 ble y dylai fynd yn y strwythur. 47 00:02:09,725 --> 00:02:12,850 Ac os ydym, yna mae angen i weld a yw'n mewn strwythur, os bydd angen i ddod o hyd iddo, 48 00:02:12,850 --> 00:02:16,610 rydym am edrych ar y data eto a gallu yn effeithiol, 49 00:02:16,610 --> 00:02:18,910 ddefnyddio'r data, ar hap gael gafael arno. 50 00:02:18,910 --> 00:02:20,700 Dim ond drwy edrych ar y data dylem gael 51 00:02:20,700 --> 00:02:25,890 syniad o ble yn union rydym yn mynd i ddod o hyd iddo yn y tabl hash. 52 00:02:25,890 --> 00:02:28,770 >> Nawr bod y Anfantais hash tabl yw eu bod yn wirioneddol 53 00:02:28,770 --> 00:02:31,770 eithaf gwael yn archebu neu'n didoli data. 54 00:02:31,770 --> 00:02:34,970 Ac yn wir, os byddwch yn dechrau i'w defnyddio i archebu neu ddidoli 55 00:02:34,970 --> 00:02:37,990 data byddwch yn colli pob un o'r manteision i chi o'r blaen 56 00:02:37,990 --> 00:02:40,710 Roedd yn nhermau mewnosod a dileu. 57 00:02:40,710 --> 00:02:44,060 Mae'r amser yn dod yn nes at theta o n, ac rydym wedi bôn 58 00:02:44,060 --> 00:02:45,530 llithro'n ōl i mewn i restr cysylltiedig. 59 00:02:45,530 --> 00:02:48,850 Ac felly rydym yn unig am eu defnyddio hash tablau os nad ydym yn poeni am 60 00:02:48,850 --> 00:02:51,490 a yw'r data yn cael ei datrys. 61 00:02:51,490 --> 00:02:54,290 Ar gyfer y cyd-destun y byddwch yn eu defnyddio yn CS50 62 00:02:54,290 --> 00:02:58,900 mae'n debyg nad oes ots bod y data yn cael ei datrys. 63 00:02:58,900 --> 00:03:03,170 >> Felly tabl hash yn gyfuniad o ddau ddarn ar wahân 64 00:03:03,170 --> 00:03:04,980 rydym yn gyfarwydd â hwy. 65 00:03:04,980 --> 00:03:07,930 Y cyntaf yn swyddogaeth, a oedd yn Fel arfer, rydym yn galw swyddogaeth hash. 66 00:03:07,930 --> 00:03:11,760 A bod swyddogaeth hash yn mynd i dychwelyd rhywfaint cyfanrif heb fod yn negyddol, a oedd yn 67 00:03:11,760 --> 00:03:14,870 Fel arfer, rydym yn galw hashcode, OK? 68 00:03:14,870 --> 00:03:20,230 Mae'r ail ddarn yn array, sydd yn gallu storio data o'r math yr ydym 69 00:03:20,230 --> 00:03:22,190 yn awyddus i roi i mewn i'r strwythur data. 70 00:03:22,190 --> 00:03:24,310 Byddwn yn dal i ffwrdd ar y cysylltu elfen rhestr ar hyn o bryd 71 00:03:24,310 --> 00:03:27,810 a dim ond dechrau gyda'r pethau sylfaenol o hash tabl i gael eich pen o'i gwmpas, 72 00:03:27,810 --> 00:03:30,210 ac yna byddwn efallai chwythu eich meddwl ychydig bach pan fyddwn 73 00:03:30,210 --> 00:03:32,920 cyfuno araeau a rhestrau cyswllt at ei gilydd. 74 00:03:32,920 --> 00:03:35,590 >> Y syniad sylfaenol er yw ein cymryd rhywfaint o ddata. 75 00:03:35,590 --> 00:03:37,860 Rydym yn cynnal y data hynny drwy y swyddogaeth hash. 76 00:03:37,860 --> 00:03:41,980 Ac felly mae'r data yn cael ei brosesu ac mae'n poeri allan nifer, OK? 77 00:03:41,980 --> 00:03:44,890 Ac yna gyda nifer hwnnw rydym yn unig storio'r data 78 00:03:44,890 --> 00:03:48,930 rydym am i storio yn y amrywiaeth yn y lleoliad hwnnw. 79 00:03:48,930 --> 00:03:53,990 Felly, er enghraifft mae gennym efallai y tabl hwn hash o dannau. 80 00:03:53,990 --> 00:03:57,350 Mae'n got 10 elfen ynddo, felly gallwn ffitio 10 dannau ynddo. 81 00:03:57,350 --> 00:03:59,320 >> Lets 'ddeud rydym am hash John. 82 00:03:59,320 --> 00:04:02,979 Felly John gan fod y data yr ydym am i fewnosod i mewn i dabl hash hwn yn rhywle. 83 00:04:02,979 --> 00:04:03,770 Ble rydym yn ei roi? 84 00:04:03,770 --> 00:04:05,728 Wel fel arfer gyda amrywiaeth hyd yn hyn rydym yn ôl pob tebyg 85 00:04:05,728 --> 00:04:07,610 Byddai roi yn lleoliad array 0. 86 00:04:07,610 --> 00:04:09,960 Ond yn awr mae gennym y swyddogaeth hash newydd. 87 00:04:09,960 --> 00:04:13,180 >> A gadewch i ni ddweud ein bod yn rhedeg John drwy swyddogaeth hash hon 88 00:04:13,180 --> 00:04:15,417 ac mae'n poeri allan 4. 89 00:04:15,417 --> 00:04:17,500 Wel dyna lle rydym yn mynd i eisiau rhoi John. 90 00:04:17,500 --> 00:04:22,050 Rydym yn awyddus i roi John yn y lleoliad array 4, oherwydd os ydym yn hash John again-- 91 00:04:22,050 --> 00:04:23,810 gadewch i ni ddweud yn ddiweddarach rydym yn am ei chwilio a gweld 92 00:04:23,810 --> 00:04:26,960 os John yn bodoli yn hash hwn table-- pob mae angen i ni ei wneud 93 00:04:26,960 --> 00:04:30,310 yn cael ei rhedeg drwy'r un hash swyddogaeth, yn cael y rhif 4 allan, 94 00:04:30,310 --> 00:04:33,929 ac yn gallu canfod John ar unwaith yn ein strwythur data. 95 00:04:33,929 --> 00:04:34,720 Dyna 'n bert da. 96 00:04:34,720 --> 00:04:36,928 >> Lets 'ddeud ein bod yn awr yn gwneud hyn eto, rydym am hash Paul. 97 00:04:36,928 --> 00:04:39,446 Rydym eisiau ychwanegu Paul i mewn i dabl hash hwn. 98 00:04:39,446 --> 00:04:42,070 Lets 'ddeud bod y cyfnod hwn rydym yn cynnal Paul drwy'r swyddogaeth hash, 99 00:04:42,070 --> 00:04:44,600 mae'r hashcode a gynhyrchir yw 6. 100 00:04:44,600 --> 00:04:47,340 Wel nawr gallwn roi Paul yn y lleoliad array 6. 101 00:04:47,340 --> 00:04:50,040 Ac os bydd angen i edrych i fyny a yw Mae Paul yn yn nhabl hash hwn, 102 00:04:50,040 --> 00:04:53,900 i gyd mae angen i ni ei wneud yn cael ei redeg Paul drwy'r swyddogaeth hash eto 103 00:04:53,900 --> 00:04:55,830 ac rydym yn mynd i gael 6 allan eto. 104 00:04:55,830 --> 00:04:57,590 >> Ac yna rydym yn dim ond yn edrych yn y lleoliad array 6. 105 00:04:57,590 --> 00:04:58,910 A yw Paul yno? 106 00:04:58,910 --> 00:05:00,160 Os felly, mae yn y tabl hash. 107 00:05:00,160 --> 00:05:01,875 A yw Paul does? 108 00:05:01,875 --> 00:05:03,000 Dyw e ddim yn yn y tabl hash. 109 00:05:03,000 --> 00:05:05,720 Mae'n eithaf syml. 110 00:05:05,720 --> 00:05:07,770 >> Nawr, sut ydych chi'n diffinio swyddogaeth hash? 111 00:05:07,770 --> 00:05:11,460 Wel does 'n sylweddol oes terfyn ar nifer o swyddogaethau hash posibl. 112 00:05:11,460 --> 00:05:14,350 Yn wir mae 'na nifer o mewn gwirionedd, rhai gwirioneddol dda ar y rhyngrwyd. 113 00:05:14,350 --> 00:05:17,560 Mae 'na nifer o mewn gwirionedd, rhai drwg iawn ar y rhyngrwyd. 114 00:05:17,560 --> 00:05:21,080 Mae hefyd yn eithaf hawdd i ysgrifennu un drwg. 115 00:05:21,080 --> 00:05:23,760 >> Felly beth sy'n gwneud i fyny yn dda swyddogaeth hash, dde? 116 00:05:23,760 --> 00:05:27,280 Wel dylai swyddogaeth hash da defnyddio dim ond y data sy'n cael eu hashed, 117 00:05:27,280 --> 00:05:29,420 a phob un o'r data sy'n cael eu hashed. 118 00:05:29,420 --> 00:05:32,500 Felly nid ydym am eu defnyddio anything-- nid ydym yn ymgorffori unrhyw beth 119 00:05:32,500 --> 00:05:35,560 arall heblaw am y data. 120 00:05:35,560 --> 00:05:37,080 Ac rydym eisiau defnyddio holl ddata. 121 00:05:37,080 --> 00:05:39,830 Nid ydym am i ddim ond defnyddio darn ohono, rydym eisiau defnyddio cyfan ohono. 122 00:05:39,830 --> 00:05:41,710 Swyddogaeth hash dylai hefyd fod yn benderfynedig. 123 00:05:41,710 --> 00:05:42,550 Beth yw ystyr hynny? 124 00:05:42,550 --> 00:05:46,200 Wel mae'n golygu bod pob tro y byddwn yn pasio'r union un darn o ddata 125 00:05:46,200 --> 00:05:50,040 i mewn i'r swyddogaeth hash byddwn bob amser yn yn cael yr un hashcode allan. 126 00:05:50,040 --> 00:05:52,870 Os byddaf yn mynd heibio John i mewn i'r swyddogaeth hash Rwy'n cael allan 4. 127 00:05:52,870 --> 00:05:56,110 Dylwn fod yn gallu gwneud hynny 10,000 amserau a byddaf bob amser yn cael 4. 128 00:05:56,110 --> 00:06:00,810 Felly nid oes rhifau ar hap yn effeithiol Gall fod yn rhan o'n hash tables-- 129 00:06:00,810 --> 00:06:02,750 yn ein swyddogaethau hash. 130 00:06:02,750 --> 00:06:05,750 >> Dylai Swyddogaeth hash hefyd unffurf dosbarthu data. 131 00:06:05,750 --> 00:06:09,700 Os bob tro y byddwch yn rhedeg y data trwy'r swyddogaeth hash i chi gael y hashcode 0, 132 00:06:09,700 --> 00:06:11,200 dyna debyg nad mor fawr, dde? 133 00:06:11,200 --> 00:06:14,600 Mae'n debyg y byddwch am i fawr amrediad o godau hash. 134 00:06:14,600 --> 00:06:17,190 Hefyd, gall pethau gael eu lledaenu allan drwy gydol y tabl. 135 00:06:17,190 --> 00:06:23,210 A hefyd y byddai'n wych os 'n sylweddol data tebyg, fel John a Jonathan, 136 00:06:23,210 --> 00:06:26,320 efallai eu gwasgaru i bwyso a mesur gwahanol leoliadau yn y tabl hash. 137 00:06:26,320 --> 00:06:28,750 Byddai hynny yn fantais 'n glws. 138 00:06:28,750 --> 00:06:31,250 >> Dyma enghraifft o un o swyddogaethau hash. 139 00:06:31,250 --> 00:06:33,150 Ysgrifennais yr un yma yn gynharach. 140 00:06:33,150 --> 00:06:35,047 Nid yw'n arbennig swyddogaeth hash da 141 00:06:35,047 --> 00:06:37,380 am resymau nad ydynt mewn gwirionedd arth yn mynd i mewn ar hyn o bryd. 142 00:06:37,380 --> 00:06:41,040 Ond a ydych yn gweld beth sy'n digwydd yma? 143 00:06:41,040 --> 00:06:44,420 Mae'n ymddangos fel ein bod yn datgan newidyn Gelwir swm a gosod ei hafal i 0. 144 00:06:44,420 --> 00:06:50,010 Ac yna mae'n debyg fy mod yn gwneud rhywbeth ar yr amod nad strstr [j] yn hafal 145 00:06:50,010 --> 00:06:52,490 i slaes 0. 146 00:06:52,490 --> 00:06:54,870 Beth ydw i'n ei wneud yno? 147 00:06:54,870 --> 00:06:57,440 >> Mae hyn yn y bôn yn unig un arall ffordd o weithredu [? strl?] 148 00:06:57,440 --> 00:06:59,773 a chanfod pan eich bod wedi cyrraedd diwedd y llinyn. 149 00:06:59,773 --> 00:07:02,480 Felly nid oes rhaid i Fi 'n weithredol cyfrifo hyd y llinyn, 150 00:07:02,480 --> 00:07:05,640 Im 'jyst yn defnyddio pan fyddaf yn cyrraedd y slaes 0 gymeriad yr wyf yn gwybod 151 00:07:05,640 --> 00:07:07,185 Rydw i wedi cyrraedd diwedd y llinyn. 152 00:07:07,185 --> 00:07:09,560 Ac yna dwi'n mynd i gadw ailadrodd drwy'r llinyn, 153 00:07:09,560 --> 00:07:15,310 gan ychwanegu strstr [j] i grynhoi, ac yna yn y diwedd y dydd yn mynd i ddychwelyd swm mod 154 00:07:15,310 --> 00:07:16,200 HASH_MAX. 155 00:07:16,200 --> 00:07:18,700 >> Yn y bôn yr holl hash hwn swyddogaeth yn ei wneud yn ychwanegu i fyny 156 00:07:18,700 --> 00:07:23,450 pob un o'r gwerthoedd ASCII o fy llinyn, ac yna mae'n 157 00:07:23,450 --> 00:07:26,390 dychwelyd rhywfaint hashcode modded gan HASH_MAX. 158 00:07:26,390 --> 00:07:29,790 Mae'n debyg mai dyma'r maint fy array, dde? 159 00:07:29,790 --> 00:07:33,160 Nid wyf am i fod yn mynd hash Codau os yw fy casgliad o faint 10, 160 00:07:33,160 --> 00:07:35,712 Dydw i ddim eisiau bod yn cael Codau hash allan 11, 12, 161 00:07:35,712 --> 00:07:38,690 13, ni allaf roi pethau mewn lleoliadau hynny y rhesi, 162 00:07:38,690 --> 00:07:39,790 a fyddai'n anghyfreithlon. 163 00:07:39,790 --> 00:07:42,130 Id 'yn dioddef nam segmentu. 164 00:07:42,130 --> 00:07:45,230 >> Nawr dyma un arall gyflym neilltu. 165 00:07:45,230 --> 00:07:48,470 Yn gyffredinol, mae'n debyg nad yn mynd i am ysgrifennu eich swyddogaethau hash hun. 166 00:07:48,470 --> 00:07:50,997 Mae'n mewn gwirionedd yn dipyn o yn gelfyddyd, nid gwyddoniaeth. 167 00:07:50,997 --> 00:07:52,580 Ac mae llawer sy'n mynd i mewn iddynt. 168 00:07:52,580 --> 00:07:55,288 Mae'r rhyngrwyd, fel y dywedais, yn llawn swyddogaethau hash gwirioneddol dda, 169 00:07:55,288 --> 00:07:58,470 a dylech ddefnyddio'r rhyngrwyd i dod o hyd i swyddogaethau hash oherwydd ei fod yn wir yn 170 00:07:58,470 --> 00:08:03,230 yn unig fath o diangen wastraff amser i greu eich hun. 171 00:08:03,230 --> 00:08:05,490 >> Gallwch ysgrifennu rhai syml at ddibenion profi. 172 00:08:05,490 --> 00:08:08,323 Ond pan fyddwch mewn gwirionedd yn mynd i dechrau stwnsio data a'i storio 173 00:08:08,323 --> 00:08:10,780 mewn tabl hash eich bod yn yn ôl pob tebyg yn mynd i eisiau 174 00:08:10,780 --> 00:08:14,580 i ddefnyddio rhai swyddogaeth a gynhyrchwyd i chi, sy'n bodoli ar y rhyngrwyd. 175 00:08:14,580 --> 00:08:17,240 Os ydych yn unig fod yn siŵr i ddyfynnu eich ffynonellau. 176 00:08:17,240 --> 00:08:21,740 Does dim rheswm i plagiarize unrhyw beth yma. 177 00:08:21,740 --> 00:08:25,370 >> Mae'r gymuned cyfrifiadureg yn bendant yn tyfu, ac yn wir gwerthoedd 178 00:08:25,370 --> 00:08:28,796 ffynhonnell agored, ac mae'n bwysig iawn i ddyfynnu eich ffynonellau fel bod pobl 179 00:08:28,796 --> 00:08:30,670 Gall gael priodoliad am y gwaith y maent yn 180 00:08:30,670 --> 00:08:32,312 wneud er budd y gymuned. 181 00:08:32,312 --> 00:08:34,020 Felly bob amser yn sure-- ac nid dim ond ar gyfer hash 182 00:08:34,020 --> 00:08:37,270 swyddogaethau, ond yn gyffredinol pan fyddwch yn defnyddio cod o ffynhonnell allanol, 183 00:08:37,270 --> 00:08:38,299 bob amser ddyfynnu eich ffynhonnell. 184 00:08:38,299 --> 00:08:43,500 Yn rhoi credyd i'r person a wnaeth rhywfaint o'r gwaith fel nad oes rhaid i chi. 185 00:08:43,500 --> 00:08:46,720 >> Iawn felly gadewch i ni edrych eto ar hyn tabl hash am eiliad. 186 00:08:46,720 --> 00:08:48,780 Dyma lle ni adael i ffwrdd ar ôl i ni mewnosod 187 00:08:48,780 --> 00:08:53,300 John a Paul i mewn i dabl hash hwn. 188 00:08:53,300 --> 00:08:55,180 A ydych yn gweld problem yma? 189 00:08:55,180 --> 00:08:58,410 Efallai y byddwch yn gweld dau. 190 00:08:58,410 --> 00:09:02,240 Ond yn benodol, a ydych gweld problem posibl hwn? 191 00:09:02,240 --> 00:09:06,770 >> Beth os byddaf yn hash Ringo, ac mae'n ymddangos bod ar ôl prosesu 192 00:09:06,770 --> 00:09:14,000 data hwnnw drwy'r swyddogaeth hash Ringo hefyd yn cynhyrchu y hashcode 6. 193 00:09:14,000 --> 00:09:16,810 Rwyf eisoes wedi cael data ar Lleoliad amrywiaeth hashcode-- 6. 194 00:09:16,810 --> 00:09:22,000 Felly, mae'n fwy na thebyg yn mynd i fod ychydig yn o broblem i mi nawr, dde? 195 00:09:22,000 --> 00:09:23,060 >> Rydym yn galw hyn yn gwrthdrawiad. 196 00:09:23,060 --> 00:09:26,460 Ac y gwrthdrawiad yn digwydd pan fydd dau darnau o ddata yn rhedeg drwy'r un hash 197 00:09:26,460 --> 00:09:29,200 swyddogaeth cynnyrch yr un hashcode. 198 00:09:29,200 --> 00:09:32,850 Yn ôl pob tebyg yr ydym yn dal yn awyddus i gael y ddau darnau o ddata yn y tabl hash, 199 00:09:32,850 --> 00:09:36,330 fel arall ni fyddem yn cynnal Ringo fympwyol drwy'r swyddogaeth hash. 200 00:09:36,330 --> 00:09:40,870 Rydym yn ôl pob tebyg am gael Ringo i mewn i'r casgliad. 201 00:09:40,870 --> 00:09:46,070 >> Sut rydym yn ei wneud fodd bynnag, os yw ef a Paul y ddau gynnyrch hashcode 6? 202 00:09:46,070 --> 00:09:49,520 Nid ydym am ei throsysgrifo Paul, rydym am i Paul fod yno hefyd. 203 00:09:49,520 --> 00:09:52,790 Felly mae angen i ddod o hyd i ffordd i gael elfennau yn y tabl hash sy'n 204 00:09:52,790 --> 00:09:56,550 dal cyffeithiau ein cyflym mewnosod a edrych yn sydyn i fyny. 205 00:09:56,550 --> 00:10:01,350 Ac un ffordd i ddelio ag ef yw gwneud rhywbeth a elwir yn llinol treiddgar. 206 00:10:01,350 --> 00:10:04,170 >> Gan ddefnyddio'r dull hwn os oes gennym gwrthdrawiad, wel, beth ydym yn ei wneud? 207 00:10:04,170 --> 00:10:08,580 Wel ni allwn ei roi mewn lleoliad array 6, neu beth bynnag hashcode ei greu, 208 00:10:08,580 --> 00:10:10,820 gadewch i ni ei roi ar hashcode ac 1. 209 00:10:10,820 --> 00:10:13,670 Ac os dyna osod llawn ei roi mewn hashcode a 2. 210 00:10:13,670 --> 00:10:17,420 Mantais o fod hwn os ei fod yn Nid yw union lle yr ydym yn meddwl ei fod yn, 211 00:10:17,420 --> 00:10:20,850 ac mae'n rhaid i ni ddechrau chwilio, efallai nad oes gennym i mynd yn rhy bell. 212 00:10:20,850 --> 00:10:23,900 Efallai nad oes gennym i chwilio holl elfennau'r n o'r tabl hash. 213 00:10:23,900 --> 00:10:25,790 Efallai mae'n rhaid i ni chwilio un neu ddau ohonynt. 214 00:10:25,790 --> 00:10:30,680 >> Ac felly rydym yn dal i dueddu tuag at yr achos ar gyfartaledd yn agos at 1 vs 215 00:10:30,680 --> 00:10:34,280 yn agos at n, felly efallai y bydd yn gweithio. 216 00:10:34,280 --> 00:10:38,010 Felly, gadewch i ni weld sut mae hyn yn Gallai gweithio allan mewn gwirionedd. 217 00:10:38,010 --> 00:10:41,460 A gadewch i ni weld os efallai y gallwn ganfod y broblem allai ddigwydd yma. 218 00:10:41,460 --> 00:10:42,540 >> Lets 'ddeud ein bod hash Bart. 219 00:10:42,540 --> 00:10:45,581 Felly nawr rydym yn mynd i redeg set newydd o linynnau drwy'r swyddogaeth hash, 220 00:10:45,581 --> 00:10:48,460 ac rydym yn rhedeg Bart drwy'r hash swyddogaeth, rydym yn cael hashcode 6. 221 00:10:48,460 --> 00:10:52,100 Rydym yn cymryd golwg, rydym yn gweld 6 yw'r gwag, fel y gallwn roi Bart yno. 222 00:10:52,100 --> 00:10:55,410 >> Nawr rydym hash Lisa a bod hefyd yn cynhyrchu hashcode 6. 223 00:10:55,410 --> 00:10:58,330 Wel nawr ein bod yn defnyddio hyn llinol treiddgar dull yr ydym yn dechrau am 6, 224 00:10:58,330 --> 00:10:59,330 rydym yn gweld bod 6 yn llawn. 225 00:10:59,330 --> 00:11:00,990 Ni allwn roi Lisa mewn 6. 226 00:11:00,990 --> 00:11:02,090 Felly, ble rydyn ni'n mynd? 227 00:11:02,090 --> 00:11:03,280 Gadewch i ni fynd i 7. 228 00:11:03,280 --> 00:11:04,610 7 wag, fel eu bod yn gweithio. 229 00:11:04,610 --> 00:11:06,510 Felly gadewch i ni roi Lisa yno. 230 00:11:06,510 --> 00:11:10,200 >> Nawr rydym hash Homer ac rydym yn cael 7. 231 00:11:10,200 --> 00:11:13,380 OK dda yr ydym yn gwybod bod 7 yn llawn erbyn hyn, felly ni allwn roi Homer yno. 232 00:11:13,380 --> 00:11:14,850 Felly gadewch i ni fynd i 8. 233 00:11:14,850 --> 00:11:15,664 Yw 8 ar gael? 234 00:11:15,664 --> 00:11:18,330 Yeah, ac 8 oed yn agos i 7, felly os rhaid i ni ddechrau chwilio ein bod 235 00:11:18,330 --> 00:11:20,020 Nid yw mynd i gael i fynd yn rhy bell. 236 00:11:20,020 --> 00:11:22,860 Ac felly gadewch i ni roi Homer yn 8. 237 00:11:22,860 --> 00:11:25,151 >> Nawr rydym hash Maggie a yn dychwelyd 3, diolch byth 238 00:11:25,151 --> 00:11:26,650 rydym yn gallu jyst rhoi Maggie yno. 239 00:11:26,650 --> 00:11:29,070 Nid oes rhaid i ni wneud unrhyw math o holi am hynny. 240 00:11:29,070 --> 00:11:32,000 Nawr rydym hash Marge, a Marge hefyd yn dychwelyd 6. 241 00:11:32,000 --> 00:11:39,560 >> Wel 6 yn llawn, 7 yn llawn, 8 yn llawn, 9, popeth yn iawn diolch i Dduw, 9 yn wag. 242 00:11:39,560 --> 00:11:41,600 Gallaf roi Marge am 9. 243 00:11:41,600 --> 00:11:45,280 Eisoes gallwn weld ein bod yn dechrau i gael y broblem hon lle erbyn hyn rydym yn 244 00:11:45,280 --> 00:11:48,780 dechrau ymestyn pethau caredig o bell i ffwrdd oddi wrth eu codau hash. 245 00:11:48,780 --> 00:11:52,960 A bod theta o 1, cyfartaledd y achos o fod yn amser cyson, 246 00:11:52,960 --> 00:11:56,560 yn dechrau cael ychydig yn more-- dechrau tueddu ychydig yn fwy 247 00:11:56,560 --> 00:11:58,050 tuag at theta o n. 248 00:11:58,050 --> 00:12:01,270 Rydym yn dechrau colli hynny mantais o dablau hash. 249 00:12:01,270 --> 00:12:03,902 >> Mae hyn yn broblem yr ydym newydd weld yn rhywbeth a elwir yn clystyru. 250 00:12:03,902 --> 00:12:06,360 A'r hyn sydd wir yn ddrwg am clystyru yw bod unwaith y byddwch yn awr 251 00:12:06,360 --> 00:12:09,606 ddwy elfen sy'n cael eu ochr yn ochr mae'n ei gwneud yn oed yn fwy tebygol, 252 00:12:09,606 --> 00:12:11,480 mae gennych dwbl y cyfle, eich bod yn mynd 253 00:12:11,480 --> 00:12:13,516 i gael gwrthdrawiad arall gyda hynny clwstwr, 254 00:12:13,516 --> 00:12:14,890 a bydd y clwstwr yn tyfu gan un. 255 00:12:14,890 --> 00:12:19,640 A byddwch yn cadw dyfu a thyfu eich tebygolrwydd o gael gwrthdrawiad. 256 00:12:19,640 --> 00:12:24,470 Ac yn y diwedd 'i' jyst mor ddrwg gan nad didoli data o gwbl. 257 00:12:24,470 --> 00:12:27,590 >> Y broblem arall fodd bynnag yw ein o hyd, a hyd yn hyn hyd at y pwynt hwn, 258 00:12:27,590 --> 00:12:30,336 rydym newydd wedi bod fath o deall yr hyn tabl hash yw, 259 00:12:30,336 --> 00:12:31,960 rydym yn dal dim ond lle i 10 o dannau. 260 00:12:31,960 --> 00:12:37,030 Os ydym am barhau i hash dinasyddion Springfield, 261 00:12:37,030 --> 00:12:38,790 ni allwn ond cael 10 ohonynt mewn 'na. 262 00:12:38,790 --> 00:12:42,619 Ac os ydym yn ceisio ychwanegu 11eg neu 12fed, nid oes gennym le i'w rhoi. 263 00:12:42,619 --> 00:12:45,660 Gallai Rydym yn unig fod yn troelli o gwmpas mewn cylchoedd yn ceisio dod o hyd i fan gwag, 264 00:12:45,660 --> 00:12:49,000 ac yr ydym efallai mynd yn sownd mewn dolen ddiddiwedd. 265 00:12:49,000 --> 00:12:51,810 >> Felly y math hwn o yn rhoi benthyg i'r syniad o rywbeth o'r enw gadwyno. 266 00:12:51,810 --> 00:12:55,790 A dyma lle rydym yn mynd i ddod rhestrau cysylltiedig yn ôl i mewn i'r darlun. 267 00:12:55,790 --> 00:13:01,300 Beth os hytrach na storio yn unig y data ei hun yn y casgliad, 268 00:13:01,300 --> 00:13:04,471 pob elfen y rhesi gallai cynnal lluosog o ddarnau o ddata? 269 00:13:04,471 --> 00:13:05,970 Wel nid yw hynny'n gwneud synnwyr, dde? 270 00:13:05,970 --> 00:13:09,280 Rydym yn gwybod y gall amrywiaeth yn unig hold-- pob elfen o amrywiaeth 271 00:13:09,280 --> 00:13:12,930 dim ond cynnal un darn o ddata o'r math hwnnw data. 272 00:13:12,930 --> 00:13:16,750 >> Ond beth os y math hwnnw data yn rhestr cysylltiedig, dde? 273 00:13:16,750 --> 00:13:19,830 Felly beth os yw pob elfen y rhesi oedd 274 00:13:19,830 --> 00:13:22,790 pwyntydd at bennaeth rhestr cysylltiedig? 275 00:13:22,790 --> 00:13:24,680 Ac yna gallem adeiladu rhestrau cysylltiedig y rhai 276 00:13:24,680 --> 00:13:27,120 a thyfu eu mympwy, oherwydd bod rhestrau cysylltiedig yn caniatáu 277 00:13:27,120 --> 00:13:32,090 ni i dyfu ac yn crebachu llawer mwy hyblyg na amrywiaeth yn ei wneud. 278 00:13:32,090 --> 00:13:34,210 Felly beth os ydym yn awr yn defnyddio, rydym yn trosoledd hyn, dde? 279 00:13:34,210 --> 00:13:37,760 Rydym yn dechrau tyfu cadwyni hyn y tu allan i leoliadau arae hyn. 280 00:13:37,760 --> 00:13:40,740 >> Nawr gallwn ffitio yn ddiddiwedd faint o ddata, neu beidio ddiddiwedd, 281 00:13:40,740 --> 00:13:44,170 swm mympwyol o data, i mewn i'n bwrdd hash 282 00:13:44,170 --> 00:13:47,760 heb erioed yn rhedeg i mewn i y broblem o gwrthdrawiad. 283 00:13:47,760 --> 00:13:50,740 Rydym hefyd wedi dileu clystyru trwy wneud hyn. 284 00:13:50,740 --> 00:13:54,380 Ac dda yr ydym yn gwybod bod pan fyddwn yn mewnosod i mewn i restr cysylltiedig, os ydych yn cofio 285 00:13:54,380 --> 00:13:57,779 oddi wrth ein fideo ar restrau cysylltiedig, yn unigol rhestrau cysylltiedig a rhestrau cysylltiedig ddwywaith, 286 00:13:57,779 --> 00:13:59,070 mae'n llawdriniaeth amser cyson. 287 00:13:59,070 --> 00:14:00,710 Rydym yn unig yn ychwanegu at y blaen. 288 00:14:00,710 --> 00:14:04,400 >> Ac ar gyfer edrych i fyny, dda yr ydym yn gwybod sy'n edrych i fyny mewn rhestr cysylltiedig 289 00:14:04,400 --> 00:14:05,785 Gall fod yn broblem, dde? 290 00:14:05,785 --> 00:14:07,910 Mae'n rhaid i ni chwilio drwy mae'n o'r dechrau i'r diwedd. 291 00:14:07,910 --> 00:14:10,460 Does dim hap mynediad mewn rhestr cysylltiedig. 292 00:14:10,460 --> 00:14:15,610 Ond os yn lle cael un cysylltiedig Rhestr lle byddai am-edrych yn O n, 293 00:14:15,610 --> 00:14:19,590 mae gennym bellach 10 o restrau cysylltiedig, neu 1,000 o restrau cysylltiedig, 294 00:14:19,590 --> 00:14:24,120 nawr mae'n O o n rannu gan 10, neu O n rhannu â 1,000. 295 00:14:24,120 --> 00:14:26,940 >> Ac er ein bod yn siarad ddamcaniaethol am gymhlethdod 296 00:14:26,940 --> 00:14:30,061 fe anwybyddir cysonion, yn y go iawn byd y pethau hyn mewn gwirionedd yn fater, 297 00:14:30,061 --> 00:14:30,560 iawn? 298 00:14:30,560 --> 00:14:33,080 Rydym mewn gwirionedd yn sylwi bod hyn yn digwydd 299 00:14:33,080 --> 00:14:36,610 i redeg 10 gwaith yn gyflymach, neu 1,000 o gwaith yn gyflymach, 300 00:14:36,610 --> 00:14:41,570 oherwydd ein bod yn dosbarthu'r un hir cadwyn ar draws 1,000 o gadwyni llai. 301 00:14:41,570 --> 00:14:45,090 Ac felly bob tro y mae'n rhaid i ni chwilio drwy un o gadwyni rhai y gallwn 302 00:14:45,090 --> 00:14:50,290 anwybyddwch y cadwyni 999 Nid ydym yn poeni am, a dim ond yn chwilio bod un. 303 00:14:50,290 --> 00:14:53,220 >> Sydd, ar gyfartaledd i fod 1,000 o weithiau fyrrach. 304 00:14:53,220 --> 00:14:56,460 Ac felly rydym yn dal yn fath o tueddu tuag at yr achos ar gyfartaledd 305 00:14:56,460 --> 00:15:01,610 o fod yn amser cyson, ond Dim ond oherwydd ein bod yn ddylanwad busnes 306 00:15:01,610 --> 00:15:03,730 rhannu gan rai ffactor enfawr gyson. 307 00:15:03,730 --> 00:15:05,804 Gadewch i ni weld sut y gallai hyn mewn gwirionedd yn edrych er. 308 00:15:05,804 --> 00:15:08,720 Felly dyma oedd y tabl hash cawsom cyn i ni ddatgan tabl hash sy'n 309 00:15:08,720 --> 00:15:10,270 Roedd gallu storio 10 o dannau. 310 00:15:10,270 --> 00:15:11,728 Nid ydym yn mynd i wneud hynny anymore. 311 00:15:11,728 --> 00:15:13,880 Rydym eisoes yn gwybod y gyfyngiadau'r dull hwnnw. 312 00:15:13,880 --> 00:15:20,170 Nawr ein tabl hash yn mynd i fod amrywiaeth o 10 o nodau, awgrymiadau 313 00:15:20,170 --> 00:15:22,120 i benaethiaid rhestrau cysylltiedig. 314 00:15:22,120 --> 00:15:23,830 >> Ac ar hyn o bryd mae'n null. 315 00:15:23,830 --> 00:15:26,170 Mae pob un o'r rhai 10 awgrymiadau yn null. 316 00:15:26,170 --> 00:15:29,870 Does dim byd yn ein hash tabl ar hyn o bryd. 317 00:15:29,870 --> 00:15:32,690 >> Nawr, gadewch i ni ddechrau i roi rhai pethau i mewn i dabl hash hwn. 318 00:15:32,690 --> 00:15:35,440 A gadewch i ni weld sut mae dull hwn yn mynd i fod o fudd i ni ychydig. 319 00:15:35,440 --> 00:15:36,760 Gadewch i ni yn awr hash Joey. 320 00:15:36,760 --> 00:15:40,210 Byddwn yn rhedeg y llinyn Joey drwy swyddogaeth hash ac yn dychwelyd 6. 321 00:15:40,210 --> 00:15:41,200 Wel beth ydym yn ei wneud nawr? 322 00:15:41,200 --> 00:15:44,090 >> Wel bellach yn gweithio gyda rhestrau cysylltiedig, nid ydym yn gweithio gyda arrays. 323 00:15:44,090 --> 00:15:45,881 A phan rydym yn gweithio gyda rhestrau cysylltiedig i ni 324 00:15:45,881 --> 00:15:49,790 gwybod bod angen i ni ddechrau ddeinamig dyrannu gofod ac adeiladu cadwyni. 325 00:15:49,790 --> 00:15:54,020 Dyna fath o how-- dyna'r craidd elfennau o adeiladu rhestr cysylltiedig. 326 00:15:54,020 --> 00:15:57,670 Felly gadewch i ni ddeinamig dyrannu lle ar gyfer Joey, 327 00:15:57,670 --> 00:16:00,390 ac yna gadewch i ni ychwanegu ef i'r gadwyn. 328 00:16:00,390 --> 00:16:03,170 >> Felly, yn awr yn edrych yr hyn yr ydym wedi ei wneud. 329 00:16:03,170 --> 00:16:06,440 Pan fyddwn yn hash Joey rydym yn cael y hashcode 6. 330 00:16:06,440 --> 00:16:11,790 Nawr bod y pwyntydd yn y lleoliad array 6 yn cyfeirio at y pennaeth rhestr cysylltiedig, 331 00:16:11,790 --> 00:16:14,900 ac ar hyn o bryd dyma'r unig elfen o restr cysylltiedig. 332 00:16:14,900 --> 00:16:18,350 A'r nôd yn hynny rhestr gysylltiedig yn Joey. 333 00:16:18,350 --> 00:16:22,300 >> Felly, os bydd angen i edrych i fyny Joey yn ddiweddarach, rydym yn unig hash Joey eto, 334 00:16:22,300 --> 00:16:26,300 rydym yn cael 6 eto oherwydd bod ein swyddogaeth hash yn benderfynedig. 335 00:16:26,300 --> 00:16:30,400 Ac yna rydym yn dechrau ym mhen o'r rhestr gysylltiedig sylw at y ffaith 336 00:16:30,400 --> 00:16:33,360 i yn ôl lleoliad array 6, a gallwn ailadrodd 337 00:16:33,360 --> 00:16:35,650 ar draws y ceisio dod o hyd Joey. 338 00:16:35,650 --> 00:16:37,780 Ac os ydym yn adeiladu ein hash tabl yn effeithiol, 339 00:16:37,780 --> 00:16:41,790 ac mae ein swyddogaeth hash yn effeithiol i ddosbarthu data'n dda, 340 00:16:41,790 --> 00:16:45,770 ar gyfartaledd bob un o'r rhai a cysylltiedig rhestrau ym mhob lleoliad array 341 00:16:45,770 --> 00:16:50,110 fydd 1/10 maint pe baem newydd gael fel enfawr sengl 342 00:16:50,110 --> 00:16:51,650 rhestr gysylltiedig â phopeth sydd ynddo. 343 00:16:51,650 --> 00:16:55,670 >> Os byddwn yn dosbarthu oedd yn cysylltu enfawr Rhestr draws 10 o restrau cysylltiedig 344 00:16:55,670 --> 00:16:57,760 Bydd pob rhestr fod 1/10 maint. 345 00:16:57,760 --> 00:17:01,432 Ac fel hyn 10 gwaith yn gyflymach i chwilio drwy. 346 00:17:01,432 --> 00:17:02,390 Felly, gadewch i ni wneud hyn eto. 347 00:17:02,390 --> 00:17:04,290 Gadewch i ni yn awr hash Ross. 348 00:17:04,290 --> 00:17:07,540 >> A gadewch i ni ddweud Ross, pan fyddwn yn gwneud hynny y cod hash yr ydym yn mynd yn ôl yw 2. 349 00:17:07,540 --> 00:17:10,630 Wel nawr rydym ddeinamig dyrannu nod newydd, rydym yn rhoi Ross yn y nod, 350 00:17:10,630 --> 00:17:14,900 ac rydym yn dweud nawr lleoliad array 2, yn lle pwyntio at null, 351 00:17:14,900 --> 00:17:18,579 cyfeirio at y pennaeth cysylltiedig Rhestr y mae ei nod yn unig yw Ross. 352 00:17:18,579 --> 00:17:22,660 A gallwn wneud hyn yn un mwy o amser, rydym yn Gall hash Rachel a chael hashcode 4. 353 00:17:22,660 --> 00:17:25,490 malloc yn nod newydd, rhowch Rachel yn y nôd, ac yn dweud lleoliad arae 354 00:17:25,490 --> 00:17:27,839 4 awr yn cyfeirio at y pen o restr cysylltiedig y mae ei 355 00:17:27,839 --> 00:17:31,420 unig elfen digwydd bod Rachel. 356 00:17:31,420 --> 00:17:33,470 >> OK ond beth sy'n digwydd os mae gennym gwrthdrawiad? 357 00:17:33,470 --> 00:17:38,560 Gadewch i ni weld sut yr ydym yn ymdrin â gwrthdrawiadau gan ddefnyddio'r dull gadwyno ar wahân. 358 00:17:38,560 --> 00:17:39,800 Gadewch i hash Phoebe. 359 00:17:39,800 --> 00:17:41,094 Rydym yn cael y hashcode 6. 360 00:17:41,094 --> 00:17:44,010 Yn ein enghraifft flaenorol roeddem yn unig storio'r tannau yn y rhesi. 361 00:17:44,010 --> 00:17:45,980 Roedd hon yn broblem. 362 00:17:45,980 --> 00:17:48,444 >> Nid ydym am i trosysgrifo'r Joey, ac rydym wedi eisoes 363 00:17:48,444 --> 00:17:51,110 gweld y gallwn gael rhywfaint o glystyru problemau os ydym yn ceisio cam 364 00:17:51,110 --> 00:17:52,202 trwy a chwiliedydd. 365 00:17:52,202 --> 00:17:54,660 Ond beth os ydym yn unig fath o drin hyn yr un ffordd, dde? 366 00:17:54,660 --> 00:17:57,440 Mae'n union fel ychwanegu elfen i bennaeth y rhestr cysylltiedig. 367 00:17:57,440 --> 00:18:00,220 Gadewch i le unig malloc i Phoebe. 368 00:18:00,220 --> 00:18:04,764 >> Byddwn yn dweud pwyntiau pwyntydd nesaf Phoebe yn i'r hen bennaeth y rhestr cysylltiedig, 369 00:18:04,764 --> 00:18:07,180 ac yna 6 dim ond cyfeirio at y pennaeth newydd y rhestr cysylltiedig. 370 00:18:07,180 --> 00:18:10,150 Ac yn awr yn edrych, rydym wedi newid Phoebe yn. 371 00:18:10,150 --> 00:18:14,210 Gallwn yn awr yn storio dau elfennau gyda hashcode 6, 372 00:18:14,210 --> 00:18:17,170 ac nid oes gennym unrhyw broblemau. 373 00:18:17,170 --> 00:18:20,147 >> Dyna 'n bert lawer holl mae i gadwyno. 374 00:18:20,147 --> 00:18:21,980 Ac gadwyno yn bendant y dull sy'n 375 00:18:21,980 --> 00:18:27,390 mynd i fod fwyaf effeithiol i chi os ydych yn storio data mewn tabl hash. 376 00:18:27,390 --> 00:18:30,890 Ond mae cyfuniad hwn o araeau a rhestrau cysylltiedig 377 00:18:30,890 --> 00:18:36,080 at ei gilydd i ffurfio tabl hash 'n sylweddol yn gwella yn ddramatig eich gallu 378 00:18:36,080 --> 00:18:40,550 i storio symiau mawr o ddata, a yn gyflym iawn ac yn effeithlon chwilio 379 00:18:40,550 --> 00:18:41,630 trwy ddata hynny. 380 00:18:41,630 --> 00:18:44,150 >> Mae dal un yn fwy strwythur data i maes 'na 381 00:18:44,150 --> 00:18:48,700 a allai fod hyd yn oed fod ychydig yn well o ran gwarantu 382 00:18:48,700 --> 00:18:51,920 bod ein mewnosod, dileu, a Amseroedd edrych i fyny hyd yn oed yn gynt. 383 00:18:51,920 --> 00:18:55,630 A byddwn yn gweld bod mewn fideo ar gais. 384 00:18:55,630 --> 00:18:58,930 Rwy'n Doug Lloyd, mae hyn yn CS50. 385 00:18:58,930 --> 00:19:00,214