[Powered by Google Translate] [Walkthrough - Set Problem 5] [Zamyla Chan - Universiteti i Harvardit] [Kjo është CS50. - CS50.TV] Dakord. Hello, të gjithë, dhe të mirëpritur të walkthrough 5. Pset5 është misspellings, në të cilën ne do të bërë një spell checker-. Damë spell-janë jashtëzakonisht të rëndësishme. Kjo ka ndodhur ndonjëherë për ju? Ju punoni shumë, shumë grumbullojnë në një letër për një përplasje dhe pastaj ende të përfundojnë duke marrë një Rade shumë shkëlqim si një D ose A = D dhe të gjithë, sepse ju jeni Spoiler sallam me mëlçi në fjalën balenë gjerë. Po, proofreading speca tuaja është një çështje e, të impotenca madhe. Ky është një problem që prek burrëror, studentët burrëror. Unë u tha një herë nga Sith torturues tim të klasës se unë kurrë nuk do të merrni në një koleg të mirë. Dhe kjo është e gjitha që kam kërkuar kurrë, që të gjithë çdo fëmijë dëshiron në moshën time, vetëm për të marrë në një koleg të mirë. Dhe jo vetëm ndonjë koleg. Nr Unë të kërkuar për të shkuar në një kolegut të Fildishtë Ligjor. Pra, nëse unë nuk e kam përmirësim, do të jetë zhdukur ëndrrat e mia për të shkuar në Harvard, Jalë, ose burg - ju e dini, në burg, New Jersey. Kështu që unë kam veten një spell checker-. Kjo është një fragment të vogël nga një prej artistëve të mi të preferuar fjalë e thënë, Taylor Mali. Gjithsesi, siç thotë ai, rëndësia e të paturit e një spell checker-është shumë e rëndësishme. Kështu mirëpresim tek walkthrough 5, në të cilën ne do të flasim rreth pset5: misspellings, në të cilën ne do të jetë bërë shumë vetë tonë spell checker-. Toolbox për këtë javë, Kodin e Shpërndarjes, do të jetë e rëndësishme të shohim në vetëm për të kuptuar funksionet e ndryshme që fjalori juaj do të ketë. Ne jemi të vërtetë do të të ketë të shumta. Fotografi që së bashku bëjnë c pset tonë. Dhe kështu duke kërkuar nëpër aspekte të ndryshme, edhe pse ne nuk jeni aktualisht redaktimi një e dosjeve, Shkruaj një fjalë, duke e ditur se si punon me lidhje me dictionary.c, të cilat ne do të jetë me shkrim, do të jetë shumë e rëndësishme. Spekulim pset gjithashtu përmban një shumë informacione të dobishme në aspektin e gjërave që ju mund të supozojmë, rregullat dhe gjëra si kjo, kështu që të jetë i sigurt për të lexuar spekulim pset kujdes për këshilla. Dhe kur në dyshim të një rregulli ose diçka të tillë, atëherë gjithmonë i referohen spekulim pset ose Diskutoni. Kjo pset do të mbështeten në pointers, kështu që ne duam të sigurohemi se ne e kuptojmë dallimin midis yje të mundshëm shtuar në frontin e emrit treguesin së dhe ampersands, si për të liruar ato, etj Pra, duke qenë një mjeshtër i pointers do të jetë shumë e dobishme në këtë grup problemit. Ne jemi duke shkuar për të parë në listat e lidhura pak më shumë, ku ne kemi elemente që ne e quajmë nyjet që kanë edhe një vlerë, si dhe si një tregues në nyjen e ardhshëm, dhe kështu në thelb lidh elementeve të ndryshme njëra pas tjetrës. Ka disa opsione të ndryshme të zbatimit fjalorin tuaj aktuale. Ne do të shikojmë në dy metoda kryesore, e cila është tavolina hash dhe pastaj përpiqet. Në të dyja këto, ato përfshijnë disa lloj të nocionit të një liste të lidhur ku keni elemente të lidhura me njëri-tjetrin. Dhe kështu që ne jemi duke shkuar për të parë mbi se si ju mund të jetë në gjendje të veprojë rreth listave të lidhura, krijuar ato, për të lundruar në drejtim të asaj se si për të, për shembull, të futur një nyje në të ose pa të gjitha nyjet si. Në kushtet e nyjave liruar, se me të vërtetë e rëndësishme se sa herë që ne memorie malloc, më pas ne e liruar atë. Pra, ne duam të sigurohemi që asnjë pointer shkon unfreed, se ne nuk kemi ndonjë rrjedhjet e kujtesës. Ne jemi duke shkuar për të futur një mjet të quajtur Shprehje që shkon programin tuaj dhe kontrollon nëse të gjitha kujtesës që keni caktuar është liruar më pas. Pset juaj është vetëm plotësoni kur ajo punon dhe ajo ka funksionalitet të plotë, por gjithashtu, Shprehje tregon se ju nuk e keni gjetur asnjë rrjedhjet e kujtesës. Së fundi, për këtë pset, unë me të vërtetë dua të theksoj - Unë do të thotë, si zakonisht, unë jam padyshim një mbështetës i përdorur stilolaps dhe letër për grupe tuaja problemore, por për këtë, unë mendoj se stilolaps dhe letër do të jetë veçanërisht e rëndësishme kur ju doni të tërhequr shigjeta për të gjëra dhe të kuptuarit se si funksionojnë gjërat. Pra, patjetër të përpiqen të përdorin stilolaps dhe letër për të nxjerrë gjëra para se të merrni coding për shkak se ajo mund të marrë pak çrregullt. Së pari, le të shkojnë në listat e lidhura pak. Listat e lidhura përbëhen nga nyjet, ku çdo nyje ka një vlerë të lidhur me të, si një tregues për nyjen e ardhshme pas saj. Një disa gjëra të rëndësishme që lidhen me listat janë se ne kemi nevojë për të kujtuar ku nyja jonë e parë është, dhe pastaj një herë ne e dimë se ku nyja e parë është, në këtë mënyrë ne mund të hyni në nyjen që pikat e para nyjë në dhe pastaj njëra pas se dhe ai pas kësaj. Dhe pastaj elementi i fundit në listën tuaj është e lidhur tregues se Nyja e është gjithmonë do të theksojnë null. Kur një pikë nyjë për null, atëherë ju e dini se ju keni arritur fundin e listës, se kjo është nyja e fundit, se nuk ka asgjë pas kësaj. Këtu në këtë skematike, ju shihni se shigjetat janë pointers, dhe seksioni blu është ku vlera është ruajtur, dhe pastaj kutia e kuqe me treguesin ndaj saj është tregues nyjen e treguar në nyjen e ardhshëm pas saj. Dhe kështu që ju shihni këtu, nyja D do të tregojnë për NULL, sepse ajo është elementi i fundit në listë. Le të shohim se si ne mund të përcaktojë një struct për një nyje. Dhe pasi ne duam që të ketë nyje të shumta, kjo do të bëhet një struct typedef në të cilën ne do të kemi disa raste të ndryshme të nyjeve. Dhe kështu ne define si një lloj të ri të dhënave. Këtu, ne kemi një nyje typedef struct. Në këtë shembull, ne jemi që kanë të bëjnë me nyje numër i plotë, kështu që ne kemi një vlerë integer emrin dhe pastaj ne kemi një tjetër tregues, dhe në këtë rast, kjo është një tregues për një nyje, kështu që ne kemi një nyje struct * quajtur ardhshëm. Dhe atëherë ne jemi duke e quajtur këtë gjë nyjen tërë. Sigurohuni që ju ndiqni këtë sintaksë. Vini re se nyja është referohet në të vërtetë lart, si më poshtë formatimin e teksteve kaçurrel. Pastaj të mbajnë gjurmët e ku nyja ime e parë është në këtë listë e lidhur, atëherë unë kam një tregues nyje quajtur kreu, dhe unë hapësirë ​​malloc mjaftueshme për madhësinë e një nyje. Njoftim, megjithatë, se kreu në fakt është një tregues nyje në krahasim me një nyje aktuale vetë. Kështu kreu në fakt nuk përmban ndonjë vlerë, ajo vetëm tregon cilado nyja e parë në listën time të lidhura është. Për të marrë një kuptim më të mirë të listave të lidhura, sepse kjo është shumë e rëndësishme të mbajnë gjurmët për të bërë të sigurtë që ju të ruajtur zinxhirin, Më pëlqen të mendoj për atë si njerëzit në një linjë që mbajnë duart, ku çdo person është i mbajnë duart me një tjetër. Ju nuk mund të shihni në këtë vizatim, por në thelb ata janë treguar të personit tjetër që është në zinxhirin e tyre. Dhe kështu që nëse ju doni të kaloj nëpër një listë të lidhur ku këta njerëz - imagjinoni të gjithë ata njerëz kanë vlera të lidhur me to dhe gjithashtu theksojnë tek personi tjetër në linjë - në qoftë se ju doni të kaloj nëpër lista të lidhur, për shembull, ose të ndryshoni vlerat ose kërko për një vlerë apo diçka si kjo, atëherë ju do të dëshironi që të ketë një tregues për person të veçantë. Pra, ne do të kemi një nyje të dhënave treguesin lloji. Për këtë shembull, le të thërrasë atë kursorit. Një tjetër mënyrë e përbashkët për të përmendur se kjo do të jetë iterator ose diçka si kjo sepse ajo është iterating gjatë dhe në fakt lëvizin nyjen e cila është e treguar. Kjo këtu do të jetë kursori tonë. Kursori tonë së pari do të theksojnë elementin e parë në listën tonë. Dhe kështu që ajo që ne duam të bëjmë është që ne në thelb do të jetë e vazhdueshme kursorin, lëvizur atë nga njëra anë në tjetrën. Në këtë rast, ne duam për të lëvizur atë në elementin tjetër në listë. Me vargjeve, ajo që ne do të bëjmë është që ne do të themi vetëm ne rritjen e indeksit nga 1. Në këtë rast, ajo që ne duhet të bëni është të gjeni të vërtetë që personi ky person aktuale është treguar, dhe kjo do të jetë vlera e ardhshëm. Pra, nëse kursori është vetëm një tregues nyje, atëherë ajo që ne duam të bëjmë është që ne duam për të marrë vlerën që kursori është treguar. Ne duam që të merrni në atë nyje dhe pastaj, pasi ne jemi në atë nyje, të gjetur ku është treguar për të. Për të marrë në nyjen aktuale që kursori është treguar për të, Zakonisht ne tregojnë atë me (* kursorin). Kjo do të ju jap nyjen aktuale që kursori është duke treguar. Dhe pastaj pas kësaj, ajo që ne duam të bëjmë është që ne duam për të hyrë çfarëdo që vlera tjetër është nyje. Për ta bërë këtë, për të hyrë në vlerat brenda e struct, kemi operatorin dot. Pra, atëherë ajo do të jetë (* kursori). Ardhshëm. Por kjo është pak e çrregullt në drejtim të pasur kllapa rreth kursorit *, dhe kështu që ne zëvendësojë këtë deklaratë tërë me kursorin->. Kjo është një dash dhe pastaj një shenjë e madhe se, kështu duke e bërë një shigjetë. kursori-> ardhshëm. Kjo do të vërtetë të merrni ju nyja që pikat kursorin. Kjo vlerë është e ardhshëm. Pra, në vend që të kesh yll dhe dot, ju jeni duke zëvendësuar atë me një shigjetë. Jenë shumë të kujdesshëm për të bërë të sigurtë që ju përpiqeni të përdorni këtë sintaksë. Tani që ne kemi kursorin tonë, në qoftë se ne duam të hyrë në vlerë, më parë, ne kishim kursori-> tjetër, por për të hyrë në vlerën në nyjen që kursori është duke treguar, ne thjesht themi nyjen-> vlera. Nga atje, kjo është e të dhënave të llojit të përcaktuar çdo gjë që ne kemi vlerat dhe nyjet të jetë. Në qoftë se kjo është një nyje int, atëherë kursori-> vlera është vetëm do të jetë një numër të plotë. Pra, ne mund të bëjë operacione në atë, kontrolloni barazitë, të caktojë atë vlera të ndryshme, etj Pra, atëherë çfarë ju doni të bëni nëse ju doni të lëvizni kursorin tek personi tjetër, ju në të vërtetë të ndryshojë vlerën e kursorit. Që kursori është një tregues nyje, ju ndryshoni adresën aktuale akrep në adresën e nyjeve tjetër në listën tuaj. Kjo është vetëm disa Kodi ZIP ku ju mund të iterate. Ku kam koment bëjë diçka, kjo është ajo ku ju jeni me siguri do të ketë qasje në vlerën ose të bëjë diçka të bëjë me atë nyje të veçantë. Për të filluar atë, unë them se kursori im fillimisht do të tregojnë për elementin e parë në listën e lidhur. Dhe kështu deri përpara, kam definuar atë si kreun e nyjeve. Siç e kam përmendur më parë, duke çliruar është me të vërtetë e rëndësishme. Ju dëshironi të bëni të sigurtë që ju të liruar çdo element në listë pasi të keni përfunduar me atë. Kur ju nuk keni nevojë për ndonjë nga ato referencë pointers më, ju doni të bëni të sigurtë që ju të liruar të gjithë ata pointers. Por ju doni të jenë shumë të kujdesshëm këtu në atë që ju doni të shmangur çdo rrjedhjet e kujtesës. Në qoftë se ju pa një person para kohe, atëherë të gjitha pointers se se pikë nyjë të do të jetë e humbur. Going back to shembullin e personit për ta bërë atë një pak më të lartë aksionet, le të kemi këta njerëz, me përjashtim në këtë rast ata janë hovering mbi një liqen me një përbindësh. Ne duam të sigurohemi që sa herë që ne të lirë, ne nuk do të humbin dhe le të shkojnë e çdo nyje përpara se ne kemi liruar në fakt ato. Për shembull, në qoftë se ju do të thjesht të telefononi pa pagesë në këtë djalë këtu, atëherë ai do të lirohet, por pastaj të gjithë këta njerëz atëherë do të jetë e humbur dhe ata do të drift off dhe bie poshtë. Pra, ne duam të sigurohemi se në vend të kësaj, ne duam të mbajnë një lidhje me pjesën tjetër. Akrep tonë kokë, që tregon për elementin e parë në listë. Kjo është lloj i si një litar ankorimin personin e parë. Çfarë ju mund të dëshironi të bëni kur jeni të liruar një listë të ketë - Nëse ju doni për të liruar elementin e parë e parë, atëherë ju mund të ketë një tregues të përkohshme se pikë për çfarëdo elementi i parë është. Pra, ju keni treguesin tuaj të përkohshme treguar këtu. Në këtë mënyrë, ne kemi një të mbajë nyjen e parë. Dhe pastaj, pasi ne e dimë se nyja e parë do të lirohen, atëherë ne mund të lëvizin këtë litar, kjo spirancë, kokën tonë, që në fakt tregojnë për çfarëdo pari është treguar. Pra, ky kreu në fakt tregon elementin e dytë tani. Tani ne jemi të lejuar për të liruar çdo gjë që është ruajtur në temp, dhe kështu që ne mund të fshihet ajo që pa rrezikuar të gjitha nyjet e tjera në listën tonë. Një tjetër mënyrë që ju mund të bëni këtë mund të jetë çdo herë që ju vetëm të liruar elementin e fundit në listën e sepse ata janë të garantuara për të mos u tregoi asgjë. Kështu që ju mund vetëm të liruar këtë, atëherë kjo pa një, atëherë pa këtë një të tillë. Kjo definitivisht punon, por është pak e ngadalshme, sepse nga natyra e listave të lidhura, ne nuk mund thjesht menjëherë hidhen në një të fundit. Ne duhet të përshkojë çdo element në listën lidhur dhe kontrolloni nëse ky dikush është duke treguar NULL, kontrolloni çdo kohë, dhe pastaj një herë kemi arritur fundin, pastaj të lirë që. Nëse ju do të bëni këtë proces, ju do të jetë në fakt kontrolluar këtu, kontrolluar këtu, pastaj duke kontrolluar këtu, liruar atë, pastaj do të kthehet, duke kontrolluar këtu, duke kontrolluar këtu, liruar atë, kontrolluar këtu, dhe pastaj liruar atë. Kjo merr kohë pak më shumë. Po. [Student] A do të jetë e mundur për të bërë një listë e lidhur që ruan një dalje treguesin deri në fund? Kjo patjetër do të jetë e mundur. Ta përsërisë pyetjen, a është e mundur që të ketë një strukturë të lidhur listë të tilla që ju keni një tregues treguar deri në fund të listës të lidhura? Unë do të them se është e mundur, dhe çdo herë që ju të futur diçka në listën tuaj të lidhur ju do të keni për të rinovuar atë treguesin dhe gjëra të tilla si kjo. Ju do të keni një bisht nyje *, për shembull. Por kur ju jeni duke zbatuar këtë tipar, ju duhet të mendoni të tregtisë të humbura, si sa herë jam unë do të iterating mbi këtë, sa e vështirë është ajo do të jetë për të mbajtur gjurmët e bishtit si dhe kreun si iterator im, dhe gjëra të tilla si kjo. Bën që -? >> [Student] Yeah. Është e mundur, por në aspektin e vendimeve të projektimit, ju duhet të peshojnë mundësitë. Këtu është një skelet i kodit që do të ju lejojnë për të liruar çdo element në një listë të lidhura. Përsëri, pasi që unë jam iterating mbi një listë e lidhur, unë jam do të duan që të ketë një lloj të kursorit ose iterator. Ne jemi iterating derisa kursori është NULL. Ju nuk doni të iterate kur kursori juaj është NULL sepse kjo do të thotë se nuk ka asgjë në listë. Pra, atëherë këtu kam bërë një nyje * përkohshme duke treguar për atë që unë jam duke marrë parasysh është i pari i listës sime, dhe pastaj kam lëvizur kursorin tim përpara 1 dhe pastaj të lirë çdo gjë që kam pasur në ruajtje të përkohshme. Tani kemi ardhur për të futur në listat e lidhura. Unë kam tre nyje në listën time lidhur, dhe le të shkojë me rastin thjeshtë ku ne duam të futur një tjetër nyje në fund të listës sonë të lidhura. Për ta bërë këtë, të gjithë ne do të bëjmë është që ne do të kaloj për të gjetur se ku në fund aktual i listës është i lidhur, kështu që cilado është nyja treguar NULL - që është kjo - dhe pastaj thonë, në fakt, kjo nuk do të jetë nyja e fundit; ne jemi në të vërtetë do të ketë një tjetër. Pra, ne do të kemi këtë aktuale një pikë për çdo gjë që ne jemi futur. Deri tani ky person kuqe këtu bëhet nyja e fundit në listën e lidhur. Dhe kështu karakteristikë e nyjeve të fundit në listën e lidhur është se ajo tregon null. Pra, atëherë ajo që ne do të duhet të bëni është vendosur treguesin ky djalë kuq për NULL. Atje. Por çfarë nëse ne të kërkuar për të futur një nyje në mes të një të dytë dhe të tretë? Kjo nuk është fare e thjeshtë, sepse ne duam të sigurohemi se ne nuk e le të shkojnë e çdo nyje në listën tonë lidhur. Ajo që ne do të duhet të bëni është të siguroheni se ne anchor veten për secilën prej tyre. Për shembull, le të quajmë këtë një të dytë. Nëse ju tha e dyta tani tregon për këtë një të re dhe ju vetëm e bëri një tregues atje, atëherë kjo do të rezultojë në këtë djalë të humbur sepse nuk ka ndonjë lidhje të tij. Në vend të kësaj - unë do të tërheqë këtë përsëri. Falni aftësitë e mia artistike. Ne e dimë se ne nuk mund thjesht të drejtpërdrejtë lidhur 2 në një të ri. Ne duhet të sigurohemi që ne të mbajë në të atë të fundit. Ajo që ne mund të dëshironi të bëni është të ketë një tregues të përkohshme në elementin që do të jetë bashkëngjitur në. Pra, atëherë ne kemi një tregues të përkohshëm atje. Që ne e dimë se kjo një e treta është duke u mbajtur gjurmët e, 2 tani mund të lidhura me një tonë të ri. Dhe në qoftë se kjo i ri djalë kuqe do të jetë në mes të 2 dhe 3, atëherë çfarë është tregues se djalë e shkuar për pikë për të? >> [Student] Temp. Temp. Po. Pra, atëherë vlera e ardhshëm ky djalë kuq është do të jetë temp. Kur ju jeni futur në listat e lidhura, ne pamë që ne mund të lehtësisht të shtoni diçka në fund, duke krijuar një rrjet të përkohshëm, ose në qoftë se ne të kërkuar për të shtuar diçka në mes të array tonë, atëherë ajo do të marrë një pak më shumë shuffling rreth. Nëse ju doni të, për shembull, kanë një listë të renditura të lidhur, atëherë ju duhet të lloj peshojnë kostot dhe përfitimet e që sepse në qoftë se ju dëshironi që të ketë një rrjet të renditura, që do të thotë se çdo herë që ju të futur në të, ajo do të marrë kohë pak më shumë. Megjithatë, nëse ju doni të më vonë, si ne do të gjeni ne do të duan të, kërko përmes një listë e lidhur, atëherë ajo mund të jetë më e lehtë në qoftë se ju e dini se çdo gjë është në rregull. Kështu që ju mund të dëshironi të peshojnë kostot dhe përfitimet e kësaj. Një tjetër mënyrë për të futur në listën e lidhur është futur në fillim të listës. Nëse ne barazim spirancë tonë këtu - kjo është kreu ynë - dhe pastaj kanë këta njerëz të lidhur me të, dhe pastaj ne kemi një nyje të re të futur në fillim, atëherë çfarë mund të duam të bëjmë? Çfarë do të jetë i gabuar me vetëm duke thënë se unë dua të lidhë të kuqe në blu, sepse kjo është e para? Çfarë do të ndodhë këtu? Të gjitha këto tre do të merrni humbur. Pra, ne nuk duam të bëjmë atë. Përsëri, ne kemi mësuar se ne duhet të kemi disa lloj pointer përkohshëm. Le të zgjedhin të kenë një pikë të përkohshme për këtë djalë. Atëherë ne mund të kemi një pikë blu të përkohshme dhe pastaj pika të kuqe në blu. Arsyeja pse unë jam duke përdorur njerëzit këtu është, sepse ne të vërtetë duan të kujtoj mbajtur për njerëzit dhe duke u siguruar se ne kemi një lidhje të tyre para se të le të shkojë e një dore apo diçka të tillë. Tani që ne kemi një ndjenjë të listave të lidhura - si ne mund të krijojë një listë të lidhur dhe për të krijuar strukturat për atë përbërë nga përkufizimi tipit për një nyje dhe pastaj duke e bërë të sigurtë që ne kemi një tregues për kreun e lidhur atë listë - herë kemi se dhe ne e dimë se si të kaloj përmes një grup, hyrë elemente të ndryshme, ne e dimë se si për të futur dhe ne e dimë se si për të liruar ato, atëherë ne mund të merrni në gabim. Si zakonisht, ne kemi një seksion të pyetjeve që do të merrni ju përdorur për të operuar me listat e lidhura dhe struktura të ndryshme të tilla si radhët e gjata dhe oxhaqet. Atëherë ne mund të lëvizin në gabim. Gabim ka në kodin e shpërndarjes një çift të dosjeve të rëndësishme. Së pari vërejmë se kemi këtë Makefile këtu, të cilat ne nuk kemi hasur në të vërtetë më parë. Nëse keni shikuar brenda dosje pset5, ju do të vëreni që ju të keni një skedar. H, atëherë ju keni dy fotografi. c. Çfarë kjo nuk është Makefile para, ne vetëm do të bëjë dhe pastaj shtypni emrin programi dhe pastaj ne do të shohim të gjitha këto argumente dhe flamuj kaluar në të përpiluesit. Çfarë nuk është Makefile na lejon për të hartuar disa fotografi në të njëjtën kohë dhe të kalojë në flamujt që ne duam. Këtu ne shohim vetëm ka një file header këtu. Pastaj ne fakt kemi dy fotografi burim. Ne kemi Shkruaj një fjalë dhe dictionary.c. Ju jeni të mirëpritur për të redaktuar Makefile nëse ju dëshironi. Vini re se në qoftë se ju shkruani këtu pastër, atëherë ajo që bën është në të vërtetë i heq asgjë që është bërthamë. Në qoftë se ju mori një faj segmentimit, në thelb ju merrni një hale thelbësore. Pra, kjo fotografi e shëmtuar pak do të shfaqet në directory tuaj quajtur thelbësore. Ju do të dëshironi të hiqni atë për ta bërë atë të pastër. Ajo heq ndonjë fotografi exe dhe. Fotografi o. Le të marrin një vështrim në dictionary.h. Kjo thotë se ajo deklaron funksionalitetin e një fjalor të. Ne kemi një gjatësi maksimale për çdo fjalë në fjalor. Ne themi se kjo do të jetë fjala më e gjatë të jetë e mundur. Kjo është e gjatësi 45. Pra, ne nuk do të ketë ndonjë fjalë që tejkalojnë atë gjatësi. Këtu ne vetëm kemi prototypes funksion. Ne nuk kemi zbatimin aktual, sepse kjo është ajo që ne do të jetë bërë për këtë pset. Por ajo që e bën këtë është që ne jemi që kanë të bëjnë me fotografi të mëdha këtu dhe funksionalitetin në një shkallë më të madhe, është e dobishme që të ketë një skedar. h kështu që dikush tjetër lexuar ose duke përdorur kodin tuaj mund të kuptojnë se çfarë po ndodh. Dhe ndoshta ata duan për të zbatuar përpiqet në qoftë se ju e bëri tabelat hash apo anasjelltas. Atëherë ata do të thonë funksionin tim ngarkesës, implementimi aktual do të ndryshojnë, por kjo nuk do të ndryshojë prototip. Këtu kemi të kontrolluar, e cila kthehet e vërtetë në qoftë se një fjalë e dhënë është në fjalor. Pastaj kemi ngarkesë, e cila në thelb merr në një skedar fjalor dhe pastaj ngarkesa e saj në disa strukturën e të dhënave. Ne kemi madhësi, e cila, kur të quhet, kthen madhësinë e fjalorit tuaj, sa fjalë janë ruajtur në të, dhe pastaj zbraz, e cila liron të gjithë kujtesës që ju mund të keni marrë duke bërë fjalorin tuaj. Le të marrin një vështrim në dictionary.c. Ne shohim se kjo duket shumë e ngjashme me dictionary.h, përveç tani ajo vetëm ka të gjitha këto Shihni Tërë në të. Dhe kështu kjo është puna juaj. Përfundimisht, ju do të jetë i plotësuar me të gjitha Shkruaj një fjalë të këtij kodi. Dictionary.c, kur ekzekutohet, nuk është me të vërtetë do të bëjë asgjë, kështu që ne shikojmë drejt Shkruaj një fjalë për të parë zbatimin aktual të spell checker. Edhe pse ju nuk do të jeni të redaktimi ndonjë të këtij kodi, është e rëndësishme për të lexuar, të kuptojnë kur është quajtur ngarkesës, kur unë jam duke bërë thirrje kontroll, vetëm për të kuptuar, hartë atë jashtë, të shohim se si funksion punon. Ne e shohim se ajo është kontrolluar për përdorimin korrekt. Në thelb, kur dikush shkon speller, kjo tregon se kjo është fakultative që ata të kalojnë në një skedar fjalor, sepse nuk do të jetë një fjalor parazgjedhur file. Dhe pastaj ata duhet të kalojnë në tekst të jetë spell-kontrolluar. merret rusage me kohë, sepse një pjesë e kësaj pset të cilat ne do të merremi me vone nuk është vetëm marrjen e një funksionimi spell-checker pune por në fakt të gjetur atë të jetë i shpejtë. Dhe kështu, atëherë kjo është ajo ku rusage do të vijnë in Këtu, ne shih thirrjen e parë për të njërit prej dosjeve tanë dictionary.c, e cila është ngarkesës. Load kthehet e vërtetë apo e rreme - e vërtetë mbi të suksesit, të rreme mbi dështimit. Pra, në qoftë se fjalori nuk është i ngarkuar si duhet, atëherë Shkruaj një fjalë do të kthehet 1 dhe u largua. Por në qoftë se bën ngarkesës siç duhet, atëherë ai do të vazhdojë. Ne vazhdojmë, dhe ne shohim disa fotografi I / O këtu, ku ajo do të jetë që kanë të bëjnë me hapjen e file teksti. Ja, ajo që ky nuk është spell-kontrollon çdo fjalë të vetme në tekst. Pra, çfarë është duke bërë Shkruaj një fjalë të drejtë këtu është iterating mbi secilën nga fjalët në skedar teksti dhe pastaj kontrollin e tyre në fjalor. Këtu, ne kemi një Boolean misspelled që do të shohim nëse kontrolloni kthen vërtetë apo jo. Nëse fjala është në të vërtetë në fjalor, atëherë kontrolloni do të kthehet vërtetë. Kjo do të thotë se fjala nuk është misspelled. Misspelled Pra, do të jenë të rreme, dhe kjo është arsyeja pse ne kemi zhurmë atje, tregues. Ne mbajmë në vazhdim e sipër, dhe pastaj ajo mban gjurmët e sa fjalë misspelled nuk janë në dosje. Ajo vazhdon në dhe mbyllet file. Atëherë këtu, ajo raporton se shumë fjalë misspelled keni pasur. Ai llogarit se sa kohë u desh për të ngarkuar fjalor, se sa kohë u desh për të kontrolluar atë, se sa kohë u desh për të llogaritur madhësinë, cila, siç ne do të shkojnë në, duhet të jenë shumë të vogla, dhe pastaj se sa kohë u desh për të shkarkoj fjalorin. Këtu ne shohim lart thirrjen për shkarkoj këtu. Nëse ne kontrolloni për madhësinë këtu, atëherë shohim se këtu është thirrja në madhësi ku ajo përcakton madhësinë e fjalorit. Awesome. Detyra jonë për këtë pset është për të zbatuar barrën, e cila do të ngarkesës fjalorin Të dhënat Struktura - cilado që ju zgjidhni, të jetë ajo një tabelë hash apo një provoni - me fjalë nga file fjalor. Atëherë ju keni madhësi, e cila do të kthehet në numrin e fjalëve në fjalor. Dhe në qoftë se ju të zbatojë ngarkesës në një mënyrë të zgjuar, atëherë madhësia duhet të jetë goxha e lehtë. Atëherë ju keni kontrolluar, e cila do të kontrolloni nëse një fjalë e dhënë është në fjalor. Pra Shkruaj një fjalë kalon në një varg, dhe pastaj ju duhet të kontrolloni nëse string se gjendet brenda fjalorit tuaj. Vini re se ne në përgjithësi kanë fjalorë standarde, por në këtë pset, në thelb çdo fjalor kaluar në në çdo gjuhë. Pra, ne nuk mund të supozojmë se fjala është brenda. Foobar fjalë mund të përcaktohet në një fjalor të caktuar që ne të kalojë in Dhe pastaj ne kemi zbraz, e cila çliron një fjalor nga memoria. Së pari, unë do të doja të shkoj mbi metodën hash tryezë rreth asaj se si ne mund të zbatojë të gjitha këto katër funksioneve, dhe pastaj unë do të shkoj mbi përpiqet metodë, si ne zbatojë ato katër funksionet, dhe në fund të bisedës në lidhje me disa këshilla të përgjithshme, kur ju jeni bërë pset dhe gjithashtu se si ju mund të jetë në gjendje të përdorin Shprehje të kontrolloni për rrjedhjet e kujtesës. Le të marrë në tryezë metodë hash. Një tabelë hash përbëhet nga një listë e kova. Çdo vlerë, çdo fjalë, do të shkojë në një nga këto kova. Një tabelë hash në mënyrë ideale të barabartë shpërndan të gjitha këtyre vlerave që ju jeni duke kaluar në dhe pastaj populates ato në kovë tillë që çdo kovë ka rreth një numër të barabartë të vlerave në të. Struktura për një tryezë hash, ne kemi një grup të listave të lidhura. Çfarë bëjmë ne është kur ne të kalojë në një vlerë, ku ne kontrolloni se vlera duhet të takojnë, e cila kovë ajo i takon, dhe pastaj vendin e saj në listën e lidhur lidhur me atë kovë. Ja, ajo që unë kam është një funksion hash. Kjo është një tabelë hash int. Pra, për kovë e parë, çdo integers nën 10 shkojnë në kovë e parë. Çdo integers mbi 10 por nën 20 shkoni në të dytë, dhe pastaj kështu me radhë e kështu me radhë. Për mua, çdo kovë është përfaqësuar këto numra. Megjithatë, thonë se unë do të kalojë në 50, për shembull. Duket sikur tre e parë përmban një gamë të dhjetë numrave. Por unë dua që të lejojë tryezën time hash për të marrë në çdo lloj të integers, kështu atëherë unë do të duhet për të filtruar nga të gjitha numrat e mësipërme 30 në kovë fundit. Dhe kështu atëherë kjo do të rezultojë në një lloj të tabelës hash çekuilibruar. Për të përsëritur, një tavolinë hash është vetëm një grup i kova ku çdo kovë është një listë e lidhur. Dhe kështu për të përcaktuar ku çdo vlerë shkon, e cila kovë ajo shkon në, ju jeni do të duan atë që quhet një funksion hash që merr një vlerë dhe pastaj thotë se kjo vlerë i korrespondon një kovë të caktuar. Pra, deri lart në këtë shembull, funksioni im mori hash çdo vlerë. Të kontrolluar nëse ajo ishte më pak se 10. Në qoftë se kjo ishte, ajo do të vënë atë në kovë e parë. Ajo kontrollon nëse kjo është më pak se 20, e vë atë në të dytë, nëse vërtetë, kontrollon nëse ajo është më pak se 30, dhe pastaj e vë atë në kovë e tretë, dhe pastaj të gjithë të tjerët sapo bie në kovë katërt. Pra, kur ju keni një vlerë, funksioni juaj hash do të zhvillohet këtë vlerë në kovë duhur. Funksioni hash në thelb duhet të dini se sa kova keni. Madhësia hash tuaj tavolinë, numri i kova keni, që do të jetë një numër fiks që është deri te ju, për ju që të vendosë, por ajo do të jetë një numër fiks. Pra, funksioni juaj do të hash duke u mbështetur në atë të përcaktuar se cila kovë çdo kyç shkon në tillë që është e shpërndarë në mënyrë të barabartë. Ngjashëm me implementimin tonë të listave të lidhura, tani çdo nyjë në tabelën hash është në të vërtetë do të ketë një lloj char. Pra, ne kemi një rrjet të char quajtur Fjala dhe pastaj një tjetër tregues për nyjen e ardhshëm, gjë që e bën kuptim sepse kjo do të jetë një listë e lidhur. Mos harroni kur ne kishim listat e lidhur, kam bërë një nyje * quajtur kreu që ishte vënë në nyjen e parë në listën e lidhur. Por, për tryezën tonë hash, sepse ne kemi listat e shumta të lidhura, ajo që ne duam është që ne duam tabelë hash ynë të jetë si, "Çfarë është një kovë?" Një kovë është vetëm një listë e pointers nyjeve, dhe kështu çdo element në kovë në fakt është duke treguar përkatëse listën e saj lidhur. Që të kthehen në këtë skematike, ju shihni se kova vetë janë shigjeta, jo nyjet aktuale. Një nga funksionet thelbësore pronë hash është se ata janë determinist. Kjo do të thotë se sa herë që ju të hash numri 2, ajo gjithmonë duhet të kthejë kovë njëjtë. Çdo vlerë e vetme që shkon në funksion hash, nëse përsëritet, ka për të marrë indeksin e njëjtë. Pra, funksioni juaj hash kthen indeksin e vektorit se ku vlera takon. Siç e kam përmendur më parë, numri i kova është fikse, dhe kështu indeksi tuaj që ju të kthehen duhet të jetë më pak se numri i kova por më e madhe se 0. Arsyeja pse ne kemi funksionet hash në vend të vetëm një listë të vetme lidhur ose një grup i vetëm është se ne duam të jetë në gjendje të hidhen në një seksion të caktuar më të lehtë në qoftë se ne e dimë karakteristikën e një vlerë - në vend që të kërkoni nëpër tërë fjalor të tërë, qenë në gjendje të hidhen në një seksion të caktuar të saj. Funksion hash juaj duhet të marrë parasysh që në mënyrë ideale, çdo kovë ka përafërsisht numrin e njëjtë të çelësat. Që nga tabela hash është një seri e listave të lidhura, atëherë listat lidhura vetë do të ketë më shumë se një nyje. Në shembullin e mëparshëm, dy numra të ndryshëm, edhe pse ata nuk ishin të barabartë, kur sheshuar, do të kthehen indeksin e njëjtë. Pra, kur ju jeni që kanë të bëjnë me fjalë, një fjalë kur sheshuar do të jetë vlera e hash njëjtë si një tjetër fjalë. Kjo është ajo që ne e quajmë një përplasje, kur ne kemi një nyje që, kur të sheshuar, lista e lidhur në atë kovë nuk është bosh. Teknika që ne e quajmë nuk është lineare probing, ku ju shkoni në listën e lidhur dhe pastaj të gjeni se ku ju doni të futur atë nyje sepse ju keni një përplasje. Ju mund të shihni se nuk mund të jetë një tregti-off këtu, apo jo? Nëse ju keni një tabelë shumë të vogël hash, një numër shumë i vogël i kova, atëherë ju jeni do të ketë një shumë e perplasjeve. Por pastaj, nëse ju bëni një tabelë shumë të madhe hash, ju jeni me siguri do të minimizuar goditjet, por ajo do të jetë një shumë të madhe të dhënave struktura. Nuk do të jetë tregtisë humbura me këtë. Pra, kur ju jeni duke bërë pset tuaj, do të përpiqen për të luajtur rreth mes ndoshta bën një tabelë të vogël hash por pastaj duke e ditur se ajo do të marrë një pak më të gjatë për përshkim të elementeve të ndryshme e këtyre listave lidhura. Çfarë ngarkesës do të bëni është të iterate mbi çdo fjalë në fjalor. Ai kalon në një tregues për dosjen e fjalorit. Pra, ju jeni do të përfitojnë nga file I / O funksionet që ju zotëruar në pset4 dhe iterate mbi çdo fjalë në fjalor. Ju dëshironi që çdo fjalë në fjalor për t'u bërë një nyje e re, dhe ju do të jeni në vendin e çdo një prej këtyre nyjeve në brendësi të strukturës së të dhënave tuaj të fjalorit. Kurdo që ju të merrni një fjalë të re, ju e dini se ajo do të bëhet një nyje. Kështu që ju mund të shkoni menjëherë dhe malloc një tregues nyje për çdo fjalë të re që ju keni. Këtu unë jam duke bërë thirrje new_node akrep time nyje dhe unë jam mallocing çfarë? Madhësinë e një nyje. Pastaj për të lexuar vargun aktual nga një skedar, sepse fjalori është ruajtur në të vërtetë nga një fjalë dhe pastaj një linjë të re, ajo që ne mund të përfitojnë nga është fscanf funksion, ku file është file fjalor që ne jemi duke kaluar në, kështu që ajo skanon skedarin për një varg dhe vende që string në argumentin e fundit. Nëse ju kujtohet përsëri në një nga leksionet, kur kemi shkuar mbi dhe lloji i peeled shtresa përsëri në bibliotekë CS50, ne pamë një zbatim të fscanf atje. Të kthehen në fscanf, ne kemi skedar që ne jemi duke lexuar nga, ne jemi duke kërkuar për një varg në atë dosje, dhe pastaj ne jemi vënë atë në këtu kam new_node-> fjalë, sepse new_node është një tregues nyje, jo një nyje e vërtetë. Pra, atëherë unë jam duke thënë new_node, unë dua të shkoj në nyje se është treguar dhe pastaj të caktojë atë vlerë të fjalës. Ne duam që të pastaj të marrë atë fjalë dhe futur atë në tabelën hash. Kuptojnë se kemi bërë new_node një tregues nyje sepse ne do të duan të dinë se çfarë adresa e asaj nyje është kur kemi futur atë në, sepse struktura e nyjeve vetë, e struct, është se ata kanë një tregues për një nyje të re. Pra, atëherë çfarë është adresa e kësaj nyje do të vinte për të? Kjo adresë do të jetë new_node. Bën që të ketë kuptim, pse ne jemi duke bërë një new_node * nyje në krahasim me një nyje? Rregull. Ne kemi një fjalë. Kjo vlerë është new_node-> fjalë. Që përmban një fjalë nga fjalori që ne duam të dhëna. Kështu që ajo që ne duam të bëjmë është që ne duam të thirrur funksionin hash tonë në atë varg sepse funksioni ynë hash merr në një varg dhe pastaj kthehet na një numër të plotë, se ku numër i plotë është indeksi ku hashtable në atë indeks paraqet atë kovë. Ne duam të marrin atë indeks dhe pastaj të shkoni në atë indeksit të tabelës hash dhe pastaj të përdorin këtë listë e lidhur për të futur në nyjen new_node. Mos harroni se megjithatë ju vendosni për të futur nyje tuaj, nëse kjo është në mes, nëse ju doni të zgjidhur atë ose në fillim ose në fund të fundit, vetëm sigurohuni që nyja juaj e fundit gjithmonë tregon NULL sepse kjo është mënyra e vetme që ne e dimë se ku elementi i fundit i listës sonë është e lidhur. Nëse madhësia është një numër të plotë që përfaqëson numrin e fjalëve në një fjalor, atëherë një mënyrë për të bërë këtë është se sa herë madhësia quhet ne do të shkojmë nëpër çdo element në tabelën hash tonë dhe pastaj iterate nëpër çdo listë e lidhur brenda tabelës hash dhe pastaj të llogaritur gjatësinë e që, duke u rritur me 1 nga 1 counter tonë. Por çdo herë që madhësia quhet, që do të marrë një kohë të gjatë sepse ne jemi duke shkuar për jetë linear probing çdo listë të vetme lidhur. Në vend të kësaj, ajo do të jetë shumë më e lehtë në qoftë se ju mbajnë gjurmët e sa fjalë janë miratuar in Pra, atëherë në qoftë se ju të përfshijë një counter brenda funksionit tuaj ngarkesës se si përditësime të nevojshme, atëherë kundër, nëse keni vendosur atë në një ndryshore globale, do të jetë në gjendje që do të arrihen nga madhësia. Pra, çfarë madhësia thjesht mund të bëni është në një linjë, vetëm kthejë vlerën kundër, madhësia e fjalorit, të cilat ju tashmë trajtohen në ngarkesë. Kjo është ajo që unë do të thotë kur kam thënë në qoftë se ju të zbatuar ngarkesës në një mënyrë të dobishme, atëherë madhësia do të jetë goxha e lehtë. Kështu që tani ne kemi marrë për të kontrolluar. Tani ne jemi që kanë të bëjnë me fjalë nga file teksti input, dhe kështu që ne jemi duke shkuar për të kontrolluar nëse të gjitha ato fjalë hyrëse janë në fakt në fjalor apo jo. Ngjashëm me Scramble, ne duam për të lejuar për ftohtësi rast. Ju dëshironi të bëni të sigurtë që të gjitha fjalët kaluar në, edhe pse ata janë rasti të përziera, kur thirri me krahasoni string, janë ekuivalente. Fjalët në fotografi tekst dictionary të vërtetë janë të gjitha të vogla. Një tjetër gjë është se ju mund të supozojmë se çdo fjalë kaloi në, çdo varg, do të jetë ose alfabetike ose përmbajnë apostrofat. Apostrofat do të jenë të vlefshme fjalë në fjalorin tonë. Pra, nëse ju keni një fjalë me apostrof S, kjo është një fjalë aktual legjitim në fjalorin tuaj që do të jetë një nga nyjet në tryezën tuaj hash. Kontrolloni në qoftë se operon me fjalën ekziston, atëherë ai e mori të jetë në tryezën tonë hash. Nëse fjala është në fjalor, atëherë të gjitha fjalët në fjalor janë në tabelën hash, kështu që le të shohim për këtë fjalë në tabelën hash. Ne e dimë se që kemi zbatuar funksionin hash tonë tillë që çdo fjalë është unik sheshuar gjithmonë të njëjtën vlerë, atëherë ne e dimë që në vend të kërkimit përmes tabelës tërë tonë të gjithë hash, ne fakt mund të gjeni listën e të lidhur që kjo fjalë duhet përkasin. Nëse do të ishte në fjalor, atëherë ajo do të jetë në atë kovë. Çfarë mund të bëjmë, në qoftë se fjala është emri i vargut jonë kaloi në, ne vetëm mund të hash se fjala dhe të kërkoni në listën lidhur në vlerën e hashtable [hash (fjala)]. Nga atje, ajo që ne mund të bëjmë është që ne kemi një mesin e vogël e nyjeve për të kërkuar për këtë fjalë, dhe kështu që ne mund të kaloj listën e të lidhur, duke përdorur një shembull nga më herët në walkthrough, dhe pastaj thirrje string krahasohet me fjalën kudo kursori është treguar për të, se fjala, dhe të shohim nëse ato krahasohen. Varësi në mënyrë që ju të organizojë funksionin tuaj hash, në qoftë se ajo është renditur, ju mund të jetë në gjendje të kthehen rreme pak më herët, por në qoftë se është unsorted, atëherë ju doni të vazhdoni traversing përmes listën tuaj lidhur derisa ju të gjeni elementin e fundit të listës. Dhe në qoftë se ju ende nuk kanë gjetur fjalën nga koha që ju keni arritur fundin e listës së lidhur, që do të thotë se fjala juaj nuk ekziston në fjalor, dhe kështu se fjala është e pavlefshme, dhe kontrolloni duhet të kthehen rreme. Tani kemi ardhur për të shkarkoj, ku ne duam të liruar të gjitha nyjet që kemi malloc'd, në mënyrë të lirë të gjitha nyjet e brenda tryezën tonë hash. Ne do të duan të iterate mbi të gjitha listave të lidhura dhe të lira të gjitha nyjet në këtë. Nëse ju shikoni lart në walkthrough për shembull ku kemi liruar një listë të lidhur, atëherë ju do të dëshironi të përsëritur këtë proces për çdo element në tabelë hash. Dhe unë do të shkoj për këtë në fund të walkthrough, por Shprehje është një mjet ku ju mund të shihni nëse ju keni liruar e duhur çdo nyje që e keni malloc'd ose ndonjë gjë tjetër që ju keni malloc'd, çdo tregues tjetër. Pra, kjo është tabela hash, ku ne kemi një numër i caktuar i kova dhe një funksion hash që do të marrë një vlerë dhe pastaj të caktojë se vlera në një kovë të caktuar. Tani kemi ardhur për të përpiqet. Mundohet lloj të duken si kjo, dhe unë gjithashtu do të tërheqë nga një shembull. Në thelb, ju keni një koleksion të tërë të letrave të mundshme, dhe pastaj kur ju jeni ndërtimin e një fjalë, se letra mund të jetë i lidhur për një fjalor me një gamë të gjerë të mundësive. Disa fjalë të filluar me C, por pastaj të vazhdojë me A, por të tjerët vazhdojnë me O, për shembull. Një trie është një mënyrë për të visualizing të gjitha kombinimet e mundshme të këtyre fjalëve. Një trie do të mbajnë gjurmët e sekuencën e shkronjave që përbëjnë fjalët, bronkial jashtë kur është e nevojshme, kur një letër mund të pasohet nga një shumë të letrave, dhe në fund të tregojë në çdo moment nëse kjo fjalë është e vlefshme apo jo sepse në qoftë se ju jeni mat drejtshkrimi fjalë, MA unë nuk mendoj se është një fjalë e vlefshme, por MAT është. Dhe kështu në trie tuaj, ajo do të tregojë se pas MAT që është në fakt një fjalë të vlefshme. Çdo nyje në trie tonë është në të vërtetë do të përmbajë një sërë pointers nyjeve, dhe ne do të kemi, në mënyrë specifike, 27 të këtyre pointers nyjeve, një për çdo letër në alfabetin si dhe karakterin apostrof. Çdo element në këtë grup është vetë do të tregojnë për një tjetër nyje. Pra, në qoftë se është nyje NULL, nëse nuk ka asgjë pas kësaj, atëherë ne e dimë se nuk ka letra të mëtejshme në atë sekuencë fjalë. Por në qoftë se nuk është nyja NULL, që do të thotë se ka më shumë letra në atë rend letër. Dhe pastaj më tepër, çdo nyje tregon nëse është personazhi i fundit i një fjalë apo jo. Le të shkojë në një shembull të një trie. Së pari unë kam hapësirë ​​për 27 nyje në këtë grup. Nëse kam bar fjalën - Nëse kam bar fjalën dhe unë dua për të futur atë në, Letra e parë është B, kështu që nëse trie ime është e zbrazët, B është letra e dytë e alfabetit, kështu që unë jam duke shkuar për të zgjedhur për të vënë këtë këtu në këtë indeks. Unë jam duke shkuar të ketë B këtu. B do të jetë një nyje që tregon për një grup të të gjitha personazhet e mundshme që mund të ndjekin pas letrës B. Në këtë rast, unë jam që kanë të bëjnë me BAR fjalë, kështu që një do të shkojnë këtu. Pas një, unë kam letrën R, kështu që pas një pikë tani në kombinimin e vet, dhe pastaj R do të jetë këtu. BAR është një fjalë të plotë, kështu që atëherë unë jam duke shkuar të ketë pikë në një tjetër nyje R që thotë se kjo fjalë është e vlefshme. Kjo nyjë është gjithashtu do të ketë një rrjet të nyjeve, por ato mund të jenë NULL. Por në thelb, ajo mund të vazhdojë kështu. Kjo do të bëhet pak më e qartë kur të shkojmë në një shembull tjetër, kështu që vetëm të kesh durim me mua atje. Tani ne kemi bar brenda e fjalorit tonë. Tani thonë se ne kemi Baz fjalë. Ne fillim me B, dhe ne tashmë kemi B si një nga letrat që në fjalorin tonë. Kjo është pasuar me A. Ne kemi një tashmë. Por pastaj në vend të kësaj, ne kemi pas z. Pra, atëherë një element në grup tonë do të jetë Z, dhe kështu pastaj se dikush është duke shkuar për pikë në një tjetër në fund të vlefshme të fjalës. Pra, ne shohim se kur ne vazhdojmë përmes B dhe pastaj A, ka dy opsione të ndryshme aktualisht në fjalorin tonë për fjalët që fillojnë me B dhe A. Thonë se ne të kërkuar për të futur Foobar fjalë. Atëherë ne do të bëjë një hyrje në F. F është një nyje që tregon për një grup të tërë. Ne do të gjeni O, shkojnë në O, o pastaj lidh në një listë të tërë. Ne do të kemi B dhe pastaj të vazhdojë, ne do të kemi një dhe pastaj R. Pra pastaj përshkon Foobar gjithë rrugën poshtë derisa Foobar është një fjalë e saktë. Dhe kështu, atëherë kjo do të jetë një fjalë të vlefshme. Tani thonë se fjala jonë e ardhshme në fjalor është në të vërtetë FOO fjala. Ne do të thonë F. Çfarë vijon F? Unë në fakt tashmë kanë një hapësirë ​​për O, kështu që unë jam duke shkuar për të vazhduar. Unë nuk kam nevojë për të bërë një të ri. Vazhdo. FOO është një fjalë e vlefshme në këtë fjalor, kështu që atëherë unë jam duke shkuar për të treguar se kjo është e vlefshme. Nëse unë ndaluar rend time atje, që do të jetë e saktë. Por në qoftë se ne kemi vazhduar rend tonë nga foo poshtë për B dhe vetëm kishte FOOB, FOOB nuk është një fjalë, dhe se nuk është treguar si një të vlefshme. Në një trie, ju keni çdo nyje treguar nëse kjo është një fjalë të vlefshme ose jo, dhe pastaj çdo nyje gjithashtu ka një rrjet prej 27 pointers nyjeve që pastaj pikë në nyjet vetë. Këtu është një mënyrë se si ju mund të dëshironi për të përcaktuar këtë. Megjithatë, ashtu si në shembullin e tabelës hash, ku kemi pasur një kokë nyje * për të treguar fillimin e listës sonë të lidhura, ne jemi gjithashtu do të duan disa mënyrë për të ditur se ku fillimi i trie tonë është. Disa e quajnë njerëz të përpiqet pemë, dhe kjo është ajo ku vjen nga rrënja. Pra, ne duam rrënja e pemës tonë për të siguruar që ne të qëndrojnë të bazuara kudo që trie tonë është. Ne tashmë lloj i shkoi në mënyrë që ju mund të mendoni për ngarkimin e çdo fjalë në fjalor. Në thelb, për çdo fjalë që ju jeni do të duan të iterate përmes trie tuaj dhe duke e ditur se çdo element në fëmijët - ne e quajti atë fëmijë në këtë rast - korrespondon me një letër tjetër, ju jeni do të dëshironi të kontrolloni ato vlera në atë indeks të veçantë që korrespondon me letër. Pra, duke menduar të gjithë rrugën prapa Cezarit dhe Vigenere, duke e ditur se çdo letër ju mund të lloj hartë kthehet në një indeks alfabetik, Një patjetër nëpërmjet Z do të jetë goxha e lehtë për të hartë në një letër alfabetik, por fatkeqësisht, apostrofat janë gjithashtu një karakter pranuar në fjalë. Unë nuk jam edhe i sigurt se çfarë është vlera ASCII, kështu që për se në qoftë se ju doni të gjeni një indeks për të vendosur nëse ju dëshironi që ajo të jetë ose para apo e fundit, ju do të keni për të bërë një kontroll të vështirë koduar për këtë dhe të vënë më pas se në indeksin e 26, për shembull. Pra, atëherë ju jeni duke kontrolluar vlerën në fëmijët [i] ku [i] korrespondon në çfarëdo letër ju jeni në. Nëse kjo është NULL, që do të thotë se nuk ka aktualisht asnjë letra e mundshme që rrjedhin nga ky rend mëparshme, kështu që ju jeni do të duan të malloc dhe të bëjë një nyje të re dhe të ketë që fëmijët [i] pikë për të në mënyrë që ju të krijoni - kur futet një letër në drejtkëndësh - bërë fëmijët jo-NULL pikë dhe në atë nyje të re. Por në qoftë se nuk është NULL, si në rast tonë të foo kur ne tashmë kishte Foobar, ne vazhdojmë, dhe ne nuk jemi kurrë duke bërë një nyje të re, por jo vetëm vendosjen is_word të vërtetë në fund të kësaj fjale. Prandaj, ashtu si më parë, sepse këtu ju jeni që kanë të bëjnë me çdo letër në një kohë, ajo do të jetë më e lehtë për ju për të madhësisë, në vend që të llogarisë dhe kalojnë nëpër pemë gjithë dhe për të llogaritur se sa fëmijë kam dhe pastaj bronkial jashtë, duke kujtuar se sa shumë janë në anën e majtë dhe në anën e djathtë dhe gjëra të tilla si se, ajo do të jetë shumë më e lehtë për ju në qoftë se ju vetëm i mbajnë gjurmët e sa fjalë që ju jeni duke shtuar në kur ju jeni që kanë të bëjnë me ngarkesën. Dhe kështu atëherë madhësia mënyrë mund të kthehen vetëm një ndryshore globale të madhësisë. Tani kemi ardhur për të kontrolluar. Standardet e njëjtë si më parë, ku ne duam të lejuar për ftohtësi rast. Si edhe, ne supozojmë se vargjet janë karaktere alfabetike vetëm ose apostrofat sepse fëmijët është një grup i 27 gjatë, kështu që të gjitha shkronjat e alfabetit plus apostrof. Për të parë se çfarë ju do të dëshironi të bëni është që ju do të dëshironi të fillojë në rrënjë sepse rrënja do të tregojë për një grup që përmban të gjitha letrat e mundshme e fillimit të një fjale. Ju jeni do të fillojë atje, dhe pastaj ju do të jeni për të kontrolluar është kjo NULL vlerë apo jo, sepse nëse vlera është NULL, që do të thotë se fjalori nuk ka asnjë vlera që përmbajnë atë letër në atë mënyrë të veçantë. Nëse kjo është NULL, atëherë kjo do të thotë se fjala është misspelled menjëherë. Por në qoftë se kjo nuk është NULL, atëherë ju mund të vazhdojë, thonë se letra e parë është një letër e mundur të parë në një fjalë, kështu që tani unë dua të kontrolloni nëse letra e dytë, që rend, është brenda fjalorit tim. Pra, ju jeni do të shkojë në indeksin e bijve të nyjen e parë dhe kontrolloni nëse kjo letër të dytë ekziston. Pastaj ju përsëris këtë proces për të parë nëse kjo sekuencë është e vlefshme apo jo brenda trie tuaj. Kurdo që fëmijët nyjë në atë pikë indeksi në NULL, ju e dini se kjo sekuencë nuk ekziston, por pastaj nëse ju arrini në fund të fjalës që ju keni futur, atëherë ju dëshironi të shikoni tani që unë kam përfunduar këtë rend dhe e gjeti atë brenda trie tim, është se fjala e vlefshme apo jo? Dhe kështu atëherë ju dëshironi të shikoni se, dhe kjo është kur në qoftë se ju keni gjetur atë rend, atëherë ju doni të kontrolloni nëse kjo fjalë është e vlefshme apo jo sepse kujtohet përsëri në rastin e mëparshëm që unë tërhoqi ku kemi pasur FOOB, se ishte një sekuencë e vlefshme që kemi gjetur, por nuk ishte një fjalë e vlefshme aktuale vetë. Në mënyrë të ngjashme, për të shkarkoj në mundohet që ju doni të shkarkoj të gjitha nyjet në trie tuaj. Më vjen keq. Ngjashëm me tabelat hash ku në shkarkoj ne liruar të gjitha nyjet, në mundohet ne duam gjithashtu të liruar të gjitha nyjet. Shkarkoj vërtetë do të punojnë lehtë nga fundi në krye sepse këto janë të lidhura thelb listat. Pra, ne duam të sigurohemi që ne të mbajë në të gjitha vlerave dhe të lirë të gjithë ata në mënyrë eksplicite. Çfarë ju jeni do të dëshironi të bëni, nëse ju jeni duke punuar me një trie është që të udhëtojë për në fund dhe të lirë nyjen më të ulët të mundshme parë dhe pastaj të shkojnë deri në të gjithë ata fëmijë dhe pastaj të lirë të gjithë ata, shkojnë deri dhe pastaj të lirë, etj Lloj si që kanë të bëjnë me shtresën e poshtme të parë trie dhe pastaj të shkojnë deri të lartë një herë ju keni liruar gjithçka. Ky është një shembull i mirë i ku funksion recursive mund të vijnë në volitshëm. Pasi të keni liruar shtresën e poshtme të trie tuaj, atëherë ju telefononi shkarkoj në pjesën tjetër të saj, duke u siguruar që ju të liruar çdo mini - Ju mund të lloj të parashikoj se si përpiqet mini. Pra, ju keni rrënjë tuaj këtu. Unë jam vetëm thjeshtuar atë kështu që unë nuk duhet të tërheqë 26 prej tyre. Pra, ju keni këto, dhe pastaj këto paraqesin sekuenca të fjalëve ku të gjitha këto qarqe janë pak letra që janë sekuenca të vlefshme e letrave. Le të vazhdojnë vetëm një pak më shumë. Çfarë ju jeni do të dëshironi të bëni është pa fund këtu dhe pastaj të lirë kjo dhe pastaj pa kjo në fund para se të liruar një të lartë deri këtu sepse në qoftë se ju diçka të lirë në nivelin e dytë këtu, atëherë ju në të vërtetë do të humbasë këtë vlerë këtu. Kjo është arsyeja pse është e rëndësishme në të shkarkoj një trie për të bërë të sigurtë që ju të liruar në fund të parë. Çfarë ju mund të dëshironi të bëni është të thonë për çdo nyje Unë dua të shkarkoj gjithë fëmijët. Tani që ne kemi shkuar mbi zbraz për metodën tryezë hash si dhe metodën trie, ne do të dëshironi të shikoni në Shprehje. Shprehje me ju drejtuar komandat e mëposhtme. Ju keni Shprehje-V. Ju jeni duke kontrolluar për të gjitha rrjedhjet kur ju drejtuar speller dhënë këtë tekst të caktuar sepse speller nevojë për të marrë në një skedar teksti. Pra Shprehje do të drejtuar programin tuaj, t'ju them se sa bytes keni ndarë, sa bytes keni liruar, dhe kjo do të ju tregojnë nëse ju liruan vetëm sa apo nëse ju nuk e keni të lirë të mjaftueshme, ose ndonjëherë ju mund edhe të mbi-të lirë, si nyje e lirë një që është tashmë liruar dhe kështu ajo do të ju kthehen gabime. Në qoftë se ju përdorni Shprehje, ai do t'ju japë disa mesazhe treguar nëse ju keni liruar ose më pak se e mjaftueshme, vetëm të mjaftueshme, ose më shumë se herë të mjaftueshme. Një pjesë e këtij pset, kjo është fakultative për të sfiduar Bordi Big. Por kur ne jemi që kanë të bëjnë me këto struktura të dhënave kjo është lloj i argëtim për të parë se sa shpejt dhe sa efikase strukturave të dhënat tuaja mund të jetë. A rezultat hash juaj funksionojnë në një shumë prej perplasjeve? Apo është madhësia të dhënat tuaja të vërtetë e madhe? A do të marrë shumë kohë të kaloj? Në log të speller, ajo nxjerr sa kohë që ju përdorni për të ngarkuar, për të kontrolluar, për të kryer madhësinë, dhe të shkarkoj, dhe kështu ata janë postuar në bordin Big, ku ju mund të konkurrojnë kundër shokëve tuaj dhe disa anëtarë të stafit për të parë që e ka më të shpejtë spell checker-. Një gjë që unë do të doja të theksohet në lidhje me tabelat hash është se ka disa funksione mjaft të thjeshta hash se ne mund të mendoni. Për shembull, ju keni 26 kova, dhe kështu çdo kovë korrespondon tek letrës së parë në një fjale, por që do të rezultojë në një tryezë mjaft të paekuilibruar hash sepse nuk janë fjalët e një shumë më pak që fillojnë me X se fillimi me M, për shembull. Një mënyrë për të shkuar në lidhje speller është në qoftë se ju doni të merrni të gjitha funksionet e tjera poshtë, vetëm atëherë përdorni një funksion të thjeshtë hash të jetë në gjendje për të marrë kodin tuaj running dhe pastaj të shkojnë prapa dhe të ndryshojë madhësinë e tabelës suaj hash dhe përkufizim. Nuk janë një shumë e burimeve në internet për funksione të hash, dhe kështu për këtë pset ju lejohet të kërkimit funksionet hash në internet për disa lë të kuptohet dhe frymëzim për aq kohë sa ju të bëni të sigurt për të citojnë se ku e keni marrë atë nga. Ju jeni të mirëpritur për të parë dhe interpretuar disa funksion hash që ju të gjeni në internet. Mbrapsht në se, ju mund të jetë në gjendje për të parë nëse dikush përdorur një trie nëse zbatimi i tyre është më i shpejtë se tavolina juaj hash apo jo. Ju mund t'i dorëzojë Bordit Big herë të shumta. Ajo do të regjistrojë hyrjen tuaj më të fundit. Kështu që ndoshta ju të ndryshojë funksionin hash tuaj dhe pastaj të kuptojë se kjo është në fakt një shumë të shpejtë ose një shumë më ngadalë se më parë. Kjo është pak e një mënyrë zbavitëse. Ka gjithmonë 1 ose 2 anëtarët e stafit të cilët të përpiqet të bëjë fjalor slowest të jetë e mundur, kështu që është gjithmonë kënaqësi për të parë. Përdorimi për pset është që ju të drejtuar speller me një fjalor opsional dhe pastaj një file teksti të detyrueshme. By default, kur ju drejtuar speller me vetëm një skedar një tekst dhe nuk specifikoni një fjalor, ajo do të përdorin fjalor file teksti, një të madhe në dosje cs50/pset5/dictionaries. Se një ka mbi 100.000 fjalë. Ata gjithashtu kanë një fjalor të vogël e cila ka fjalë në mënyrë të konsiderueshme më pak CS50 që ka bërë për ju. Megjithatë, ju mund shumë lehtë të bëjë vetëm fjalorin tuaj në qoftë se ju vetëm duan të punojnë në shembuj të vogla - për shembull, në qoftë se ju dëshironi të përdorni gdb dhe ju e dini vlerat specifike se ju doni tavolina juaj hash në hartë për të. Kështu që ju vetëm mund të bëni vetë dosjen tuaj tekst vetëm me bar, Baz, foo, dhe Foobar, bëjnë që në një skedar teksti, ndajë ata njëri me 1 linjë, dhe pastaj të bëjë vetë dosjen tuaj tekst që fjalë për fjalë përmban vetëm ndoshta 1 ose 2 fjalë kështu që ju e dini saktësisht se çfarë duhet të jetë prodhimi. Disa nga fotografi tekst mostër që Bordi Big, kur ju drejtuar sfidë do të kontrollojë Lufta dhe Paqja janë dhe një roman Austen Jane ose diçka të tillë. Pra, kur ju jeni duke filluar nga jashtë, kjo është një shumë e lehtë për të bërë fotografi tuaj tekst që përmbajnë vetëm disa prej fjalëve apo ndoshta 10 kështu që ju mund të parashikojnë se çfarë rezultati duhet të jetë dhe pastaj shikoni atë kundër që, aq më shumë të një shembull të kontrolluar. Dhe kështu që ne jemi që kanë të bëjnë me parashikimin dhe hartimin gjërat rreth, përsëri unë dua të ju inkurajoj që të përdorni stilolaps dhe letër sepse ajo është me të vërtetë do të ju ndihmojë me këtë - vizatim shigjeta, si tabela hash apo si trie tuaj duket, kur ju jeni liruar diçka ku shigjetat po shkojnë, po ju mbajnë në të mjaftueshme, ju shihni ndonjë lidhje zhduken dhe të bjerë në humnerën e kujtesës rrjedhur. Pra ju lutem, ju lutem provoni për të nxjerrë jashtë gjërat edhe para se të merrni për të shkruar kodin poshtë. Draw gjëra jashtë në mënyrë që ju të kuptoni se si gjërat janë duke shkuar për të punuar sepse atëherë unë garantoj ju do të kandidojë në muddles akrep pak atje. Dakord. Unë dua të ju uroj shumë më të mirë e fat me këtë pset. Kjo është ndoshta një e vështirë. Kështu që të përpiqet për të filluar herët, barazim gjërat jashtë, barazim gjërat jashtë, dhe fat të mirë. Kjo ishte Walkthrough 5. [CS50.TV]