[Powered by Google Translate] [Walkthrough - Harjoitus 5] [Zamyla Chan - Harvardin yliopisto] [Tämä on CS50. - CS50.TV] Selvä. Hei, kaikki, ja tervetuloa läpikäynti 5. Pset5 on kirjoitusvirheet, jossa teemme oikoluku. Oikolukijoissa ovat äärimmäisen tärkeitä. Onko tämä koskaan tapahtunut sinulle? Työskentelet hyvin, hyvin hamstrata on paperi yhteenotto ja sitten vielä lopulta saada hyvin hehku Rade kuin D tai D = ja kaikki, koska olet maksamakkaraa spoileri valas laaja sana. Kyllä, oikoluku teidän paprikat on asia, äärimmäisen impotenssi. Tämä on ongelma, joka vaikuttaa miehekäs, miehekäs opiskelijoita. Olin kerran kertoi minun Sith luokan kiduttaja että olisin koskaan päästä hyvä kollega. Ja se on kaikki mitä olen koskaan halunnut, että kaikki mahdolliset lapsi haluaa ikäisenä, vain päästä hyvä kollega. Eikä vain mitään kollegalle. En halunnut mennä Ivory Legal kollega. Joten jos en ole parannusta, mennyt olisi unelmieni menossa Harvardiin, Jale tai vankila - tiedät, vankilassa, New Jersey. Joten sain itselleni oikoluku. Tuo pieni ote yksi suosikkini puhutun sanan taiteilijoita, Taylor Mali. Joka tapauksessa, kuten hän sanoo, että on tärkeää ottaa oikoluku on erittäin tärkeää. Joten tervetuloa esittely 5, jossa me puhumme pset5: kirjoitusvirheet, jossa teemme ikioma oikoluku. Työkalupakki tällä viikolla, jakelu koodia, tulee olemaan tärkeää tarkastella vain ymmärtää eri toimintoja, että sanakirja tulee olemaan. Me todellakin tullaan ottaa useita. C tiedostot yhdessä tekevät PSET. Ja niin katsellut eri näkökohtia, vaikka emme oikeastaan ​​ole muokkaus yksi tiedosto, speller.c, tietäen miten se toimii suhteessa dictionary.c, jota tullaan kirjallisesti, tulee olemaan aika merkittävä. PSET spec sisältää myös runsaasti hyödyllistä tietoa kannalta asioita, joita voit olettaa, sääntöjä ja tuollaista, joten muista lukea PSET spec huolellisesti vihjeitä. Ja kun epäile säännön tai jotain, niin aina viitata PSET spec tai keskustella. Tämä PSET menee hyvin riippuvainen osoittimia, joten haluamme varmistaa, että ymmärrämme eron lisäämällä tähteä edessä osoittimen nimi ja et-, miten vapauttaa niitä, jne. Joten on mestari osoittimia tulee olemaan erittäin hyödyllinen tämän ongelman asetettu. Aiomme tutkia linkitettyjen listojen hieman, jossa on elementtejä, jota me kutsumme solmut, jotka ovat sekä arvo sekä osoittimen seuraavalle solmulle, ja niin olennaisesti yhdistää eri elementtejä toinen toisensa jälkeen. On olemassa muutamia eri vaihtoehtoja toteuttaa todellinen sanakirja. Aiomme tutkia kahdella tavalla, mikä on hash taulukoita ja yrittää sitten. Molemmissa näistä, niihin liittyy jonkinlainen käsitys linkitetty lista jos olet elementtejä sidoksissa toisiinsa. Ja niin olemme menossa katsomaan, kuinka saatat pystyä toimimaan noin linkitettyjä listoja, luoda niitä, selata suhteen, miten esimerkiksi lisätä solmun siihen tai vapaa kaikki solmut samoin. Mitä vapauttaa solmuja, se on todella tärkeää että kun me malloc muisti, jälkeenpäin me vapauttaa sitä. Joten haluamme varmistaa, ettei osoitin menee unfreed, että meillä ei ole mitään muistivuotoja. Aiomme esitellä työkalu nimeltään Valgrind joka toimii ohjelman ja tarkistaa, onko kaikki muistin että olet varattu sitten vapautuu. Sinun PSET on valmis vasta, kun se toimii, ja se on kaikki toiminnot, vaan myös, Valgrind kertoo sinulle, että et ole löytänyt mitään muistivuotoja. Lopuksi, tämä PSET, haluan todella korostaa - Tarkoitan, kuten tavallista, olen ehdottomasti kannattaja kynää ja paperia ongelman sarjaa, mutta tämä yksi, mielestäni kynä ja paperia tulee olemaan erityisen tärkeää kun haluat olla piirros nuolia asioita ja ymmärtää miten asiat toimivat. Joten ehdottomasti kokeilla käyttää kynää ja paperia tehdä asioita ennen kuin saat koodausta koska se voisi saada hieman sotkuinen. Ensinnäkin Mennään linkitettyjen listojen hieman. Linkitettyjä listoja koostuvat solmuja, jossa jokainen solmu on arvo, joka liittyy sen kanssa, sekä osoitin seuraavaan solmuun sen jälkeen. Pari asiaa tärkeä linkitettyjen listojen että meidän täytyy muistaa jossa ensimmäinen solmu on, ja sitten kun me tiedämme missä ensimmäinen solmu on, Tällä tavoin voimme käyttää solmu, että ensimmäinen solmu pistettä ja sitten yhden jälkeen ja yksi sen jälkeen. Ja sitten viimeinen osa teidän linkitetty lista on, että solmun osoitin on aina menossa osoittamaan NULL. Kun solmupisteet NULL, niin tiedät, että olet saavuttanut listan loppuun, että solmu on viimeinen, että on olemassa mitään jälkeen. Täällä kaavamaisen, näet että nuolet ovat osoittimia, ja sininen osa on, jos arvo on tallennettu, ja sitten punainen laatikko osoitin on solmun osoitin osoittaa seuraavaan solmuun sen jälkeen. Ja niin näette tässä, D solmu muistuttaa NULL koska se on viimeinen elementti luettelossa. Katsotaan miten voimme määrittää struct varten solmun. Ja koska haluamme olla useita solmuja, tämä on tulossa typedef struct jossa aiomme olla useita erilaisia ​​tapauksia solmuja. Ja niin me määrittelemme sen uusi tietotyyppi. Tässä meillä on typedef struct solmu. Tässä esimerkissä olemme tekemisissä kokonaisluku solmuja, joten meillä on kokonaisluku nimetty arvo, ja sitten meillä on toinen osoitin, ja tässä tapauksessa se on osoitin solmuun, joten meillä struct solmu * kutsutaan seuraavaan. Ja sitten me vaaditaan tämän jutun solmuun. Varmista, että noudatat tätä syntaksia. Huomaa, että solmu on todella viitattu ylhäällä sekä alla hakasulkeiden. Sitten seurata, jossa ensimmäinen solmu on tässä linkitetyssä listassa, sitten on solmun osoitin nimeltään pää, ja minä malloc riittävästi tilaa koko solmun. On kuitenkin huomattava, että pää on itse asiassa solmu osoitin toisin kuin todellinen solmu itse. Joten pää ei itse asiassa ole mitään arvoa, se vain osoittaa kumpi ensimmäisen solmun oma linkitetty lista on. Saadaksesi paremman tunteen linkitettyjä listoja, koska se on erittäin tärkeää seurata siitä, että sinulla säilyttää ketjun Haluan ajatella sitä ihmistä linja kädestä, jossa jokainen henkilö käsi kädessä seuraavaan. Et näe tässä piirustuksessa, mutta pohjimmiltaan he osoittaa seuraavalle henkilölle joka on heidän ketjussa. Joten jos haluat kulkea linkitetyn listan, jossa nämä ihmiset - kuvitella kaikki nuo ihmiset ovat arvoja, jotka liittyvät heidän ja huomauttavat myös seuraavalle henkilölle linjaa - Jos haluat kulkea linkitetty lista, esimerkiksi joko muokata arvoja tai etsi arvo tai jotain, Sitten sinun kannattaa olla osoitin tiettyä henkilöä. Niinpä aiomme olla tietotyyppi solmun osoitin. Tätä esimerkiksi kutsukaamme sitä kursoria. Toinen yleinen tapa nimetä tämä olisi iteraattori tai jotain koska se on iteroimalla yli ja todella liikkuu mihin solmuun se on osoittaa. Tämä tässä on meidän kursori. Meidän kursori Aluksi ensimmäisen alkion listalta. Ja niin me haluamme tehdä, on meillä olisi periaatteessa jatkuvan kohdistin, siirtämällä sitä puolelta toiselle. Tässä tapauksessa haluamme siirtää sen seuraavaan elementti luettelossa. Kanssa paneelit mitä voisimme tehdä, on meidän sanoa vain lisäämme indeksi 1. Tässä tapauksessa, mitä meidän täytyy tehdä, on todella löytää joka henkilö tämä nykyinen henkilö osoittaa, ja että tulee olemaan seuraavan arvon. Joten jos kohdistin on vain solmu osoitin, niin mitä me haluamme tehdä me haluamme päästä arvo osoitin. Haluamme päästä siihen solmu ja sitten, kun olemme siinä solmussa, löytää missä se osoittaa. Saada todellista solmuun että osoitin, Yleensä me osoittavat sen (* kursori). Tämä antaisi sinulle todellinen solmu että osoitin. Ja sitten sen jälkeen, mitä haluamme tehdä, on me haluamme päästä mitä se solmun seuraava arvo. Voit tehdä, että käyttää arvojen sisällä struct, meillä on piste operaattori. Joten sitten se olisi (* osoitin). Seuraavaksi. Mutta tämä on vähän sotkuinen kannalta ottaa hakasulkeisiin * kohdistin, ja niin me korvata tämä koko lausumaa kursori->. Tämä on viiva ja sitten yli merkin, niin mikä nuoli. kursori-> Seuraava. Se todella sinut solmuun että kohdistin. Tämä arvo on seuraava. Joten sen sijaan, tähti ja piste, olet korvaa että nuoli. Ole erittäin varovainen varmista, että yrität käyttää tätä syntaksia. Nyt meillä on kohdistin, jos haluamme päästä arvoon, Ennen meillä oli kursori-> seuraava, vaan käyttää arvoa solmussa että osoitin, me vain yksinkertaisesti sanoa solmu-> arvo. Sieltä se on tietotyyppi mitä olemme määritelleet arvot ja solmut on. Jos se int solmu, niin kursori-> arvo vain olemaan kokonaisluku. Joten voimme tehdä operaatioita, että tarkista yhtälöt, antaa sille eri arvoja jne. Joten mitä haluat tehdä, jos haluat siirtää kohdistimen seuraavalle henkilölle, voit itse muuttaa arvoa kohdistimen. Koska osoitin on solmu osoitin, muutat todellinen osoitin osoite osoitteeseen seuraavan solmun listaasi. Tämä on vain pätkä koodia missä voisit toistaa. Missä olen kommentoida jotain, se missä olet todennäköisesti aio käyttää arvoa tai tehdä jotain tekemistä sen kanssa, että tietty solmu. Voit aloittaa pois, sanon että minun kohdistin aluksi tulee osoittamaan ensimmäinen elementti linkitetty lista. Ja niin edessäpäin, minä määritellyt sen pää solmun. Kuten aiemmin mainitsin, vapauttaen on todella tärkeää. Haluat varmistaa, että olet ilmaiseksi joka elementti listalta, kun olet lopettanut sen. Kun et tarvitse viitata mihinkään näistä osoittimia enää, haluat varmistaa, että voit vapauttaa kaikki nämä osoittimia. Mutta haluat olla hyvin varovainen täällä, että haluat välttää muistivuotoja. Jos vapaa yksi henkilö ennenaikaisesti, niin kaikki viitteitä että solmu osoittaa aiotaan menetetty. Palataan henkilölle esimerkiksi tehdä hieman high stakes- otetaanpa nämä ihmiset, paitsi tässä tapauksessa ne leijuu järven hirviö. Haluamme varmistaa, että aina kun me free, emme menetä ja päästää kaikki solmut ennen kuin olemme todella vapautti heidät. Esimerkiksi, jos olit yksinkertaisesti soittaa ilmaiseksi tämä kaveri täällä, Sitten hän vapautuu, mutta sitten kaikki nämä kaverit sitten menetetään ja he ajelehtivat pois ja pudota alas. Joten haluamme varmistaa, että sen sijaan, haluamme säilyttää linkin loput. Päämme osoitin, joka osoittaa ensimmäisen osan luettelossa. Se on tavallaan kuin köysi ankkurointi ensimmäinen henkilö. Mitä kannattaa tehdä, kun vapauttaa luettelo on - Jos haluat vapauttaa ensimmäisen osan ensimmäinen, niin voit olla tilapäinen osoitin , joka osoittaa mitä tahansa ensimmäinen elementti on. Joten sinulla on tilapäinen osoitin osoittaa täällä. Tällä tavalla, meillä on kiinni ensimmäisen solmun. Ja sitten, koska me tiedämme, että ensimmäinen solmu aiotaan vapauttaa, Sitten voimme siirtyä tästä köysi, tämä ankkuri, meidän pää, todella osoittaa mitä ensimmäinen on osoittaa. Joten tämä pää todella osoittaa toisen elementin nyt. Nyt meillä on mahdollisuus vapauttaa mitä on tallennettu temp- joten voimme poistaa että ilman sitä vaarantamatta kaikki muut solmut listalta. Toinen tapa, että voit tehdä tämän voisi aina vain vapauttaa viimeinen elementti luettelossa koska he taatusti pidä osoitti mitään. Joten te voisi vain vapauttaa tämän yhden, sitten vapaa tämä yksi, sitten vapaa tämä. Se varmasti toimii, mutta on vähän hitaampi, koska luonteen linkitettyjä listoja, emme voi vain välittömästi hypätä viimeinen. Meidän täytyy kulkea jokaisen elementin linkitetty lista ja tarkista, onko se yksi on osoittaa NULL, tarkista aina, ja sitten kun pääsemme loppuun, niin vapaa, että. Jos tekisimme tätä prosessia, sinulla olisi todella tarkistaa tässä tarkkailun täällä, sitten tarkistaa täältä, vapauttaen sen, Sitten menee takaisin, tarkistaa tänne, tarkkailun täällä, vapauttaen sen, tarkkailun täällä, ja sitten vapauttamalla se. Se vie hieman enemmän aikaa. Joo. [Opiskelija] Olisiko mahdollista linkitetty lista, joka tallentaa exit osoitin loppuun? Se olisi varmasti mahdollista. Toistaa kysymys, onko mahdollista saada linkitetyn listan rakenne niin että sinulla on osoitin osoittaa loppuun linkitetty lista? Sanoisin, että on mahdollista, ja joka kerta kun asetat jotain omalle linkitetty lista sinulla olisi päivitettävä että osoitin ja tuollaista. Sinulla olisi solmu * hännän, esimerkiksi. Mutta kun olet täytäntöön tätä toimintoa, sinun täytyy ajatella kompromissit, kuten kuinka monta kertaa olen menossa olla iteroimalla yli tämän, kuinka vaikeaa se tulee olemaan seurata häntä sekä pää sekä minun iteraattori, ja tuollaista. Onko se -? >> [Opiskelija] Joo. On mahdollista, mutta suhteen suunnittelun päätöksiä, sinun täytyy punnita vaihtoehtoja. Tässä on luuranko koodin, jonka avulla voit vapauttaa jokaisen alkion linkitetty lista. Jälleen, koska olen iteroimalla yli linkitetty lista, aion haluavat olla jonkinlainen kohdistimen tai iteraattori. Olemme iteroimalla kunnes kohdistin on NULL. Et halua toistaa, kun kohdistin on NULL koska se tarkoittaa, että ei ole mitään luettelossa. Joten tässä minä tee tilapäinen solmu * osoittaen mitä olen harkinnut on ensimmäinen listallani, ja sitten voin siirtää kohdistinta eteenpäin 1 ja sitten vapaa mitä minulla oli väliaikainen varastointi. Nyt tulemme insertoimalla linkitettyjä listoja. Minulla on kolme solmua minun linkitetyn listan, ja mennään kanssa yksinkertainen tapaus jossa haluamme lisätä toiseen solmuun lopussa meidän linkitetty lista. Voit tehdä, että kaikki me tekisimme on olisimme kulkee löytää jos nykyinen loppuun linkitetty lista on, niin kumpi solmu osoittaa NULL - että tämä yksi - ja sitten sanoa, todella, tämä ei tule olemaan viimeinen solmu; olemme todella menossa on toinen. Eli meillä olisi tämä nykyinen yhden pisteen mitä olemme lisäämällä. Joten nyt tämä punainen henkilö täällä tulee viimeinen solmu linkitetyn listan. Ja niin ominaisuus viimeisen solmun linkitetty lista on, että se osoittaa NULL. Joten mitä pitäisi tehdä, on asettaa tämä punainen kaveri osoitin NULL. Siellä. Mutta entä jos halusimme lisätä solmun välillä toisen ja kolmas? Tuo ei ole aivan niin yksinkertainen, sillä haluamme varmistaa että emme anna mennä minkään solmun linkitetyn listan. Mitä meidän pitäisi tehdä, on varmistaa, että me ankkuroida itsemme jokainen. Esimerkiksi kutsukaamme tätä toinen. Jos sanoi toinen viittaa nyt tähän uuteen ja juuri tehnyt osoitin siellä, niin että johtaisi tämä kaveri katoaa koska ei ole mitään yhteyttä häneen. Sen sijaan - Minä piirtää tämän uudestaan. Anteeksi taiteellisia kykyjä. Me tiedämme, että emme voi suoraan liittää 2 uuteen. Meidän on varmistettava, että pidämme kiinni viimeinen. Mitä me haluta tehdä, on olla tilapäinen osoitin sen elementin, joka tulee liitteeksi päälle. Joten meillä on tilapäinen osoitin siellä. Koska me tiedämme, että tämä kolmas on pidetään kirjaa, 2 voi nyt linkittää meidän uuteen. Ja jos tämä uusi punainen kaveri tulee olemaan välillä 2 ja 3, mitä sitten on että kaveri osoitin tulee osoittamaan? >> [Opiskelija] Temp. Temp. Joo. Joten tämä punainen kaveri seuraava arvo tulee olemaan temp. Kun olet insertoimalla linkitettyjen listojen, näimme, että voisimme helposti lisätä jotain loppuun luomalla tilapäinen jono, tai jos halusimme lisätä jotain keskelle meidän array, se veisi vähän enemmän shuffling ympärillä. Jos haluat esimerkiksi on lajiteltu linkitetyn listan, sinun on eräänlainen punnita kustannukset ja hyödyt, jotka koska jos haluat olla lajiteltu array, se tarkoittaa, että joka kerta, kun asetat siihen, se vie vähän enemmän aikaa. Kuitenkin, jos haluat myöhemmin, koska me löydämme me haluamme, Hae linkitetty lista, niin se voisi olla helpompaa, jos tietää, että kaikki on kunnossa. Joten kannattaa punnita kustannuksia ja hyötyjä siitä. Toinen tapa lisätä osaksi linkitetty lista on lisätä osaksi alusta luettelon. Jos me ammennamme ankkuri täällä - tämä on meidän pää - ja sitten ovat nämä ihmiset liittyvät siihen, ja sitten meillä on uusi solmu voidaan työntää alusta, mitä sitten voisi haluamme tehdä? Mikä olisi väärin vain sanomalla haluan liittää punainen sininen koska se on ensimmäinen? Mitä tapahtuisi täällä? Kaikki nämä kolme hukkuisi. Joten emme halua tehdä sitä. Jälleen olemme oppineet, että tarvitsemme jonkinlaisen tilapäisen osoittimen. Valitaan olla tilapäinen kohta tämä kaveri. Sitten voimme olla sininen pisteen väliaikaista ja sitten punainen piste on sininen. Syy miksi olen käyttäen ihmisiä täällä on, koska me todella haluamme visualisoida tilalla ihmisten ja varmistaa, että meillä on yhteys niihin ennen kuin päästää toisen käden tai jotain. Nyt meillä on tunne linkitettyjä listoja - miten voisimme luoda linkitetyn listan ja luoda rakenteita, jotka koostuvat tyypin määritelmän solmun ja sitten varmistaa, että meillä on osoittimen päähän että linkitetty lista - kun meillä on se, ja me tiedämme, miten kulkea läpi array, käyttää eri elementit, tiedämme miten lisätä ja osaamme vapauttaa heidät, voimme päästä kirjoitusvirheet. Kuten tavallista, meillä on osa kysymyksiä, saavat käytit käyttöjärjestelmän kanssa linkitettyjen listojen ja erilaisten rakenteiden, kuten jonot ja pinot. Sitten voimme siirtyä kirjoitusvirheet. Kirjoitusvirheet on jakelun koodin pari tiedostoja merkitystä. Ensin huomaamme, että meillä on tämä Makefile täällä, joita emme ole oikeastaan ​​ennen kohdannut. Jos katsoin sisälle pset5 kansio, olisit huomannut, että sinulla on. H-tiedoston, sitten sinulla on kaksi. C tiedostoa. Mitä tämä Makefile tekee on ennen, olisimme kirjoita tehdä ja sitten ohjelman nimi ja sitten me näkisimme kaikki nämä väitteet ja liput hyväksyttiin sen kääntäjä. Mitä Makefile ei on auttaa meitä kokoamaan useita tiedostoja kerralla ja kulkea liput että haluamme. Täällä me vain nähdä siellä otsikkotiedoston täällä. Sitten meillä olla kaksi lähdetiedostot. Olemme speller.c ja dictionary.c. Olet tervetullut muokata Makefile jos haluat. Huomaa, että jos kirjoitat puhdas, niin mitä se on oikeastaan ​​poistaa mitään että on ydin. Jos sinulla segmentointi vika, pohjimmiltaan saat core dump. Joten tämä ruma pieni tiedosto näkyvät hakemistossa nimeltään ydin. Sinun kannattaa poistaa, että jotta se puhdistaa. Se poistaa exe tiedostoja ja. O tiedostoja. Otetaanpa tutkia dictionary.h. Tämä sanoo, että se julistaa sanakirja toiminnallisuutta. Meillä maksimipituus tahansa sanan sanakirjasta. Sanomme, että tämä tulee olemaan pisin mahdollinen sana. Se on, jonka pituus on 45. Eli emme aio mitään sanoja ylittää pituus. Täällä meillä on vain tehtävä prototyyppejä. Meillä ei ole varsinainen täytäntöönpano koska sitähän me tehdä tälle PSET. Mutta mitä tämä tekee, on sillä olemme tekemisissä suurempia tiedostoja tässä ja toiminnot suuremmassa mittakaavassa, se on hyvä olla. h tiedosto niin että joku muu lukee tai käyttämällä koodia voi ymmärtää, mitä on tekeillä. Ja ehkä he haluavat toteuttaa yrittää jos teit hash taulukoita tai päinvastoin. Sitten he sanoisivat minun kuorma-toiminto, varsinainen täytäntöönpano on menossa erilaisia, mutta tämä prototyyppi ei muutu. Täällä olemme tarkistaa, joka palauttaa true, jos annettu sana on sanakirjassa. Sitten meillä on kuorma, joka pohjimmiltaan vie sanakirjasta tiedosto ja sitten lataa sen joitakin tietoja rakenteeseen. Meillä on koko, joka, kun kutsutaan, palauttaa kokoa sanakirja, kuinka monta sanaa tallennetaan se, ja sitten purkaa, mikä vapauttaa kaiken muistin että olet ehkä ottanut samalla oman sanakirjan. Katsotaanpa katsomaan dictionary.c. Näemme, että se näyttää hyvin samankaltainen dictionary.h, paitsi nyt se vain on kaikki nämä Todos siinä. Ja niin se on teidän tehtävänne. Lopulta sinut täyttämällä speller.c kaikki tämän koodin. Dictionary.c, kun ajaa, ei todellakaan aio tehdä mitään, joten katsomme speller.c nähdä todellisen täytäntöönpanon oikoluku. Vaikka et aio olla muokkaamalla mitään tämän koodin, on tärkeää lukea, ymmärtää, kun on kuormaa kutsutaan, kun olen soittaa Tarkista, vain ymmärtää, kartoittaa sitä, miten toiminto toimii. Näemme, että se tarkistaa oikean käytön. Pohjimmiltaan, kun joku kulkee aapinen, tämä osoittaa, että se on vapaaehtoinen niiden kulkea sanakirjasta tiedosto, koska siellä tulee olemaan oletusarvoisesti sanakirja tiedosto. Ja sitten ne on läpäistävä tekstissä olisi spell-check. rusage käsittelee aikaa, koska osa PSET jota hoidan myöhemmin ei vain saada toimiva oikoluku toimi mutta todella saada sen olevan nopeaa. Ja niin sitten se on silloin rusage on tulossa sisään Tässä näemme ensimmäisen puhelun jollekin dictionary.c tiedostoja, mikä on kuorma. Load palauttaa true tai false - totta kun menestys, vääriä vian tullessa. Joten jos sanakirja on ladattu väärin, niin speller.c palaa 1 ja lopetetaan. Mutta jos se kuorma kunnolla, niin se tulee jatkumaan. Jatkamme, ja näemme muutamia tiedoston I / O täällä, minne se on menossa käsittelee avaamalla tekstitiedoston. Täällä, mitä tämä tekee on oikeinkirjoituksen tarkistaa jokaisen sanan tekstissä. Joten mitä speller.c tekee täällä on iteroimalla enemmän kuin sanat tekstitiedostoon ja sitten tarkistaa ne sanakirjasta. Täällä meillä on Boolen kirjoitusvirhe, joka näkee jos sekki palauttaa totta vai ei. Jos sana on todella sanakirjasta, niin tarkista palaa totta. Tämä tarkoittaa, että sana ei ole kirjoitettu väärin. Joten kirjoitusvirhe olisi väärä, ja siksi meillä on bang siellä merkintä. Pidämme käynnissä, ja sitten se pitää kirjaa kuinka monta kirjoitusvirheet siellä on tiedosto. Se jatkuu ja sulkee tiedoston. Sitten täällä, se kertoo kuinka monta väärin kirjoitettuja sanoja olet ollut. Se laskee, kuinka paljon aikaa kului ladata sanakirja, kuinka paljon aikaa kului tarkistaa sitä, kuinka paljon aikaa kului laskea koko, joka, kuten me mennä, pitäisi olla hyvin pieni, ja sitten kuinka paljon aikaa kului purkaa sanakirja. Täällä ylhäällä näemme puhelu purkaa täällä. Jos me tarkistaa koko täällä, Sitten nähdään, että tässä on puhelu koon, jossa se määrittää koko sanakirjassa. Mahtavaa. Meidän tehtävämme tämä PSET on toteuttaa kuormitus, joka lataa sanakirja tietorakenne - kumpi valitset, se hash taulukon tai kokeilla - kanssa sanoja sanakirjasta tiedosto. Sitten sinulla on koko, joka palauttaa sanojen määrä sanakirjassa. Ja jos teette kuorman fiksu tapa, niin koko pitäisi olla aika helppoa. Sitten olet tarkistaa, joka tarkistaa onko annettu sana on sanakirjassa. Joten speller.c kulkee merkkijono, ja sitten sinun täytyy tarkistaa, että merkkijono on sisällä oman sanakirjan. Huomaa, että meillä on yleensä standardi sanakirjoja, mutta tässä PSET, periaatteessa mikä tahansa sanakirja hyväksyttiin millä tahansa kielellä. Joten emme voi olettaa, että sana on sisällä. Sana foobar voitaisiin määritellä tietty sanakirjasta että menetämme tuumaa Ja sitten meillä on purkaa, mikä vapauttaa sanakirja muistista. Ensinnäkin haluaisin mennä yli hash table menetelmän miten voisimme toteuttaa kaikki nämä neljä tehtävää, ja sitten menen aikana yrittää menetelmän, miten toteuttaa näitä neljä toimintoa, ja lopussa puhua joitakin yleisiä vinkkejä, kun teet PSET ja miten voit ehkä käyttää Valgrind tarkistaa muistivuotoja. Mennään osaksi hash table menetelmällä. Hash taulukko sisältää luettelon kauhoja. Jokainen arvo, jokainen sana, ei mene johonkin näistä kauhoja. Hash table mieluiten tasaisesti jakaa kaikkien näiden arvojen että olet ohimennen ja sitten populates ne kauhan siten, että jokainen kauha on noin yhtä suuri määrä arvoja siinä. Rakenteen hash-taulukkoon, meillä on joukko linkitettyjä listoja. Mitä teemme, kun me kulkemaan arvon, voimme tarkistaa jos tämän arvon pitäisi kuulua, mikä ämpäri se kuuluu, ja aseta se linkitetty lista liittyy tähän kauha. Täällä, mitä minulla on hajautusfunktio. Se int hash taulukon. Niinpä ensimmäisen kauhan kaikki kokonaisluvut alle 10 mennä ensimmäiseen ämpäri. Jokainen kokonaislukuja yli 10 mutta alle 20 menevät toiseen, jälkeen ja niin edelleen ja niin edelleen. Minulle jokainen kauha on edustaa näitä numeroita. Kuitenkin sanon olivat kulkemaan 50, esimerkiksi. Vaikuttaa siltä, ​​että kolmen ensimmäisen sisältävät useita kymmenen numeroa. Mutta haluan antaa minun hash taulukon toteuttaa minkäänlaista kokonaislukuja, niin sitten olisin suodattaa pois kaikki numerot yli 30 osaksi viime ämpäri. Ja niin sitten se johtaisi eräänlainen epäsymmetrinen hash taulukon. Toistan, hash table on vain joukko kauhat jossa jokainen kauha on linkitetty lista. Ja niin päättää, missä jokainen arvo menee, mikä ämpäri se menee, olet menossa haluavat mitä kutsutaan hajautusfunktio , joka vie arvo ja sanoo sitten tämä arvo vastaa tiettyä kauhan. Joten jopa edellä tässä esimerkissä, minun hash-funktio oli kukin arvo. Se tarkistetaan onko se ollut alle 10. Jos se oli, se laittaa sen ensimmäiseen ämpäri. Se tarkistaa, onko se on vähemmän kuin 20, laittaa sen toiseen jos totta, tarkastuksia, jos se on vähemmän kuin 30, ja sitten laittaa sen kolmannen ämpäri, ja sitten kaikki muu vain kuuluu neljänteen ämpäri. Joten jos sinulla on arvoa, sinun hash funktio sijoittaa että arvo oikeaan ämpäriin. Hajautusfunktio pohjimmiltaan tarvitsee tietää kuinka monta ämpärillistä olet. Sinun hash taulukon koko, määrä kauhat olet, että tulee olemaan kiinteä määrä, joka on sinun, voit päättää, mutta se tulee olemaan kiinteä numero. Joten hajautusfunktio tulee luottaa, että mitkä kauhan jokainen avain menee siten, että se on tasaisesti jakautunut. Samanlaisia ​​meidän toteuttamiseen liittyvien luetteloiden, nyt jokainen solmu tiiviste todella olemaan tyyppiä char. Joten meillä on char array nimeltään sana ja sitten toinen osoitin seuraavaan solmuun, mikä on järkevää, koska se tulee olemaan linkitetty lista. Muistatko, kun olimme linkitettyjä listoja, tein solmun * kutsutaan pää joka osoittaa ensimmäisen solmun linkitetty lista. Mutta meidän tiiviste, koska meillä on useita linkitettyjä listoja, haluamme haluamme hash taulukon olla, "Mikä on ämpäri?" Kauha on vain lista solmun osoittimia, ja niin jokainen elementti ämpäri todella osoittaa sen vastaavan linkitetty lista. Voit palata tämän kaavamaisen, näet että kauhat itse nuolet, ole todellisia solmuja. Yksi olennainen ominaisuus hash toimintoja on, että he deterministinen. Tämä tarkoittaa, että aina hash numero 2, sen pitäisi aina palata samaan ämpäriin. Jokainen yksittäinen arvo, joka menee hash-funktion, toistuva on saada samaa indeksiä. Joten hash-funktio palauttaa indeksi array jos tämä arvo kuuluu. Kuten aiemmin mainitsin, määrä kauhat on kiinteä, ja niin hakemistostasi palaat on oltava pienempi kuin määrä kauhat mutta suurempi kuin 0. Syy miksi meillä on hash toimintoja eikä vain yhden linkitetty lista tai yksi joukko on, että haluamme voi hypätä tietyn jakson helpoimmin jos tiedämme ominaisuus arvo - sen sijaan tarvitse etsiä koko koko sanakirja, se voi hypätä tietty osa sitä. Sinun hash funktio on otettava huomioon, että ihannetapauksessa kunkin segmentin on suunnilleen sama määrä näppäimiä. Koska tiiviste on sarja linkitettyjä listoja, sitten linkitettyjä listoja itse ovat menossa on enemmän kuin yksi solmu. Edellisessä esimerkissä, kaksi eri numeroa, vaikka ne eivät ole yhtä suuret, kun hajauttamat, palaisi samaa indeksiä. Joten kun olet tekemisissä sanoja, yksi sana kun hajauttamat olisi sama hash-arvo kuin toinen sana. Sitähän me kutsumme törmäys, kun meillä on solmu, että kun hajauttamat, linkitetty lista on, että kauha ei ole tyhjä. Tekniikka, jota kutsumme on lineaarinen tunnustelevat, minne menet linkitetyn listan ja sitten löytää, jos haluat lisätä, että solmuun koska sinulla on törmäyksen. Voit nähdä, että siellä saattaa olla kauppa-off täällä, eikö? Jos sinulla on hyvin pieni tiiviste, hyvin pieni määrä kauhat, sitten olet menossa on paljon yhteentörmäyksiä. Mutta sitten jos teet hyvin suuri hash-taulukko, olet todennäköisesti menossa minimoida törmäykset, mutta se tulee olemaan hyvin suuri tietorakenne. Siellä tulee olemaan kompromisseja kanssa. Joten kun teet oman PSET, yritä leikkiä välillä ehkä tehdä pienempi hash-taulukko mutta tietäen, että se vie hieman kauemmin kulkea eri elementtejä Näiden linkitettyjen listojen. Mitä kuormitus tulee tehdä, on toistaa yli jokaisen sanan sanakirjasta. Se kulkee osoitin sanakirja tiedosto. Joten aiot hyödyntää tiedoston I / O-toimintoja, joita masteroitu vuonna pset4 ja toistaa yli jokaisen sanan sanakirjasta. Haluat jokaisen sanan sanakirjaan tulee uusi solmu, ja aiot sijoittaa jokainen näistä solmuista sisäpuolelle sanakirjan tietorakenne. Kun saat uuden sanan, tiedät että se on tulossa solmuun. Joten voit mennä heti ja malloc solmu osoittimen jokainen uusi sana, että sinulla on. Täällä Soitan minun solmu osoittimen new_node ja olen mallocing mitä? Koko solmun. Sitten lukea varsinaisen merkkijonon tiedostosta, koska sanasto on tosiasiallisesti varastoitu jonka sana ja sitten uuden linjan, mitä voimme hyödyntää on funktio fscanf, jolloin tiedosto on sanakirja tiedosto että olemme kului, niin se skannaa tiedoston merkkijono ja paikkoja, string viimeinen väite. Jos muistatte takaisin yhteen luentojen, kun meillä meni yli ja millaisia ​​kuoritut kerrokset takaisin CS50 kirjasto, näimme täytäntöönpanon fscanf siellä. Voit palata fscanf, meillä on tiedosto, olemme lukemisen, Etsimme merkkijono kyseisen tiedoston, ja sitten olemme sijoittamalla sen täällä olen new_node-> sana koska new_node on solmu osoitin, ei ole varsinainen solmu. Joten sanon new_node, haluan mennä solmuun että se osoittaa ja sitten määrittää tämän arvon sana. Haluamme sitten ottaa se sana ja aseta se tiiviste. Ymmärtäkää, että teimme new_node solmu osoitin koska olemme menossa halua tietää, mitä osoitetta että solmu on kun me aseta se, koska rakenne solmujen itse, ja struct, on se, että niillä on osoitin uuteen solmuun. Joten mitä sitten on osoite, joka solmun menossa osoittamaan? Että osoite tulee olemaan new_node. Onko siinä järkeä, miksi Teemme new_node solmu * toisin kuin solmuun? Okei. Meillä on sana. Tämä arvo on new_node-> sana. Joka sisältää sanan sanakirjasta, että haluamme tuloon. Joten mitä me haluamme tehdä, on me haluamme kutsua meidän hash-funktio merkkijonon koska meidän hajautusfunktio vie merkkijono ja palauttaa sitten meidät kokonaisluku, jos tämä kokonaisluku on indeksi, jossa Hashtable tuohon indeksi että kauha. Haluamme ottaa tämän indeksin ja siirry sitten että indeksi tiiviste ja sitten käyttää, että linkitetty lista lisätä solmun new_node. Muista, että kuitenkin päätät asetat solmuun, onko se keskellä jos haluat lajitella tai alussa tai lopussa, vain varmista, että viimeinen solmu aina osoittaa NULL koska se on ainoa tapa, että tiedämme missä viimeinen elementti meidän linkitetty lista on. Jos koko on kokonaisluku, joka edustaa useita sanoja sanakirjasta, sitten yksi tapa tehdä tämä on, että jos koko on nimeltään käymme läpi kaikki osa meidän tiiviste ja sitten toistaa läpi jokaisen linkitetyn listan sisällä tiiviste ja sitten laskea pituus, että kasvattamalla laskurin 1 1. Mutta joka kerta koko kutsutaan, että tulee viemään aikaa koska aiomme olla lineaarisesti luotaa jokaisen linkitetyn listan. Sen sijaan se tulee olemaan paljon helpompaa, jos pidät kirjaa siitä, kuinka monta sanaa välitetään sisään Joten jos sisällytät laskuri omassa kuorman funktio että päivitykset tarvittaessa, niin laskuri, jos olet asettanut sen globaali muuttuja, voi päästä käsiksi koko. Joten mitä kokoa voisi yksinkertaisesti vain yksi rivi, vain palata vasta-arvo, koko sanakirjan, josta jo käsitelty kuormalla. Sitähän minä tarkoitin, kun sanoin, jos toteuttaa kuorma hyödyllinen tapa, Sitten koko tulee olemaan melko helppoa. Joten nyt saamme tarkistaa. Nyt olemme tekemisissä sanoja syöttää tekstitiedosto, ja niin aiomme tarkistaa, onko kaikki nämä tulosanaa ovat todella sanakirjassa vai ei. Samanlaisia ​​Scramble, haluamme mahdollistaa asian välinpitämättömyys. Haluat varmistaa, että kaikki sanat hyväksyttiin, vaikka he isoja kun maksoi merkkijono vertailla, vastaavat. Sanoja, tekstitiedostot ovat todella pieniksi. Toinen asia on, että voit olettaa, että jokainen sana kului, jokaisessa string, tulee olemaan joko aakkosjärjestyksessä tai sisältää heittomerkit. Heittomerkit tulevat olemaan voimassa sanoja meidän sanakirjasta. Joten jos sinulla on sanan apostrophe S, joka on todellinen laillista sana teidän sanakirja että tulee olemaan yksi solmujen teidän hash taulukon. Tarkista toimii jos sana on olemassa, niin sen täytyy olla meidän tiiviste. Jos sana löytyy sanakirjasta, niin kaikki sanat sanakirjasta ovat tiiviste, joten katsotaanpa tätä sanaa tiiviste. Tiedämme, että koska olemme toteuttaneet hajautusfunktio siten, että jokainen uniikki sana on aina hajakoodattu sama arvo, tiedämme, että sen sijaan, hakuja meidän koko koko tiiviste, voimme itse löytää linkitetty lista, että sana tulisi kuulua. Jos se oli sanakirjasta, niin se olisi siinä ämpäri. Mitä voimme tehdä, jos sana on nimi meidän merkkijono hyväksyttiin, voimme vain hash että sana ja katso linkitetty lista arvossa Hashtable [hash (sana)]. Sieltä, mitä voimme tehdä, on meillä pienempi osajoukko solmut etsiä tätä sanaa, ja jotta voimme kulkea linkitetty lista, käyttämällä esimerkiksi aiemmin walkthrough, ja sitten soittaa merkkijono verrata sanaan missä osoitin, että sana, ja onko niitä vertailla. Riippuen tavalla voit järjestää hajautusfunktio, jos se on lajiteltu, saatat pystyä palauttamaan vääriä hieman aikaisemmin, mutta jos se on lajittelemattoman, sitten haluat jatkaa liikkumisesta kautta linkitetty lista kunnes löydät viimeinen osa listan. Ja jos et vieläkään ole löytänyt sanaa kerran olet saavuttanut loppuun linkitetty lista, se tarkoittaa, että sinun sana ei ole sanakirjassa, ja niin, että sana on pätemätön, ja tarkistettava palauttaa false. Nyt tulemme purkaa, minne haluamme vapauttaa kaikki solmut, jotka olemme malloc'd, joten vapaa kaikki solmut sisällä meidän hash taulukon. Aiomme halua toistaa yli kaikkien liittyvien luetteloiden ja vapaa kaikille solmuille että. Jos katsot edellä walkthrough on esimerkki, jossa me vapauttaa linkitetyn listan, Sitten sinun kannattaa toistaa, että prosessi jokaisen elementin tiiviste. Ja minä menen tänä loppupuolella walkthrough, mutta Valgrind on työkalu, jossa voit nähdä, jos olet oikein vapautettu jokainen solmu että olet malloc'd tai jotain muuta, että olet malloc'd, muita osoitin. Niin, että hash taulukoita, jossa meillä on rajallinen määrä kauhat ja hash funktio, joka vie arvoa ja määritä se arvo tiettyjä ämpäri. Nyt tulemme yrittää. Yrittää sellainen näyttää tämän, ja minä myös vetää pois esimerkki. Periaatteessa sinulla on koko joukko mahdollisia kirjaimia, ja sitten kun olet rakentaa sana, että kirje voidaan linkittää sanakirjan monenlaisia ​​mahdollisuuksia. Jotkut sanat alkavat C mutta jatka, mutta toiset jatkaa O, esimerkiksi. Trien on tapa katsella kaikkia mahdollisia yhdistelmiä nämä sanat. Trie on menossa seurata kirjainyhdistelmä, jotka käsittävät sanoen, haaroittamalla tarvittaessa, kun yksi kirje voidaan seurata useita kirjeitä, ja lopussa osoittavat kussakin pisteessä onko sana kelvollinen vai ei koska jos olet oikeinkirjoitus sana MAT, MA en usko on kelvollinen sana, mutta matto on. Ja niin teidän trien, se ilmoittaa, että sen jälkeen MAT se on oikeastaan ​​pätevä sana. Jokainen solmu meidän trien ylipäänsä sisältävät suuren joukon solmun osoittimet, ja aiomme olla, erityisesti 27 niistä solmun osoittimia, yksi jokaista kirjain aakkosissa sekä heittomerkki luonnetta. Jokainen elementti, joka matriisi on itse menossa paikasta toiseen solmuun. Joten jos solmu on NULL, jos ei mitään sen jälkeen, tiedämme, että ei ole muita kirjaimia että sanasekvenssi. Mutta jos solmu ei ole NULL, se tarkoittaa, että on enemmän kirjaimia samassa kirjeessä järjestyksessä. Ja sitten lisäksi jokainen solmu ilmoittaa, onko se viimeinen merkki sanan vai ei. Mennään esimerkki trie. Ensin minun on tilaa 27 solmua tämän array. Jos minulla on sana BAR - Jos minulla on sana BAR ja haluan lisätä, että, ensimmäinen kirjain on B, niin jos minun trie on tyhjä, B on toinen kirjain, joten aion valita laittaa tämän tänne tällä indeksillä. Aion olla B täällä. B tulee olemaan solmu, joka viittaa toiseen joukko kaikki mahdolliset merkit jotka voivat seurata jälkeen kirjain B. Tässä tapauksessa olen tekemisissä sanan BAR, joten menee täällä. Kun minulla on R-kirjain, niin sitten nyt viittaa oman yhdistelmän, ja sitten R on täällä. BAR on täydellinen sana, niin sitten aion olla R-pisteen toiseen solmuun joka sanoo, että tuo sana on pätevä. Tämä solmu on myös menossa on joukko solmuja, mutta ne saattavat olla NULL. Mutta pohjimmiltaan se voi jatkua. Se tulee vähän enemmän selvää, kun menemme eri esimerkiksi joten vain vastaa minulle siellä. Nyt meillä on BAR sisällä meidän sanakirja. Nyt sanovat meillä sanan BAZ. Aloitamme B, ja meillä on jo B-kirjaimeen, joka on meidän sanakirjassa. Se on seurannut A. Meillä on jo. Mutta sitten vaan, meillä on Z seuraavat. Joten sitten osa meidän array tulee olemaan Z, ja niin sitten, että yksi on menossa osoittamaan toiselle voimassa sanan loppuun. Näemme siis, että kun jatkamme kautta B ja sitten, olemassa kaksi eri vaihtoehtoa tällä hetkellä meidän sanakirjasta sanoja, jotka alkavat B ja A. Sano halusimme lisätä sanan foobar. Sitten tekisi maahanpääsy F. F on solmu, joka viittaa koko joukon. Haluaisimme löytää O, siirry O, O sitten linkkejä koko listan. Meillä olisi B ja jatkaa sitten, olisimme sitten R. Joten sitten foobar kulkee pohjaan kunnes Foobar on oikea sana. Ja niin sitten tämä olisi pätevä sana. Nyt sanovat meidän seuraava sana sanakirja on todella sana FOO. Sanoisimme F. Mitä seuraa F? Olen itse jo tilaa O, joten aion jatkaa. En tarvitse tehdä uutta. Jatka. FOO on pätevä sana tähän sanakirjaan, niin sitten aion ilmoittaa että on voimassa. Jos lopetan järjestyksessä siellä, se olisi oikein. Mutta jos me jatkoimme sekvenssi FOO alas B ja juuri oli FOOB, FOOB ei sana, ja se ei ole merkitty kelvollinen. Vuonna trie, olette jokainen solmu ilmoittaa, onko se kelvollinen sana tai ei, ja sitten jokainen solmu on myös joukko 27 solmun osoittimet että valitse sitten solmuja itse. Tässä on tapa, miten haluat ehkä määrittää tämän. Kuitenkin aivan kuten hash taulukon esimerkissä, jossa meillä oli solmu * pää osoittamaan alkuun meidän linkitetty lista, olemme myös menossa halua jotenkin tietää mistä aloitimme trie on. Jotkut kutsuvat yrittää puita, ja se jos root tulee. Joten me haluamme juuri meidän puu varmistaa, että pysymme maadoitettuun minne meidän trie on. Olemme jo sellainen meni yli miten voisit ajatella lastaus jokaisen sanan sanakirjaan. Pohjimmiltaan, jokaista sanaa olet menossa halua toistaa läpi trie ja tietäen, että jokainen osa lapsille - Kutsuimme sitä lasta tässä tapauksessa - vastaa eri kirjeen, olet menossa haluavat tarkistaa näitä arvoja klo kyseisen indeksin, joka vastaa kirjeeseen. Joten ajattelu aina takaisin keisarille ja Vigenere, tietäen, että jokainen kirjain voit eräänlainen kartta takaisin aakkosellinen hakemisto, varmasti läpi Z tulee olemaan melko helppo kartoittaa ja aakkosellinen kirje, mutta valitettavasti heittomerkkejä myös hyväksytty merkki sanoja. En ole edes varma, mitä ASCII-arvo on, joten että jos haluat löytää indeksi päättää haluatko sen olevan joko ensimmäinen tai viimeinen, sinun täytyy tehdä kovakoodattu tarkistaa, että ja sitten laittaa että indeksi 26, esimerkiksi. Joten sitten olet tarkkailun arvoa lapsille [i] jossa [i] vastaa mitä kirjeen olet. Jos se on NULL, se tarkoittaa, että tällä hetkellä ei ole mitään mahdollista kirjaimet johtuvat siitä, että edellisen sarjan, joten olet menossa haluavat malloc ja tee uusi solmu ja on, että lapsia [i] järkeä niin että voit luoda - kun asetetaan kirjeestä suorakulmion - jolloin lapset ei-NULL ja pisteen tuohon uuteen solmuun. Mutta jos se ei ole nolla, kuten meidän tapauksessa foo kun meillä oli jo foobar, jatkamme, ja emme koskaan tehdä uusi solmu vaan vain asettamalla is_word true lopussa joka sanan. Joten kuten ennenkin, koska täällä olet tekemisissä jokaisen kirjaimen kerrallaan, se tulee olemaan helpompaa koon, sen sijaan, laskea ja läpi koko puun ja laskea kuinka monta lasta minulla on ja sitten haarautuu, muistaen kuinka moni on vasemmalla puolella ja oikealla puolella ja tuollaista, se tulee olemaan paljon helpompaa jos vain seurata, kuinka monta sanaa lisäät vuonna kun olet tekemisissä kuormalla. Ja niin sitten sillä tavalla koko voi vain palata globaali muuttuja koosta. Nyt tulemme tarkistamaan. Samoja standardeja kuin ennenkin, minne haluamme mahdollistaa asian välinpitämättömyys. Kuten hyvin, oletamme, että jouset ovat vain kirjaimia tai heittomerkit koska lapset on joukko 27 pitkä, joten kaikki aakkosten plus heittomerkki. Sillä tarkistaa, mitä sinun kannattaa tehdä, on sinun kannattaa aloittaa juureen koska juuressa osoittaa array, joka sisältää kaikki mahdolliset alkaa kirjaimet sanan. Olet menossa aloittaa siellä, ja sitten aiot tarkistaa tämä arvo NULL vai ei, koska jos arvo on NULL, se tarkoittaa, että sanakirja ei ole mitään arvoja jotka sisältävät tuon kirjeen kyseisessä järjestyksessä. Jos se on NULL, niin se tarkoittaa, että sana on kirjoitettu väärin heti. Mutta jos se ei ole NULL, niin voit jatkaa, sanoa, että ensimmäinen kirjain on mahdollinen ensimmäinen kirjain sanan, joten nyt haluan tarkistaa, jos toinen kirjain, että sekvenssi, on minun sanakirja. Joten aiot mennä indeksi lasten ensimmäisen solmun ja tarkista, onko se toinen kirje on olemassa. Sitten voit toistaa prosessin tarkistaa, onko kyseinen sekvenssi on voimassa vai ei omassa trie. Aina solmun lapset että indeksi osoittaa NULL, te tiedätte, että sekvenssi ei ole olemassa, mutta sitten jos tulet sanan loppuun, että olet syöttänyt, sitten haluat tarkistaa nyt, että olen suorittanut tässä järjestyksessä ja todennut sen sisällä minun trien, että sana pätevä vai ei? Ja niin sitten haluat tarkistaa, että sekä silloin, jos olet huomannut, että sekvenssi, sitten haluat tarkistaa, että sana on voimassa vai ei koska muistan takaisin edellisessä tapauksessa, että piirsin missä meillä oli FOOB, että oli pätevä sekvenssi löysimme mutta ei varsinainen kelvollinen sana itse. Samoin purkamisoikeudet yrittää haluat purkaa kaikki solmut oman trien. Anteeksi. Samanlainen hash taulukoita missä purkamaan me vapautti kaikki solmut, että yrittää haluamme myös vapauttaa kaikki solmut. Poista todella työtä helpoin alhaalta ylös koska nämä ovat pääosin sidoksissa luetteloita. Joten haluamme varmistaa, että pidämme kiinni kaikki arvot ja vapaa ne kaikki erikseen. Mitä olet menossa haluavat tehdä, jos olet työskennellyt triellä on matkustaa pohjaan ja vapaa mahdollisimman solmun ensimmäinen ja sitten mennä jopa kaikki ne lapset ja sitten vapaa kaikille niille, nousevat ja sitten vapaa, jne. Ikään kuin käsitellään pohjakerroksen trien ensimmäinen ja sitten menee ylös, kun olet vapautti kaiken. Tämä on hyvä esimerkki siitä, missä rekursiivinen funktio voi olla hyötyä. Kun olet vapauttanut pohjakerroksen teidän trie, Sitten soitat purkaa siitä loput siitä, Varmista, että olet ilmaiseksi joka mini - Voit sellainen visualisoida sitä mini yrittää. Joten sinulla on root täällä. Minä vain yksinkertaistaa niin minun ei tarvitse tehdä 26 niistä. Joten sinulla on näitä, ja sitten nämä edustavat sekvenssien sanoja jos kaikki nämä pikku piireissä ovat kirjaimet, jotka ovat voimassa sarjoja kirjeitä. Jatketaan vain vähän enemmän. Mitä aiot halua tehdä, on ilmainen pohja täällä ja sitten vapaa tämä ja sitten vapaa tämä alareunassa ennen vapauttaa ylin täällä koska jos ilmaiseksi jotain toisella tasolla täällä, niin olet todella menettää tämän arvon täällä. Siksi on tärkeää purkaa ja triellä varmista, että voit vapaasti pohja edellä. Mitä kannattaa tehdä, on sanoa jokaiselle solmulle Haluan purkaa kaikkia lapsia. Nyt olemme ylittäneet purkaa varten hash table menetelmä sekä trie menetelmää, olemme menossa halua katsoa Valgrind. Valgrind voit ajaa seuraavat komennot. Sinulla on valgrind-v. Olet tarkistanut kaikki vuodot kun ajaa aapinen antanut tämän tietyn tekstin koska aapinen otettava tekstitiedostoon. Joten Valgrind ajaa ohjelman, kertoa kuinka monta tavua olet varattu, kuinka monta tavua olet vapautettu, ja se kertoo onko sinulla vapautui juuri tarpeeksi vai et ole riittävän vapaata, tai joskus jopa yli-vapaa, kuten ilmainen solmu, joka on jo vapautettu ja niin palataan virheitä. Jos käytät Valgrind, se antaa sinulle joitakin viestejä osoittaa, onko olet vapautunut joko vähemmän kuin tarpeeksi, aivan tarpeeksi, tai enemmän kuin tarpeeksi kertaa. Osana tätä PSET, se on vapaaehtoista haastaa Big Board. Mutta kun olemme tekemisissä näiden tietorakenteet Se on tavallaan hauska nähdä, kuinka nopeasti ja kuinka tehokkaita tietosi rakenteet voisivat olla. Onko hajautusfunktio johtaa paljon törmäykset? Vai onko tietosi koko todella iso? Kestääkö paljon aikaa kulkea? Vuonna log aapinen, se tulostaa kuinka paljon aikaa käytät ladata, tarkistaa, suorittaa koko ja purkaa, ja niin ne ovat luettavissa Big Board, jossa voit kilpailla oman luokkatovereiden ja joitain toimihenkilöitä nähdä kuka on nopein oikoluku. Yksi asia, jonka haluaisin todeta siitä hash taulukoita on, että on olemassa joitakin melko yksinkertaisia ​​hash toimintoja, voisimme ajatella. Esimerkiksi, sinulla on 26 kauhat, joten jokainen kauhan vastaa ensimmäisen kirjaimen sanan, mutta että menee johtaa melko epätasapainoinen hash-taulukko koska siellä on paljon vähemmän sanoja, jotka alkavat X kuin alkavat M, esimerkiksi. Yksi tapa edetä aapinen on, jos haluat saada kaikki muut toiminnot alas, sitten vain käyttää yksinkertaista hajautusfunktio voi saada koodin suorittamisen ja sitten mennä takaisin ja muuttaa kokoa tiiviste ja määritelmä. On olemassa paljon resursseja Internetissä hash-funktioita, ja niin tämä PSET sinulla on mahdollisuus tutkia hash toimintoja Internetissä joitakin vinkkejä ja inspiraatiota niin kauan kuin sinulla on mainittava mistä sait sen. Olet tervetullut katsomaan ja tulkita jotkut hash funktio, jonka löydät internetistä. Takaisin, että saatat nähdä, jos joku käyttää triellä onko niiden täytäntöönpano on nopeampi kuin hash taulukon tai ei. Voit toimittaa Big hallitukselle useita kertoja. Se tallentaa viimeisimmän merkinnän. Joten ehkä muutat hajautusfunktiota ja sitten ymmärtää, että se on todella paljon nopeampi tai paljon hitaammin kuin ennen. Se vähän hauska tapa. On aina 1 tai 2 työntekijää, jotka yrittävät tehdä hitain mahdollinen sanakirja, niin se on aina hauska katsoa. Käyttö PSET on juokset oikolukija lisävarusteena sanakirja ja sitten pakollinen tekstitiedosto. Oletuksena kun juokset oikolukija vain tekstitiedosto ja ei määritä sanakirja, se tulee käyttämään sanakirjaa tekstitiedostoa, suuri yksi vuonna cs50/pset5/dictionaries kansioon. Että yksi on yli 100.000 sanaa. Niillä on myös pieni sanakirja, joka on huomattavasti vähemmän sanoja että CS50 on tehnyt sinulle. Voit kuitenkin helposti vain tehdä oman sanakirjan Jos haluat vain toimivan pienissä esimerkeissä - Esimerkiksi, jos haluat käyttää gdb ja tiedät arvoja että haluat hash taulukon kartoittaa ulos. Joten voit vain tehdä oman tekstitiedosto pelkästään BAR, Baz, FOO ja foobar, tehdä, että tekstitiedosto, erota ne kukin 1 rivi, ja sitten tehdä oman tekstitiedosto kirjaimellisesti sisältää vain ehkä 1 tai 2 sanaa jotta tiedät tarkalleen mitä tuotoksen pitäisi olla. Osa näytteen tekstitiedostoja että Big hallitus kun ajaa haaste tarkistaa ovat Sota ja rauha sekä Jane Austenin romaani tai jotain. Joten kun olet lähtemässä pois, se on paljon helpompi tehdä omia tekstitiedostoja jotka sisältävät vain pari sanaa tai ehkä 10 jotta voit ennustaa, mitä lopputulos olisi ja sitten tarkistaa, että se, että niin enemmän hallitun esimerkin. Ja niin, koska olemme tekemisissä ennustamiseen ja piirustus asioita ympärillä, taas haluan rohkaista teitä käyttämään kynää ja paperia koska se todella aikoo auttaa tämän kanssa - piirustus nuolet, miten hash table tai miten trie näyttää, kun olet vapauttaen jotain missä nuolet ovat menossa, olet tilalla on tarpeeksi, näetkö mitään yhteyttä katoamassa ja pudota kuiluun vuotanut muistia. Joten please, yritä vetää asioita jo ennen kuin saat kirjoittaa koodia alaspäin. Piirrä asioita niin, että ymmärrät, miten asiat ovat menossa töihin koska silloin Takaan voit törmätä vähemmän osoitin muddles siellä. Selvä. Haluan toivottaa teille paljon onnea tämän PSET. Se on luultavasti vaikein. Joten yritä aloittaa aikaisin, piirtää asioita, piirtää asioita, ja onnea. Tämä oli läpikäynti 5. [CS50.TV]