1 00:00:00,000 --> 00:00:11,856 2 00:00:11,856 --> 00:00:13,050 >> ROB BOWDEN: Kaixo. 3 00:00:13,050 --> 00:00:16,210 Nago Rob, eta dezagun hash irtenbide hau daudelarik. 4 00:00:16,210 --> 00:00:20,070 Beraz, hemen ari gara ezartzea joan Hash taula orokor bat. 5 00:00:20,070 --> 00:00:24,090 Ikusten dugun egiturari gure hash nodo taula da itxura hau egingo. 6 00:00:24,090 --> 00:00:28,710 Beraz, char hitz bat izan da joan tamaina luzera gehi 1 array. 7 00:00:28,710 --> 00:00:32,259 Ez ahaztu 1 gehienezko geroztik hiztegian hitzari 45 da 8 00:00:32,259 --> 00:00:35,110 pertsonaiak, eta gero goazela egiteko karaktere osagarri bat behar 9 00:00:35,110 --> 00:00:37,070 backslash 0. 10 00:00:37,070 --> 00:00:40,870 >> Eta gero, gure hash bakoitzean taula ontzi da gordetzeko joan a 11 00:00:40,870 --> 00:00:42,320 lotuta nodo zerrenda. 12 00:00:42,320 --> 00:00:44,420 Ez ari gara lineala hemen probak egiten. 13 00:00:44,420 --> 00:00:48,430 Eta beraz, ordena hurrengo lotzen ontzi, elementu, bat behar dugu 14 00:00:48,430 --> 00:00:51,110 egitura nodo * hurrengo. 15 00:00:51,110 --> 00:00:53,090 Beraz, horrek zer nodo bat itxura da. 16 00:00:53,090 --> 00:00:56,180 Orain, hemen adierazpena da gure hash taula. 17 00:00:56,180 --> 00:01:01,910 Honez 16.384 kuboak izan du, baina zenbaki hori ez da benetan axola. 18 00:01:01,910 --> 00:01:05,450 Eta, azkenik, ari gara joan behar du hashtable_size aldagai global, eta horrek 19 00:01:05,450 --> 00:01:08,640 off hasteko 0 gisa, eta hura da segimendua egingo zenbat hitz 20 00:01:08,640 --> 00:01:10,080 gure hiztegian ziren. 21 00:01:10,080 --> 00:01:10,760 Ondo da. 22 00:01:10,760 --> 00:01:13,190 >> Beraz, dezagun karga begirada bat. 23 00:01:13,190 --> 00:01:16,390 Beraz nabarituko karga duten, boolearra itzultzen digu. 24 00:01:16,390 --> 00:01:20,530 Egia itzuliko duzu arrakastaz bada kargatu eta faltsua bestela. 25 00:01:20,530 --> 00:01:23,990 Eta char * izar bat hartzen du hiztegi, horrek hiztegi da 26 00:01:23,990 --> 00:01:25,280 ireki nahi dugula. 27 00:01:25,280 --> 00:01:27,170 Beraz, lehenengo gauza da egin dugu. 28 00:01:27,170 --> 00:01:30,420 Hiztegian fopen for goaz , irakurketa eta behar goaz 29 00:01:30,420 --> 00:01:34,700 ziur hala bada arrakastarik izan dela NULL itzuli du, orduan ez genuen 30 00:01:34,700 --> 00:01:37,440 Arrakastaz ireki Hiztegian eta faltsua itzuliko behar dugu. 31 00:01:37,440 --> 00:01:41,580 >> Baina suposatuz arrakastaz egin duela irekia, eta gero irakurri nahi dugu 32 00:01:41,580 --> 00:01:42,400 hiztegi. 33 00:01:42,400 --> 00:01:46,210 Beraz eduki begizta batzuk aurkitu arte hau hautsi arrazoia 34 00:01:46,210 --> 00:01:47,570 begizta bertan ikusiko dugu. 35 00:01:47,570 --> 00:01:51,780 Beraz eduki begizta, eta orain goaz nodo bakar bat malloc. 36 00:01:51,780 --> 00:01:56,800 Eta, jakina, txeke error behar dugu mallocing ez bada arrakasta berriro so 37 00:01:56,800 --> 00:02:00,660 eta edozein nodo dugun deskargatu nahi dugu malloc gertatu aurretik, itxi 38 00:02:00,660 --> 00:02:02,590 hiztegi eta itzultzeko faltsua. 39 00:02:02,590 --> 00:02:07,440 >> Baina hori ez ikusi egingo zaio, suposatuz dugu arrakastarik izan, orduan fscanf erabili nahi dugu 40 00:02:07,440 --> 00:02:12,400 hitz bakar bat irakurri gure gure nodo sartu hiztegia. 41 00:02:12,400 --> 00:02:17,310 Beraz, gogoratu sarrera-> hitz hori karakterra da Hitz tamaina luzera Buffer plus 42 00:02:17,310 --> 00:02:20,300 Bat goazela hitza gordetzeko sartu 43 00:02:20,300 --> 00:02:25,280 Beraz fscanf da itzuliko 1 betiere joan arrakastaz irakurri bat gai izan zen bezala 44 00:02:25,280 --> 00:02:26,750 fitxategia hitza. 45 00:02:26,750 --> 00:02:31,030 >> Bai errore bat gertatzen bada edo helduko gara fitxategia amaieran, ez da 46 00:02:31,030 --> 00:02:34,950 itzultzeko 1 eta kasu horretan ez bada itzuli 1, ari gara, azkenik, hautsi egingo 47 00:02:34,950 --> 00:02:37,280 berriz, begizta hau daudelarik. 48 00:02:37,280 --> 00:02:42,770 Beraz, ikusi dugu behin arrakastaz dugu hitz bat irakurri sartu 49 00:02:42,770 --> 00:02:48,270 sarrera-> hitza, eta gero ari gara hash joan hitz hori gure hash funtzioa erabiliz. 50 00:02:48,270 --> 00:02:49,580 Ikus dezagun begirada bat hash funtzioa. 51 00:02:49,580 --> 00:02:52,430 52 00:02:52,430 --> 00:02:55,610 >> Beraz, ez duzu benetan behar hau ulertzeko. 53 00:02:55,610 --> 00:02:59,460 Eta, egia esan, besterik gabe bota hau dugu hash funtzioa Internetetik. 54 00:02:59,460 --> 00:03:04,010 Du aitortu behar duzun gauza bakarra da hori char * hitz bat hartzen du, 55 00:03:04,010 --> 00:03:08,960 beraz, kate bat hartu du sarrera gisa eta unsigned int bat itzuli irteera gisa. 56 00:03:08,960 --> 00:03:12,360 Beraz, hash funtzio bat guztia da da, da sarrera bat hartzen du, zuk bat ematen du 57 00:03:12,360 --> 00:03:14,490 hash taula sartu indizea. 58 00:03:14,490 --> 00:03:18,530 Nabarituko ari garela NUM_BUCKETS by Modding beraz hash balioa itzuliko 59 00:03:18,530 --> 00:03:21,730 benetan hash taula sartu indize bat da eta ez du haratago indizea 60 00:03:21,730 --> 00:03:24,320 array mugetatik. 61 00:03:24,320 --> 00:03:27,855 >> Beraz emandako hash funtzio hori, goazen irakurri dugun hitza egiaztatu 62 00:03:27,855 --> 00:03:31,700 hiztegitik eta ondoren, goazen hori erabili ahal txertatu ditu 63 00:03:31,700 --> 00:03:33,750 Istorio hash taula sartu. 64 00:03:33,750 --> 00:03:38,830 Orain, hash taula hash oraingoa da lotuta hash taulan zerrenda, eta 65 00:03:38,830 --> 00:03:41,410 Oso posible da hori besterik ez da NULL. 66 00:03:41,410 --> 00:03:45,640 Gure at sarrera txertatu nahi dugu lotutako zerrenda honen hasieratik, eta beraz, 67 00:03:45,640 --> 00:03:48,910 gure uneko sarrera izan goaz hash zer taulan gaur egun seinalatu 68 00:03:48,910 --> 00:03:54,030 puntuak eta gero ari gara gordetzeko joan hash hash at taulan 69 00:03:54,030 --> 00:03:55,350 egungo sarrera. 70 00:03:55,350 --> 00:03:59,320 >> Beraz bi lerro hauek arrakastaz txertatu du hasieran sarrera 71 00:03:59,320 --> 00:04:02,270 lotuta indizea hartan zerrenda hash taula. 72 00:04:02,270 --> 00:04:04,900 Horrekin dugu Bukatutakoan behin, badakigu beste hitz bat aurkitu dugula horretan 73 00:04:04,900 --> 00:04:07,800 hiztegi eta Kontatzailea dugu berriro. 74 00:04:07,800 --> 00:04:13,960 Hori egitean mantendu dugun fscanf arte azkenik zerbait ez 1 ematen at 75 00:04:13,960 --> 00:04:18,560 puntua gogoratu behar dugula sarrera doan, beraz, hemen, bat malloced dugu 76 00:04:18,560 --> 00:04:21,329 Istorio eta zerbait irakurtzen saiatu ginen hiztegitik. 77 00:04:21,329 --> 00:04:24,110 Eta ez du behar bezala irakurri dugu hiztegitik zerbait zeinean 78 00:04:24,110 --> 00:04:27,440 Kasu sarrera dugula libratzeko behar dugu inoiz benetan hash taula jarri 79 00:04:27,440 --> 00:04:29,110 eta, azkenik, hautsi. 80 00:04:29,110 --> 00:04:32,750 >> Behin hautsi dugu, ikusi behar dugu, bai, apurtu genuen han delako 81 00:04:32,750 --> 00:04:35,840 zen Errorea gertatu da fitxategia irakurtzean, edo apurtu genuen iritsi garelako 82 00:04:35,840 --> 00:04:37,120 fitxategiaren amaieran? 83 00:04:37,120 --> 00:04:40,150 Errorea gertatu da bada, orduan nahi dugu itzultzeko faltsua karga ez delako 84 00:04:40,150 --> 00:04:43,260 arrakasta, eta prozesuan, nahi dugu dugu irakurri diren hitz guztiak deskargatu 85 00:04:43,260 --> 00:04:45,670 eta hiztegi itxi fitxategia. 86 00:04:45,670 --> 00:04:48,740 Suposatuz arrakasta genuen, orduan besterik ez dugu oraindik ere hiztegi itxi behar 87 00:04:48,740 --> 00:04:51,970 fitxategia, eta azkenik egia geroztik itzuli Nik ongi kargatu dugu 88 00:04:51,970 --> 00:04:53,040 hiztegi. 89 00:04:53,040 --> 00:04:54,420 Eta hori da karga. 90 00:04:54,420 --> 00:04:59,020 >> Beraz, orain begiratu, kargatutako hash taula bat eman, da itxura hau egingo. 91 00:04:59,020 --> 00:05:02,690 Beraz, egiaztatu, boolearra itzultzen digu, eta horrek dagoela adierazi du joan ala 92 00:05:02,690 --> 00:05:07,530 pasa-in char * hitza, ala pasa-Kate gure hiztegian dago. 93 00:05:07,530 --> 00:05:10,530 Da hiztegian hala bada, bada gure hash taula, izango da itzuliko gara 94 00:05:10,530 --> 00:05:13,380 egia, eta ez bada, faltsua itzuliko izango dugu. 95 00:05:13,380 --> 00:05:17,770 Pasa-hitza horren aurrean, ez gara hitza egiaztatu du. 96 00:05:17,770 --> 00:05:22,020 >> Orain, aitortu gauza garrantzitsu bat da duten karga, dugu bazekien hori guztia 97 00:05:22,020 --> 00:05:25,820 Hitzak ziren minuskulaz izango, baina hemen, ez gaude hain ziur. 98 00:05:25,820 --> 00:05:29,510 Gure hash funtzioa begirada bat hartzen badugu, gure hash funtzioa benetan 99 00:05:29,510 --> 00:05:32,700 da pertsonaia bakoitzak lowercasing Hitzaren. 100 00:05:32,700 --> 00:05:37,580 Beraz, kapitalizazioa kontuan hartu gabe hitza, gure hash funtzioa ez da joan 101 00:05:37,580 --> 00:05:42,270 edozein dela indizea berberak emango kapitalizazio da litzateke 102 00:05:42,270 --> 00:05:45,280 erabat minuskulaz itzuli hitzaren bertsio. 103 00:05:45,280 --> 00:05:45,950 Ondo da. 104 00:05:45,950 --> 00:05:47,410 >> Beraz, gure indizea da. 105 00:05:47,410 --> 00:05:49,790 Hash hitza honetarako mahai da. 106 00:05:49,790 --> 00:05:52,940 Orain, hau loop va Zerrenda lotuta gehiagoko izateko 107 00:05:52,940 --> 00:05:55,000 du indize hori izan zen. 108 00:05:55,000 --> 00:05:59,630 Beraz, konturatu sarrera hasieratzean ari gara indize hori seinalatu. 109 00:05:59,630 --> 00:06:03,480 Istorio ez bitartean jarraituko goaz ez berdinak NULL, eta gogoratu 110 00:06:03,480 --> 00:06:08,350 erakuslea eguneratzeko gure lotuta zerrendan Istorio berdinen sarrera-> hurrengoa, beraz, 111 00:06:08,350 --> 00:06:13,840 gure egungo sarrera puntu lotuta-zerrendako hurrengo elementua. 112 00:06:13,840 --> 00:06:14,400 Ondo da. 113 00:06:14,400 --> 00:06:19,150 >> Hain lotuta zerrendan sarrera bakoitzeko, strcasecmp erabili goaz. 114 00:06:19,150 --> 00:06:23,780 Ez da strcmp delako berriro ere, dugu gauzak kasu insensitively egin nahi. 115 00:06:23,780 --> 00:06:28,830 Beraz strcasecmp erabiltzen dugu hitza alderatzeko zen funtzio hori gainditu 116 00:06:28,830 --> 00:06:31,860 hitzaren aurka duten Istorio honetan. 117 00:06:31,860 --> 00:06:35,570 0 itzultzen badu, horrek esan nahi du ez zela Partidu bat, kasu horretan, nahi dugu 118 00:06:35,570 --> 00:06:36,630 egia itzuliko. 119 00:06:36,630 --> 00:06:39,590 Arrakastaz aurkitu dugu Gure hash taula hitza. 120 00:06:39,590 --> 00:06:43,040 >> Ez zen partida bat izanez gero, ondoren gara begizta berriro joan eta begiratu 121 00:06:43,040 --> 00:06:43,990 Hurrengo sarrera. 122 00:06:43,990 --> 00:06:47,640 Eta begizta jarraituko dugu han berriz lotutako zerrenda honetako sarrerak dira. 123 00:06:47,640 --> 00:06:50,160 Zer gertatzen apurtzen badugu hau daudelarik loop? 124 00:06:50,160 --> 00:06:55,110 Horrek esan nahi ez dugu sarrera bat aurkituko duten datorren hitz hori, eta kasu horretan 125 00:06:55,110 --> 00:07:00,220 faltsua adierazi itzuliko gara, gure Hash taula ez dauka hitz hau. 126 00:07:00,220 --> 00:07:01,910 Eta hori da txeke da. 127 00:07:01,910 --> 00:07:02,540 Ondo da. 128 00:07:02,540 --> 00:07:04,790 >> Beraz, dezagun tamaina begirada bat. 129 00:07:04,790 --> 00:07:09,280 Orain, tamaina nahiko erraza da izango geroztik karga gogoratu, hitz bakoitzeko 130 00:07:09,280 --> 00:07:12,880 aurkitu dugu global bat gehitzen dugu hashtable_size aldakorra. 131 00:07:12,880 --> 00:07:15,830 Beraz tamaina funtzioa besterik ez da global hori itzuli egingo da 132 00:07:15,830 --> 00:07:18,150 aldakorra, eta hori da. 133 00:07:18,150 --> 00:07:22,300 >> Orain, azkenik, deskargatu behar dugu hiztegi guztia behin egiten. 134 00:07:22,300 --> 00:07:25,340 Beraz, nola ari gara hori egin dugu? 135 00:07:25,340 --> 00:07:30,440 Hementxe, ari gorako guztiak begizta dugu Gure hash taula kuboak. 136 00:07:30,440 --> 00:07:33,240 Beraz, ez dago NUM_BUCKETS kuboak dira. 137 00:07:33,240 --> 00:07:37,490 Eta lotuta gure hash zerrenda bakoitzeko mahaia, gabiltza gainean begizta joan 138 00:07:37,490 --> 00:07:41,070 lotutako zerrenda osoa elementu bakoitzak uzten. 139 00:07:41,070 --> 00:07:46,070 Orain, kontuz ibili behar dugu, beraz, hemen dugu tenporala aldagai bat hori da, izan 140 00:07:46,070 --> 00:07:49,740 erakusleak gordetzeko hurrengo lotuta zerrendan elementu. 141 00:07:49,740 --> 00:07:52,140 Eta gero ari gara doan joan uneko elementua. 142 00:07:52,140 --> 00:07:55,990 >> Ziur hau egin dugu geroztik dugun izan behar dugu ezin besterik egungo elementu askatzea 143 00:07:55,990 --> 00:07:59,260 eta saiatu hurrengo erakuslea sartzeko behin geroztik libratuko dugu 144 00:07:59,260 --> 00:08:00,870 memoria baliogabe bihurtzen da. 145 00:08:00,870 --> 00:08:04,990 Beraz, inguruan mantentzeko erakuslea behar dugu hurrengo elementua, eta ondoren askatu ahal dugu 146 00:08:04,990 --> 00:08:08,360 egungo elementu, eta gero eguneratu ahal izango dugu egungo gure nahi seinalatu elementu 147 00:08:08,360 --> 00:08:09,590 hurrengo elementua. 148 00:08:09,590 --> 00:08:12,770 >> Begizta dugu daude bitartean elementuak lotutako zerrenda honetan. 149 00:08:12,770 --> 00:08:16,450 Egin dugu duten zerrendak lotutako guztientzat in Hash taula du, eta egiten ari gara behin 150 00:08:16,450 --> 00:08:20,180 horrekin, erabat Nik deskargatzen dugu Hash taula du, eta egiten ari gara. 151 00:08:20,180 --> 00:08:24,050 Beraz, ezinezkoa da zamaketariarena inoiz itzultzeko faltsua, eta Bukatutakoan dugunean, dugu 152 00:08:24,050 --> 00:08:25,320 return egia. 153 00:08:25,320 --> 00:08:27,563