DAVID J. Malan: Bone. Do bonvenon al la unua iam CS50 postmortem por kvizon. Ni pensis ke ni inaŭguros tiun tradicion ĉi jaron. Kaj tio estos okazo marŝi tra la solvojn al la kvizo. Kaj ni vidos plirapidigi aŭ malrapidigi bazita en intereso de tiuj ĉi tien. Do vi estas probable tie ĉar vi estas interesiĝas pri kio vi povus havi aŭ devus esti respondis iuj de tiuj problemoj. Do kial ni ne tuj iri en ĉi tiu sekcio unue? Do atingi kordoj. Tio donis al vi tri malsamaj versioj de programo kiu estis, finfine, signifis akiri kordo de uzanto. Ĉu aŭ ĉu ne ĝi faris ke estis lasis al vi determini. Kaj ni demandis en Demando 0, supozu ke la versio 1 estas kompilis kaj ekzekutita. Kial eble la programo segfault? Je unua rigardo, ia sugestoj kial? Jes. Spektantaro: Tiel mi memoras vidi tion en antaŭa ekzemplo rigardante la char * s, kaj vidante la scan de la s kaj vidante ĉar ĝi estas montrilon, kiel cxu gxi tuŝi kion vi escaneados en? Ĉu s aŭ la adreso de s? DAVID J. Malan: okej. Bona. Do fine, la fonto de iu ajn problemo Estas supozeble tuj redukti por ke variablo s. Kaj ĝi estas ja variablo. La datumtipo de tiu variablo estas char *, kio signifas ke ĝi tuj enhavas la adreson de karaktero. Kaj tie radikas la komprenon. Ĝi tuj enhavas la adreson de gravulo aŭ, pli ĝenerale, la adreso de la unua signo en tutan blokon de karakteroj. Sed la ruzo estas ke scan s, celon en vivo, estas donita adreson kaj donis formato kodon, kiel% s, legi ŝnureto en la eron de memoro en tiu adreso. Sed ĉar mankas egalsigno antaŭe ke punktokomo sur la unua linio de kodo, ĉar ni ne reale atribui ajnan memoro kun malloc, ĉar ĝi ne reale destini tabelo de iuj dimensioj, ĉiuj vi faras legas la uzanto klavaro enigo en iuj kompletaj rubo valoro, kiun estas en s defaŭlte. Do malakordo vi tuj segfault se tiu adreso ne ĝuste tiel okazos esti valoro kiun vi povas, fakte, skribu al. Do malbona ne destini via memoro tie. Do, en demando 1, ni demandis, supozu ke la versio 2 estas kompilis kaj ekzekutita. Kial eble tiu programo segfault? Do ĉi tiu estas malpli kalesxo. Kaj estas vere nur unu evidenta vojo, kie vi povas deĉenigi segfault tie. Kaj jen estas temático. Ajna tempo ni uzas c en memoro, kio vi povus fari por indukti segfault kun la versio 2? Spektantaro: Se vi uzas tiun enigo en ĉeno kiu estas pli longa ol 49 karakteroj. DAVID J. Malan: Ekzakte. Ajna tempo vi vidos io fiksita longeco kiam temas pri tabelo, via radaro devus foriri tiu ĉi povus esti problema se vi ne estas kontrolanta la limoj de tabelo. Kaj tio estas la problemo ĉi tie. Ni daŭre uzante scanf. Ni daŭre uzante% s, kiu signifas provi legi ĉenon de la uzanto. Tio okazas al esti legata en s, kiuj, ĉe tiu punkto, estas efektive la adreso de eron de memoro aŭ ĝi estas ekvivalento. Ĝi estas la nomo de tabelo el karakteroj de memoro. Sed ĝuste tio, se vi legis kordo ke estas pli longaj ol 49 signoj, 49 ĉar vi bezonas cxambron por la backslash 0, vi tuj dronigos ke bufro. Kaj eble vi ricevas sorton kaj esti kapabla skribi 51-a karaktero, 52nd, 53a. Sed en iu momento, la VIN tuj diru, ke ne. Tiu certe ne estas memoro vi rajtas tuŝi. Kaj la programo tuj segfault. Do, la heurísticas devus esti neniu tempo vi havas fiksa longeco, vi havas por certiĝi vi kontrolanta la longo de ĉiu kiu estas vi provas legi en ĝi. Spektantaro: Do ​​por solvi tion, vi povus havis komunikaĵo kontrolanta reale estas la longo pli granda ol aŭ malpli ol? DAVID J. Malan: Absolute. Vi nur devas kondiĉo kiu diras, se la - aŭ prefere vi ne nepre scias anticipe kiom da karakteroj la uzanto tuj tajpi, ĉar vi havas kokinon kaj la ovo. Ne ĝis kiam vi mem legis gxin en kun scanf ĉu vi povas eltrovi kiom longe ĝi estas. Sed je tiu punkto, estas tro malfrue, ĉar vi jam legis ĝin en iuj bloko de memoro. Do kiel apartigas, la CS50 biblioteko Evitas tiu temo en aro, recall uzante fgetc. Kaj legas unu karaktero samtempe, tip-toeing kune, sciante, ke vi povas ne dronigos karaktero se Vi legas unuope. La ruzo estas kun getstring revokon estas ke ni devas konstante re-grandeco ke eron de memoro, kiun Estas nur la doloro. Estas multe da linioj de kodo por fari tion. Do alian alproksimiĝon estus efektive uzi kuzo, do paroli, el scanf. Ekzistas variantoj de multe da tiuj funkcioj kiuj reale kontrolu la longeco de kiom da karakteroj vi eble legis maksimume. Kaj vi povus precizigi, ne legu pli ol 50 signoj. Do kiu estus alia alproksimiĝo sed malpli akomodi de pli grandaj enigoj. Do pridubi 2 petas, supozu ke versio 3 estas kompilita kaj ekzekutita. Kial eble tiu programo segfault? Do ĉi tiu estas vere la sama respondu, kvankam ĝi aspektas iom amatoro. Ni uzas malloc, kiuj sentas kiel Ni donas al ni pli da ebloj. Kaj tiam ni liberigante ke memoron ĉe la fino. Ĝi estas ankoraŭ nur 50 bitokoj de memoro. Do ni povus ankoraŭ provas legi en 51, 52, 1000 bajtoj. Ĝi tuj segfault por precize la sama kialo. Sed estas alia kialo tro. Kion alian povis malloc reveno krom la adreso de eron de memoro? Ĝi povis reveni nula. Kaj ĉar ni ne kontrolas por ke ni povus fari ion stulta pro alia kialo, kiu estas tiu Ni povus diri scanf, legi la uzanto enigon el la klavaro en 0 situo, AKA nula. Kaj tio, tro, definitive deĉenigi segfault. Do por la kvizo la celo, ni volas esti akceptita ankaŭ de tiuj, kiel valida kialo. Unu estas identaj. Unu estas iomete pli nuancita. Fine, kun respekto al la programo uzo de memoro, kiom fari versio 2 kaj Versio 3 diferencas? Do por kio valoras, ni vidis ŝajne senfina provizo de eblaj respondojn por ĉi tio. Kaj inter popola respondoj, kion ni estis esperante, sed ni akceptas aliajn aĵoj, estis iuj mencio de la fakto ke la versio 2 estas uzanta la tn pilo. Versio 3 estas uzanta la havaĵo. Kaj funkcie, tiu ne vere fari cxiujn ke multe de la diferencon. Je la fino de la tago, ni estas ankoraŭ nur nun 50 bitokoj de memoro. Sed tiu estis unu el la eblaj respondoj ke ni rigardis. Sed vi vidos, kiel vi ricevis viajn kvizojn liberigitan el TFS, ke ni faris akcepti aliajn diskutojn de ilia dispar uzoj de memoro tiel. Sed pilo kaj amason estus estinta facilan respondon akompani. Demandojn? Mi donos al vi Rob. ROB Bowden: Do problemo 4. Ĉi tio estas unu kie vi devis plenigi en la nombro de bitokoj, el cxiuj tiuj malsamaj tipoj uzataj. Do ni unue vidas. Alpreni 32-bita arkitekturo, kiel tiu CS50 aparaton. Do unu el la fundamentaj aferoj pri 32-bita arkitekturoj, kiuj diras al ni ekzakte kiom granda puntero tuj esti en la arkitekturo. Do tuj, ni scias, ke iu montrilo tipo estas la 32-bitoj aŭ 4 bitokoj. Do rigardante tiun tabulon, a nodo * estas montrilo tipo. Tio tuj estos 4 bitokoj. Struct nodo *, tio estas laŭvorte identa al nodo stelo. Kaj por ke tuj estos 4 bitokoj. Kordo, do tio ne aspektas kiel Pointer ankoraŭ, sed la typedef, a kordo estas nur char *, kiun estas montrilo tipo. Do tiu tuj estos 4 bitokoj. Kaj tiuj tri estas ĉiuj 4 bitokoj. Nun, nodo kaj studento estas iom pli komplika. Do rigardante nodo kaj studentaj, ni vidas nodo kiel entjero kaj montrilo. Kaj studento estas du montriloj interne de ĝi. Do almenaŭ por nia kazo tie ĉi, la vojon ke ni finu la kalkuli la grandecon de ĉi struct estas nur aldonu ĉion kiu estas interne de la struct. Do por nodo, ni havas entjero, kio estas 4 bitokoj. Ni havas montrilon, kiu estas 4 bitokoj. Kaj do unu nodo tuj preni 8 bajtoj. Kaj simile por studento, ni havi montrilo tio 4 bajtoj kaj alia montrilo tio 4 bitokoj. Por ke okazas al fino estante 8 bajtoj. Do nodo kaj studento estas 8 bajtoj. Kaj tiuj tri estas ĉiuj 4 bitokoj. Demandojn pri tio? Jes. Spektantaro: CXu estis 64-bita arkitekturo, volus, ke duobligi ĉiuj el ili? ROB Bowden: Ĝi ne volis duobligi ĉiuj el ili. Do 64-bita arkitekturo, ĝi, denove, ŝanĝoj kiuj fundamenta afero, kiun oni montrilo estas nun 64 bitojn. Jes. Do puntero estas 8 bajtoj. Do tiuj kiuj estis 4 bitokoj tuj estos la 8 bajtoj. Studento, kiu estis du montriloj, bone, nun ĝi estas tuj esti 8 bajtoj, 8 bajtoj. Ĝi tuj fari 16 bajtoj. Sed nodo estas ankoraŭ 4 bitokoj. Do tiu montrilon tuj esti 8 bajtoj. Tiu estas 4 bitokoj. Do nodo nur tuj esti 12 bajtoj. Ajna alia demandojn pri tiu? Do la proksimaj unu, jen estas la HTTP statuso kodoj. Kaj vi devis priskribi cirkonstancoj sub kiu tiuj heroajxoj revenos al vi. unu problemo, kiun mi auxdis kelkajn studentojn havas estas ke ili provis fari la eraroj estos cxe la kliento fino. Do kiam ni provos fari la peton al la servilo, io iras erara sur nia fino. Sed ĝenerale, tiuj kodoj estas esti redonata de la servilo. Do ni volas eltrovi, kio okazas erara aŭ rajto je la servilo kaŭzas tion esti reveninta. Do kial multobligita servilon revenoj statuso kodo 200? Ajna pensojn? Jes. Do io pri sukcese peto trapasis. Kaj ili estas kapablaj reveni kion ajn vi petis. Do ĉio iris bone. Kio pri 302 trovitaj? Jes. Spektantaro: La servilo rigardis por kio vi petis. Sed tio ne povis trovi ĝin. Do tie estas eraro. ROB Bowden: Do la servilo estis serĉas, kion vi volis. Do nur rigardas tien, 302 trovis, ĝi sukcesis trovi ĝin. Spektantaro: mi bedaŭras. Trovita signifas ke ili faris gxin trovi. Pardonon. ROB Bowden: Do 302 trovitaj. La servilo povas trovi kion vi volis. Spektantaro: Sed ĝi ne estas montri ĝin? ROB Bowden: La diferenco inter ĉi 302 kaj 200 estas ke gxi scias kion vi volas. Sed gxi ne estas precize kie Vi volis demandi. Do 302 estas tipa alidirektadon. Do vi petis paĝon. Ĝi scias, ho, mi deziras redoni al vi ĉi. Sed tio estas je malsama retadreso. Do bona, vi vere volas tion. DAVID J. Malan: Ĝi estas peco kiu diris ke ni donis al vi uloj estas alidirektadoj funkcio kiu uzis la kaplinion funkcio kiuj, siavice, presita ekster situo, dupunkto, kaj tiam la URL por kio vi volas malakcepti la uzanto. Eĉ se vi ne vidis 302 eksplicite tie, tio estas kion PHP- estus magie enŝovu la kaplinio dirante precize kion Rob diris tie - trovita. Sed iru tien anstataŭe. ROB Bowden: okej. Do kio pri 403 malpermesita? Spektantaro: Mi kredas ke estas ke la servilo Estas esence dirante ke la klienton ne povas aliri la ĉefpaĝon. ROB Bowden: Do jes. Nu, la tipa respondo ni estis atendante, estas io kiel, la dosieroj ne chmodded taŭge. Tio probable sub kiaj cirkonstancoj vi vidis ilin. Sed ekzistas kialo, ke la kliento povus esti je kulpo ĉi tie. Tie estas vere alia statuso kodo - 401. Do ĉi tiuj estas tre similaj. 401 estas rajtigita. Kaj 403 estas malpermesata. Kaj tia senpermesa vin ekskluzive akiri, se vi ne estas ensalutinta Sed ensalutante povus signifi ke vi estas rajtigita. Sed se vi jam salutanta kaj vi ankoraŭ ne havas permeson, tiam vi povas ankaŭ preni malpermesitan. Do se vi estas ensalutinta, kaj ne havas permeson, malpermesita estas ankaŭ io, kion vi povas akiri. DAVID J. Malan: Kaj la mekanismo per kiu tiuj problemoj estas kutime solvitaj sur la servilo estas tra kio komandon? Chmod, se ĝi estas, efektive, permesojn ekspedi en la dosiero aŭ dosierujo. ROB Bowden: Tiam 404 Ne trovis. Jes. Do malkiel 302, kie oni ne ekzakte kie vi petante sed scias kion oni volas, tion, ĝi nur havas nenian ideon kion vi volas. Kaj vi ne petante io validas. 418 Mi estas tekruĉo kaj poste 500 internajn servilo. Do kial eble vi ricevas tion? Do segfault - Mi vere ne scias la grading normo por ĉi tio. Sed se via PHP-kodo havis ion malbone en ĝi, en teorio, ĝi povis reale segfault, en kiu kazo, ĉi 500 internajn servilo eraro, iu estas malĝusta kun via servilo agordo. Aux tie estas sintaksa eraro en via PHP-kodo. Aux io malbona okazas. DAVID J. Malan: Ni vidis, segfault inter malmultaj popola respondojn. Kaj teknike, ĝi povus okazi. Sed tio estus PHP, la programo skribitaj de aliaj personoj, reale segfaulted, kiu nur se tiuj homoj ŝraŭbita kaj skribis kalesxo kodo ilia interpretisto farus PHP mem segfault. Do eĉ se 500 estas kiel segfault en spirito, ĝi estas preskaŭ ĉiam la rezulto de agordo-dosiero afero kun via ttt-servilo aŭ, kiel Rob diris, sintakson eraro, kiel vi ne fermas citaĵon. Aŭ vi perdis punktokomo ie. Spektantaro: Do ​​pro la Shuttle pset, mi pensas, kiam mi faris tion unufoje Mi klakis la retumilo, sed nenio okazis, kion oni nomas blanka paĝo. Sed ĝi estis pro la kodon. Mi pensas ke estis JavaScript, ĉu ne? ROB Bowden: Jes. Spektantaro: Ĉu tiu eraro ankoraŭ sin levas? ROB Bowden: Do vi ne estus alveninta tiu eraro ĉar ĉiu de la TTT-servilo perspektivo Estis tute bone. Sed vi petis index.html. Vi petis shuttle.js kaj service.js. Kaj ĝi povis sukcese revenos al vi cxiuj el tiuj aĵoj - 200. OK. Estas nur kiam via retumilo provis interpreti la JavaScript-kodon ĝi estas kiel, atendu, tio ne estas valida JavaScript eraro. Ajna alia demandojn? Ĉiuj pravas. DAVID J. Malan: Do apud supren estis numero 11. Kaj 11 estis la plej delira cxar multe da homoj. Do la plej grava afero por noti ĉi tie estis, ke tiu estis, efektive, pri duoble ligillisto. Sed tio ne estis la sama kiel pasintjara duoble ligillisto problemo, kiuj ne donis al vi la averto ke la listo povus, fakte, estus Unsorted. Do la fakto ke la listo estis Unsorted kaj la fakto ke tiu vorto estis substrekita tie oni intencis transdoni ke ĉi tio vere estas simpligo de kio alimaniere estus estinta pli defia problemo kaj pli longa unu. Do oni komuna eraro ĉi tie estis esti metita pasintjara solvo je via oni pager kaj tiam simple blinde kopii tiun malsupren kiel la respondon, kiu estas dekstre respondi al malsama demando simila en spirito. Sed la subtilaĵoj tien estis jene. Do, ni jam nodo deklaris kaj difinita en la kutima maniero ĉi tie. Tiam ni difinis listo de esti tutmonda montrilo pravalorizita al nula. Tiam ŝajne, estas du funkcioj ni havos prototipoj por tie, insert kaj forigi. Kaj tiam ni havas iun specimenon kodo tien fari faskon de interpolaciones. Kaj tiam ni demandos vin kompletigi la efektivigo de insert malsupre en tia maniero, ke ĝi enmetas n enen la listo en konstanta tempo, ankaŭ substrekis, eĉ se jam ĉeestas. Do la belecon de povi enigi en konstanta tempo estas ke ĝi implicas ke vi devas enigi la nova vertico kie? En la fronto. Do ĝi forigas, dankeme, almenaŭ unu el la kazoj kiujn uzis por postuli eĉ pli linioj de kodo, kiel ĝi faris lasta jaro kaj eĉ en la klaso, kiam ni parolis per ĉi tiu speco de afero kun homoj kaj kun iu verba pseŭdo-kodo. Do la solvo ĉi tie, ni salti super por ke ĝuste havi vidan sur la ekrano. Rimarku ke ni faras la sekvan. Kaj ankaŭ rimarkos la aliaj plisimpligo estis, ke eĉ se ĝi estas jam ĉeestas, do tio signifas, eĉ se la nombro jam estas tie, vi povas nur blinde enmeti alian kopion de ĝi. Kaj tio, tro, ĝi signifis esti plisimpligo, por ke vi povis enfokusigi, vere, iu de la pli intelekte interesan parton kaj Ne nur iuj aldonaj eraro kontrolanta donita la limigita tempo. Do en tiu specimeno solvo, ni rezervu puntero sur la maldekstra mano flanken tien por nodo. Nun, rimarkas ke montrilon, kiel Rob diris, estas nur 32 bitoj. Kaj ĝi ne reale enhavi adreso, ĝis vi atribui al ĝi la adreson. Kaj ni faru tion en la dekstra mano flankon per malloc. Kiel bona civitano, ni kontrolu ke malloc ne estas, fakte, nula, tial ke ni ne akcidente krei a segfault tie. Kaj iam vi uzas malloc en vivo, vi devus esti kontrolanta por nula, por ke vi havas subtilan cimon. Tiam ni pravalorizi ke nula por atribuante n kaj antaŭa kaj sekva. Kaj en tiu kazo ĉi tie, mi pravalorizita antaŭaj al nula, ĉar ĉi nova nodo tuj estos la nova komencante de mia listo. Do tuj estos nenion antaux gxi. Kaj mi volas esence append la ekzistantan liston al la nova vertico per opcio apud egala al listo mem. Sed mi ne agis ĝuste ankoraŭ. Do se la listo mem jam ekzistis, kaj tie estis almenaŭ unu nodo Jam en tiu loko, se ĉi tiu estas la listo ĉi tie kaj mi enmeti novan nodon tie, mi bezonas certigi ke mia iama nodo antaŭ malantaŭen al mia nova nodo, ĉar ĉi tio estas, denove, duoble ligillisto. Do ni faras prudento ĉekon. Se listo ne estas nula, se estas jam unu aŭ pli da nodoj tie, tiam aldoni ke reen referenco por tiel diri. Kaj tiam la lasta afero kiun ni bezonas fari estas vere aktualigi la tutmonda variablo listo mem atentigi al tiu nova nodo. Jes. Spektantaro: En la montrilon sago [Inaudibles] egalas nula, faras ke pritrakti la listo ĉar la listo estas nula? DAVID J. Malan: Nope. Tio estas simple mi esti proactivamente Atentu, ke se ĉi tiu estas mia originalaj liston kun eble kelkaj pli nodoj super ĉi tie kaj mi enmeto mia novan nodon super cxi tie, tie okazas esti superflue tie ĉi. Kaj mi volas kapti tiun ideon per opcio antaŭa al nula en la nova nodo. Kaj supozeble, se mia kodo estas korekta kaj tie estas alia maniero por enmeti nodojn alia ol tiu funkcio, supozeble, eĉ se listo havas jam unu aŭ pli da nodoj en ĝin, supozeble la listo, la unua nodo, havus antaŭa montrilon de nula mem. Spektantaro: Kaj nur sekvado. La kialo vi metis montrilon sekvanta egaluloj listo estas vi farante la montrilo antaŭ listo en tiu ĝi estas montrante al la sekva, mi supozas - Mi ne batu - nur listigas? DAVID J. Malan: Ekzakte. Kaj do ni efektive konsideri du kazoj tie vere, eĉ kvankam la Por ni konsideras ilin ne tute la sama kiel la kodon. Sed sur alta nivelo, se ĉi tio reprezentas listo kaj tio estas 32-bita montrilo, la plej simpla scenejo estas ke ĉi tiu estas nula defaŭlte. Kaj supozu mi volas enmeti la numero 50 estis la unua numero. Do mi tuj iros antaŭen kaj destini nodo, kiu tuj enhavi tri kampoj - n, antaŭa kaj sekva. Mi tuj metos la nombro 50 ĉi tie, ĉar tio estos n. Ĉi tio estos proksima. Kaj ĉi tio estos antaŭa. Kaj do, kion mi faru en tiu kazo? Nu, mi ĵus faris linio 1 cxi tie. Pointer n gets n. Mi tiam diris, antaŭa devus preni nula. Do tiu tuj estos nula. Tiam Mi iros dirindan tuj alvenos listo. Kaj tio nur funkcias bone. Tiu estas nula. Kaj do mi diras, la nova nodo apud kampo devus preni kion ajn tio estas. Do kiu metas alian nula tie. Kaj tiam la lasta afero Mi estas kontrolu ĉi tie. Se listo ne estas egala al nula, sed estas egala al nula, tial ni saltos, ke aro. Kaj tial ĉiuj mi faras nun, estas listo gets montrilon, kiu pictóricamente rezultigas bildon tiel. Do jen unu scenaro. Kaj kiu vi demandis pri specife estas situacio kiel tiu, kie ni jam havas unu-nodo listo. Kaj se mi reirus en la originalo problemo komunikaĵo, la sekvanta Ni enŝovu diri estas 34, nur por pro diskuto. Do mi iros nur oportune cxerpi, ke ĉi tie. Mi ĵus malloced. Supozu mi kontrolanta por nula. Nu, mi tuj pravalorizi n al esti 34. Kaj tio estos n. Ĉi tio estos proksima. Kaj ĉi tio estos antaŭa. Ni certigu mi ne get this malantaŭen. Malantaŭa venas unue en la difino. Permesu al mi korekti tion. Tiu estas antaŭa. Ĉi tiu estas proksima. Eĉ se tiuj estas identaj, ni tenu gxin konsekvenca. Malantaŭa. Ĉi tiu estas proksima. Do mi ĵus malloced mia noto, kontrolis por nula, atribuitaj 34 en la nodo. Malantaŭa gets nula. Do tio donas al mi tion. Sekva gets listo. Do listo estas tiu. Do tiu estas la sama nun kiel desegnon ĉi arrow, tiel ke ili notas al unu en la sama. Kaj poste mi kontrolanta se listo estas ne egala al nula. Kaj ĝi estas ja tiu tempo. Tiam Mi faros listo antaŭa gets montrilo. Do listo antaŭa gets PTR. Do tiu havas la efiki de meto grafikan sagon tie. Kaj tio ricevas iom ondecaj, la linioj. Kaj poste, fine, mi ĝisdatigos listo atentigi al Pointer. Do nun tiu notas al tiu ulo. Kaj nun, ni faros rapidan prudento ĉekon. Jen la listo, kiu estas La malloka variablo. La unua nodo estas ja 34, ĉar Mi sekvajn ke sago. Kaj tio estas korekta ĉar mi volas enmeti komence de la listo ĉiuj novaj nodoj. Lia sekva kampo kondukas min al tiu ulo. Se mi plu iri, mi batis proksima estas nula. Do ne estas pli-listo. Se mi batis antaŭa, I get dorso kie mi atendus. Do estas ankoraŭ kelkaj indikoj, evidente, manipuli. Sed la fakto, ke vi sciigis fari tiu en konstanta tempo signifas nur havi finia nombro de aferoj vi rajtas fari. Kaj kio estas tiu nombro? Ĝi povus esti unu paŝon. Ĝi povus esti du. Ĝi povus esti 1.000 paŝoj. Sed ĝi estas finia, kio signifas ke vi ne povas esti ia speco de looping antauxenirinte ĉi tie, sen rekursio, neniu maŝojn. Ĝi simple alvenis al esti hard-coded linioj de kodo, kiel ni havas en tiu specimeno. Do la sekva problemo 12 petis nin kompletigi la efektivigo de Elpreni malsupre en tia maniero, ke ĝi forigas n de la listo en lineara tempo. Do vi havas iom pli moveti ĉambro nun. Vi povas supozi, ke n, se ĉeestas en la listo, ĉeestos ne pli ol unufoje. Kaj tio tro celas esti kvizo-bazita simpligante supozo, do ke se vi trovas la numeron 50 ie en la listo, vi ne faras same devas zorgi pri daŭre persisti, serĉante ĉiun eblan Kopio de 50, kio estus nur devolve en kelkaj minutia en limigita tempo. Do kun forigi, ĉi tiu estis definitive pli defia kaj pli kodon por skribi. Sed je la unua rigardo, sincere, ĝi eble aspektas blindigaj kaj kiel iu estas nenia vojo vi povus havi veni supren kun la kvizon. Sed se ni fokusiĝas je la individuaj paŝoj, espereble, gxi subite frapi vin ke ĉiu de tiuj individuaj paŝoj faras evidenta senco Retrospektive. Do ni rigardu. Do unue, ni pravalorizi montrilo esti listo mem. Ĉar mi volis lineara tempo, tio signifas Mi tuj havis iun cirklon. Kaj komunan vojon persisti super la nodojn en lerta strukturo aŭ ia ajn de strukturo ripete estas preni puntero al la fronto de la datumoj strukturo kaj tiam nur komencas ĝisdatigi ĝin kaj iru vian vojon tra la datumstrukturo. Do mi tuj faros ĝuste tion. Dum montrilon, mia provizora variablo, estas ne egala al nula, ni iru antaŭen kaj kontrolu. Did I get bonŝanca? Estas la n kampo en la nodo Mi estas aktuale rigardas egala al la numeron Mi serĉas? Kaj se jes, ni faru ion. Nun, rimarkos ĉi se kondiĉo ĉirkaŭas la tutan sekvajn liniojn de kodo. Tiu estas la nura afero interesas min - trovanta nombro en demando. Do ne estas alia, kiu simpligas aferojn koncepte iom. Sed nun, mi rimarkis, kaj eble vi havos nur rimarkis tion post pensante ĝin tra iom, ke estas fakte du kazoj tie. Unu estas kie la nodo estas en la komencante de la listo, kiu estas iom ĝena, ĉar tio estas speciala kazo, cxar vi devas trakti kun tiu afero, kiun Estas la sola anomalio. Ĉie alie en la listo, ĝi estas la sama afero. Ekzistas antaŭa nodo kaj apud nodo, antaŭa nodo, apud nodo. Sed tiu ulo estas iom speciala se li estas en la komenco. Do se la montrilon egalas la listo mem, do se mi estas ĉe la komenco de la listo kaj mi trovis n, mi bezonas fari kelkajn aferojn. Unu, mi bezonas ŝanĝi listo por atentigi al la sekvanta kampo, 50. Do supozu, ke mi provis forigi 34. Do tiu ulo havas jam iri for en nur unu momento. Do mi intencis diri, lerta gets Pointer proksima. Nu, tio estas montrilo. Sekva notas ĉi tie. Do tiu ŝanĝiĝas ĉi sago dekstren nun atentigi al tiu ulo tie. Nu, memoru, ni havi portempa variablo. Do ni ne orfino ajna nodoj, ĉar mi ankaŭ havas ĉi ulo en mia efektivigo de forigi. Do nun, se listo mem ne estas nulaj, Mi bezonos ripari iom io. Mi bezonas nun certiĝi ke tiu sago, kio estas antaŭe indikante el 50 al 34, tiu jam devas iri for, ĉar se mi provas forigi de 34, 50 prefere ne subtenas ajnan speco de dorso aludo al ĝi kiel la sago sugestis. Do mi nur faris ĉi tiun linion. Tial do mi faris. Tiukaze estas fakte sufiĉe facila. Batante la supron de la listo estas relative simpla. Bedaŭrinde, estas tio ĝena alia bloko. Do nun, mi devas konsideri la kazon kie estas io en la mezo. Sed ne tro terura, krom cxar sintakso kiel ĉi tio. Do, se mi ne estas ĉe la komenco de la listo, mi ie ​​en la mezo. Kaj ĉi tiu lineo tie estas diranta, komenco ĉe kio ajn nodo vi estas ĉe. Iru al la antaŭa nodo apud kampo kaj atentigi ke ĉe la montrilo. Ni faru tion pictóricamente. Tio estis atingi komplika. Do, se mi havas antaŭaj kampoj ĉi tie - ni faru tion - apud kampoj ĉi tie. Mi iras al simpligi mian pointers prefere ol desegni tutan faskon da aferojn tien kaj reen crisscrossing reciproke. Kaj nun, ni nur diru ĉi estas 1, 2, 3 pro diskuton, eĉ kvankam tio ne laŭliniigi kun la problemo en demando. Do jen mia ligillisto. Mi klopodas eltiri du en tiu aparta versio de la rakonto. Do mi ĝisdatigita montrilon al esti indikante al koncerna ulo. Do tiu estas PTR. Li montras ĉi tie. Ĉi tio estas listo, kiu ekzistas tutmonde kiel antaŭe. Kaj li montras ĉi tie ne gravas. Kaj nun mi provas eltiri du. Do se montrilon notas cxi tie, mi estas sekvos, ŝajne, la antaŭa montrilon, kiu metas min je 1. Mi tiam tuj diru, ke la venonta kampo, kiun alportas al mi trans ĉi tiun boksi tie, tuj egala montrilon proksima. Do, se ĉi montrilon, ĉi tiu estas proksima. Tio signifas ke ĉi sago bezonoj atentigi al tiu ulo. Do kion tiu linio de kodo havas nur farita estas iom de tiu. Kaj nun, tiu serĉas kiel paŝon en la ĝusta direkto. Ni esence volas Snip 2 out el la mezo de 1 kaj 3. Do ĝi havas sencon, ke ni volas itinero ĉi montrilon ĉirkaŭ ĝi. Do tiu sekva linio estas kontrolanta se montrilo sekvanta ne estas nulaj, ekzistas ja iu al la rajto de 2, tio signifas ke ni ankaŭ devas fari iom Snip tie. Do mi devas nun sekvi tiun montrilon kaj aktualigi la antaŭan montrilon sur ĉi ulo fari iom de workaround tie la punkto ĉi tie. Kaj nun, vide tiu estas agrabla. Ĝi estas iom senorda en kiuj ekzistas neniu fingromontrante la 2 plu. 2 notas maldekstren. Kaj 2 estas montranta dekstren. Sed li povas fari kion ajn li volas, ĉar li estas proksimume al get liberigita. Kaj ne gravas kion tiuj valoroj estas plu. Kio gravas estas, ke la ceteraj infanoj routing supre kaj sub li nun. Kaj efektive, jen kio ni faros. Ni liberaj montrilon, kiu signifas ke ni diru la mastruma sistemo, vi estas bonvena por postuli ĉi. Kaj poste laste, ni revenos. Alie, implice, se ni ne revenis ankoraŭ, Ni devas subteni rigardante. Do montrilon egalas montrilon sekvanta simple signifas movi ĉi ulo tie. Movu ĉi ulo tie. Movu ĉi ulo ĉi tie, se, fakte, ni ne trovos la nombro ni serĉas ankoraŭ. Do sincere, ĝi aspektas tute blindiga, mi opinias, unue rigardo, speciale se vi baraktis kun tiu dum la kvizo tiam vidos iu kiel ĉi tio. Kaj vi frapeti mem sur la dorso. Nu, ne estas vojo mi povis havi veni supren kun tiu en la kvizo. Sed mi volas argumenti, sed vi povas, se vi rompas Ĝi penetras en tiujn individuajn kazoj kaj nur marŝi tra ĝi zorgeme, kvankam, rekoni, sub turmenta cirkonstancoj. Bonŝance, la portreto farita ĉiun feliĉaj. Vi povus cxerpi tio en ajn da manieroj. Vi ne devos fari la crisscrossing afero ĉi tie. Vi povus fari ĝin per rektaj liniojn kiel ĉi tio. Sed la esencon de ĉi tiu problemo, en ĝenerala, estis realigi, ke la pentraĵo en la fino devus aspekti iom io simila, ĉar konstanta tempo implicis ke vi observu jamming kaj jamming kaj jamming la novaj nodoj ĉe la komenco el la listo. Demandojn? Probable la plej defia de certe estas la kodigo demandoj. Spektantaro: Tia estas listo simila al estras en antaŭaj ekzemploj. DAVID J. Malan: Precize, ĝuste. Nur malsama nomo por malloka variablo. World Wide kio? ROB Bowden: okej. Do tiu estas tiu, kie vi devis verki la alineo. Kelkaj homoj verkis eseojn por tiu ĉi demando. Sed vi devas nur uzi tiujn ses terminoj priskribi kio okazas, kiam vi provu kontakti facebook.com. Do mi simple parolas tra la procezo uzante cxiujn tiujn terminojn. Do, en nia retumilo, ni tajpas facebook.com kaj batis Eniru. Do nia retumilo tuj konstrui HTTP peti ke ĝi estas tuj sendos tra iu procezo por Facebook por Facebook por respondi al ni kun la HTML de lia paĝo. Do kio estas la procezo per kiun la HTTP peto fakte alvenas al Facebook? Do unue, ni bezonas por traduki Facebook.com. Do simple donita la nomo Facebook.com, kie fakte faras la HTTP peto bezonas iri? Do ni bezonas por traduki Facebook.com al IP-adreso, kiun unike identigas kia maŝino ni efektive volas sendi tiun peton. Via portebla komputilo havas IP-adreso. Io ajn konektita al la interreto havas IP-adreso. Do DNS, Domain Name System, kiu estas kio okazos al manipuli la tradukado el facebook.com al IP-adreso, ke vi fakte volas kontakti. Do ni kontaktos la DNS-serviloj kaj diru, kio estas facebook.com? Ĝi diras, oh, tio estas la IP-adreso 190,212 io, iu, io. Ĉiuj pravas. Nun, mi scias kio maŝino Mi volas kontakti. Do tiam vi sendu vian HTTP peto super tiu maŝino. Do kiel faras ĝi preni al tiu maŝino? Nu, la peto iras de enkursigilo al enkursigilo Bouncing. Rememoru la ekzemplo en klaso, kie ni efektive vidis, ke la vojo kiun la pakojn prenis kiam ni provis komuniki. Ni vidis ĝin salti super la Atlantiko Oceano ĉe unu punkto aŭ kio ajn. Do la lastan terminon havenon. Do tiu estas nun en via komputilo. Vi povas havi plurajn aferojn aktuale komunikanta per la interreto. Do mi povas kuri, diru, Skype. Mi ne havas retumilo malfermita. Mi ne havas iu kiu torrenting dosierojn. Do ĉiu el ĉi tiuj aferoj estas komuniki kun la interreto iel. Do, kiam via komputilo ricevas iujn datumoj el la interreto, kiel faras tion scias kion apliko reale volas la datumo? Kiel tio scii ĉu ĉi tiu aparta datumo estas intencita por la torrenting apliko kontraste al la retumilo? Do tiu estas la celo de havenoj en tiu ĉiuj el tiuj aplikoj havas asertis havenon en via komputilo. Do via retumilo diras, bona, Mi aŭskultas la haveno 1000. Kaj via torrenting programo estas jene: Mi aŭskultas la haveno 3000. Kaj Skype diras, Mi uzas havenon 4000. Do, kiam vi ricevas iujn datumojn kiuj apartenas al unu el ĉi tiuj aplikoj, la datumoj estas markitaj per kiu haveno ĝi efektive devus esti sendita kune al. Do tio diras, ho, mi apartenus al haveno 1000. Mi scias, ĉar mi bezonas resendi ĉi kune al mia retumilo. Do la kialo estas grava ĉi tie estas ke retserviloj emas aŭskultu sur haveno 80. Do, kiam mi kontaktas Facebook.com, mi estas komunikanta kun iu maŝino. Sed mi bezonas diri kiun havenon de tiu maŝino Mi deziras komuniki kun. Kaj retserviloj inklinas esti aŭskultante la haveno 80. Se ili volas, ili povus agordi gxin supren ĝis ĝi listigas kiel sur haveno 7000. Kaj poste en foliumilo, mi povis permane tajpi Facebook.com: 7000 por sendu la peton al haveno 7000 de Facebook ttt-servilo. DAVID J. Malan: Kaj en tiu kazo, eĉ kvankam ni ne postulas ke la homo mencii ĉi, en tiu kazo, kion haveno estus peto efektive iros al? Provu denove. Ekzakte. Ne serĉas tion, sed oni subtileco ke estas tie neniu la lasta. ROB Bowden: Do la HTTPS, ĉar ĝi estas aŭskultante specife por la ĉifrita, ĝi estas sur haveno 4430. Spektantaro: Kaj retmesaĝoj estas 25, ĉu ne? DAVID J. Malan: outbound retmesaĝoj, 25, Yep. ROB Bowden: Mi ne eĉ konas la plimulto de la - ĉiuj el la malsupra inklinas esti rezervita por aĵoj. Mi kredas ke ĉiu sub 1024 estas rezervitaj. Spektantaro: Kial vi diras 3 estis la malĝusta nombro? ROB Bowden: Ĉar en sama IP-adreso, ekzistas kvar grupoj de ciferoj. Kaj ili estas de 0 ĝis 255. Do 192.168.2.1 estas komuna loka reto IP-adreso. Rimarku ĉiuj el tiuj estas malpli ol 255. Do kiam mi komencis per 300, ke ne povus havi estis unu el la nombroj. DAVID J. Malan: Sed tiu stulta klipo de - gxi estis CSI, kie ili havis numeron kiu estis tro granda por la IP adreso. ROB Bowden: Ajna demandojn pri tio? La proksima, tiel kompletan ŝanĝon en temo, sed ni havas ĉi PHP tabelo por La domoj en la kvar. Kaj ni havas neordigitan liston. Kaj ni volas presi ĉiun listeron nur enhavanta la domo nomo. Do ni havas foreach buklo. Do memoru, la sintakso estas foreach tabelo kiel eron en la tabelo. Do per ĉiu ripeto de la ciklo, domo iras preni sur unu el la valoroj ene de la tabelo. Sur la unua ripeto, domo Estos Cabot Domo. Sur dua iteracio, domo esti Courier Domo kaj tiel plu. Do por ĉiu quad kiel domon, ni estas nur tuj presi - vi ankaŭ povus esti eĥis - la listeron kaj tiam la domo, la nomo kaj poste fermi la listeron. La krispa krampoj estas laŭvolaj tie. Kaj tiam ni ankaŭ diris en la demando mem, memoras por fermi la Neordigita listo etikedo. Tial oni devas eliri PHP mode por fari tion. Aŭ ni povus esti ehxis la fermi Neordigita listo etikedo. DAVID J. Malan: Ankaŭ fajna tie farus estis uzi malnova lernejo por buklo kun $ i = 0 0 kaj uzante grafoj al elkompreni la longeco de la radio. Plene fajna tro, nur iom wordier. Spektantaro: Do, se vi intencis [Inaudibles], vi farus - Mi forgesis kion la buklo [inaudibles] is. Ĉu vi $ quad krampo i? DAVID J. Malan: Ekzakte. Jes, ĝuste. ROB Bowden: Ĉu io alia? DAVID J. Malan: Bone. Komerco maldungitaj. Do tie estis aroj da respondojn ebla por ĉiu el tiuj. Ni estis vere nur serĉas io konvinka por upside kaj oni batas. Kaj numero 16 demandis, validigi uzantoj enigo kliento-flanko, kiel kun JavaScript, anstataŭ servilo-flanko, kiel kun PHP. Do kio estas la supra parto de faranta kliento-flanko? Nu, unu el la aferoj kiujn ni proponis estas ke kondomoj latenta, ĉar vi ne devas ĝeni kontaktanta la servilo, kiu povus preni kelkajn milisekundoj aŭ eĉ kelkaj sekundoj evitante tion kaj simple validigi uzantoj 'enigo kliento-flanko de deĉenigi sur-submit traktilo kaj ĝuste kontrolanta, cxu ili tajpi io en por nomo? Ĉu oni tajpas ion in por retadreso? Ĉu oni elektu dormejo de la falmenuo? Vi povas doni al ili tujan reagon uzante la gigahertz komputilo aux cxion, kion ili havas, ke estas efektive sur ilia tablo. Do ĝi estas nur bonaj uzanto spertos tipe. Sed batas fari kliento-flanko validigon, se vi faras ĝin sen ankaŭ faranta servilo-flanko validigo estas ke plej Iu venas el CS50 scias ke vi povas simple sendu ajnan datumoj vi volas al servanto ajna nombro de manieroj. Sincere, en plej ajna retumilo, vi povas klaku ĉirkaŭe en la agordojn kaj justa elŝalti JavaScript, kiuj volis, do, malŝalti ajnan formon de validigo. Sed vi ankaŭ povas memori, ke eĉ mi faris kelkaj arkaikaj aĵojn en klaso uzante telnet kaj reale ŝajnigante esti retumilo sendante get petoj al servilo. Kaj tio certe ne uzante ajnan JavaScript. Tio estas nur mi tajpas komandojn ĉe klavaro. Do vere, ajna programisto ene sufiĉas konsolo, per la retejo kaj http povus sendi kion ajn datumoj li aŭ ŝi volas al servanto sen validigo. Kaj se via servilo ne estas ankaŭ checking, cxu ili donu al mi nomon, estas tio efektive validan retpoŝtan adreson, faris Ili elektas dormejo, vi povus fini supren enmeto blufa aŭ nur malplenan datumoj en via datenbazo, kiu probable ne tuj estos bona afero se vi estis alprenanta ĝi estis tie. Do tiu estas ĝena realo. Sed ĝenerale, la kliento-flanko validigo estas granda. Sed tio signifas duoble da laboro. Kvankam tie fari ekzistas pluraj bibliotekoj, JavaScript bibliotekojn por Ekzemple, kiuj faras ĉi multe, multe malpli pri kapdoloro. Kaj vi povas reuzi iun el la kodo server-side, kliento-flanko. Sed ĉu rimarki ke ĝi estas tipe aldona laboro. Jes. Spektantaro: Do, se ni nur diris malpli sekuraj - DAVID J. Malan: [rie] Ugh. Tiuj estas ĉiam la pli malfacila ones al juĝas. ROB Bowden: Tio estus estis akceptita. DAVID J. Malan: Kio? ROB Bowden: Mi kreis tiun ĉi problemon. Tio estus akceptita. DAVID J. Malan: Jes. Spektantaro: Cool. ROB Bowden: Sed ni ne akceptis cxar la unua - nu, kion ni serĉas estas iu kiel vi ne devas komuniki kun la servilo. Ni ne akceptas nur rapida. Spektantaro: Kio pri ne refreŝigu paĝon? ROB Bowden: Jes. Tio estis akceptita respondo. DAVID J. Malan: Io ajn kie ni sentis ĝi estis pli verŝajna ol ne verŝajna ke vi sciis kion vi estis dirante, ke estas malmola linio por cxerpi foje. Uzanta ligillisto anstataŭ de tabelo subteni ordo listo de entjeroj. Do oni upside ni ofte citas kun ligita listoj kiuj motivis siajn tutajn enkonduko estis vi ricevas dinamismo. Ili povas kreski. Ili povas ŝrumpi. Do vi ne devas salti tra aros por fakte krei pli da memoro kun tabelo. Aŭ vi ne devas nur diri, sorry, uzanto. La tabelo estas plena. Do dinamika kresko de la listo. A malavantaĝo kvankam ligita listoj? Spektantaro: Ĝi estas lineara. Serĉado en ligitaj listo estas lineara anstataŭ kia vi ensaluti DAVID J. Malan: Ekzakte. Serĉado sur ligillisto estas lineara, eĉ se ĝi estas ordo, ĉar vi povas nur sekvas tiujn pano panpecetoj, tiuj montriloj, de la komenco de la listo al la fino. Vi ne povas utiligi hazarda aliro kaj, tiele, duuma serĉo, eĉ se ĝi estas ordo, kiun vi povis faru kun tabelo. Kaj ekzistas ankaŭ alia kosto. Jes. Spektantaro: Memoro malkompetenta? DAVID J. Malan: Jes. Nu, mi ne volas nepre diru malkompetenta. Sed tio kostos al vi pli da memoro, ĉar vi bezonas 32 bitojn por ĉiu nodo por la aldona montrilon, ĉe Almenaŭ por unuope ligillisto. Nun, se vi nur stokante entjeroj kaj vi estas aldono de la montrilo, jen fakte speco de ne-bagatela. Ĝi estas duobliganta la kvanto da memoro. Sed en realo, se vi stokante a ligillisto de structs kiuj povus havi 8 bajtoj, 16 bitokoj, eĉ pli ol tio, eble estas malpli de marĝena kosto. Sed estas kosto tamen. Do ĉu de tiuj estus jam estis delikata kiel downsides. 18. Uzanta PHP anstataŭ C por skribi komand-linia programo. Do ĉi tie, ĝi estas ofte pli rapide uzi lingvo kiel PHP aŭ Ruby aŭ Python. Vi nur rapide malfermi supren tekstoredaktilo. Vi havas multe pli da funkcioj disponebla por vi. PHP havas la kuirejo profundiĝi de funkcioj, dum en C, oni havas tre, tre malmulte. Fakte, knaboj la scias la malmola vojo ke vi ne havas hash tabloj. Vi ne kunligis listoj. Se vi volas tiujn, vi devas apliki ilin mem. Do unu upside de PHP aŭ vere neniu interpretita lingvo estas la rapideco kun kiuj vi povas skribi kodon. Sed malfacilaĵo, ni vidis tion, kiam mi rapide ekfrapis a misspeller efektivigo en prelego uzi PHP, estas ke uzante interpretita lingvo estas kutime malrapidaj. Kaj ni vidis, ke pruveble kun pliigi en tempo de 0,3 sekundoj por 3 sekundoj, pro la interpretado kiu fakte okazas. Alia upside estis, ke vi ne devas kompili. Do ĝi ankaŭ akcelas disvolviĝon parenteze, ĉar vi ne havas du paŝojn por ruli programon. Vi nur havas unu. Kaj tial ke estas sufiĉe konvinka tiel. Uzanta SQL datumbazo anstataŭ a CSV-dosiero por stoki datumoj. Do SQL datumbazo estas uzata por pset7. CSV dosierojn vi ne uzis multe. Sed vi uzis ĝin malrekte en pset7 kiel bone por paroli por Yahoo! Finance. Sed CSV estas ĝuste kiel Excel dosieron sed super simpla, kie la kolumnoj estas nur demarked per komoj interne de la cetere teksta dosiero. Kaj uzante SQL datumbazo estas iom pli konvinka. Ĝi estas inversita, ĉar vi ricevas tion, kiel elekti kaj enmeti kaj forigi. Kaj vi akiras, supozeble, indeksoj, ke MySQL kaj aliaj datumbazoj, kiel Oracle, konstruu por vi en la memoro, kiu signifas via unuaranga estas probable ne tuj estos lineara supro al malsupro. Ĝi estas vere tuj estos io kiel duuma serĉo aŭ io simila en spirito. Do ili estas ĝenerale pli rapidaj. Sed malfacilaĵo estas, ke ĝi estas nur pli da laboro. Estas pli da klopodoj. Vi devas kompreni datumbazoj. Vi devas agordi ĝin. Vi bezonas servilon kuri ke datumbazo plu. Vi devas kompreni kiel konfiguri ĝin. Do tiuj estas nur tiuj specojn de komerco maldungitaj. Pro CSV-dosiero, vi povas krei ĝin per gedit. Kaj vi estas bonaj iri. Ne estas komplekseco preter tiu. Uzanta trie anstataŭ hash tablo kun apartaj sinsekvon stoki vortaro de vortoj memorigas de pset5. Do oni provas inversita, en la teorio almenaŭ, estas kio? Konstanta tempo, almenaŭ, se vi estas hashing sur ĉiu de la individuo literoj en vorto, same kiel vi povus havi por pset5. Tio povus esti kvin hashes, ses hashes se estas kvin aŭ ses literoj en la vorto. Kaj tio estas sufiĉe bonaj. Kaj se estas supera baro sur kiel longe viajn vortojn povus esti, ke estas ja asimptote konstanta tempo. Pro hash tabelo kun apartaj ĉeni, la problemo ekzistas kun tiu speco de datumstrukturo estas ke la agado de via algoritmoj kutime dependas de la nombro de la aferoj jam en la datumstrukturo. Kaj tio estas definitive la kazo kun ĉenoj, per la pli stuff vin meti enen hash tablo, la pli longa tiuj ĉenoj iru, kiu signifas en la plej malbona kazo, la afero vi povus serĉi estas la tuta vojo al la fino de unu de tiuj ĉenoj, kiu efike devolves en iu lineara. Nun, en praktiko, ĝi povus absolute esti la kazo ke oni hash tablo kun ĉenoj estas pli rapida ol la respondaj trie efektivigo. Sed tio estas pro diversaj kialoj, inter kiuj provas uzi tuta amaso de memoro kiu povas, fakte, malrapida aferoj malsupren, ĉar vi ne ricevas belan avantaĝoj de iu nomita caching, kie aferoj, kiuj estas proksime unu en memoro povas aliri ofte pli rapide. Kaj foje vi povas veni supren kun vere bona hash funkcio. Eĉ se vi havas por perdi iom de memoro, eble vi ja povos trovu tion firme kaj ne kiel malbona kiel lineare. Do mallonge, ne estis bezone kun iu ajn el tiuj unu aŭ eĉ du specifaj aferoj ni serĉis. Vere io persvada kiel upside kaj malavantaĝo ĝenerale kaptis nian okulon. ROB Bowden: Do pro la inversita, ni faris Ne akcepti je lia propra "rapida." Vi devis diri ion pri tio. Eĉ se vi diras teorie pli rapide, Ni sciis, ke vi ia komprenis ke ĝi estas 0 de 1. Kaj hash tablo, en teorio, ne estas 0 de 1. Citante ion pri ekzekuto ĝenerale akiris vi la punktoj. Sed "rapida," la plimulto de la solvaĵoj je la granda tabulo kiuj peras estis objektive pli malrapida ol solvoj kiuj estis hash tabloj. Do pli rapide en kaj el si mem ne estas vere vera. DAVID J. Malan: Dom De dom dom. Mi estas probable la sola kiu realigas jen kiel tio supozas ke prononcus, ĉu ne? ROB Bowden: Mi havis fakte neniun ideon. DAVID J. Malan: Ĝi faris senco en mia kapo. ROB Bowden: mi faras ĉi tiu. OK. Do tiu estas tiu, kie vi devis desegni la diagramo simila al vi, multobligita vidis sur pasinteco ekzamenojn. Do ni simple rigardi ĉi. Do el la HTML nodo, ni havas du infanoj, la kapon kaj la korpon. Do ni branĉo - kapo kaj korpo. La kapo havas titolon etikedo. Do ni havas titolon. Nun, la sola afero ke multaj personoj forgot estas ke tiuj tekstoj nodoj estas elementojn ene de ĉi arbo. Do jen ni okazi por cxerpi ilin kiel ovaloj por distingi ilin el tiuj tipoj de nodoj. Sed avizo Ankaŭ tie ni havas supro, mezo, kaj malsupro finos esti teksto nodoj. Do forgesante estis iom de komuna eraro. La korpo havas tri filojn - tiuj tri divs. Do div, div, div kaj tiam la teksto nodo infanoj de tiuj divs. Tio estas sufiĉe da ĝi por ke la demandoj. DAVID J. Malan: Kaj estas Mencindas, eĉ kvankam ni ne logxas en tiuj detaloj en la tempo ni pasigas sur Javascript, ke la ordono faras, en Fakte, afero teknike. Do, se la kapo venas antaux korpo en la HTML, tiam ĝi devus aperi al la forlasis de korpo en la fakta DOM. Ke lia estas, en ĝenerala, simple FYI, iu nomita dokumenton ordo, kie tio gravas. Kaj se vi efektivigo sintaksa analizilo, programon kiu legas HTML en konstruaĵo ĝis la arbo en la memoro, por esti honesta, tio estas intuicie probable kion vi do ĉiuokaze - supro al malsupro, maldekstre dekstren. ROB Bowden: Demandoj pri tio? Should I do la venonta unu? DAVID J. Malan: Certe. ROB Bowden: okej. Do tiu estas la bufro invadita atako demando. La ĉefa afero por agnoski ĉi tie estas, bone, kiom povus malhelpi lertaĵo ĉi programo en la ekzekuti arbitra kodo? Do argv1, la unua komandlinia argumento por ĉi programon, kiu povas esti arbitre longa. Sed ĉi tie ni uzas memcpy kopii argv1, kio tie estas trinkejo. Ni pasante ĝin kiel la argumento. Kaj tial ĝi estas prenante la nomon trinkejo. Do ni memcpying trinkejo en ĉi tiun buffer c. Kiom da bajtoj ni kopiado? Nu tamen multaj bitokoj trinkejo okazas al uzos, la longeco de tiu diskuto. Sed c estas nur 12 bitokoj larĝa. Do, se ni tajpi komandlinia argumento ke estas pli longaj ol 12 bitokoj, ni estas tuj dronigos ĉi aparta bufro. Nun, kio povus malhelpi trompi la plani en ekzekuti arbitrajn kodo? Do memoru, ke ĉi tie ĉefa vokas foo. Kaj tiel do la ĉefa alvokoj Foo. Ni desegnas ĉi. Do ni havas nian pilo. Kaj ĉefa havas stack frame ĉe la malsupro. Je iu punkto, ĉefa alvokoj Foo. Nu, tuj, ĉefa alvokoj Foo. Kaj tiel foo ricevas sian propran stack frame. Nun, en iu punkto, foo tuj revenos. Kaj iris foo revenas, ni bezonas scii ĉe kio linio de kodo ene de ĉefa ni estis por scias kie ni devus rekomenci en ĉefa. Ni povas nomi foo el tutaj fasko da malsamaj lokoj. Kiel ni scias, kie reveni? Nu, ni bezonas por stoki ke ie. Do ie dekstra ĉirkaŭ ĉi tien, ni stoki kie ni devus redoni al fojo foo revenas. Kaj jen estas la reveno adreso. Do kiel atakanto povus utiligi de tio estas la fakto, ke ĉi buffer c estas stokita, ni diri, ĝuste ĉi tie estas c. Do ni havas 12 bitokoj por c. Tiu estas c. Kaj jen estas foo la stako ringo. Do se la malica uzanto eniras pli bajtoj ol 12 aŭ ili entajpi komandon linio argumento kiu estas pli longa ol 12 signoj, tiam ni tuj dronigos ĉi bufro. Ni povas plu iri. Kaj en iu punkto, ni iru for sufiĉas ke ni komencu overwriting ĉi reveno adreso. Do iam ni anstataŭigi la reveno adreson, tio signifas ke kiam foo revenas, ni revenis al kie ajn la malica uzanto estas diri gxin al per kion ajn valoron eniris, per kio ajn karakterojn la uzanto eniris. Kaj do se la malica uzanto estas estante aparte ruza, ĝi povas havi tiun revenu al ie en la printDef funkcio aŭ ie en la malloc funkcio, nur ie ajn arbitra. Sed eĉ pli inteligenta estas kio, se li havas la uzanto reveni al ĝuste ĉi tie. Kaj tiam vi komencas ekzekutante la tiujn kiel liniojn de kodo. Do, je tiu punkto, la uzanto povas eniri kion ajn li volas en tiu regiono. Kaj li havas kompletan kontrolon super via programo. Demandojn pri tio? Do la sekva demando estas plenumi la reimplementation de foo en tia vojo ke ĝi ne plu vundebla. Do tie estas kelkaj manieroj vi povus fari tion. Ni ankoraŭ havas c nur estante de longo 12. Vi povus esti ŝanĝita ĉi kiel parto de via solvo. Ni ankaŭ aldonis ĉekon por fari certa trinkejo ne estis nula. Kvankam vi ne bezonas ke por plena kredito. Do ni estas kontrolanta unue la korda longeco de trinkejo. Se ĝi estas pli granda ol 12, do Usonanoj ne faru la kopion. Do jen unu maniero de fiksi ĝin. Alia maniero de fiksi estas anstataŭ havanta c esti nur de longo 12, havas ĝin esti de longo strlen (stango). Alia maniero de fiksi estas por fakte ĝuste reveni. Do se vi jxus liveris de ĉiuj tiu, se vi jxus forigis ĉiujn linioj de kodo, vi estus alveninta plena kredito, ĉar ĉi tiu funkcio ne reale efektivigi ion. Ĝi estas simile al la komanda linio argumento en iuj tabelo en lia loka stack frame. Kaj tiam la afero reveni. Kaj kio ajn ĝi plenumita estas for. Do reveno estis ankaŭ sufiĉan vojo de pleniĝas kredito. DAVID J. Malan: Ne tute la spirito de la demando sed akceptebla por la spec tamen. ROB Bowden: Demandoj pri ajna el kiuj? La unu afero, kiun vi almenaŭ bezonis esti kompilita kodo. Do kvankam teknike vi ne estas vundeblaj se via kodo ne kompili, ni ne akceptas tion. Neniu demandojn? OK. DAVID J. Malan: Ĉu vi volas diri tiun titolon? ROB Bowden: N-ro DAVID J. Malan: Do, en ĉi tiu, ĉi Aŭ estis bona novaĵo aŭ malbonaj novaĵoj. Ĉi tio estas laŭvorte la saman problemon kiel la unua kvizo. Kaj ĝi estas preskaŭ la sama problemo kiel pset1. Sed ĝi estis intence simplificó esti simpla piramido, kiu povas esti solvita kun iomete simpla ripeto. Kaj vere, kion ni fartas, je tie estis ne tiom la logiko, ĉar verŝajne, por ĉi tiu punkto, vi estas pli komforta ol vi estis en la semajno unu kun por masxojn aŭ kial masxojn, sed por vere turmentus aparte ke vi estas iom komforta kun la nocio ke PHP ne estas nur pri kion programado. Ĝi povas efektive esti uzata kiel lingvo skribi komandlinia programoj. Kaj efektive, jen kio ni provis por atentigi vin. Tio ĉi estas komandlinia PHP-programo. Do C-kodo tie, dum korekta en C, kaj ne korektu por PHP. Sed la kodo ja estas la sama. Se vi komparas la solvojn por Kvizo 0 kontraŭ Kvizo 1, vi trovos ke ĝi estas preskaŭ identaj, krom iuj dolaro signoj kaj pro la foresto de datumtipo. En aparta, se ni tuj iri tien, vi vidos, ke ni ankaŭ persisti, en tiu kazo, de 1 ĝis tra 7. Ni povis esti farinta 0 indekso. Sed kelkfoje, mi kredas ke estas nur psike pli facile pripensi aferojn de 1 ĝis 7. Se vi volas unu bloko, tiam du blokoj, kaj poste tri, tiam streketo streketo dot sep. Ni J esti pravalorizita al 1 kaj tiam havante supren al i. Kaj ĉio ĉi tie estas alie identaj. Sed inda noto estas kelkaj aĵoj. Ni donas al vi tiujn du liniojn, tiu unua unu, goofily nomata kiel shebang pro akra krako. Kaj tio nur precizigas la vojo, La dosierujo, en kiu programo povas esti trovis ke vi volas uzi interpreti ĉi tiun dosieron. Kaj tiam la linion post kiu, Kompreneble, ĝi signifas eniri PHP moduso. Tiam la linio je la tre malsupro signifas eliro PHP moduso. Kaj tio funkcias, ĝenerale, kun interpretitaj lingvoj. Ĝi estas speco de ĝena, se vi skribos programo en dosiero nomata foo.php. Kaj tiam via uzantoj devas nur memori, OK, kuri ĉi programon, mi devi tajpi "php spaco foo.php." Speco de ĝena, se nenio alia. Kaj ĝi ankaŭ malkaŝas ke via programo Estas skribita en PHP, kiuj ne estas ĉiuj kiuj lumigas por la uzanto. Do vi povas forigi la. Php tute memoras el prelego. Kaj vi povas efektive fari. / Foo se vi jam chmodded gxin per fari gxin plenumebla. Do chmod a + x foo estus farinta tion. Kaj se vi ankaŭ aldonos la shebang tie. Sed vere, la problemo estis akiri ĉe presi ion kiel ĉi tio. Neniu HTML, sen C-kodo certe, nur iuj PHP. Do Milo tiam revenis en problemo 25. Kaj en 25, vi estis donita la jena skeleto kodo, kiu estis sufiĉe simpla retpaĝo. Kaj la sukaj parto HTML-saĝa iris malsupren tie, kie ni havas interne de la korpo formon kiu havas unika ID de enigoj ene de kio estis du eniroj, unu kun ideo de nomo, unu kun ideo de butono. La unua estis tipo de teksto, la dua de tipo submetiĝi. Kaj tial ni donis al vi, vere, pli ingrediencoj ol vi bezonis, nur tiel you guys havis eblojn per kiu solvi ĉi tiun problemon. Vi ne strikte bezonas ĉiuj el tiuj identecoj. Sed ĝi ebligas vin solvi ĝin en malsamaj manieroj. Kaj ĉe la supro, rimarki ke la objektivo estis deĉenigi fenestro kiel tiu - Saluton, Milo! - pop-supre en la retumilo uzante la super simpla, se Ne malbela, garde funkcio. Kaj do, finfine, ĉi bolas malsupren koncepte al iel aŭskultante por prezentoj de la formo kliento-flanko , Ne la servilon-flanko, iel respondi al tiu submetiĝo de kaptante la valoron kiun la uzanto tajpas en la nomo de kampo, kaj poste montri ĝin en la korpon de garde. Do unu vojo vi povas fari ĉi tion estas kun jQuery, kiu aspektas iomete sintakse konfuzaj unue. Vi povas fari tion per pura DOM kodo - document.getelement de ID. Sed ni rigardu tiun version. Mi havas kelkajn gravajn liniojn unue. Do, ni havas tiun linion, kiu estas identa al kio vi eble vidis en, mi kredas, form2.html el klaso en semajno 9. Kaj tiu estas nur diras, ekzekuti la jena kodo kiam La dokumento estas preta. Tiu estas grava nur ĉar HTML-paĝojn oni legas supre fundo, maldekstre dekstren. Kaj do, se vi provos fari ion en kodo supren tie al iu DOM elemento, kelkaj HTML-etikedon, jen malsupren ĉi tie, vi faras ĝin tro frue, ĉar tio havas eĉ ne estis legitaj en la memoro. Do dirante ĉi document.ready linio, ni jene: jen iu kodo, foliumilo. Sed ne ekzekuti ĉi ĝis la tuta dokumento estas preta, kiu estas la DOM arbo ekzistas en memoro. Ĉi tiu estas iom pli simpla, se sintakse a iom malsamaj, kie mi estas diranta, grab la HTML-elemento kies sola ensalutilo estas enigoj. Tio estas kion la hash etikedon signifas, la unika identigilo. Kaj tiam mi petas. Submetiĝi. Tiel. Submit tie estas funkcio, alie konata kiel metodo, jen interne de la objekto en la maldekstra mano flanko, ke mi ne elstari. Do, se vi pensas pri enigoj kiel objekto en memoro - kaj ja estas. Ĝi estas vertico en arbo - . Submit rimedoj kiam tiu formo kun tiu ID estas donita, ekzekuti la jena kodo. Mi ne zorgas, kion la nomo de la funkcio estas mi ekzekuti. Do ĉi tie mi uzas, kiel antaŭe, kio estas vokis la lambda funkcio aŭ anonima funkcio. Ĝi ne estas ĉe ĉiuj intelekte Interesa alia ol ĝi ne havas nomon, kiu estas delikata se vi estas nur iam tuj nomas ĝin unufoje. Kaj ene de tie mi efektive manipuli la submetiĝo de la formularo. Mi unue deklari variablon vokis valoro. Kaj tiam kia estas la efiko de tiu reliefigis porcion tie nun? Kion tio do ĉe alta nivelo por mi? Spektantaro: ĝi ricevas la valoron kiun la uzanto ne en la HTML-sube. Ĝi alvenas ke IRU kaj tiam Trovas la valoron de tio. DAVID J. Malan: Ekzakte. Ĝi kaptas la nodo, kies sola ensalutilo estas nomo. Ĝi ricevas la valoron en gxi, kiuj Estas, supozeble, kion la uzanto tajpitaj li aŭ ŝi. Kaj poste stokas, ke en la variablon nomitan valoron. Kiel flanken, vi povus havi ankaŭ faris tion iom malsame. Plene akcepteblaj de faranta ion mensogo var valoro gets document.getElementById. Kaj tio estas kial ĝi estas iom teda por ne uzi jQuery. "Nomo". Valoro. Do tute akceptebla. Malsamaj manieroj por fari tion. jQuery nur emas esti iom pli konciza kaj definitive pli populara inter programistoj. Nun, mi faras iom da prudento kontrolu, ĉar en la problemo komunikaĵo ni eksplicite diris, se la uzanto ankoraŭ ne tajpis lia aŭ ŝia enoficigi, ne montras atentigoj. Sed vi povas kontroli, ke, por nur kontrolanta por la malplena linio por citaĵo-unquote se ekzistas nenio vere ekzistas. Sed se estas ne egala al citaĵo-unquote, Mi volas nomi atentigoj. Kaj la interesa parto estas, ke ni uzas la alpago operatoro, kiu faras kion en JavaScript? Concatenate. Do gxi estas kiel PHPs skalara operatoro. Sama ideo, iomete malsama sintakso. Kaj mi simple krei la kordo, kiu vi vidis sur la ekrankopio - Saluton, tiom kaj tiom. Kaj tiam la lasta detalo estas cxi. Kial mi revenu falsaj interne de tiu anonima funkcio? Spektantaro: Mankas valoro. Vi metis ĝin en formo. Ĝi ĵus diras, se valoro ne estas egala al malplena, tiam faru. Okazis malplenan en tiu submetiĝo. DAVID J. Malan: okej. Zorga kvankam. Estas neniu alia ĉi tie. Kaj tiu reveno falsa estas ekstere de la se kondiĉoj. Do tiu reliefigis linio, revenu mensoganto, ekzekutas negrave kia kiam La formo estas donita. Kion signifas reveni falsaj ene de ĉi eventa traktilo, kiel ĝi nomiĝas, la okazaĵo en demando esti submetiĝo? Spektantaro: Pro tio okazas nur unufoje. DAVID J. Malan: Nur okazas unufoje. Ne tute. Jes? Spektantaro: ĝi malhelpas la formo de obeante la defaŭlta konduto, kio farus la paĝon Reŝarĝi. DAVID J. Malan: Ekzakte. Do mi superŝarĝi la termino submit ĉi tie, ĉar mi diras, la formo estas esti donita. Sed kiel vi sugestas, ĝi fakte ne estas prezentis en la vera HTTP vojo. Kiam vi klakas Submetu, pro nia onSubmit traktilo, ni interkapti tiun formon submetiĝo tiel diri. Ni tiam fari nian aferon kun JavaScript kodo. Sed mi intence redoni malvera, ĉar kion mi ne volas okazos ono de sekundo posta, estas por la tuta formo mem por esti prezentita al la retejo servilo kun ŝlosilo valoro paroj ŝanĝante la retadreson al iu kiel q = katoj aŭ kion ajn ni faris, ekzemple, en la klaso. Mi ne volas ke tio okazas, ĉar ne estas servilo aŭskultado de tiu formi submetiĝo. Ĝi estas pure farita en JavaScript kodo. Kaj tio estas kial mi ecx ne havas ago atribui mian formon, ĉar mi ne intencas por ĉi tion al iam iri al la servilo. Do ĝi estas esti donita. Sed ni interkapti tiun formon submetiĝo kaj malhelpante la defaŭltan konduto, kio estas efektive iri la tutan vojon al la servilo. Spektantaro: Do ​​subtenante ŝin kliento-flanko. DAVID J. Malan: Keeping ĝi kliento-flanko. Ekzakte pravas. Sekva supren estis mia ho MySQL. ROB Bowden: okej. Do tiu unua demando estis ĝenerale malglata por homoj. Kvankam la postaj iris bone. Do vi devis elekti la korektan datumoj tipoj por ambaŭ tiuj kolumnoj. Ambaux havas iujn aferojn pri ili, ke fari la elekton malfacila. Do int ne estis valida tajpi por nombro. La kialo estante 12-ciferaj konton nombro, an int estas ne sufiĉe grandaj por stoki tutan ciferoj. Do valida elekto estus estinta granda int se vi hazarde scias ke. Alia elekto povus esti a char kampo de longo 12. Do ĉu de tiuj estus laborinta. Mez ne volis. Nun, ekvilibro, opinias reen al pset7. Do ni specife uzata dekuma al stoki la valoro de agoj aŭ - DAVID J. Malan: Cash. ROB Bowden: Cash. Ni uzas decimalan stoki la kvanto de kontanta mono, ke la uzanto aktuale havas. Do la kialo ni faros tion, kio ĉar rememoru, flosas. Tie estas glitpunktaj en precizeco. Ĝi ne povas precize stoki la kontanta mono valorojn kiel ni volas cxi tie. Do dekuma povas precize vendejo io, diru, du dekumaj lokoj. Tio estas kial ekvilibro, ni volas ĝin esti dekuma kaj ne flosi. DAVID J. Malan: Kaj ankaŭ, tro, kvankam tio povis esti ruza en aliaj kuntekstoj pensi, eble tiu Estas ŝanco por int. Mi nur sekvigi aĵojn en cendoj. Ĉar ni eksplicite montris la defaŭltan valoro de esti 100.00, ke signifas ke ĝi povus simple esti int. Kaj alia subtileco tro kun nombro estis, ke ĝi ne signifis esti lertaĵo demando. Sed memoru, ke int en MySQL, kiel en C, almenaŭ en la aparato, estas 32-bita. Kaj eĉ se ni ne atendas vin scias ekzakte kiom da ciferoj kiujn rimedoj, ja memori, ke la plej granda nombro vi povas reprezenti potenciale kun 32-bitan nombro estas malglate kio? Kio nombro ni ĉiam diras? 2 al la 32, kiu estas kiu krude? Vi ne bezonas scii precize. Sed malglate estas utila vivo. Ĝi estas proksimume 4 miliardoj. Do ni jam diris, ke en kelkaj okazoj. Mi scias, mi jam diris, ke en kelkaj okazoj. Kaj ĝi estas proksimume 4 miliardoj. Kaj tio estas bona regulo de dikfingro scii. Se vi havas 8 bitojn, 256 estas la magia nombro. Se vi havas 32 bitojn, 4 miliardo donos nek preni. Do, se vi nur noti 4 miliardoj, vi vidos, ke ĝi estas malpli ciferojn ol 12, kiu signifas ke estas klare ne sufiĉe esprimpovo kapti 12-ciferaj konton nombro. ROB Bowden: okej. Do la aliaj aĵoj iris bone. Do supozu ke la banko postulas $ 20 ĉiumonate bontenado kotizo je ĉiuj kontoj. Kun kia SQL query povis la bankon dedukti $ 20 el ĉiu grafo, eĉ se ĝi rezultas en iuj negativaj pesiloj? Do esence, estas kvar ĉefaj tipoj de konsultoj - enigi, elektu, ĝisdatigo kaj forviŝi. Do kion ni pensas ke ni estas tuj uzos ĉi tie? Ĝisdatigi. Do ni rigardu. Do jen ni ĝisdatigi. Kio tablo ni ĝisdatigi kontoj? Do ĝisdatigi kontojn. Kaj tiam la sintakso diras, kion en kontoj estas ni ĝisdatigo? Nu, ni opcio pesilo egalas al la aktuala valoro de balanciĝo minus 20. Do tiu ĝisdatigos ĉiuj vicoj de kontoj, subtrahanta $ 20 de la ekvilibro. DAVID J. Malan: Al komuna eraro ĉi tie, eĉ kvankam ni iam pardonis ŝin, iris al reale havas PHP kodo tien vokas la informpeto funkcio aŭ metante citiloj ĉirkaŭ ĉio tio ne bezonas esti tie. ROB Bowden: Memoru, ke MySQL estas apartan lingvon de PHP. Ni hazarde skribos MySQL en PHP. Kaj PHP estas poste sendas gxin super la MySQL-servilo. Sed vi ne bezonas PHP-celo komuniki kun MySQL servilon. DAVID J. Malan: Ekzakte. Do neniu variablojn kun dolaro signoj devus esti en tiu kunteksto. Ĝi povas simple fari ĉiujn da la matematiko ene de la datumbazo mem. ROB Bowden: okej. Do la proksimaj unu. Ĉu tiu estas la venonta unu? Jes. Do per kio SQL query povis la bankon retrovi la konto numeroj de lia riĉaj klientoj, tiuj kun Pesilo granda ol 1.000? Do kiu el la kvar ĉefaj specoj ni tuj volas ĉi tie? Selektu. Do ni volas elekti. Kion ni volas elekti? Kio kolumnon cxu ni volas elekti? Ni estos specife volas elekti nombron. Sed se vi diris, stelo, ni ankaŭ akceptis ke. Do elektu numeron de kio tablo? Kontoj. Kaj tiam la kondiĉo ni volas? Kie ekvilibro granda ol 1,000. Ni akceptis ankaŭ granda ol aŭ egala. Lasta. Kun kia SQL query povis la bankon apude, tio estas:, forigi ĉiun konto ke havas ekvilibron de $ 0? Do kiu el la kvar estas ni tuj volas uzi? Delete. Do la sintakson por tiu? Forigi el kio tablo? Kontoj. Kaj tiam la kondiĉo, sur kiu ni volas forigi - kie pesilo egalas nulo. Do delete ĉiuj vicoj de kontoj kie la ekvilibro estas nulo. Demandojn pri iu el tiuj? Volas enviciĝi? DAVID J. Malan: Queue gvidilo. Do, en ĉi tiu, ni donis al vi iom familiara strukturo kiu ni esploris bito en la klaso apud de structs, kiu estis datumoj strukturo rilataj, en la Spirito. La diferenco kvankam kun vosto estas ke ni devis iel memoras kiu Estis en la fronto de la atendovico, en grandaj parto por ke ni povus fari pli efika uzo de la memoro, almenaŭ se ni uzis tabelo. Ĉar revokon, se ni havas tabelo, se, Ekzemple, ĉi tio estas la antaŭa parto de La vosto, se mi eniras en la atendovico ĉi tie, kaj tiam iu metas en linio malantaŭ mi, malantaŭ mi, malantaŭ mi, kaj unu persono paŝas el linio, vi povis, kiel ni vidis kelkajn de niaj homaj volontuloj en la klaso, havas ĉiuj ŝanĝi ĉi vojon. Sed ĝenerale, esti ĉiuj faras io estas ne la plej bona uzo de tempo en programo, ĉar ĝi signifas via algoritmo ruliĝas en kio asimptota rula tempo? Ĝi estas lineara. Kaj mi sentas ke estas iom stulta. Se la sekvanta persono en linio estas la sekva persono, kiu supozas, por iri en la vendejo, ne ĉiuj havas movi kune. Nur lasu tiun personon esti desxiritan kiam la tempo venos, ekzemple. Do ni povas savi iom da tempo tie. Kaj fari tiel, ke kvankam, tio signifas ke la kapo de la vosto aŭ la antaŭ la vosto tuj iom post iom movi pli kaj pli profunden en la tabelo kaj eventuale multobligita reale wrap ĉirkaŭ se ni uzas la tabelo por stoki la popolo en ĉi tiu vico. Do vi povas preskaŭ pensas pri la tabelo kiel cirkla datumoj strukturo en tiu senco. Do vi iel devas sekvigi la grandeco de ĝi aŭ vere la fino de tio kaj do kie la komenco de ĝi estas. Do ni proponas ke vi rakontu unu tia atendovico, voko ĝi q, nur unu letero. Tiam ni proponas ke la fronto estos pravalorizita al nulo kaj ke la grandeco esti pravalorizita al nulo. Do nun, estas nenio ene de tiu vico. Kaj ni petas vin kompletigi la efektivigo de enqueue malsupre en tiel ke la funkcio aldonas n al la finon de q kaj tiam revenas vera. Sed se q estas plena aŭ negativa, la funkcio devus anstataŭe redoni malvera. Kaj ni donis al vi paro de supozoj. Sed ili ne estas vere funkcie adekvata, nur ke bool ekzistas, ĉar, teknike, bool ne ekzistas en C, se vi ne inkluzivas certaj kaplinio dosiero. Por ke oni simple certigi tie estis neniu estas ĉi lertaĵo demando speco de afero. Do enqueue, ni proponis en la specimeno solvoj por apliki jene. Unu, ni unue kontrolu la facileco, la malalta kovrotukon fruktoj. Se la vosto estas plena aŭ la nombro ke vi provas enmeti estas malpli ol nulo, kion ni diris en la specifo de la problemo devus ne estos permesita, ĉar ni nur volas nenegativaj valoroj, tiam vi devus nur redoni malvera tuj. Do iuj relative facila eraro checking. Se tamen vi volas aldoni, ke la efektiva nombro, vi devis fari iom de pensante tie. Kaj ĉi tiu estas kie ĝi estas iom ĝena mense, ĉar vi devas elkompreni kiel manipuli wraparound. Sed la ĝermo de la ideo tie tio de intereson por ni estas ke wraparound ofte implicas modula aritmetiko kaj la mod operatoro, la procento flanko kie vi povas iri de unu pli granda valoro reen al nulo kaj tiam unu kaj du kaj tri kaj poste revenos ĉirkaŭ nulo, unu kaj du kaj tri, ks denove kaj denove. Do la vojon Ni proponas fari tion estas ke ni volas indekson en la tabelo nomis ciferojn kie nia entjeroj mensogas. Sed por iri tien, ni unue volas fari sendepende de la grandeco de la vosto estas nur tiam aldonu al tio, kion la fronto de la listo estas. Kaj la efekto de tiu estas meti nin en la dekstra pozicio en la atendovico, kaj Ne supozu, ke la unua persono en linio estas je la komenco, kion li aŭ ŝi tute povus esti se ni estis ankaŭ sxangxigxantaj ĉiuj. Sed ni nur kreante verkon por ni se ni prenas ke apartan vojon. Do ni povas konservi gxin relative simpla. Ni devas memori, ke ni simple aldonis int al la vico. Kaj tiam ni ĵus revenas vera. Dume, en dequeue, ni demandis vi faru la sekvan. Apliki ĝin en tia maniero, ke ĝi dequeues, kiu estas Forigas kaj revenoj, la int ĉe la fronto de vosto. Por forigi la int, sufichas forgesi ĝin. Vi ne bezonas nuligi lian bito. Do estas ankoraŭ reale ekzistas. Ĝuste kiel datumoj en malmola disko, ni simple ignoras la fakton ke ĝi estas nun. Kaj se q estas malplena, oni devus anstataŭ reveni negativa 1. Do tiu sentas arbitra. Kial revenu negativa 1 anstataŭ falsa? Jes. Spektantaro: Q estas stokante pozitivajn valorojn. Ĉar vi stoki nur pozitivajn valorojn en la q, negativa estas eraro. DAVID J. Malan: OK, veraj. Do ĉar ni nur stokante pozitiva valorojn aŭ nulo, tiam gxi estas bone al revenu negativan valoron kiel sentinelo valoro, speciala simbolo. Sed vi reskribi historion tie, ĉar la kialo ni estas nur reveninte nenegativaj valoroj estas ĉar ni volas havi gardostaranto valoro. Do, pli specife, kial ne simple redoni malvera en kazoj de eraroj? Jes. Spektantaro: Vi jam malsukcesis reveni entjero. DAVID J. Malan: Ekzakte. Kaj ĉi tiu estas kie C gets bela constriñendo. Se vi diras ke vi iras reveni an int, vi havas reveni an int. Vi ne povas imagi kaj komenci reveni a bool aŭ kaleŝego aŭ ŝnuro aŭ io kiel tio. Nun, dume, JavaScript kaj PHP kaj iujn aliajn lingvojn povas, fakte, ĉu vi reveninte malsamajn specoj de valoroj. Kaj kiu povas reale esti utila, kie vi povus redoni pozitiva ints, nuloj, negativa ints aux malvera aŭ nula eĉ por signifi eraro. Sed ni ne havas tiun versatilidad en C. Do kun dequeue, kion ni proponas fari estas - ROB Bowden: Vi povas redoni malvera. Estas nur ke falsa estas hash difini falsa al nulo. Do, se vi revenos falsa, vi reveninte nulo. Kaj nulo estas valida afero en nia atendovico, dum negativa 1 ne estas se falsa okazis esti negativa 1. Sed vi ne devus eĉ bezonas scii tion. DAVID J. Malan: Tio estas kial mi ne diris ĝin. ROB Bowden: Sed tio ne estis vera ke vi ne povas reveni falsaj. DAVID J. Malan: Certe. Do dequeue, rimarki ni akceptas vanigas kiel ĝia argumento. Kaj tio estas ĉar ni ne estas pasante ion in Ni nur volas forigi la elementon ĉe la fronto de la vosto. Do kiom eble ni iros en fari ĉi tion? Nu, unue, ni faros tiun rapida prudento ĉekon. Se la atendovico grandeco estas 0, ekzistas neniu laboro farenda. Reiru negativa 1. Farita. Do jen kelkaj linioj de mia programo. Do nur kvar linioj restas. Do ĉi tie mi decidas dekremento la grandeco. Kaj decrementing la grandeco efike signifas ke mi forgesas io estas en tie. Sed mi havas ankaŭ ĝisdatigi kie la fronto de la nombroj estas. Do fari tion, mi bezonas fari du aĵojn. Mi unue bezonas memori kion la nombro estas je la fronto de la vosto, ĉar mi bezonas reveni tiun aĵon. Do mi ne volas hazarde forgesas pri tio kaj poste anstataŭigi ĝin. Mi simple tuj memoras en int. Kaj nun mi volas ĝisdatigi q.front esti q.front +1. Do, se tiu estis la unua persono en linio, nun, mi volas fari plus 1 por noti al la sekva persono en linion. Sed mi devas manipuli ke wraparound. Kaj se kapablo estas tutmonda konstanto, ke tuj permesos ke mi certiĝu kiel mi notas por la lasta persono en linio, la module operacio kondukos min reen al nulo je la fronto de la vosto. Kaj kiu manipulas la wraparound tie. Kaj poste mi procedi reveni n. Nun, strikte parolante, tamen mi ne devas deklari n. Mi ne devis ekpreni ĝin kaj konservas ĝin provizore, ĉar la valoro estas ankoraŭ ekzistas. Do mi povis apenaŭ fari la dekstra aritmetiko por reveni al la antaŭa estro de la vico. Sed mi nur sentis, ke tiu estis pli klaraj por fakte havigu la int, metu ĝin en n, kaj tiam revenu ke por klareco, kalkaj sed ne strikte necesaj. Psst. Ili estas ĉiuj pronunciables en mia kapo. ROB Bowden: Do unua demando estas la duuma arbo problemon. Do unua demando estas, ni estas donitaj tiuj numeroj. Kaj ni volas iel enmeti ilin en tiujn nodojn tia, ke ĝi estas valida duuma serĉarbo. Do la sola afero por memori pri duuma serĉo arboj estas ke ĝi ne estas nur ke la afero maldekstren Estas malpli kaj la afero dekstre estas granda. Ĝi bezonas esti ke la tuta arbo la maldekstro estas malpli, kaj la tuta arbo al la dekstra estas pli granda. Do se mi metis 34 ĉi tie ĉe la supro, kaj poste Mi metis la 20 ĉi tie, do tio estas valida tiel nun, ĉar 34 ĝis ĉi tie. 20 iras maldekstren. Do tio estas malpli. Sed mi ne povas do meti la 59 ĉi tie, ĉar eĉ se 59 estas sur la dekstra de 20, ĝi estas ankoraŭ sur la maldekstra de 34. Do per tiu limigo en menso, la facila maniero de probable solvi ĉi problemo estas nur speco de tiuj nombroj - tial 20, 34, 36, 52, 59, 106. Kaj poste enmeti tiujn de maldekstre al dekstre. Do 20 iras tien. 34 iras tien. 36 iras tien. 52, 59, 106. Kaj vi ankaux povus esti figured evi iuj ŝtopanta en kaj realigante, Ho, atendu, mi ne havas sufiĉan nombroj al ENIGU ion pli ĉi tie. Do mi bezonas reshift kion mia itinero noto tuj estos. Sed rimarkas ke en la fino tri, se Vi legas de maldekstre al dekstre, estas en kreskanta ordo. Do nun, ni deziras deklari, kion la struct tuj estu por la nodojn en ĉi tiu arbo. Do, kion ni bezonas en duuma arbo? Do ni havas valoron de tipo int, do kelkaj int valoro. Mi ne scias, kion ni nomas ĝin en la solvo - int n. Ni bezonos montrilon al la maldekstra infano kaj montrilon al la dekstra infano. Do ĝi estas tuj aspekti kiel ĉi tio. Kaj ĝi malebligos reale rigardi antaux kiam la duoble-ligita listo stuff, do avizo - Mi tuj devas rulumi ĉiuj vojo reen malsupren al problemo 11. Do rimarki ĝi aspektas identa al tiu, krom ni nur okazi nomi tiujn malsamaj nomoj. Ni ankoraŭ devas entjero valoro kaj du montriloj. Estas nur ke anstataŭ trakti la pointers kiel indikante la sekva afero kaj la antaŭa, ni trakti la montriloj de atentigi al maldekstra infano kaj dekstra infano. OK. Do jen nia struct nodo. Kaj nun, la sola funkcio ni bezonas apliki cxar tio través, kiuj Ni volas iri trans la arbon, impreso el la valoroj de la arbo en ordo. Do rigardante tien, ni deziras presi el 20, 34, 36, 52, 59, kaj 106. Kiel ni plenumi tion? Do ĝi estas bela simila. Se vi vidis, en la pasinteco ekzameno de la problemo ke vi volis printi la tutan arbon per komoj en inter ĉio, ĝi estis fakte eĉ pli facile ol tio. Do jen la solvo. Tio estis signife pli facila se vi faris ĝin rekursie. Mi ne scias se iu provis fari ĝin ripete. Sed unue, ni havos nian bazon kazo. Kio, se la radiko estas nula? Tiam ni simple tuj revenos. Ni ne volas presi ion. Alie, ni iras tra rekursie malsupren. Presu la tuta maldekstra subarbo. Do presi ĉiun malpli ol mia nuna valoro. Kaj poste mi iros por printi mem. Kaj poste mi iros recurse malsupren mia tutan dekstran subarbo, do ĉiu pli granda ol mia valoro. Kaj tion tuj presi el ĉio en ordo. Demandojn pri kiel tiu ĉi reale plenumas tion? Spektantaro: Mi havas demandon sur la [inaudibles]. ROB Bowden: Do unu maniero alproksimigi ajna rekursia problemo estas simple opinias pri ĝi plaĉas al vi devos pensi pri la tuta angulo kazoj. Do konsideru, ke ni volas presi ĉi tiun tutan arbon. Do ĉiuj ni tuj enfokusigi Estas ĉi tiu aparta nodo - 36. La rekursiaj vokoj, ni ŝajnigi tiuj ĝuste funkcias. Do jen, tiu rekursia alvoko al través, ni sen eĉ pensi pri tio, nur petolanta maldekstre tri, imagu ke jam presas 20 kaj 34 por ni. Kaj poste kiam ni fine rekursie voki través sur la Bone, ke estos ĝuste presi 52, 59, kaj 106 por ni. Do pro tio ke tiu povas presi 20, 34, kaj la aliaj povas presi 52, 59, 108, ĉiuj ni devas esti kapabla fari estas presita samaj en la mezo de tiu. Do presi ĉiun antaux ni. Presi samaj, do la nuna nodo print 36, regula printf, kaj poste presi ĉiun post ni. DAVID J. Malan: Tie estas kie rekursio gets vere bela. Ĝi estas tio miriga salto de fido kie vi faras la plej eta iom da laboro. Kaj poste vi lasu iun alie fari la reston. Kaj ke iu alia estas, ironie, vi. Do por seriozaj Brownie punktoj, se vi rulumu supren sur la demandoj - ROB Bowden: Sur la demandoj? DAVID J. Malan: Kaj suben iom la numerojn, ĉu iu scias kie ĉi tiuj ciferoj venas el? ROB Bowden: Mi havas laŭvorte neniun ideon. DAVID J. Malan: Ili aperi tra la kvizo. Spektantaro: ili estas el la sama nombroj? DAVID J. Malan: Tiuj nombroj. Iom Easter egg. Do por tiuj el vi rigardi en linio ĉe hejmen, se vi povas diri al ni per retpoŝto al heads@CS50.net kion la signifon de tiuj ripetiĝantajn ses nombroj estas tra Kvizo 1, ni duŝi vin kun miriga atenton ĉe la fino prelego kaj streso pilko. Nice, subtilajn. ROB Bowden: Ajna lastaj demandoj pri io ajn en la kvizo?