[Musiikkia] ANDI Peng: Tervetuloa viikko 6 §. Me poikkesi meidän vakio kohta aikaa tiistaina iltapäivällä tämän ihanan sunnuntaiaamuna. Kiitos kaikille, että liittyi minulle tänään, mutta vakavasti, aplodit. Se on aika iso ponnistus. Melkein ei edes tee sitä ylös ajoissa, mutta se oli OK. Joten tiedän, että te kaikki juuri tehnyt sen tietovisa. Ensinnäkin, tervetuloa kääntöpuoli jotka. Toiseksi, me puhumme siitä. Puhutaan tietokilpailu. Puhutaan miten teet luokassa. Tulet hieno. Minulla on teidän tietokilpailuja sinulle lopussa täältä, joten jos kaverit haluavat ottaa katso sitä, täysin hieno. Niin nopeasti ennen kuin aloitamme, esityslista tänään on seuraava. Kuten näette, olemme pohjimmiltaan nopea ampumisen läpi koko joukko tietorakenteiden todella, todella, todella nopeasti. Niin sellaisenaan, se ei ole Super interaktiivinen tänään. Se täytyy vain olla minä sellainen huutaen asioita, joita te, ja jos minä hämmentää sinua, jos aion liian nopeasti, haluaisin tietää. He ovat vain eri tiedot rakenteet, ja osana teidän PSET tälle tulevan viikon, luultavasti pyydetään toteuttamaan yksi heistä, ehkä kaksi them-- kaksi niistä teidän PSET. OK, joten olen juuri menossa aloittaa joitakin ilmoituksia. Mennään yli pinot ja jonot enemmän syvyyttä kuin mitä teimme ennen tietokilpailu. Menemme yli liittyy luetella uudestaan, jälleen kerran, enemmän syvyyttä kuin mitä meillä oli ennen tietokilpailu. Ja sitten me puhumme hash pöydät, puita ja yrittää, joka ovat kaikki melko välttämättömiä teidän PSET. Ja sitten me mennä yli joitakin hyödyllisiä vinkkejä pset5. OK, joten tietokilpailu 0. Keskiarvo oli 58%. Se oli hyvin alhainen, ja niin te kaikki teki erittäin, erittäin hyvin mukaan tuon kanssa. Aika paljon, nyrkkisääntö on, jos olet sisällä keskihajonta keskiarvosta varsinkin kun olemme vähemmän mukava jakso, olet täysin hieno. Olet raiteilleen. Elämä on hyvää. Tiedän, että se on pelottavaa ajatella, että Sain kuin 40% tämän tietovisan. Aion epäonnistua tähän luokkaan. Lupaan teille, et ole menossa epäonnistua luokan. Olet täysin hieno. Niille teistä, jotka saivat yli keskiarvo, vaikuttava, vaikuttava, kuten, vakavasti hyvin tehty. Minulla on ne minulle. Voit vapaasti tulla saada ne lopussa osassa. Haluaisin tietää, jos sinulla on kysymyksiä, kysymyksiä heidän kanssaan. Jos lisäämme up your pisteet väärässä, kerro meille. OK, niin pset5, tämä on todella outo viikko Yale siinä mielessä että PSET johtuu Maanantaisin klo lukien myöhään päivä, joten se on todella teoriassa johtuu tiistaina keskipäivällä. Luultavasti kukaan päättynyt tiistaina keskipäivällä. Se on täysin hieno. Aiomme olla virka tänä iltana sekä maanantai-iltana. Ja kaikki osat tällä viikolla todella muuttui työpajoja, niin voit pop jokin osa haluat, ja he ovat eräänlainen mini-PSET työpajoja apua siitä. Joten sinänsä, tämä on ainoa osio minne olemme oppimateriaalia. Kaikki muut osiot keskittyy yksinomaan apua PSET. Joo? Yleisö: Missä virka? ANDI Peng: Aukioloajat tonight-- Voi, hyvä kysymys. Mielestäni virka tänä iltana ovat Tavi tai Commons. Jos tarkistaa verkossa CS50 ja menet virka, olisi aikataulun kertoo missä ne kaikki ovat. Tiedän joko tänä iltana tai huomenna on sinivihreä, ja mielestäni meillä voi olla commons muiden yö. En ole varma. Hyvä kysymys. Tarkistaa CS50. Viileä, kysyttävää aikataulu seuraavan kuten kolmessa päivässä? Lupaan te kuten David sanoi, tämä on mäen päälle. Te olette melkein perillä. Vain kolme päivää. Sinne, ja sitten me kaikki tulla alas. Meidän täytyy mukava CS-taukoa. Tervetuloa takaisin. Me sukeltaa web ohjelmointi ja kehitys, asioita, jotka ovat erittäin hauska verrattuna joitakin muita psets. Ja se tulee olemaan chill, ja meillä on hauskaa. Meillä on enemmän karkkia. Anteeksi karkkia. Unohdin karkkia. Se oli karkea aamu. Joten te olette melkein perillä, ja olen todella ylpeä sinusta kaverit. OK, niin pinot. Joka rakasti kysymys Jack ja hänen vaatteita tietovisa? Ei kukaan? OK, se käy hyvin. Niin olennaisesti kuin voit kuva Jack, tämä kaveri täällä, rakastaa ottaa vaatteet pois pinon, ja hän laittaa sen takaisin pino jälkeen hän on tehnyt. Joten tällä tavalla, hän ei koskaan näyttää olevan saada pohjaan pino hänen vaatteet. Joten tällainen kuvaa perustiedot rakenne miten pino toteutetaan. Pohjimmiltaan ajatella pino niin kaikki pino esineiden jossa voit laittaa asiat kiinni alkuun, ja sitten pop heidät pois ylhäältä. Joten LIFO on lyhenne haluamme että use-- Viime in, first out. Ja niin viime vuonna alkuun pino on ensimmäinen, joka tulee ulos. Ja niin kaksi termiä haluamme liittää kanssa, joita kutsutaan push ja pop. Kun painat jotain päälle pino, ja pop se takaisin ylös. Ja niin kai tämä on tavallaan abstrakti käsite Niille teistä jotka haluavat nähdä kuin tosiasiallinen täytäntöönpano todellisessa maailmassa. Kuinka moni teistä on kirjoittanut esseen ehkä kuten tunti ennen johtui, ja olet vahingossa poistanut valtava kimpale se, kuten vahingossa? Ja mitä sitten ohjaus tehdä käytämme laittaa se takaisin? Control-Z, joo? Control-Z, joten määrä kertoja että valvonta-Z on pelastanut henkeni, on pelastanut minun perse, joka kerta joka on toteutetaan pinon. Pohjimmiltaan kaikki tiedot se on Word-asiakirjaan, se saa työntää ja piipahti mieleisekseen. Ja niin olennaisesti kun poistaa mitään, pop se takaisin ylös. Ja sitten jos tarvitset sitä takaisin päälle, sinun työnnä se, joka on mitä control-C ei. Ja niin reaalimaailman toiminto miten yksinkertainen tietorakenne voi auttaa jokapäiväistä elämää. Joten struct on niin, että me itse luoda pino. Me Define struct, ja sitten me kutsumme sitä pino alareunassa. Ja sisällä pino, meillä on kaksi parametrit että voimme olennaisesti manipuloida, joten meillä on nieriä tähden jouset kapasiteettia. Kaikki, että se tekee luo array että voimme tallentaa mitä haluat joka voimme määrittää sen kapasiteettia. Kapasiteetti on vain max määrä kohteita voimme tähän array. int koko on laskuri, joka pitää seuraa, kuinka monta kohdetta on tällä hetkellä pinossa. Jotta voimme seurata,, sekä kuinka suuri todellinen pino on, ja, B, kuinka paljon, että pino täytimme koska emme halua ylivuoto, mitä meidän kapasiteetti on. Niinpä esimerkiksi, tämä ihana kysymys oli tietokilpailun. Pohjimmiltaan miten me työntää päälle pinon päälle. Melko yksinkertainen. Jos katsot sitä, me kulkea tämän. Jos [äänetön] size-- muistaa, kun haluavat käyttää mitä tahansa parametrin struct, teet nimi struct.parameter. Tällöin s on nimi meidän pinon. Haluamme päästä koko sitä, joten emme s.size. Niin kauan kuin koko ei ole sama kapasiteetti tai niin kauan koska se on vähemmän kuin kapasiteetti, joko toimisi täällä. Haluat käyttää sisällä stäkistäsi, niin s.strings, ja aiot laittaa että uusi numero että haluat lisätä osaksi siellä. Sanotaan vain me haluamme aseta int n pinoon, voisimme tehdä s.strings, suluissa, s.size vastaa n. Koska koko on, jos me tällä hetkellä ovat pinossa jos aiomme ajaa se, me vain käyttää missä koko on, nykyinen täyteys pino, ja me työnnä int n päälle. Ja sitten me haluamme varmistaa, että olemme myös monesko koko n, jotta voimme seurata olemme lisätty ylimääräinen asia pino. Nyt meillä on suurempi koko. Onko täällä mitään järkeä kaikki, miten loogisesti se toimii? Se oli eräänlainen nopeasti. Yleisö: Voitko mennä yli s.stringss.strings [s.size] uudelleen? ANDI Peng: Toki, niin mitä tekee s.size hetkellä antaa meille? Yleisö: Se on nykyinen koko. ANDI Peng: Aivan, niin Hakemisto, että koko on, ja niin haluamme laittaa uusi kokonaisluku että haluamme lisätä osaksi s.size. Onko siinä järkeä? Koska s.strings, kaikki jotka on on nimi jono. Kaikki se on on pääsy array sisällä struct, joten jos haluamme paikka n tuohon indeksi, voimme vain käyttää sitä käyttäen suluissa s.size. Viileä. Hyvä, pop, olen pseudokoodina se ulos sinulle kaverit, mutta samanlainen käsite. Onko siinä järkeä? Jos koko on suurempi kuin nolla, niin voit tietävät, että haluat ottaa jotain pois, koska jos koko ei ole suurempi kuin nolla, niin voit ei ole mitään pinossa. Joten haluat vain suorittaa tätä koodia, se voi vain pop jos on jotain pop. Joten jos koko on suurempi kuin 0, me miinus koko. Me dekrementoidaan koko ja palata sitten mikä on sen sisällä, koska popping, haluamme yhteys mitä tallennetaan vuonna indeksi päällimmäinen. Kaikki järkeä? Jos Tein te kirjoittaa tätä, olisi te voi kirjoittaa sen pois? OK, te voi leikkiä sen kanssa. Ei hätää, jos et saa sitä. Meillä ei ole aikaa koodia sitä tänään, koska olemme sai paljon näiden rakenteiden käydä läpi, mutta pohjimmiltaan pseudokoodilla, hyvin, hyvin samankaltainen työntää. Vain seurata pitkin logiikkaa. Varmista, että olet saada kaikki Autosi struct oikein. Joo? Yleisö: Will näitä dioja ja tämä koko juttu on tänään ish? ANDI Peng: Aina, juu. Aion yrittää laittaa tämä ylös kuin tunnin kuluttua. Minä sähköpostitse David, David yrittää laita se ylös kuin tunnin kuluttua tästä. OK, joten sitten siirrymme tähän muut ihana datarakenne kutsutaan jonoon. Kuten te voi nähdä täällä, jono, Britannian keskuudessamme, kaikki se on on viiva. Joten toisin luulet pino on, jono juuri loogisesti luulet se on. Se hallussa sääntöjen FIFO, joka on First In, First Out. Jos olet ensimmäinen yksi linja, olet ensimmäinen, joka tulee ulos linja. Joten mitä haluamme kutsua tätä on dequeueing ja enqueueing. Jos haluamme lisätä jotain meidän jonoon, me laittaa jonoon. Jos haluamme dequeue, tai ottaa jotain pois, me dequeue. Niin sama tunne, että olemme tavallaan luominen vakiokokoiseen elementtejä, jotka me voi tallentaa tiettyjä asioita, mutta voimme myös muuttaa minne olemme saattamista parametrit sisällä niitä perustuu minkälainen toiminnallisuutta haluamme. Joten pinot, halusimme viimeinen yksi, N olla ensimmäinen yksi. Jono on haluamme ensimmäinen asia on olla ensimmäinen asia pois. Joten struct-tyyppinen määritellä, kuten näette, se on hieman erilainen mitä pino koska me emme vain täytyy pitää Seuraa jossa koko tällä hetkellä on, haluamme myös seurata pään sekä missä me tällä hetkellä olemme. Niin mielestäni se on helpompaa jos piirrän tämän. Joten kuvitella meillä jono, niin sanokaamme pää on täällä. Pään linja, katsotaanpa vain sanoa, että on tällä hetkellä, ja haluamme lisätä jotain jonoon. Aion soittaa koko olennaisesti on sama asia kuin hännän, loppuun minne jono on. Sanotaan vain koko on täällä. Joten miten voidaan järkevästi aseta jotain jonoon? Mitä indeksi haluamme sijoittaa jossa haluamme lisätä osaksi. Jos tämä on alku oman jono ja tämä on lopussa se tai koko se, missä me haluavat lisätä seuraava kohde? Yleisö: [äänetön] ANDI Peng: Aivan, jonka haluat lisätä se riippuu olet kirjoittanut sen. Joko tämä on tyhjä tai on tyhjä. Joten haluat lisätä sen luultavasti tässä, koska jos koko is-- jos nämä ovat kaikki täynnä, haluat lisätä sen täällä, eikö? Ja niin se on, vaikka hyvin, hyvin yksinkertainen, ei aivan aina oikein koska suurin ero välillä jono ja pino on, että jono voi itse asiassa voidaan käsitellä niin että pää muutokset riippuen siitä, missä haluat alussa keppiin aloittaa. Ja sen seurauksena, teidän hännän aikoo myös muuttaa. Ja niin vilkaise tämä koodi juuri nyt. Kuten te pyydettiin myös kirjoittaa ulos tietokilpailu, enqueue. Ehkä niin jutellaan läpi miksi vastaus oli mitä se oli. En voinut oikein sovi tämän linjan yhdelle, mutta pohjimmiltaan tämä koodinpätkä tulisi olla yhdellä rivillä. Vietä kuin 30 sekuntia. Katsomaan, ja miksi tämä on niin, että se on. Hyvin, hyvin samankaltainen struct, hyvin, hyvin samanlainen rakenne kuin edellinen pino paitsi ehkä yhtä riviä koodia. Ja että yhtä riviä koodia määrittelee toiminnot. Ja se todella erottelee jono pinosta. Kukaan halua ottaa puukottaa selittämään miksi olet sai tämän monimutkainen asia täällä? Näemme paluuta meidän ihana ystävä moduuli. Kuten te tulevat pian tunnistaa ohjelmoinnin, melkein milloin tarvitset jotain kääri ympärille mitään, moduuli tulee olemaan tapa tehdä se. Tietäen, että ei kukaan halua yrittää selittää että koodiriviä? Joo, kaikki vastaukset ovat Hyväksytyt ja tervetuloa. Yleisö: Puhutko minulle? ANDI Peng: Joo. Yleisö: Voi ei anteeksi. ANDI Peng: OK, joten katsotaanpa kävelee tämän koodin. Joten kun yrität lisätä jotain päälle jono, ihanassa tapauksessa, että pää tapahtuu olla täällä, se on hyvin helppoa meille vain mennä loppuun lisätä jotain, eikö? Mutta idea jono on että pää voi todella dynaamisesti muuttua riippuen missä haluavat alku meidän Q olla, ja siten, hännän aikoo myös muuttaa. Ja niin kuvitella, että tämä ei ollut jonoon, vaan tämä oli jonossa. Sanotaan pää on täällä. Sanotaan meidän jono näytti tältä. Jos haluaisimme siirtää missä rivin alussa on, sanokaamme muutimme pää Näin ja kokoja täällä. Nyt haluamme lisätä jotain tämä jono, mutta te voi nähdä, se ei ole niin yksinkertainen kuin vain lisätä mitä on jälkeen koko koska silloin me loppuu rajat meidän todellinen array. Jos haluamme todella lisätä on täällä. Se kauneus jonon se meihin, visuaalisesti se näyttää linja menee näin, mutta kun tallennetaan tietorakenteeseen, Ne antavat sille samankaltaisina sykli. Se ikään kuin kiertyy eteen samalla tavalla että linja voi myös kääriä noin riippuen missä tahansa haluavat alkuun linja on. Joten jos otamme halveksua täällä, katsotaanpa sanoa halusimme luoda toiminto nimeltään enqueue. Halusimme lisätä int n tuohon q. Jos q.size q-- soitamme että tietomme structure-- jos meidän queue.size ei sama kapasiteetti tai jos se on vähemmän kuin kapasiteetti, q.strings on joukko meidän q. Aiomme asettaa että yhtä q.heads, joka on täällä, plus q.size moduuli, jonka kapasiteetti, joka kääri meidät takaisin täällä. Joten tässä esimerkissä, indeksi pään on 1, eikö? Indeksi koko on 0, 1, 2, 3, 4. Joten voimme tehdä 1 plus 4 moduuli meidän kapasiteetti, joka on 5. Mitä se antaa meille? Mikä on indeksi, joka tulee ulos tästä? Yleisö: 0. ANDI Peng: 0, joka sattuu olemaan täällä, ja niin haluamme pystyä lisättävän täällä. Ja niin tämä yhtälö täällä tällaista vain toimii numeroita riippuen siitä, missä pää ja kokosi ovat. Jos tiedät, mitä nämä asiat ovat, tiedät tarkalleen missä haluat lisätä mikä on sen jälkeen, kun jono. Tarkoittaako tämä järkevää kaikille? Tiedän eräänlainen aivojen teaser varsinkin kun tämä tuli jälkimainingeissa tietokilpailun. Mutta toivottavasti kaikki nyt voi ymmärtää miksi tämä ratkaisu tai tämä toiminto on niin, että se on. Jokainen hieman epäselvä siitä? OK. Ja nyt, jos halusi dequeue, tämä on meidän pää olisi siirtymässä koska jos me dequeue, emme ota pois loppuun q. Haluamme ottaa pois pään, eikö? Niin ollen, pää tulee muuttumaan, ja siksi kun laittaa jonoon, sinulla seurata missä päätäsi ja kokosi on voitava lisätä oikeaan asentoon. Ja niin kun dequeue, Olen myös pseudokoodilla sitä. Voit vapaasti, jos haluat yrittää koodaat ulos. Haluat siirtää pään, eikö? Jos halusin dequeue, I liikkuisi pään yli. Tämä olisi pää. Ja meidän nykyinen koko olisi vähennä koska emme enää on neljä elementtiä jono. Meillä on vain kolme, ja sitten haluamme palata mitä on tallennettu pään koska haluamme ottaa tämän arvo ulos niin hyvin samanlainen kuin pino. Vain olet ottaen eri paikasta, ja sinun täytyy siirtää osoitinta eri paikka seurauksena. Loogisesti, jokainen seuraa? Suuri. OK, joten me aiomme puhua vähän syvemmin noin linkitettyjen listojen koska he ovat hyvin, hyvin arvokas sinulle aikana tämän viikon psets. Liittyy luettelot, kuten te voi muistaa, kaikki ne ovat ovat solmuja, jotka ovat solmut tiettyjen arvot sekä arvon ja osoitin jotka on linkitetty toisiinsa näiden viitteitä. Ja niin struct miten luomme solmu tässä me on int n, joka on mitä arvo kaupassa tai merkkijono n tai mitä haluat kutsuvat sitä, nieriä tähti n. Struct solmu tähti, joka on osoitin että haluat olla kussakin solmussa, olet menossa on, että osoitin kohta kohti seuraavaksi. Sinulla on pää linkitetyn listan, joka on menossa kohta muualle arvot niin edelleen ja niin edelleen kunnes lopulta päähän. Ja tämä viimeinen solmu on vain menossa ole osoitin. Se tulee osoittamaan null, ja silloin tiedät osuma päättymiseen liittyvät luettelon on, kun viimeinen osoitin ei osoita mitään. Joten aiomme mennä hieman enemmän syvyys siitä, miten yksi olisi mahdollisesti etsi linkitetty lista. Muistakaa, mitä ovat joitakin haitat liittyvät luettelot jakeet array koskien hakuja. Array voit binäärihaku, mutta miksi et voi tehdä, että linkitetty lista? Yleisö: Koska he kaikki kytketty, mutta et oikein tiedä missä [KUULUMATON]. ANDI Peng: Joo, juuri niin muistakaa että loisto array oli se, että meillä oli Random access memory jossa jos halusin arvo indeksin kuusi, voisin vain sanoa indeksi kuusi, anna minulle, että arvo. Ja se johtuu paneelit lajitellaan vuonna yhtenäistä tilaa muistia yhteen paikkaan, kun taas Tällainen linkitettyjen listojen ovat satunnaisesti välissä ympäri, ja ainoa tapa löytää yksi on kautta osoitin joka kertoo osoite, jos tämä seuraava solmu on. Ja niin sen seurauksena, ainoa tapa etsiä linkitetty lista on lineaarinen haku. Koska en tarkalleen tiedä missä 12. arvo linkitetty lista on, Minun täytyy kulkea kokonaisuudessaan Tämän linkitetyn listan yhden yhden pään ensimmäiselle solmulle, toiselle solmulle, kolmanteen solmuun, kaikki alas kunnes lopulta saada missä että solmu etsin on. Ja niin tässä mielessä, haku on linkitetty lista on aina n. Se on aina n. Se on aina lineaarisessa ajassa. Ja niin -koodi, jossa toteutamme tätä, ja tämä on vähän uutta te koska te kaverit ovat ei oikeastaan ​​puhuneet tai koskaan nähty viitteitä miten etsiä viitteitä, niin me kulkea tämä hyvin, hyvin hitaasti. Joten bool haku, oikea, Kuvitellaan haluamme luoda toiminto nimeltään haku, joka palauttaa true jos olet löytänyt arvo sisällä liittyvät luettelo, ja se palauttaa false muutoin. Solmu tähti lista on tällä hetkellä vain osoitin on ensimmäinen kohde linkitetty lista. int n on arvo, että olet etsivät luetteloon. Joten solmu tähden osoitin vastaa lista. Tämä tarkoittaa, että me asetetaan ja luoda osoitin tähän ensimmäiseen solmuun sisällä luettelon. Jokainen kanssani? Joten jos me mennä takaisin tänne, olisin alustettu osoitin, joka osoittaa johtaja mitä se lista on. Ja sitten kun saat tänne, vaikka osoitin ei ole sama null, niin että on silmukka, jossa olemme olemaan myöhemmin liikkumisesta loput meidän luettelosta, koska mitä tapahtuu, kun osoitin vastaa null? Tiedämme, että meillä have-- Yleisö: [äänetön] ANDI Peng: Aivan, niin me tiedämme, että olemme päättynyt luettelon, eikö? Jos menet takaisin tänne, jokainen solmu olisi osoittaa toiseen solmuun ja niin edelleen ja niin edelleen kunnes osut lopulta pyrstö oman linkitetyn listan, joka on osoitin, joka vain ei osoita muualla kuin ei. Ja niin et periaatteessa tietää, että luettelo on vielä siellä ylös kunnes osoitin ei vastaa null koska kun se vastaa null, tiedät, että ei ole enemmän tavaraa. Niin että on silmukka, jossa olemme menossa on todellinen haku. Ja jos pointer-- näette sellainen nuolen toiminta siellä? Joten jos osoitin osoittaa n, jos osoitin n on yhtä suuri kuin n, niin se tarkoittaa, että jos osoitin, että olet hakevat jokaisen solmu on todella arvoa etsit sitten haluat palata totta. Joten periaatteessa, jos olet solmu, joka on arvo, jota etsit, tiedät, että olet ollut onnistuneesti etsiä. Muuten haluat asettaa osoitin seuraavaan solmuun. Sitä, että linja täällä tekee. Pointer vastaa osoitin seuraavaksi. Kaikkien nähdä, miten tämä työskentelee? Ja pohjimmiltaan aiot vain kulkea koko luettelon, nollaus osoitin aina kunnes te lopulta osuma luettelon loppuun. Ja te tiedätte, että ei ole olemassa lisää solmut etsiä, ja sitten voit palata false koska tiedät, että, oi, hyvin, jos olen voinut etsiä kautta koko luettelon. Jos tässä esimerkissä, jos halusin etsiä arvon 10, ja aloitan kärjessä, ja Etsin kokonaan alas, ja minä lopulta sai tähän, joka osoitin, joka osoittaa null, Tiedän että, paska, kai 10 ei ole tämä lista koska en löytänyt sitä. Ja olen lopussa luettelosta. Ja jolloin tiedät Aion return false. Anna että imeytyä vähän. Tämä on melko tärkeää teidän PSET. Logiikka se on hyvin yksinkertainen, ehkä syntaktisesti vain sen toteuttamisesta. Te halua tehdä Varmista, että ymmärrät. Viileä. OK, joten miten olisimme lisäämällä solmuja, oikea, listaan, koska muistaa mitkä ovat mitä etuja ottaa linkitetty lista vs. joukko kannalta tallennustilaa? Yleisö: Se on dynaaminen, joten se on helpompaa to-- ANDI Peng: Aivan, joten se on dynaaminen, joka tarkoittaa, että se voi laajentua ja kutistua riippuen käyttäjän tarpeiden. Ja niin, tässä mielessä, emme tarvitse tuhlata tarpeettomia muistin koska en jos en tiedä kuinka monta arvot haluan tallentaa, se ei ole järkeä minulle luoda array koska jos haluan tallentaa 10 arvoa ja luon joukko 1000, se paljon hukkaan muistia, luovutetaan. Siksi haluamme käyttää linkitetty luettelo voi dynaamisesti muuttaa tai kutistua meidän koko. Ja niin että tekee lisäys hieman monimutkaisempi. Koska emme voi satunnaisesti käyttää elementtejä että olisimme array. Jos haluan lisätä elementin seitsemänteen indeksi, En vain voi lisätä sen seitsemänteen indeksiin. On linkitetty lista, se ei melko työtä yhtä helposti, joten jos halusimme lisätä yksi täällä linkitetty lista, visuaalisesti, se on erittäin helppo nähdä. Me vain haluamme lisätä sen oikeassa, heti alussa luettelon, heti pään. Mutta tapa, jolla meidän täytyy siirtää viitteitä on hieman sekava tai, loogisesti, on järkevää, mutta haluat varmistaa, että sinulla on se täysin alas, koska viimeinen asia, jonka haluat on siirtämiseksi osoitin siten, että teemme täällä. Jos dereference osoitin päästä 1, sitten yhtäkkiä loppuelämäsi linkitetty lista on menetetty, koska et ole itse luotu väliaikainen mitään. Joka on osoitti 2. Jos asiakas määrittää osoitin, sitten loput listasi on täysin menetetty. Joten haluat olla hyvin, hyvin varovaisia ​​tässä ensin määrittää osoittimen mitä haluat lisätä osaksi missä haluat, ja sitten voi dereference loput listasi. Joten tämä koskee missä yrität lisättävän. Jos haluat lisätä at pää, jos haluat vastata täällä, jos haluat lisätä at loppuun, hyvin, loppujen lopuksi kai olisi vain ei ole osoitin, mutta sinä haluat varmistaa, että et menettää loput listasi. Haluat aina varmistaa uusi solmu osoittaa kohti mitä haluat lisätä osaksi, ja voit lisätä ketjuttamalla päälle. Jokainen selvä? Tämä tulee olemaan yksi todellinen kysymyksiä. Yksi tärkeistä kysymyksistä olet menossa on teidän PSET on, että aiot yrittää luoda linkitetty lista ja insertti asiat mutta sitten vain menettää loppuelämäsi linkitetyn listan. Ja aiot olla, minä en tiedä miksi näin tapahtuu? Ja se on kipu mennä läpi ja etsiä kaikki osoittimia. Ja voin taata teille tässä PSET, kirjoittaminen ja piirtäminen näiden solmujen ulos on erittäin, erittäin hyödyllistä. Joten voit täysin seurata missä kaikki osoittimet ovat, mikä on vialla, jossa kaikki solmut ovat, mitä sinun tarvitsee tehdä käyttää tai lisätä tai poistaa tai jokin niistä. Jokainen hyvä, että? Viileä. Joten jos halusimme katsoa koodi? Voi, en tiedä, jos me voi nähdä the-- OK, niin huipulla kaikki se on on funktio nimeltään insertti jossa haluamme lisätä int n osaksi linkitetty lista. Me aiomme kulkea tämän. Se on paljon koodia, paljon uusia syntaksin. Tulemme OK. Joten ylös huipulla, kun haluamme luoda mitään mitä meidän täytyy tehdä, varsinkin jos haluavat sen ei tallenneta pino mutta kasaan? Käymme malloc, eikö? Joten aiomme luoda osoitin. Solmu, osoitin, uusi tasavertaisten malloc koko solmun koska haluamme, että solmu luotava. Haluamme määrä muisti että solmu vie aiotaan luovuttaa varten luominen uusi solmu. Ja sitten me aiomme tarkistaa onko uusia tasavertaisten vastaa null. Muistakaa mitä sanoimme? Mitä ikinä malloc, mitä on aina teet? Sinun täytyy aina tarkistaa, onko se on nolla. Esimerkiksi, jos käyttöjärjestelmä järjestelmä oli aivan täynnä, jos sinulla ei ollut enemmän muistia kaikki ja yrität malloc, se palaisi null sinulle. Joten jos yrität käyttää sitä kun se osoittaa null, et aio pysty käyttää näitä tietoja. Ja niin sellaisenaan, halusimme tehdä Varmista, että kun olet mallocing, olet aina tarkistaa, jos että muisti annettu sinulle on null. Ja jos se ei ole, niin voimme siirtyä kanssa loput meidän koodi. Joten aiomme alustaa uusi solmu. Aiomme tehdä uusi n on n. Ja sitten me aiomme tehdä asettaa uusia osoitin uusi null koska nyt emme halua mitään sen osoittamaan. Meillä ei ole aavistustakaan missä se tulee laittaa sinut, ja sitten jos haluamme aseta se kärjessä, voimme siirtää osoitin päähän. Onko jokainen seuraa logiikkaa missä se tapahtuu? Kaikki me teemme on luomassa uutta solmu, jossa osoitin null, ja sitten uudelleen kohdentamisesta se päähän, jos me tietää haluamme lisätä sen kärjessä. Ja sitten pää on menossa kohta kohti että uusi solmu. Jokainen OK kanssa? Joten se on kaksivaiheinen prosessi. Sinun täytyy ensin assign mitä luot. Aseta että osoitin viite, ja sitten voi sellaista dereference ensimmäinen osoitin ja kohta se kohti uusi solmu. Minne haluat lisätä sen, että logiikka on menossa pitävät paikkansa. Se on ikään kuin osoitetaan väliaikainen muuttujat. Muista, sinulla varmista, että olet älä katoaa jos olet vaihtamalla. Haluat varmistaa, että sinulla on väliaikainen muuttuja sellainen pitää kirjaa kun tämä asia on säilytettävä niin, että voit eivät menetä mitään arvoa kurssin samankaltaisten kikkailunsa sen. OK, joten koodi on täällä. Te katsomaan jakson jälkeen. Se on siellä. Joten kai miten tämä eroaa jos haluaisimme lisätä keskelle tai loppuun? Onko kellään aavistustakaan siitä, mitä on pseudokoodia loogisena viite että ryhtyisimme jos haluaisimme lisätä sen keskellä? Joten jos halusimme aseta se pää, kaikki mitä teemme on luoda uusi solmu. Asetimme osoitin kyseisen uusi solmu mihin tahansa päähän, ja sitten asetamme pää uuteen solmuun, eikö? Jos halusimme lisätä sen keskellä luettelon, mitä meidän on tehtävä? Yleisö: se silti olla samanlainen prosessi samankaltaisten määrittämällä osoittimen ja sitten antaa tämä osoitin, mutta meidän olisi paikantaa siellä. ANDI Peng: Aivan, niin täsmälleen sama prosessi paitsi sinä täytyy etsiä missä tarkalleen olet haluavat, että uuden osoittimen mennä, joten jos haluan lisätä osaksi keskellä liittyvät list-- OK, sanotaan, että on meidän linkitetty lista. Jos haluamme lisätä sen täällä, aiomme luoda uusi solmu. Aiomme malloc. Aiomme luoda uusi solmu. Aiomme antaa osoitin tämän solmun täällä. Mutta ongelma, joka poikkeaa josta pää on on, että me tiesimme tarkalleen jossa pää on. Se oli aivan ensimmäinen, eikö? Mutta tässä meidän täytyy seurata missä olemme sen laittamista. Jos me asetat meidän solmu täällä, meillä varmistaa, että yksi aiempi tähän solmuun on yksi että reassigns osoitin. Joten sitten on sellainen seurata kaksi asiaa. Jos seurata missä tämän solmu tällä hetkellä on laitat ne. Sinun on myös seurata, missä edellinen solmu että etsit oli myös siellä. Jokainen hyvä, että? OK. Entä lisäämällä osaksi loppuun? Jos halusin lisätä sen here-- jos halusin lisätä uusi solmu loppuun luettelon, miten voisin mennä noin tekee, että? Yleisö: Eli tällä hetkellä, viime yksi osoitti null. ANDI Peng: Joo. Tarkalleen, niin tämä yksi tällä hetkellä on suunnattu tietää, ja niin kai, tässä mielessä se on erittäin helppo lisätä luettelon loppuun. Kaikki mitä sinun tarvitsee tehdä on asettaa se yhtä null ja sitten boom. Oikeassa, erittäin helppo. Hyvin yksinkertainen. Hyvin samankaltainen kuin pää, mutta loogisesti sinä haluat varmistaa, että vaiheet otat kohti teet mitään tällaista, olet seuraava pitkin. Se on erittäin helppo, keskellä koodistasi, saada kiinni, Voi, minulla niin paljon viitteitä. En tiedä missä jotain on osoittaa. En edes tiedä mikä solmu olen. Mitä on meneillään? Rentoudu, rauhoitu, vetäkää syvään henkeä. Vetää ulos linkitetyn listan. Jos sanot, tiedän missä tarkalleen Minun täytyy lisätä tämän huomioon ja tiedän tarkalleen, miten siirtää minun osoittimia, paljon, paljon helpompi kuva out-- paljon, paljon helpompaa ei eksyä vikoja koodistasi. Jokainen OK kanssa? OK. Joten kai käsite, meillä ei todella puhui ennen nyt, ja kai luultavasti ei kohdata paljon yet-- se on tavallaan kehittynyt concept-- on, että meillä on todellakin tiedot rakenne kutsutaan kaksin verroin linkitetty lista. Niin te voi nähdä, kaikki teemme on luoda todellinen arvo, ylimääräinen osoitin jokaisen meidän solmujen että myös viittaa edelliseen solmuun. Joten ei vain meillä on meidän solmut viittaavat seuraavaan. Ne viittaavat myös edelliseen. Aion jättää nämä kaksi nyt. Joten sitten on ketju jotka voivat liikkua molempiin suuntiin, ja sitten se on hieman helpompaa loogisesti seurata pitkin. Kuten täällä, sen sijaan pitää seurata, oi, minä täytyy tietää, että tämä solmu on joka minun täytyy siirtää, Voin vain mennä täällä ja vain vetää edellinen. Silloin tiedän tarkalleen missä että on, ja sitten ei tarvitse kulkea kokonaisuudessaan linkitetyn listan. Se on hieman helpompaa. Mutta sinänsä, sinulla on kaksin verroin määrän osoittimia, se kaksinkertainen määrä muistia. Se on paljon viitteitä seurata. Se on hieman monimutkaisempi, mutta se on hieman käyttäjäystävällisempi riippuen mitä yrität saavuttaa. Joten tämäntyyppisiä tietoja rakenne täysin olemassa, ja rakenne on hyvin, hyvin yksinkertainen paitsi kaikki sinulla on on, eikä vain osoitin seuraavaan, sinulla on myös osoittimen edelliseen. Siinä kaikki ero oli. Jokainen hyvä, että? Viileä. Hyvä on, joten nyt olen todella viettää luultavasti kuten 15-20 minuuttia tai irtotavarana muun ajan jaksossa puhumme hash taulukoita. Kuinka moni teistä kaverit lukenut pset5 spec? Hyvä, hyvä. Se on suurempi kuin 50% normaalisti. Se on ok. Niin te näet, olet haaste pset5 on toteuttaa sanakirja jossa lataat yli 140000 sanoja että annamme sinulle ja oikeinkirjoituksen tarkistus se vastaan ​​koko tekstin. Annamme sinulle satunnainen kappaletta kirjallisuuden. Annamme sinulle Odyssey. Annamme sinulle Ilias. Annamme sinulle Austin Powers. Ja teidän haaste on oikeinkirjoituksen tarkistus jokainen sana kaikissa näistä sanakirjoja olennaisesti meidän oikeinkirjoituksen tarkistus. Ja niin siellä on muutamia osia luoda tämän PSET, ensimmäinen haluat olla pystyy todella ladata kaikki sanat omalle sanakirja, ja sitten haluavat pystyä oikeinkirjoituksen tarkistus ne kaikki. Ja niin sellaisenaan, olet menossa vaatia tietorakenne, joka voi tehdä tämän nopeasti ja tehokkaasti ja dynaamisesti. Joten kai helpoin tapa tehdä tämä, te todennäköisesti luo runsaasti, eikö? Helpoin tapa tallennustilaa on sinua voi luoda joukko 140000 sanoja ja juuri laita ne kaikki siellä ja sitten kulkea ne binäärihaku tai valintoja tai not-- pahoillani, että on lajittelua. Ne voidaan järjestää ja sitten kulkea niitä binäärilisäyksellä haku tai vain lineaarinen haku ja vain lopullinen sanoja, mutta että vie valtavasti muistia, ja se ei ole kovin tehokas. Ja niin aiomme aloittaa puhumme tapoja meidän käyntiaika tehokkaampi. Ja tavoitteenamme on saada vakio aika missä se on melkein kuin paneelit, jossa sinulla on hetkellinen pääsy. Jos halusin etsiä mitään, Haluan pystyä vain, puomi, löytää se tarkalleen, ja vedä se ulos. Ja niin rakenne, jossa me voidaan tulossa erittäin lähellä pystyä käyttämään vakio aika, tämä pyhä Graal ohjelmointiin jatkuvasti aikaa kutsutaan hajautustaulua. Ja niin David aiemmin mainittu [Äänetön] vähän luento, mutta aiomme todella sukeltaa syvälle tällä viikolla pala, joka on koskevat miten hash table toimii. Niin että hajautus pöytä teoksia, esimerkiksi, jos halusin tallentaa joukko sanoja, nippu sanoja Englanti kielellä, Voisin teoriassa laittaa banaani, omena, kiivi, mango, pari, ja cantaloupe kaikki vain array. Ne voisivat kaikki mahtuvat ja voidaan löytää. Se olisi eräänlainen kipua etsiä ja pääsy, mutta helpompi tapa tehdä tämä on että voimme luoda todella rakenne kutsutaan hash table jossa hash. Otamme kaikki meidän avaimet kautta hajautusfunktio, yhtälö, joka muuttaa ne kaikki jonkinlainen arvo että voimme tallenna olennaisesti erilaisia ​​linkitetyn listan. Ja niin tässä, jos haluaisimme tallentaa Englanti sanat, voisimme mahdollisesti vain, en tietää, käännä kaikki ensimmäiset kirjaimet jonkinlainen numeron. Ja niin, esimerkiksi, jos halusin Olla synonyymi apple-- tai indeksi 0, ja B olla synonyymi 1, voimme olla 26 merkinnät että voi vain tallentaa kaikki kirjaimet aakkoset että aloitamme kanssa. Ja sitten voimme olla omena on indeksi 0. Meillä voi olla banaani on indeksi 1, fenkoli on indeksi 2, ja niin edelleen ja niin edelleen. Ja näin jos halusin etsiä minun tiiviste ja pääsy omena, Tiedän Apple alkaa , ja tiedän tarkalleen että sen on oltava, ja hash pöytä indeksi 0, koska Toiminnon aiemmin määritetty. Joten en tiedä, olemme käyttäjäkohtaisia ​​jossa sinulta veloitetaan kanssa arbitrarily-- ei mielivaltaisesti, kanssa yrittää mietteliäänä ajatella hyvä yhtälöt pystyä levittämään pois kaikki arvot siten he voivat helposti se myöhemmin kanssa kuin yhtälön että te itse, tietää. Joten siinä mielessä, jos halusin mennä mango, tiedän, oi, se alkaa m. Sen on oltava indeksi 12. Minulla ei tarvitse etsiä mitään. Tiedän exactly-- voisin vain mennä indeksi 12 ja vedä se ulos. Jokainen selvää miten tiiviste n toiminto toimii? Se on tavallaan vain monimutkaisempi array. Siinä kaikki se on. OK. Joten kai me törmätä tämä kysymys mitä tapahtuu, jos sinulla on useita asioita jotka antavat sinulle sama indeksi? Joten sanoa meidän tehtävämme, kaikki se teki oli ottaa tämän ensimmäisen kirjeen ja kääntää sen osaksi vastaaviin 0 kautta 25 indeksi. Se on täysin hienoa, jos sinulla on vain yksi kutakin. Mutta toinen aloitat on enemmän, olet menossa on mitä kutsutaan törmäys. Joten jos yritän lisätä haudata osaksi hash taulukko, joka jo on banaani sitä, mitä tulee tapahtumaan, kun yrität lisätä, että? Bad Things koska banaani jo tallennettu indeksi että haluat tallentaa sen. Berry sellainen on kuin, ah, mitä teen? En tiedä minne mennä. Miten ratkaista tämän? Ja niin te tulee eräänlainen katso teemme tätä hankala asia missä voimme tavallaan todella luoda linkitetyn listan meidän paneelit. Ja niin helpoin tapa ajatella tätä, kaikki tiiviste on joukko linkitettyjen listojen. Ja niin, siinä mielessä, sinulla on tämä kaunis joukko osoittimia, ja sitten kukin osoitinta että arvo, että indeksi, voi todella korostavat muita asioita. Ja niin sinulla on kaikki nämä erilliset ketjut tulossa pois yhden ison array. Ja niin tässä, jos en halusi lisätä marja, Tiedän, OK, aion tuloon se läpi minun hajautusfunktio. Aion päätyä indeksi 1, ja sitten aion voida olla vain pienempi osajoukko tämän jättiläinen 140000-sanan sanakirja. Ja sitten voin vain katsoa kautta 1/26 siitä. Ja niin sitten voin vain lisätä marja joko ennen tai jälkeen banaani tässä tapauksessa? Jälkeen, eikö? Ja niin olet menossa haluavat aseta tämä solmu jälkeen banaani, ja niin aiot lisätä klo pyrstö että linkitetyn listan. Aion mennä takaisin Tämän Edellinen dia, joten te voi nähdä, miten tiivistefunktio toimii. Joten tiivistefunktio on tämä yhtälö että käytät sellaista syöte kautta saada mitä indeksi haluat antaa etenemään kohti. Ja niin, tässä esimerkissä, kaikki halusimme tehdä oli ottaa ensimmäinen kirjain, kääntää sen osaksi indeksi, niin me voi tallentaa että meidän hajautusfunktio. Kaikki me teemme tässä olemme muuntaa ensimmäinen kirjain. Joten KeyKey [0] on vain ensimmäinen kirjain riippumatta merkkijono meillä oli, olemme ohimennen. Olemme muuntaa että ylä-, ja olemme vähentämällä mukaan isoja, niin kaikki mitä tekee antaa meille numero jossa voimme hash arvojamme päälle. Ja sitten me aiomme palata hash moduuli KOKO. Ole hyvin, hyvin varovainen sillä, teoriassa, tässä sinun hash arvo voi olla ääretön. Se voisi vain mennä ja ja. Se voisi olla joitakin todella, todella suuri arvo, mutta koska tiiviste että olet luonut vain 26 indeksit, haluat varmistaa, että modulusing jotta voit älä run-- se on sama asia kuin queue-- niin että et suorita pois pohjassa hajautusfunktion. Haluat kääri se takaisin noin samalla tavalla [äänetön], kun sinulla oli kuin hyvin, erittäin suuri kirjain, sinua ei halua, että vain ajaa pois loppuun. Sama juttu täällä, haluat varmistaa, se ei suorita pois lopussa käärimällä noin taulukon yläosassa. Joten tämä on vain hyvin yksinkertainen tiivistefunktio. Kaikki tämä teki, oli ottaa ensimmäinen kirjeellä mitä meidän panos oli ja kääntää sen osaksi indeksi, joka voisimme ottaa meidän tiiviste. Joo, ja niin kuten aiemmin sanoin, siten, että ratkaisemme törmäykset meidän hash taulukot ottaa, mitä me kutsumme, ketjutus. Joten jos yrität lisätä useita sanoja, jotka alkavat sama asia, aiot olla yksi hash-arvo. Avokadot ja omena, jos olet ajaa se läpi meidän hajautusfunktio, aiomme antaa teille sama numero, numero 0. Ja niin tapaamme ratkaista että on että voimme todella sellaista linkittää niitä yhdessä kautta linkitettyjen listojen. Ja niin tässä mielessä, te voi nähdä sellaista siitä, miten tietorakenteet olemme asettamalla aiemmin kuten rusina linkitetty lista laji ja voi tulla yhdeksi. Ja sitten voit luoda pitkälle tehokkaampi tietorakenteita jotka voivat käsitellä suurempia määriä tiedot, että dynaamisesti muuttaa riippuen tarpeisiin. Jokainen selvä? Jokainen sellainen selkeä mitä tapahtuu täällä? Jos halusin insert-- mitä hedelmä, joka alkaa, en tiedä, B, muut kuin marja, banaani. Yleisö: Blackberry. ANDI Peng: Blackberry, karhunvatukka. Jos ei karhunvatukka mennä täällä? No, emme oikeastaan ​​ole lajiteltu tätä vielä, mutta teoreettisesti jos halusimme saada tämän aakkosjärjestyksessä jossa pitäisi karhunvatukka mennä? Yleisö: [äänetön] ANDI Peng: Aivan, kun täällä, eikö? Mutta koska se on hyvin vaikeaa reorder-- Kai se on jopa teitä. Te voi täysin toteuttaa mitä haluat. Tehokkaamman tehdä tämä ehkä olisi lajitella sidoksissa luettelo aakkosjärjestykseen, ja niin kun olet lisäämällä asioita, haluat olla varma lisätä niitä aakkosjärjestykseen niin että sitten kun olet yrittää etsiä niitä, sinun ei tarvitse kulkea kaikki. Tiedät tarkalleen missä se on, ja se on helpompaa. Mutta jos sellainen on asiat välissä satunnaisesti, olet vielä menossa on kulkemaan sitä anyways. Joten jos halusin vain aseta karhunvatukka täällä ja halusin etsiä se, tiedän, OH, karhunvatukka on aloitettava indeksi 1, joten en tietää välittömästi vain etsiä 1. Ja sitten voin sellainen kulkea linkitetty lista kunnes saan Blackberry, ja then-- joo? Yleisö: Jos yrität create-- Oletan näin on hyvin yksinkertainen hash toiminto. Ja jos halusimme tehdä useita kerroksia, että kuten, OK, haluamme erotella kuten kaikki aakkosina ja sitten taas kuin toinen joukko aakkosellinen kirjeitä kyseisessä, olemme laskemisesta kuin hash pöytä sisällä tiiviste, tai kuten toimintoa funktio? Vai onko that-- ANDI Peng: Joten hash function-- sinun tiiviste voi olla niin suuri kuin haluat sen. Joten tässä mielessä, ajattelin se oli hyvin helppo, hyvin yksinkertainen minulle vain eräänlainen perustuu kirjeistä ensimmäisen sanan. Ja niin on vain 26 vaihtoehtoja. Voin vain saada 26 vaihtoehtoja 0-25 koska ne voivat vain alkaa A: sta Z Mutta Jos halusi lisätä, ehkä enemmän monimutkaisuus tai nopeampi ajaa aikaa teidän tiiviste, ehdottomasti voi tehdä kaikenlaisia ​​asioita. Voit tehdä oman yhtälö, joka antaa sinulle lisää jakelu teidän sanoja, sitten kun haet, se tulee olemaan nopeampi. Se on täysin jopa te miten haluat toteuttaa sitä. Ajattele sitä vain kauhat. Jos halusin 26 kauhat, aion lajitella asiat noihin kauhat. Mutta aion olla nippu tavaraa kussakin ämpäri, joten jos haluat tehdä nopeampi ja tehokkaampi, antaa minulle sata kauhat. Mutta sitten sinun täytyy selvittää tapa järjestää asiat niin, että ne ovat oikeassa ämpäri niiden pitäisi olla. Mutta sitten kun itse halua katsoa että ämpäri, se on paljon nopeammin, koska siellä vähemmän tavaraa kussakin ämpäri. Ja niin, joo, se on todella temppu sinulle kaverit pset5 on, että voit olla haastetaan vain luoda mikä on tehokkain toiminnolla voit ajatella olevan voi tallentaa ja tarkistaa näitä arvoja. Täysin jopa te mutta haluat tehdä sen, mutta se on todella hyvä pointti. Että logiikkaa sinua haluavat alkaa miettiä on, hyvin, miksi en tee enemmän kauhat. Ja sitten minun täytyy etsiä vähemmän asioita, ja sitten ehkä on eri hajautusfunktio. Joo, siellä on paljon tapoja tehdä tämä PSET, jotkut ovat nopeampia kuin toiset. Olen täysin menossa vain nähdä miten nopea oli nopein te kaverit voi saada toiminnot toimimaan. OK, kaikki hyvältä ketjuuntuminen ja hash taulukoita? Se on oikeastaan ​​kuin hyvin yksinkertainen käsite jos ajattelee sitä. Kaikki se on on erottamalla riippumatta teidän tulot ovat osaksi kauhat, lajittelu, ja sitten etsimällä luettelee että siellä liittyy. Viileä. Okei, nyt meillä on erilainen eräänlainen Tietojen rakenne, joka kutsutaan puu. Jatketaan ja puhua yrittää jotka ovat selvästi erilaisia, mutta samaan luokkaan. Pohjimmiltaan kaikki puu on sen sijaan järjestää tietojen lineaarisesti että tiiviste does-- sinua tietää, se sai ylä- ja alaosassa ja sitten tavallaan linkittää pois it-- puu on ylhäältä joka soitat juuri, ja sitten se on lähtee kaikki sen ympärillä. Ja niin sinun ei täällä on vain yläsolmun joka viittaa muihin solmuihin, että pistettä enemmän solmuja, ja niin edelleen, ja niin edelleen. Ja niin sinun täytyy vain jakohaaroja. Se on vain erilainen tapa organisoida tiedot, ja koska me kutsumme sitä puu, te just-- se on vain mallinnettu ulos näyttämään puu. Siksi me kutsumme sitä puita. Tiiviste näyttää pöytä. Puu vain näyttää puu. Kaikki se on on erillinen tapa järjestää solmujen riippuen mitkä tarpeet ovat. Joten sinulla on juuri ja sitten on lehdet. Tapa, jolla voimme erityisen ajattele sitä on binääripuu, binääripuu on vain tietyntyyppistä puu jossa kukin solmu vain pistettä to, max, kaksi muuta solmut. Ja niin täällä on selvä symmetria teidän puu että helpottaa sellaista näyttää mitä arvoja olet koska silloin on aina vasemmalle tai oikealle. Ei koskaan kuin vasemman kolmanneksen vasemmalle tai neljäsosa vasemmalta. Se on vain sinulla on vasen ja oikea ja voit hakea joko näistä kahdesta. Ja niin miksi tämä hyödyllinen? Siten, että tämä on hyödyllinen on jos etsit etsiä arvoja, eikö? Sijasta, binary etsiä virheen array, jos halusi pystyä lisätä solmuja ja ottaa pois solmut tahtoa ja myös säilyttää haku kapasiteetin binäärihakupuu. Joten tällä tavalla, olemme eräänlainen tricking-- muistan kun me sanoi liittyy luetteloita ei binäärihaku? Olemme tavallaan luoda tietorakenteen että temppuja että työskentelyasentoon. Ja siksi sidoksissa luettelot ovat lineaarisia, ne yhdistävät vain yksi toisensa jälkeen. Voimme sellaista olla toisenlaisen osoittimia Siinä vaiheessa eri solmut jotka voivat auttaa meitä haku. Ja niin tässä, jos halusin on binäärihakupuu, Tiedän, että minun keskimmäinen jos 55. Olen juuri menossa luoda että minun keskimmäinen, kuten minun root, ja sitten aion olla arvot spin off sitä. Joten tässä, jos aion etsiä arvo 66, voin aloittaa 55. Se on 66 suurempi kuin 55? Kyllä se on, niin tiedän mus etsi I n oikea osoitin tämän puun. Menen 77. OK, on ​​66 pienempi tai suurempi kuin 77? Se on vähemmän kuin, niin tiedät, oi, jonka on oltava vasemmalle solmu. Ja joten tässä olemme eräänlainen säilyttämiseen kaikki suuria asioita paneelit, joten kuten dynaaminen koon esineitä, että voi lisätä ja poistaa mieleisekseen, ilman huolta siitä kiinteä paljon tilaa. Meillä on vielä säilyttää kaikki niitä ihania asioita samalla myös mahdollisuus säilyttää log ja etsiä aikaa binary haku että olimme vain aiemmin saada lause. Cool tietorakenne, eräänlainen hankala toteuttaa, solmu. Kuten näette, kaikki se on struct solmun on, että sinulla on vasemmalle ja oikea osoitin. Siinä kaikki se on. Joten sen sijaan vain ottaa X tai edellinen. Sinulla vasemmalle tai oikealle, ja sitten voit sellaista liittää ne yhteen kuitenkin niin haluat. OK, olemme todella menossa vain kestää muutaman minuutin. Joten aiomme palata tänne. Kuten sanoin aiemmin, Olen sellainen selittänyt logiikka miten me olisi etsiä tätä. Aiomme yrittää pseudocoding tätä nähdä jos voimme sellaista soveltaa Sama logiikka binäärihaku eri tyyppisiä tietoja rakenteen. Jos kaverit haluavat ottaa kuin pari minuuttia vain ajatella tätä. OK. Hyvä, aion oikeastaan ​​vain antaa sinulle the-- ei, me puhumme pseudokoodina ensin. Joten ei kukaan halua antaa puukottaa mitä ensimmäinen asia, jonka haluat tehdä, kun olet aloittamassa haku on? Jos etsimme arvo 66, mikä on ensimmäinen asia haluamme tehdä, jos haluamme binäärihakupuu tämän puun? Yleisö: Haluat katsoa oikealle ja näyttävät vasemmalle ja nähdä [äänetön] suurempi määrä. ANDI Peng: Joo, täsmälleen. Joten olet menossa katsomaan pääkäyttäjän. On paljon tapoja, joilla voit soittaa se, vanhempasi solmu ihmiset sanovat. Haluan sanoa juuri koska se on kuin puun juuri. Olet menossa katsomaan sinun juurisolmu, ja olet näkemään on 66 suurempi kuin tai vähemmän kuin 55. Ja jos se on suurempi kuin, no, se on suurempi kuin, jos haluamme näyttää? Missä haluamme etsiä nyt, eikö? Haluamme etsiä oikea puoli tämän puun. Joten meillä on, sopivasti, osoitin, joka osoittaa oikealle. Ja niin sitten voimme asettaa uusi pääkäyttäjän 77. Voimme vain mennä minne osoitin osoittaa. No, oh, tässä alamme 77, ja voimme vain Tätä rekursiivisesti uudestaan ​​ja uudestaan. Näin voit laji on on toiminto. Sinulla on tapa etsiä että te voi vain toistaa uudestaan ​​ja uudestaan ​​ja uudestaan, riippuen siitä, missä haluat katsoa kunnes lopulta saada arvoa että etsit. Käydä järkeen? Olen aikeissa näyttää todellinen koodi, ja se on paljon koodia. Ei tarvitse älyttömästi. Puhutaan sen läpi. Itse asiassa, ole. Se oli vain pseudokoodilla. OK, että oli vain pseudokoodina, joka on vähän monimutkainen, mutta se on täysin hieno. Jokainen seuraava pitkin täällä? Jos juuri on null, paluu väärä, koska se tarkoittaa sinun ei edes ole mitään siellä. Jos juuri n on arvo, joten jos se sattuu olemaan yksi etsit, sitten olet menossa return true koska tiedät löysit sen. Mutta jos arvo on pienempi kuin juuri n, olet menossa etsiä vasemmalle lapsi tai vasemmalle lehtiä, mitä haluat kutsua sitä. Ja jos arvo on suurempi kuin juuri, aiot etsiä oikea puu, sitten vain ajaa toiminto haun kautta uudelleen. Ja jos juuri on null, että tarkoittaa olet saavuttanut loppuun? Tämä tarkoittaa sinulla ei ole lisää lisää lehtiä etsiä, niin tiedät, oi, minä kai se ei ole täällä koska kun olen käynyt läpi koko juttu ja se ei ole täällä, se vain voi olla täällä. Tarkoittaako tämä järkevää kaikille? Joten se on kuin binäärihaku säilöntä ominaisuuksia linkitettyjen listojen. Jäähtyä, ja siten toisen tyypin Tietojen rakenne te voi kokeilla täytäntöönpanosta teidän PSET, sinulla on vain valita yksi menetelmä. Mutta ehkä vaihtoehtoinen menetelmä hash table me kutsumme trie. Kaikki trie on on tietyntyyppisen puun, joka on arvoja, jotka menevät muita arvoja. Joten sen sijaan, että binary puu siinä mielessä, että vain yksi asia voi viitata kaksi, voit olla yksi asia kohta monia, monia asioita. Voit olennaisesti on taulukot jonka sisällä tallennat osoittimia, jotka viittaavat muihin paneelit. Joten solmu miten määriteltäisiin trie on haluamme Boolean, C sana, eikö? Joten solmu on Boolen kuten totta vai tarua, ensinnäkin kärjessä että matriisi, on tämä sana? Toiseksi, haluat olla viitteitä mihin tahansa loput niistä ovat. Hieman monimutkainen, hieman abstrakti, mutta Selitän, mitä se kaikki keinot. Joten tässä, huipulla, jos on joukko julisti jo, solmu, jossa sinulla on Boolen tallennettu arvo edessä joka kertoo on tämä sana? Eikö tämä ole sana? Ja sitten on loppuelämäsi array, joka todella tallentaa kaikki mahdollisuuksia mitä se voisi olla. Niinpä esimerkiksi, kuten huipulla olet ensimmäinen asia, joka sanoo totta tai väärä, kyllä ​​tai ei, tämä on sana. Ja sitten on 0 kautta 26 kirjaimet, jotka voit tallentaa. Jos halusin etsiä täällä BAT, menen alkuun ja odotan B löydän B minun array, ja niin tiedän, OK, on ​​B sana? B ei ole sana, niin näin Minun täytyy pitää etsimistä. Menen B, ja katson osoitin, että B osoittaa kohti ja minä näen toisen joukko tietoja, sama rakenne, että meillä oli ennen. Ja here-- oh, seuraava kirje [äänetön] on A. Joten katsomme, että jono. Löydämme kahdeksas arvo, ja sitten me katsomme, OH, hei, on että sana, on B-sana? Se ei ole sana. Meidän täytyy pitää näköinen. Ja niin sitten katsomme missä osoittimen pistettä, ja se osoittaa muulla tavalla joka meillä on enemmän arvoa tallennetaan. Ja lopulta, saamme B--T-, joka on sana. Ja niin seuraavan kerran näytät, olet menossa on, että tarkastus, kyllä, tämä Boolen toiminto on totta. Ja niin siinä mielessä olemme eräänlainen ottaa puu paneelit. Joten voit eräänlainen haku alaspäin. Sen sijaan, hajautus funktio ja osoitetaan arvoja linkitetty lista, voit vain toteuttaa trien, joka etsii downwords. Todella, todella monimutkainen kamaa. Ei helppo ajatella, koska olen kuin sylkeminen niin paljon tietorakenteita ulos sinulle, mutta ei jokainen sellainen ymmärtää, miten logiikkaa tämä toimii? OK, viileä. Joten B--T, ja sitten aiot etsiä. Seuraavan kerran olet menossa nähdä, OH, hei, se on totta, Näin Tiedän, että tämä on sana. Sama asia eläintarha. Joten tässä on asia juuri nyt, jos me halusi etsiä eläintarhaan, juuri nyt, tällä hetkellä eläintarha ei ole sana sanakirjastamme koska, kuten te voi nähdä, ensinnäkin, että meillä on Boolen return true on lopussa zoom. Meillä on Z-O-O-M. Ja niin tässä, meillä ei oikeastaan sana, eläintarha, meidän sanakirja koska tämä valintaruutu ei ole valittuna. Joten tietokone ei tietävät, että eläintarha on sana koska siten, että olemme se on tallennettu vain zoom täällä itse asiassa on totuusarvon joka on kytketty totta. Joten jos haluamme lisätä sana, eläintarha, meidän sanakirja, kuinka voisimme edetä tee sitä? Mitä meidän on tehtävä, jotta voimme varmistaa tietokone tietää, että Z-O-O on sana ja ole ensimmäinen sana on Z-O-O-M? Yleisö: [äänetön] ANDI Peng: Aivan, me haluat varmistaa, että tästä täällä, että Boolen arvo on tarkistanut pois, että se on totta. Z-O-O, niin aiomme tarkistaa, että joten tiedämme tarkalleen, hei, eläintarha on sana. Aion kertoa tietokoneeseen, se on sana niin että kun tietokone tarkistaa, se tietää, että eläintarha on sana. Koska muistaa kaikki nämä tiedot rakenteet, se on hyvin helppoa meille sanoa, oh, lepakko on sana. Zoo on sana. Zoom on sana. Mutta kun olet rakentamassa sitä, tietokone ei ole aavistustakaan. Joten sinun täytyy kertoa se tarkalleen missä vaiheessa on tämä sana? Missä vaiheessa se ole sana? Ja missä vaiheessa minun täytyy etsiä asioita, ja missä vaiheessa minun täytyy mennä seuraavaksi? Jokainen selvää siitä? Viileä. Ja niin sitten tulee ongelma, miten voisimme edetä lisäämällä jotain se oikeastaan ​​ole siellä? Joten vain sanoa haluamme lisätä sana, kylpyamme, meidän trie. Kuten te voi nähdä, kuten tällä hetkellä meidän täytyy nyt on B--T, ja tämä uusi tietorakenne siellä oli pint että viittasivat null koska oletamme että, oi, ei ole sanoja jälkeen B--T, miksi meidän täytyy pitää ottaa asioita jälkeen T. Mutta ongelma syntyy, jos teemme sinulle haluavat sana joka tulee jälkeen T: n. Jos sinulla on kylpyamme, olet menossa halua H oikealla. Ja niin miten aiomme tehdä niin on aiomme luoda erillinen solmu. Emme jakaa summaksi muistia tämän uuden taulukon, ja aiomme siirtää osoittimia. Aiomme antaa H, Ensinnäkin, tämä null, aiomme päästä eroon. Aiomme olla H-pisteen alaspäin. Jos näemme H, haluamme sen mennä jonnekin muualle. Täällä voimme sitten ruksata kyllä. Jos me osuma H jälkeen T, OH, me tiedämme, että tämä on sana. Boolean aikoo palata totta. Jokainen selvää, miten se tapahtui? OK. Niin olennaisesti, kaikki nämä tietorakenteita että olemme ylittäneet tänään, olen menneet heitä todella, todella nopeasti eikä paljon yksityiskohtaisesti, ja se on OK. Kun aloitat Messing sen kanssa, voit olla pitää kirjaa siitä, missä kaikki osoittimet ovat, mitä tapahtuu omassa tietorakenteita, jne. He ovat erittäin hyödyllisiä, ja se on sinun kaverit täysin selvittää, miten haluat toteuttaa asioita. Ja niin pset4, on 5-- Voi, että on väärä. Pset5 on kirjoitusvirheet. Kuten aiemmin sanoin, olet menossa, kun uudelleen, lataa lähdekoodin meiltä. Siellä tulee olemaan kolme asiat sinua lataamista. Sinun ladata sanakirjoja, KERS, ja tekstejä. Kaikki nämä asiat ovat ovat joko sanakirjoja sanoja että haluamme tarkistaa tai testi tiedot että me haluamme teidän oikeinkirjoituksen tarkistus. Ja niin sanakirjat annamme aiot antaa sinulle todellinen sanoja että haluamme voit tallentaa jotenkin tavalla, joka on tehokkaampi kuin jono. Ja sitten tekstit ovat olemaan mitä olemme pyytää teitä oikeinkirjoituksen varmista kaikilla sanoilla olemassa todellisia sanoja. Ja niin kolme korttelin ohjelmia, jotka annamme sinulle kutsutaan dictionary.c, dictionary.h, ja speller.c. Ja niin kaikki dictionary.c tekee on mitä sinua pyydetään toteuttamaan. Se lataa sanoja. Se oikeinkirjoituksen tarkistaa niitä, ja se varmistaa, että kaikki on asetettu oikein. diction.h on vain kirjastotiedosto että ilmoittaa kaikki toiminnot. Ja speller.c, me aiomme antaa teille. Sinun ei tarvitse muuttaa mitään siitä. Kaikki speller.c ei on ottaa sen, lataa sen, tarkistaa nopeus se, testaa vertailukohtana kuten miten nopeasti pystyt tekemään asioita. Se on speller. Eivät vain sotkea sitä, mutta varmista, että ymmärrät mitä se tekee. Käytämme toiminto nimeltään getrusage että testaa suorituskykyä loitsu Checker. Kaikki se on periaatteessa testata aika kaiken teidän sanakirjasta, joten varmista, että ymmärrät sen. Varo sotkea sitä tai muuten asiat eivät toimi kunnolla. Ja suurin osa tähän haasteeseen on te todella muuttaa dictionary.c. Aiomme antaa teille 140.000 sanat sanakirjasta. Aiomme antaa sinulle tekstiviestin tiedoston, nämä sanat, ja haluamme pystyä järjestämään ne hajautustaulun tai trie koska kun pyydämme teitä oikeinkirjoituksen check-- kuvitella, jos olet loitsu tarkkailun kuten Homeroksen Odysseia. Se on kuin tämä valtava, valtava testi. Kuvittele, jos joka ikinen sana oli etsiä läpi joukko 140000 arvoja. Se kestää ikuisesti oman koneen käydä. Siksi haluamme organisoida data tehokkaampi tietorakenteiden kuten hajautustaulun tai trie. Ja sitten te voi kind ja kun haet pääsy asioita helpommin ja nopeammin. Ja joten ole varovainen ratkaista törmäyksiä. Olet menossa saada nippu sanoja, jotka alkavat A. Olet menossa saada nippu sanoja jotka alkavat B. Jopa sinua kaverit, miten haluat sen ratkaisemiseksi. Ehkä siellä on enemmän tehokas tiivistefunktio kuin vain ensimmäinen kirjain jotain, ja niin se on sinun kaverit sellaista tehdä mitä haluat. Ehkä haluat lisätä kaikki kirjaimet yhteen. Ehkä haluat pidät tehdä outoja asioita tilille kirjeiden määrä, aivan sama. Jopa te miten haluat tehdä. Jos haluat tehdä hajautustaulun, jos kannattaa kokeilla trie, täysin vain haluat. Minä varoitan teitä etukäteen, että trie on tyypillisesti hieman vaikeaa vain koska siellä on paljon lisää viitteitä seurata. Mutta täysin jopa teitä. Se on paljon tehokkaampaa useimmissa tapauksissa. Haluat todella pystyä pitämään kirjaa kaikki osoittimia. Kuten tehdä sama asia että tein täällä. Kun yrität lisätä arvot hajautustaulun tai poistaa, varmista, että olet todella pitää kirjaa missä kaikki on, koska se on todella helppoa jos olen yrittää lisätä kuten sana, Andy. Sanotaan vain, että on oikea sana, sana, Andy, jättimäisen luettelon sanoista. Jos minä vain sattuvat siirtää osoitin väärä, oho, siellä menee kokonaisuudessaan loppuelämäni linkitetyn listan. Nyt vain sana I on on Andy, ja nyt kaikki muut sanat Sanakirja on menetetty. Ja niin haluat varmistaa, että sinulla seurata kaikki osoittimet tai muuten olet menossa saada valtavia ongelmia koodissa. Piirrä asioita huolellisesti askel askeleelta. Se tekee siitä paljon helpompi ajatella. Ja lopuksi, haluat pystyä testata suorituskykyä ohjelman iso aluksella. Jos te ottaa katsokaa CS50 juuri nyt, meillä on mitä kutsutaan iso board. Se on arvostelukaavakkeen nopeimmin oikoluvun kertaa kaikilla on CS50 juuri nyt, mielestäni top kuin 10 kertaa Luulen kahdeksan heistä ovat henkilökunnan. Haluamme todella te lyödä meitä. Kaikki meistä yrittivät toteuttaa nopein koodi kuin mahdollista. Haluamme te yrittää haastaa meille ja toteuttaa nopeammin kuin me kaikki voi. Ja niin tämä on todella ensimmäisen kerran, että olemme pyytää te tehdä PSET joka voit todella tehdä missä tahansa menetelmässä haluat. Sanon aina, tämä on enemmän sukua ja tosielämän ratkaisu, eikö? Sanon, hei, tarvitsen sinua tekemään tämän. Rakenna ohjelma, joka tekee tämän minulle. Tee se kuitenkin haluat. Tiedän vain, että haluan nopeasti. Se on sinun haaste tällä viikolla. Kaverit, aiomme antaa sinulle tehtävän. Aiomme antaa teille haasteen. Ja sitten se on sinun kaverit täysin vain selvittää mikä on nopein ja tehokas tapa toteuttaa tätä. Joo? Yleisö: Olemmeko saa jos halusi tutkia nopeammin tapoja tehdä hash taulukoita verkossa, voimme tehdä että ja mainitsevat jonkun toisen koodia? ANDI Peng: Joo, täysin hieno. Joten jos te lukea spec, siellä linja spec joka sanoo te ovat täysin vapaasti tutkimukseen hash toimintoja mitkä ovat joitakin ja nopeammin hash toimintoja ajaa asioita läpi kuin kunhan mainita, että koodin. Joten jotkut ihmiset ovat jo tajunnut nopeasti tapoja tehdä oikolukuohjelmia, nopeasti tapoja tallentaa tietoa. Täysin vain te, jos haluavat vain ottaa sen? Varmista, että olet vedoten. Haasteena todella että yritämme testata on varmistaa, että tiedät päin osoittimia. Niin pitkälle kuin täytäntöönpanosta todellinen tiivistefunktio ja keksiä kuten matematiikka tehdä niin, te voi tutkia mitä tahansa menetelmiä online-kaverit haluavat. Joo? Yleisö: Voimmeko mainita vain käyttämällä [äänetön]? ANDI Peng: Joo. Voit vain, sinun kommentti, voit mainita kuten, oh, otettu yada, Yada, Yada, tiivistefunktio. Kellään mitään kysyttävää? Me itse asiassa breezed kautta jakso tänään. Aion olla jopa täällä vastata kysymyksiin samoin. Myös, kuten sanoin, toimisto tuntia tänään ja huomenna. Spec tällä viikolla on oikeastaan erittäin helppo ja erittäin lyhyt lukea. Ehdotan ottaa tarkastella, vain lukea läpi kokonaisuudessaan se. Ja Zamyla todella kävelee sinua kullakin toimintojen sinun täytyy toteuttaa, ja niin se on hyvin, hyvin selvää, kuinka tehdä kaikkea. Vain varmista, että olet pitää kirjaa osoittimia. Tämä on erittäin haastava PSET. Se ei ole haastavaa, koska kuten, oh, käsitteet ovat niin paljon enemmän vaikea, tai sinun täytyy oppia niin paljon uusia syntaksi tavalla että teit viime PSET. Tämä PSET on vaikeaa, koska on niin paljon viitteitä, ja sitten se on hyvin, hyvin helppo kerran sinulla vian koodi ei voi löytää missä se vika on. Ja niin täydellisestä uskon sinua kaverit pystyä voittamaan meidän [äänetön] kirjoitusasuja. Minulla on oikeastaan ​​ole mitään kirjallista minun vielä, mutta olen aikeissa kirjoittaa minun. Joten kun olet kirjoittamassa sinun, otan kirjallisesti minun. Aion yrittää tehdä minun nopeammin kuin sinun. Näemme kuka on nopein. Ja joo, minä näen kaikki te täällä tiistaina. Käyn sellaista kuin PSET työpaja. Kaikki osat tämän viikko ovat PSET työpajoja, joten teillä paljon mahdollisuuksia apua, virka kuten aina, ja minä todella odotan lukeminen kaikki kaverit "koodi. Minulla on tietokilpailuja tänne jos kaverit haluavat tulla saada näitä. Siinä kaikki.