1 00:00:00,000 --> 00:00:05,259 2 00:00:05,259 --> 00:00:08,300 DOUG LLOYD: Felly, yn CS50, rydym wedi cynnwys llawer o strwythurau data gwahanol, 3 00:00:08,300 --> 00:00:09,180 iawn? 4 00:00:09,180 --> 00:00:11,420 Rydym wedi gweld arrays, a'u cysylltu rhestrau, a thablau hash, 5 00:00:11,420 --> 00:00:15,210 a geisiau, staciau a ciwiau. 6 00:00:15,210 --> 00:00:17,579 Byddwn hefyd yn dysgu ychydig am goed a phentyrrau, 7 00:00:17,579 --> 00:00:20,120 ond mewn gwirionedd mae'r rhain i gyd yn unig yn dod i ben draw yn amrywiadau ar thema. 8 00:00:20,120 --> 00:00:22,840 Mewn gwirionedd mae yna rhain math o bedwar syniad sylfaenol 9 00:00:22,840 --> 00:00:25,190 Gall fod popeth arall yn berwi i lawr i. 10 00:00:25,190 --> 00:00:28,150 Araeau, rhestrau cysylltiedig, tablau hash, a geisiau. 11 00:00:28,150 --> 00:00:30,720 Ac fel y dywedais, mae amrywiadau arnynt, 12 00:00:30,720 --> 00:00:32,720 ond mae hyn yn eithaf llawer yn mynd i grynhoi 13 00:00:32,720 --> 00:00:38,140 popeth rydyn ni'n mynd i siarad am yn y dosbarth hwn o ran C. 14 00:00:38,140 --> 00:00:40,140 >> Ond sut mae hyn i gyd mesur i fyny, dde? 15 00:00:40,140 --> 00:00:44,265 Rydym wedi siarad am y manteision a'r anfanteision o bob un mewn fideos ar wahân arnynt, 16 00:00:44,265 --> 00:00:46,390 ond mae llawer o rifau cael eu taflu o gwmpas. 17 00:00:46,390 --> 00:00:48,723 Mae llawer o gyffredinol meddyliau cael eu taflu o gwmpas. 18 00:00:48,723 --> 00:00:51,950 Gadewch i ni geisio atgyfnerthu i mewn dim ond un lle. 19 00:00:51,950 --> 00:00:55,507 Gadewch i ni bwyso a mesur y manteision yn erbyn yr anfanteision, ac ystyried 20 00:00:55,507 --> 00:00:57,340 pa strwythur data Efallai fod y data cywir 21 00:00:57,340 --> 00:01:01,440 strwythur ar gyfer eich sefyllfa benodol, pa bynnag fath o ddata yr ydych yn storio. 22 00:01:01,440 --> 00:01:06,625 Nid ydynt o reidrwydd bob amser angen i chi defnyddio'r mewnosod gyflym super, dileu, 23 00:01:06,625 --> 00:01:10,761 a am-edrych o trie os ydych yn wir nid ydynt yn poeni am mewnosod a dileu 24 00:01:10,761 --> 00:01:11,260 gormod. 25 00:01:11,260 --> 00:01:13,968 Os oes angen dim ond ar hap yn gyflym mynediad, efallai amrywiaeth yn well. 26 00:01:13,968 --> 00:01:15,340 Felly gadewch i ni distill hynny. 27 00:01:15,340 --> 00:01:18,530 Gadewch i ni siarad am bob un o'r pedwar mathau pwysig o strwythurau data 28 00:01:18,530 --> 00:01:21,720 ein bod wedi siarad am, ac ond yn gweld pryd y gallent fod yn dda, 29 00:01:21,720 --> 00:01:23,340 a phan efallai na fyddant yn mor dda. 30 00:01:23,340 --> 00:01:24,610 Felly, gadewch i ni ddechrau gyda arrays. 31 00:01:24,610 --> 00:01:27,300 Felly mewnosod, dyna fath o ddrwg. 32 00:01:27,300 --> 00:01:31,350 >> Mewnosod ar ddiwedd amrywiaeth yn iawn, os ydym yn adeiladu amrywiaeth wrth i ni fynd. 33 00:01:31,350 --> 00:01:33,570 Ond os bydd angen i fewnosod elfennau i mewn i'r canol, 34 00:01:33,570 --> 00:01:35,550 yn meddwl yn ôl i fewnosod didoli, mae llawer 35 00:01:35,550 --> 00:01:37,510 o symud i ffitio elfen mewn 'na. 36 00:01:37,510 --> 00:01:41,170 Ac felly os ydym yn mynd i fewnosod yn unrhyw le ond diwedd amrywiaeth, 37 00:01:41,170 --> 00:01:43,590 dyna debyg nad mor fawr. 38 00:01:43,590 --> 00:01:46,710 >> Yn yr un modd, dileu, oni bai ein bod yn dileu o ddiwedd amrywiaeth, 39 00:01:46,710 --> 00:01:49,810 Nid yw mor fawr os na thebyg hefyd nid ydym am adael bylchau gwag, 40 00:01:49,810 --> 00:01:50,790 sydd fel arfer nid ydym yn ei wneud. 41 00:01:50,790 --> 00:01:54,700 Rydym yn awyddus i gael gwared ar elfen, ac Yna fath o yn ei gwneud yn glyd eto. 42 00:01:54,700 --> 00:01:57,670 Ac felly ddileu elfennau o amrywiaeth, hefyd nid mor fawr. 43 00:01:57,670 --> 00:01:58,820 >> Am-edrych, fodd bynnag, yn wych. 44 00:01:58,820 --> 00:02:00,920 Mae gennym fynediad ar hap, am-edrych o amser yn gyson. 45 00:02:00,920 --> 00:02:03,800 Rydym yn unig yn dweud saith, ac rydym yn mynd i adleoli amrywiaeth saith. 46 00:02:03,800 --> 00:02:05,907 Rydym yn dweud 20, gyda ewch i amrywiaeth adleoli 20. 47 00:02:05,907 --> 00:02:07,240 Nid oes rhaid i ni ailadrodd ar draws. 48 00:02:07,240 --> 00:02:08,630 Dyna 'n bert da. 49 00:02:08,630 --> 00:02:11,020 >> Araeau hefyd yn gymharol hawdd i ddatrys. 50 00:02:11,020 --> 00:02:14,040 Bob tro y byddwn yn siarad am didoli algorithm, megis didoli dethol, 51 00:02:14,040 --> 00:02:18,820 didoli fewnosod, didoli swigen, uno didoli, rydym bob amser yn defnyddio araeau i wneud hynny, 52 00:02:18,820 --> 00:02:21,860 oherwydd araeau yn eithaf hawdd i'w didoli, o'i gymharu â'r strwythurau data 53 00:02:21,860 --> 00:02:22,970 rydym wedi gweld hyd yn hyn. 54 00:02:22,970 --> 00:02:24,320 >> Maent hefyd yn gymharol fach. 55 00:02:24,320 --> 00:02:25,695 Does dim llawer o le ychwanegol. 56 00:02:25,695 --> 00:02:29,210 Rydych yn unig a neilltuwyd yn union gymaint fel y bydd angen i chi gynnal eich data, 57 00:02:29,210 --> 00:02:30,320 a dyna 'n bert lawer iddo. 58 00:02:30,320 --> 00:02:33,180 Felly, maent yn eithaf bach ac yn effeithlon yn y ffordd honno. 59 00:02:33,180 --> 00:02:36,000 Ond anfantais arall, fodd bynnag, yw eu bod yn sefydlog o ran maint. 60 00:02:36,000 --> 00:02:38,630 Mae'n rhaid i ni ddatgan yn union sut mawr rydym eisiau i'n amrywiaeth i fod, 61 00:02:38,630 --> 00:02:39,940 a dim ond cael un ergyd yn ei. 62 00:02:39,940 --> 00:02:41,280 Ni allwn dyfu ac yn crebachu ei. 63 00:02:41,280 --> 00:02:44,582 >> Os bydd angen i dyfu neu leihau ei, rydym yn Mae angen i ddatgan amrywiaeth hollol newydd, 64 00:02:44,582 --> 00:02:47,750 gopïo'r holl elfennau'r amrywiaeth cyntaf i mewn i'r ail arae. 65 00:02:47,750 --> 00:02:51,410 Ac os ydym yn miscalculated bod pryd, mae angen ei wneud eto. 66 00:02:51,410 --> 00:02:52,760 Nid mor fawr. 67 00:02:52,760 --> 00:02:58,750 Felly nid araeau yn rhoi'r hyblygrwydd i ni i gael niferoedd amrywiol o elfennau. 68 00:02:58,750 --> 00:03:01,320 >> Gyda rhestr cysylltiedig, mewnosod yn eithaf hawdd. 69 00:03:01,320 --> 00:03:03,290 Rydym yn unig dacio ar y tu blaen. 70 00:03:03,290 --> 00:03:04,892 Dileu hefyd yn eithaf hawdd. 71 00:03:04,892 --> 00:03:06,100 Mae'n rhaid i ni ddod o hyd i'r elfennau. 72 00:03:06,100 --> 00:03:07,270 Mae hynny'n golygu rhywfaint o chwilio. 73 00:03:07,270 --> 00:03:10,270 >> Ond unwaith y byddwch wedi dod o hyd i'r elfen ydych yn chwilio am, y cyfan sydd angen i chi ei wneud 74 00:03:10,270 --> 00:03:12,830 yn newid pwyntydd, o bosibl dau os oes gennych 75 00:03:12,830 --> 00:03:15,151 yn gysylltiedig list-- yn ddwbl rhestr gysylltiedig, rather-- 76 00:03:15,151 --> 00:03:16,650 ac yna gallwch jyst ddim y nôd. 77 00:03:16,650 --> 00:03:18,399 Nid oes rhaid i chi symud popeth o gwmpas. 78 00:03:18,399 --> 00:03:22,090 Rydych yn unig yn newid dau awgrymiadau, felly dyna 'n bert gyflym. 79 00:03:22,090 --> 00:03:23,470 >> Am-edrych yn ddrwg fodd bynnag, dde? 80 00:03:23,470 --> 00:03:26,280 Er mwyn i ni ddod o hyd i elfen mewn rhestr cysylltiedig, 81 00:03:26,280 --> 00:03:29,154 boed yn unigol neu ddwbl cysylltiedig, mae'n rhaid i ni llinol chwilio amdano. 82 00:03:29,154 --> 00:03:32,320 Mae'n rhaid i ni gychwyn ar ddechrau a symud y diwedd, neu'n dechrau ar y diwedd yn symud 83 00:03:32,320 --> 00:03:33,860 i'r dechrau. 84 00:03:33,860 --> 00:03:35,474 Nid oes gennym fynediad ar hap anymore. 85 00:03:35,474 --> 00:03:37,265 Felly, os ydym yn gwneud llawer o chwilio, efallai 86 00:03:37,265 --> 00:03:39,830 Nid rhestr cysylltiedig yn mor dda i ni. 87 00:03:39,830 --> 00:03:43,750 >> Maen nhw hefyd yn wir anodd i ddidoli, dde? 88 00:03:43,750 --> 00:03:45,666 Yr unig ffordd y gallwch 'n sylweddol ddatrys rhestr cysylltiedig 89 00:03:45,666 --> 00:03:47,870 yw i ddatrys y wrth i chi adeiladu ei. 90 00:03:47,870 --> 00:03:50,497 Ond os byddwch yn datrys y mater wrth i chi adeiladu ei, eich bod bellach 91 00:03:50,497 --> 00:03:51,830 gan wneud mewnosodiadau gyflym anymore. 92 00:03:51,830 --> 00:03:53,746 Nid ydych ond yn mynd i'r afael pethau ar y tu blaen. 93 00:03:53,746 --> 00:03:55,710 Mae'n rhaid i chi ddod o hyd i'r fan a'r lle cywir i roi, 94 00:03:55,710 --> 00:03:57,820 ac yna eich mewnosod yn dod yn unig am mor ddrwg 95 00:03:57,820 --> 00:03:59,390 fel fewnosod yn arae. 96 00:03:59,390 --> 00:04:03,130 Felly nid yw'r rhestrau cysylltiedig yn mor fawr ar gyfer didoli data. 97 00:04:03,130 --> 00:04:05,830 >> Maen nhw hefyd yn eithaf bach, maint-ddoeth. 98 00:04:05,830 --> 00:04:08,496 Rhestr gysylltiedig ychydig ddwbl yn fwy na'r rhestrau cysylltiedig yn unigol, 99 00:04:08,496 --> 00:04:10,620 sydd ychydig yn fwy na araeau, ond nid yw'n 100 00:04:10,620 --> 00:04:13,330 llawer iawn o le gwastraffu. 101 00:04:13,330 --> 00:04:18,730 Felly, os oes lle yn brin, ond Nid premiwm mewn gwirionedd dwys, 102 00:04:18,730 --> 00:04:22,180 gallai hyn fod y ffordd iawn i fynd. 103 00:04:22,180 --> 00:04:23,330 >> Tablau hash. 104 00:04:23,330 --> 00:04:25,850 Gosod i mewn i dabl hash yn weddol syml. 105 00:04:25,850 --> 00:04:26,980 Mae'n broses dau gam. 106 00:04:26,980 --> 00:04:30,700 Yn gyntaf mae angen i redeg ein data trwy swyddogaeth hash i gael cod hash, 107 00:04:30,700 --> 00:04:37,550 ac yna rydym yn mewnosod yr elfen mewn i'r tabl hash yn y cod hash lleoliad. 108 00:04:37,550 --> 00:04:40,879 >> Dileu, yn debyg i'r rhestr gysylltiedig, yn hawdd ar ôl i chi ddod o hyd i'r elfen. 109 00:04:40,879 --> 00:04:43,170 Mae'n rhaid i chi ddod o hyd iddo yn gyntaf, ond wedyn pan fyddwch yn dileu y peth, 110 00:04:43,170 --> 00:04:45,128 'ch jyst angen i chi gyfnewid un neu ddau o awgrymiadau, 111 00:04:45,128 --> 00:04:47,250 os ydych yn defnyddio gadwyno ar wahân. 112 00:04:47,250 --> 00:04:49,942 Os ydych yn defnyddio treiddgar, neu os nad ydych yn 113 00:04:49,942 --> 00:04:51,650 gan ddefnyddio gadwyno o gwbl yn eich tabl hash, 114 00:04:51,650 --> 00:04:53,040 dileu yn hawdd iawn mewn gwirionedd. 115 00:04:53,040 --> 00:04:57,134 Y cyfan sydd angen i chi ei wneud yw hash y data, ac yna mynd i'r lleoliad. 116 00:04:57,134 --> 00:04:58,925 A chan dybio nad ydych yn ei wneud os oes gennych unrhyw gwrthdrawiadau, 117 00:04:58,925 --> 00:05:01,650 byddwch yn gallu dileu yn gyflym iawn. 118 00:05:01,650 --> 00:05:04,930 >> Yn awr, am-edrych yn lle pethau cael ychydig yn fwy cymhleth. 119 00:05:04,930 --> 00:05:06,910 Mae'n well ar gyfartaledd na rhestrau cysylltiedig. 120 00:05:06,910 --> 00:05:09,560 Os ydych yn defnyddio gadwyno, byddwch yn dal i gael rhestr gysylltiedig, 121 00:05:09,560 --> 00:05:13,170 sy'n golygu eich bod yn dal i gael yr chwilio anfantais rhestr cysylltiedig. 122 00:05:13,170 --> 00:05:18,390 Ond oherwydd eich bod yn cymryd eich cysylltu rhestr a hollti dros 100 neu 1,000 123 00:05:18,390 --> 00:05:25,380 neu n elfennau yn eich tabl hash, rydych yn rhestrau cysylltiedig i gyd yn un nfed y maint. 124 00:05:25,380 --> 00:05:27,650 Maen nhw i gyd yn sylweddol llai. 125 00:05:27,650 --> 00:05:32,080 N Rydych wedi rhestrau cysylltiedig yn lle hynny o un rhestr gysylltiedig o faint n. 126 00:05:32,080 --> 00:05:34,960 >> Ac felly y byd go iawn yn gyson ffactor, yr ydym yn gyffredinol 127 00:05:34,960 --> 00:05:39,730 peidiwch â siarad am ran cymhlethdod amser, Nid mewn gwirionedd yn gwneud gwahaniaeth yma. 128 00:05:39,730 --> 00:05:43,020 Felly am-edrych yn dal i fod llinol chwilio os ydych yn defnyddio gadwyno, 129 00:05:43,020 --> 00:05:46,780 ond hyd y rhestr ydych yn chwilio trwy 130 00:05:46,780 --> 00:05:50,080 yn iawn, byr iawn o'i gymharu. 131 00:05:50,080 --> 00:05:52,995 Unwaith eto, os didoli yw eich nod yma, tabl hash yn 132 00:05:52,995 --> 00:05:54,370 yn ôl pob tebyg nid y ffordd iawn i fynd. 133 00:05:54,370 --> 00:05:56,830 Dim ond yn defnyddio amrywiaeth os didoli yn bwysig iawn i chi. 134 00:05:56,830 --> 00:05:58,590 >> A gallant redeg y gamut o faint. 135 00:05:58,590 --> 00:06:01,640 Mae'n anodd dweud a yw bwrdd hash yn fach neu'n fawr, 136 00:06:01,640 --> 00:06:04,110 gan ei fod yn wir yn dibynnu ar pa mor fawr yw eich tabl hash yn. 137 00:06:04,110 --> 00:06:07,340 Os ydych yn unig yn mynd i fod yn storio pum elfen yn eich tabl hash, 138 00:06:07,340 --> 00:06:10,620 a bod gennych dabl hash gyda 10,000 o elfennau ynddo, 139 00:06:10,620 --> 00:06:12,614 yn ôl pob tebyg rydych yn gwastraffu llawer o le. 140 00:06:12,614 --> 00:06:15,030 Cyferbyniad chi gall bod hefyd rhaid tablau hash gryno iawn, 141 00:06:15,030 --> 00:06:18,720 ond mae'r bwrdd hash llai yn cael, yr hiraf pob un o'r rhestrau cysylltiedig rheini 142 00:06:18,720 --> 00:06:19,220 cael. 143 00:06:19,220 --> 00:06:22,607 Ac felly does 'n sylweddol dim ffordd i ddiffinio yn union yr un maint â tabl hash, 144 00:06:22,607 --> 00:06:24,440 ond mae'n fwy na thebyg yn ddiogel i ddweud ei fod yn gyffredinol 145 00:06:24,440 --> 00:06:27,990 mynd i fod yn fwy na cysylltiedig Rhestr storio'r un data, 146 00:06:27,990 --> 00:06:30,400 ond yn llai na trie. 147 00:06:30,400 --> 00:06:32,720 >> A geisiau yn y pedwerydd o'r strwythurau hyn 148 00:06:32,720 --> 00:06:34,070 ein bod ni wedi bod yn siarad am. 149 00:06:34,070 --> 00:06:36,450 Mewnosod i mewn i trie yn gymhleth. 150 00:06:36,450 --> 00:06:38,400 Mae llawer o deinamig dyrannu cof, 151 00:06:38,400 --> 00:06:40,780 yn enwedig ar y dechrau, fel y ydych yn dechrau i adeiladu. 152 00:06:40,780 --> 00:06:43,700 Ond mae'n amser cyson. 153 00:06:43,700 --> 00:06:47,690 Dim ond yr elfen ddynol yma sy'n ei gwneud yn anodd. 154 00:06:47,690 --> 00:06:53,250 Gorfod dod ar draws pwyntydd null, malloc gofod, yn mynd yno, lle o bosib malloc 155 00:06:53,250 --> 00:06:54,490 oddi yno eto. 156 00:06:54,490 --> 00:06:58,880 Y math o ffactor bygwth awgrymiadau o ran dyrannu cof deinamig 157 00:06:58,880 --> 00:07:00,130 yw'r rhwystr i glirio. 158 00:07:00,130 --> 00:07:04,550 Ond unwaith y byddwch wedi clirio ei, mewnosod mewn gwirionedd yn dod yn eithaf syml, 159 00:07:04,550 --> 00:07:06,810 ac yn sicr yn bryd gyson. 160 00:07:06,810 --> 00:07:07,680 >> Dileu yn hawdd. 161 00:07:07,680 --> 00:07:11,330 Y cyfan sydd angen i chi ei wneud yw navigate i lawr cwpl o awgrymiadau a rhydd y nôd, 162 00:07:11,330 --> 00:07:12,420 felly dyna 'n bert da. 163 00:07:12,420 --> 00:07:13,930 Am-edrych hefyd yn eithaf cyflym. 164 00:07:13,930 --> 00:07:16,780 Dim ond ei seilio ar y hyd eich data. 165 00:07:16,780 --> 00:07:19,924 Felly os eich holl ddata yn pum llinynnau cymeriad, 166 00:07:19,924 --> 00:07:22,590 er enghraifft, eich bod yn storio pump llinynnau cymeriad yn eich trie, 167 00:07:22,590 --> 00:07:25,439 dim ond yn cymryd pum cam i hyd i'r hyn rydych chi'n chwilio amdano. 168 00:07:25,439 --> 00:07:28,480 Pump yn unig yn ffactor cyson, felly eto, mewnosod, dileu, ac am-edrych 169 00:07:28,480 --> 00:07:31,670 dyma holl amser yn gyson, yn effeithiol. 170 00:07:31,670 --> 00:07:34,880 >> Peth arall yw bod eich trie yn mewn gwirionedd yn datrys fath o barod, dde? 171 00:07:34,880 --> 00:07:36,800 Yn rhinwedd sut rydym yn elfennau mewnosod, 172 00:07:36,800 --> 00:07:40,060 trwy lythyr yn mynd trwy lythyr y allweddol, neu drwy digid digid o'r allweddol, 173 00:07:40,060 --> 00:07:45,084 Fel arfer, mae eich trie yn dod i ben i fyny yn cael math o didoli wrth i chi adeiladu. 174 00:07:45,084 --> 00:07:47,250 Nid yw'n wir yn gwneud synnwyr i feddwl am didoli 175 00:07:47,250 --> 00:07:49,874 yn yr un ffordd rydym yn meddwl am 'i ag araeau, neu restrau cysylltiedig, 176 00:07:49,874 --> 00:07:51,070 neu dablau hash. 177 00:07:51,070 --> 00:07:54,780 Ond mewn rhyw ystyr, eich trie cael ei ddidoli wrth i chi fynd. 178 00:07:54,780 --> 00:07:58,630 >> Mae anfantais, wrth gwrs, yw bod yn trie yn gyflym yn dod yn enfawr. 179 00:07:58,630 --> 00:08:02,970 O bob pwynt gyffordd, efallai y byddwch have-- os yw eich allwedd yn cynnwys ddigid, 180 00:08:02,970 --> 00:08:04,880 mae gennych 10 arall leoedd y gallwch fynd, a oedd 181 00:08:04,880 --> 00:08:07,490 yn golygu bod pob nod yn cynnwys gwybodaeth 182 00:08:07,490 --> 00:08:11,440 am y data rydych am ei storio ar y nod, yn ogystal â 10 o awgrymiadau. 183 00:08:11,440 --> 00:08:14,430 Pa rai, ar CS50 IDE, yn 80 bytes. 184 00:08:14,430 --> 00:08:17,220 Felly mae'n o leiaf 80 bytes am pob nod eich bod yn creu, 185 00:08:17,220 --> 00:08:19,240 ac nid yw hynny'n hyd yn oed yn cyfrif data. 186 00:08:19,240 --> 00:08:24,950 Ac os yw eich nodau yn llythyrau yn hytrach na digidau, 187 00:08:24,950 --> 00:08:27,825 Erbyn hyn mae gennych 26 o awgrymiadau o bob lleoliad. 188 00:08:27,825 --> 00:08:32,007 A 26 o weithiau 8, mae'n debyg 200 bytes, neu rywbeth fel 'na. 189 00:08:32,007 --> 00:08:33,840 Ac mae gennych gyfalaf a lowercase-- gallwch 190 00:08:33,840 --> 00:08:35,381 gweld lle roeddwn i'n mynd gyda hyn, dde? 191 00:08:35,381 --> 00:08:37,500 Gall eich nodau ca 'n sylweddol mawr, ac felly mae'r trie 192 00:08:37,500 --> 00:08:40,470 ei hun, ar y cyfan, gall cael fawr iawn, hefyd. 193 00:08:40,470 --> 00:08:42,630 Felly os gofod yn uchel premiwm ar eich system, 194 00:08:42,630 --> 00:08:45,830 Efallai na fydd trie yw'r ffordd gywir i fynd, er bod ei budd-daliadau eraill 195 00:08:45,830 --> 00:08:47,780 yn dod i chwarae. 196 00:08:47,780 --> 00:08:48,710 Rwy'n Doug Lloyd. 197 00:08:48,710 --> 00:08:50,740 Mae hyn yn CS50. 198 00:08:50,740 --> 00:08:52,316