[Powered by Google Translate] [3 skirsnis - patogiau]
[Rob Bowden - Harvardo universiteto]
>> [Tai CS50. - CS50.TV]
>> Taigi į pirmąjį klausimą būtų keistai suformuluotas.
GDB leidžia jums "debug" programa, bet, tiksliau, ką jis jums tai padaryti?
Aš atsakyti į šį vieną, ir aš nežinau, ką tiksliai tikimasi,
todėl aš atspėti, tai kažkas palei jo linijas leidžia jums žingsnis po žingsnio
vaikščioti per programa, bendrauti su juo, pakeisti kintamieji, padaryti visus šiuos dalykus -
iš esmės visiškai kontroliuoti programos vykdymą
ir apžiūrėti bet kuriuo programos vykdymo.
Taigi šios funkcijos leidžia jums derinti dalykų.
Gerai.
Kodėl dvejetainis paieškos reikalauja, kad masyvas būti rūšiuojami?
Kas nori atsakyti, kad?
[Studentas] Kadangi jis neveikia, jei ji nėra rūšiuojamos. >> Taip. [Juokas]
Jei jis nėra rūšiuojamos, tada tai neįmanoma padalinti per pusę
ir žinoti, kad viskas į kairę yra mažesnis ir viskas į dešinę
yra didesnis nei vidutinis dydis.
Todėl ji turi būti rūšiuojami.
Gerai.
Kodėl burbulas rūšiuoti O n kvadrato?
Ar kas nors norite suteikti labai greitai aukšto lygio apžvalgą, ką burbulas rūšiuoti?
[Studentas] Jūs iš esmės pereiti per kiekvieno elemento ir jums patikrinti keletą pirmųjų elementai.
Jei jie iš ten, kur jums apsikeitimo juos, tada jums patikrinti artimiausius elementus ir pan.
Kai pasieksite pabaigos, tuomet jūs žinote, kad didžiausias elementas dedamas pabaigoje,
todėl jūs ignoruoti, kad tada jūs nuolat išgyvena,
ir kiekvieną kartą, jūs turite patikrinti vieną mažiau elementą, kol jūs padaryti jokių pakeitimų. >> Taip.
Tai vadinama burbulas rūšiuoti, nes jei jums apversti masyvas ant šono, todėl iki ir žemyn, vertikali,
Tada didelės vertės bus kriaukle prie dugno ir mažos vertės burbulas iki viršaus.
Tai, kaip jis gavo savo pavadinimą.
Ir taip, jūs tiesiog eiti per.
Jūs nuolat išgyvena masyvą, keičiant didesnę vertę
gauti didžiausios vertės iki dugno.
>> Kodėl ji yra O n kvadrato?
Pirma, ar kas nors nori pasakyti, kodėl ji O n kvadrato?
[Studentas] Dėl kiekvieno reiso metu jis eina n kartų.
Galite būti tikri, kad jūs atlikote didžiausias elementas visą kelią žemyn,
tada jūs turite pakartoti, kad kuo daugiau elementų. >> Taip.
Todėl atminkite, Big O reiškia ir ką reiškia didelis Omega.
Didelis O kaip viršutinė riba, kaip lėtai jis iš tikrųjų gali paleisti.
Taigi, sakydamas, kad tai Õ n kvadrato, tai nėra O n arba kitur, kad būtų galima paleisti
eilutėmis, tačiau ji yra O n sudedamos kubeliais supjaustytos
nes ji yra apribota O n sudedamos kubeliais supjaustytos.
, Jei ji riboja O n kvadrato, tada jis riboja taip pat n sudedamos kubeliais supjaustytos.
Taigi, tai yra n kvadrato ir absoliučios blogiausiu atveju jis negali padaryti geriau nei n kvadrato,
kuris yra, kodėl ji O n kvadrato.
Taigi, norint pamatyti šiek tiek matematikos, kaip ji išeina n kvadrato,
jei mes turime penkis dalykus mūsų sąraše, pirmą kartą, kiek apsikeitimo sandoriai galėtume potencialiai reikia padaryti
siekiant gauti? Tegul iš tikrųjų tik
Kiek apsikeitimo sandoriai mes turėsime padaryti Pirmą kartą taikant burbulas rūšiuoti per masyvo?
[Studentas] n - 1. >> Taip.
>> Jei yra 5 elementai, mes ketiname reikia padaryti n - 1.
Tada antrasis kiek apsikeitimo sandoriai mes turėsime padaryti?
[Studentas] n - 2. >> Taip.
O trečiajame bus n - 3, o dėl patogumo, aš parašyti per pastaruosius dvejus
nes tada mes ketiname reikia padaryti 2 apsikeitimo sandorius ir 1 SWAP.
Manau, naujausia gali arba negali iš tikrųjų reikia, kad taip atsitiktų.
Tai yra swap? Nežinau.
Taigi tai yra bendrą sumą, apsikeitimo sandorių ar bent palyginimai, jūs turite padaryti.
Net jei jūs neturite swap, jums vis tiek reikia palyginti vertybes.
Taigi yra n - 1 palyginimai pirmąjį masyvo paleisti per.
Jei jūs pertvarkyti šiuos dalykus, galime iš tikrųjų padaryti jį šešių dalykų, todėl viskas sukrauti gražiai,
ir tada aš padaryti 3, 2, 1.
Taigi, tiesiog pertvarkyti šių sumų, mes norime pamatyti, kiek palyginimai mes darome
visą algoritmą.
Taigi, jei mes suteikiame žemai čia, šie vaikinai
tada mes dar tik susumuojant Tačiau daugelis palyginti, tai nebuvo.
Bet jei mes Apibendrinant šiuos ir mes Apibendrinant tai ir mes Apibendrinant tai,
tai vis dar ta pati problema. Mes tiesiog apibendrinti šias konkrečias grupes.
>> Taigi dabar mes sumuojant 3 n. Tai ne tik 3 n.
Jis visada bus n / 2 n.
Taigi čia mes atsitikti, kad 6.
Jei mes turėjome 10 dalykų, tada mes galime padaryti šį grupavimą 5 skirtingų dalykų porų
ir galų gale su n + n + n + n + n.
Todėl jūs visada ketinate gauti n / 2 n ir todėl tai mes Užrašoma jį n kvadrato / 2.
Ir todėl, nors tai pusė veiksnys, kuris atsitinka ateiti
, nes tai, kad per kiekvieną per masyvo iteracijos mes palyginti 1 mažiau
todėl tai, kaip mes gauname daugiau nei 2, bet ji vis dar n kvadrato.
Mums nerūpi, apie pusę pastoviu koeficientu.
Taigi, Big O daug dalykų, kaip tai remiasi tik rūšies daro šį matematikos rūšiuoti,
daro aritmetines sumas ir geometrinę progresiją stuff,
tačiau dauguma jų į šį kursą yra gana paprasta.
Gerai.
Kodėl įterpimas n Omega rūšiuoti? Ką Omega reiškia?
[Du studentai, kalbantys vienu metu - nesuprantami] >> Yeah.
Omega jūs galite galvoti kaip apatinė riba.
>> Taigi nesvarbu, kaip efektyviai jūsų įterpimo rūšiavimo algoritmas,
neatsižvelgiant į tai, kad praėjo sąraše, ji visada turi palyginti bent n dalykus
arba jis turi pakartoti per n dalykų.
Kodėl taip yra?
[Studentas] Dėl, jei sąrašas jau surūšiuoti, tada per pirmas iteracijos
jūs galite tik garantuoti, kad pirmasis elementas yra mažiau,
ir antrajame iteracijos galite garantuoti tik pirmieji du yra
, nes jūs nežinote, kad likusi dalis yra rūšiuojamos sąrašo. >> Taip.
Jei pereisite visiškai rūšiuotų sąrašą, bent jau, jūs turite pereiti per visus elementus
matyti, kad nieko nereikia būti perkeltas aplink.
Taigi pravažiavimą sąrašą ir sako: oh, tai jau surūšiuoti,
tai neįmanoma, kad jūs žinote, tai rūšiuojamos, kol jums patikrinti kiekvieną elementą
pamatyti, kad jie rūšiuotų tvarka.
Taigi apačios įterpimo Rūšiuoti Omega n.
Kas blogiausiu atveju veikia Merge sort laikas,
Big O blogiausiu atveju dar kartą?
Taigi, blogiausiu atveju, kaip sujungti rūšiuoti paleisti?
[Studentas] n log n. >> Taip.
Sparčiausiai bendri rūšiavimo algoritmai n log n. Jūs negalite padaryti geriau.
>> Yra specialūs atvejai, ir jei mes turime laiko šiandien - bet mes tikriausiai won't -
mes galime pamatyti vieną, kad veikia geriau nei n log n.
Tačiau bendruoju atveju, jūs negalite padaryti geriau nei n log n.
Ir sujungti rūšiuoti atsitinka, kad jūs turėtumėte žinoti, šį kursą, kuris yra n log n.
Ir taip mes iš tikrųjų būti įgyvendinti, kad šiandien.
Ir galiausiai, ne daugiau kaip tris sakinius, kaip atrankos rūšiavimo darbą?
Ar kas nors norite atsiliepti, ir aš suskaičiuoti savo sakinius
nes jei jūs einate per 3 -
Ar kas nors prisimena atrankos rūšiuoti?
Pasirinkimas rūšiuoti yra paprastai gana lengva atsiminti tik iš pavadinimo.
Jūs tiesiog pakartoti per masyvo, todėl surasti kokia didžiausia vertė yra arba mažiausia -
kokia tvarka, kokia jūs rūšiavimas.
Taigi tarkim mes rūšiavimo nuo mažiausio iki didžiausių.
Jūs pakartoti per masyvą, nepriklausomai minimalus elementas yra
pasirinkite jį, ir tada tiesiog apsikeitimo jį, kokia yra pirmoje vietoje.
Ir tada antrojo jus per masyvo, vėl ieškoti minimalaus elemento,
pasirinkite jį, tada apsikeitimo jį su tuo, kas yra antroje vietoje.
Taigi mes tiesiog skinti ir pasirinkti mažiausių verčių
ir įterpti juos į masyvo priekyje, kol jis yra rūšiuojama.
Turite klausimų apie tai?
>> Tai neišvengiamai formų, turite užpildyti, kai jūs pateikdami pset.
Tie, kurie iš esmės yra atsakymai į šiuos.
Gerai, kad dabar kodavimo problemas.
Aš jau išsiuntė per email - Ar kas nors negalite gauti, kad laišką? Gerai.
Aš jau išsiuntė per e-mail erdvę, kad mes ketiname naudoti,
ir jei jūs paspausite ant mano vardo, todėl manau, kad aš ruošiuosi būti apačioje
dėl atgalinio r - bet jei paspausite ant mano vardo jūs pamatysite 2 pakeitimus.
Bus aš jau nukopijuoti ir įklijuoti kodą į erdvių Peržiūra 1
paieškos dalykas, kad jūs ketinate turi įgyvendinti.
Ir 2 redakcija bus rūšiuoti dalykas, kad mes įgyvendinti po to.
Taigi, jūs galite spustelėti ant mano redakcijos 1 ir dirbti iš ten.
Ir dabar mes norime įgyvendinti Dvejetainė paieška.
>> Ar kas nors nori tiesiog duoti pseudocode aukšto lygio paaiškinimą
ką mes ketiname turite padaryti paieškai? Taip.
[Studentas] Jūs tiesiog pasiimti iš masyvo viduryje ir pamatyti, jei tai, ką jūs ieškote
yra mažesnis negu arba daugiau nei tai.
Ir jei tai mažiau, jūs einate į pusę mažiau,
ir jei tai daugiau, jūs einate pusę, kad daugiau ir jums kartoti, kad tol, kol jūs tiesiog gaunate vieną dalyką.
[Bowden] Taip.
Atkreipkite dėmesį, kad mūsų numeriai masyvas jau surūšiuoti,
ir todėl tai reiškia, kad mes galime pasinaudoti, kad ir mes galime pirmiausia patikrinkite,
gerai, aš žiūriu skaičius 50.
Taigi, aš galiu eiti į vidurį.
Viduryje yra sunku apibrėžti, kai jis net keletas dalykų,
bet tegul tiesiog pasakyti, mes visada trumpinti į vidurį.
Taigi čia mes turime 8 dalykų, kad viduryje būtų 16.
Aš ieškau 50, kad 50 yra daugiau nei 16.
Taigi, dabar aš iš esmės gali gydyti savo masyvas kaip šių elementų.
Galiu išmesti viską, nuo 16 per.
Dabar mano masyvas yra tik šie 4 elementai, o aš kartoti.
Taip, tada aš noriu rasti viduryje vėl, kuris bus 42.
42 yra mažiau nei 50, kad galėčiau išmesti šiuos du elementus.
Čia yra mano likęs masyvas.
Aš ruošiuosi dar kartą rasti vidurį.
Manau, 50 blogas pavyzdys, nes aš visada buvo mesti toli dalykus į kairę,
bet pagal tą pačią priemonę, jei aš ieškote ko nors,
ir tai yra mažiau nei elemento Aš šiuo metu ieško
tada aš ruošiuosi išmesti viską, į dešinę.
Taigi, dabar mes turime tai įgyvendinti.
Atkreipkite dėmesį, kad mes turime praeiti dydžio.
Mes taip pat galime nereikia sunkiai kodo dydžio.
Taigi, jei mes atsikratyti, kad # define -
Gerai.
Kaip aš galiu gražiai išsiaiškinti, ką skaičių masyve dydis šiuo metu yra?
>> Kiek elementai skaičių masyve?
[Studentas] Skaičiai, laikikliai, ilgis?
[Bowden] Tai nėra egzistuoti C.
Reikia. Ilgio.
Matricos neturi savybių, todėl nėra ilgis nuosavybė masyvai
kad bus tiesiog suteikti jums, kaip ilgai tai atsitinka būti.
[Studentas] Žr kiek atminties ji ir padalinti kiek - >> Taip.
Taigi, kaip mes galime pamatyti, kiek atminties ji? >> [Studentas] sizeof. >> Taip, sizeof.
Sizeof yra operatorius, kad ketina grįžti skaičių masyve dydį.
Ir tai bus tačiau daugelis sveikieji skaičiai yra sveikasis skaičius dydis
nes tai, kiek atminties ji iš tikrųjų pradėjimo.
Taigi, jei aš noriu, kad daug dalykų masyvo,
tada aš ruošiuosi norite padalinti sveikojo skaičiaus dydį.
Gerai. Taip, kad leidžia man pereiti dydžio.
Kodėl aš turiu išlaikyti dydžio?
Kodėl aš negaliu tiesiog padaryti čia int dydis = sizeof (kaugė) / sizeof (int)?
Kodėl tai neveikia?
[Studentas] Tai ne pasaulio kintamasis.
[Bowden] šieno kupetoje egzistuoja ir mes artimųjų skaičiais kaip šieno kupetoje,
ir tai, kas turi ateiti foreshadowing natūra. Taip.
[Studentas] šieno kupetoje yra tik nuoroda į jį, todėl ji grįš, kaip didelis, kad nuoroda.
Taip.
Auditorijose ir aš abejoju, kad jūs mačiau krūvą tikrai dar, tiesa?
Mes ką tik kalbėjo apie tai.
Taigi, kamino, kur visiems savo kintamiesiems bus saugomi.
>> Bet atminties, kuri skirta vietos kintamieji vyksta ant klojinio,
ir kiekviena funkcija gauna savo vietos kamino, savo kamino rėmas yra, kaip ji vadinasi.
Taigi, pagrindinis turi savo kamino rėmas, o viduje ji ketina egzistuoja šį skaičių masyvas,
ir tai bus dydis sizeof (numeriai).
Jis ketina turėti skaičių, suskirstyti pagal dydį elementų dydį,
bet kad gyvena, visos pagrindinis kamino rėmo.
Kai mes vadiname paieška, Paieškos gauna savo kamino rėmo,
savo vietos laikyti visus savo vietos kintamieji.
Tačiau šie argumentai - taip kaugė nėra visos šio masyvo kopija.
Mes neturime perduoti visą masyvą, kaip į paieškos kopija.
Jis tiesiog eina nuorodą į šį masyvo.
Taigi paiešką galite prieiti prie šių skaičių per šią nuorodą.
Jis vis dar gauti prieigą prie dalykų, kurie gyvena viduje pagrindinis kamino rėmo,
bet iš esmės, kai mes gauname rodyklės, kurios turėtų būti greitai,
tai yra tai, ką rodykles.
Pointeriai tik nuorodos dalykų, ir jūs galite naudoti rodykles ir atidarykite dalykų
kurie yra kitų daiktų kamino kadrų.
Taigi, nors numeriai yra vietos į pagrindinį, mes vis dar gali jį pasiekti per šį rodyklė.
Bet kadangi tai tiesiog rodyklė ir tai tik nuoroda,
sizeof (kaugė) sugrįžtų pačios nuoroda dydį.
Jis negrąžina dalykas, tai nukreipta į dydį.
Jis negrąžina tikrąjį dydį skaičių.
Ir taip, tai nesiruošia dirbti, kaip mes norime, kad ji.
>> Turite klausimų apie tai?
Rodykles atvyko į gerokai daugiau Gory išsamiai savaitėmis į priekį.
Ir štai kodėl daug dalykų, kad jūs matote, dauguma paieškos daiktų ar rūšiuoti dalykų,
jie beveik visi ketinate reikia imtis tikrąjį dydį masyvo,
C, nes mes neturime jokios idėjos, ką masyvo dydis yra.
Jums reikia rankiniu būdu perduoti jį.
Ir jūs galite ne rankiniu būdu perduoti visą masyvą, nes jūs tik artimųjų nuoroda
ir jis negali gauti dydį nuo normos.
Gerai.
Taigi, dabar mes norime įgyvendinti tai, ką buvo paaiškinta anksčiau.
Jūs galite dirbti tai už minutę,
ir jūs neturite nerimauti apie tai, kaip viskas puikiai 100% darbo.
Tiesiog parašyti, kaip jūs manote, kad ji turėtų dirbti pusę pseudocode.
Gerai.
Nereikia būti visiškai tai padarysite dar.
Bet ar kas nors jaustis patogiai su tuo, ką jie iki šiol,
kaip kažkas, kad galime dirbti kartu?
Ar kas nors nori savanoriauti? Ar aš atsitiktinai pasirinkti.
Ji neturi būti jokių priemonių, bet ką mes galime pakeisti į darbo būseną.
[Studentas] Žinoma. >> Gerai.
Taigi jūs galite išsaugoti peržiūrėti paspaudę ant mažai Išsaugoti piktogramą.
Esate Ramya, tiesa? >> [Studentas] Yeah. >> [Bowden] Gerai.
Taigi, dabar galiu peržiūrėti savo peržiūrą ir kiekvienas gali atsigriebti peržiūrėti.
O čia - Gerai.
Taigi Ramya nuėjo su grįžtamojo sprendimui, kuris tikrai tinkamas sprendimas.
Yra du būdai, kuriuos galite padaryti su šia problema.
Jūs galite padaryti jį keletą kartų arba rekursyviai.
Dauguma jūsų problemų, kad galima padaryti rekursyviai taip pat gali būti atliekamas keletą kartų.
Taigi čia mes padarėme rekursyviai.
>> Ar kas nors nori apibrėžti, ką tai reiškia, kad funkcija rekursinis?
[Studentas] Jei turite funkciją vadinti save
ir tada skambinti, kol jis išeina su tiesa ir teisinga. >> Taip.
Tiesiog rekursinis funkcija yra funkcija, kuri vadina save.
Rekursinis funkcija turi turėti Yra trys dideli dalykai.
Pirmasis yra akivaizdu, kad ji vadina save.
Antra, pagal bazinį scenarijų.
Taigi kažkuriuo momentu funkcija turi sustabdyti skambinate save,
ir tai, ką bazinį scenarijų yra.
Taigi čia mes žinome, kad turime sustabdyti, mes turėtume pasiduoti mūsų paieškos
, kai pradžia yra lygi pabaigoje - ir mes pereiti, ką tai reiškia.
Bet pagaliau, paskutinis dalykas, kad svarbu rekursyvinių funkcijų:
funkcijos turi kažkaip kreiptis į bazinę skyrių (didžiąsias į mažąsias arba atvirkščiai).
Patinka, jei jūs ne iš tikrųjų atnaujinti nieko, kai jūs padaryti antrą rekursinis skambutį,
jei jūs tiesiog tik paskambinus funkciją vėl su tais pačiais argumentais,
ir nėra visuotiniai kintamieji, pasikeitė arba nieko,
jūs niekada nepasieks pagrindą, tokiu atveju, kad blogai.
Tai bus begalinė rekursija ir nepakeliama.
Bet čia mes matome, kad atnaujinimas vyksta, nes mes atnaujinti pradėti + END / 2,
Mes atnaujiname argumentas pabaigos, mes atnaujiname argumentas pradžios.
Taigi visose rekursinis kvietimus mes atnaujinti kažką. Gerai.
Ar norite eiti su mumis per savo sprendimą? >> Žinoma.
Aš naudoju SearchHelp taip, kad kiekvieną kartą, kai aš darau tai skambinimo funkcijos
Turiu, kur aš ieškau masyve pradžią ir pabaigą
nuo to, kur aš ieškau masyvo.
>> Kiekviename žingsnyje, kur jis sakydamas, kad tai vidutinio elementas, kuris yra pradžia + pabaiga / 2,
yra lygi tai, ko mes ieškome?
Ir jei ji yra, tada mes ją radau, ir aš manau, kad gauna išlaikė iki rekursijos lygį.
Ir jei tai nėra tiesa, tada mes patikrinti, ar, kad masyvo viduryje vertė yra per didelis,
tokiu atveju mes pažvelgti į kairę pusę masyvo nuo pradžios iki vidurinės indeksą.
Ir kitaip mes pabaigos 1/2.
[Bowden] Gerai.
Skamba viliojančiai.
Gerai, kad pora dalykų, ir iš tikrųjų, tai yra labai aukšto lygio dalykas
kad jūs niekada reikia žinoti šio kurso, bet tai tiesa.
Rekursyvūs funkcijas, kuriuos Jūs visada girdite, kad jie blogai elgtis
nes jei jūs rekursyviai vadina save per daug kartų, gausite nepakeliama
, nes, kaip minėjau anksčiau, kiekviena funkcija gauna savo kamino rėmo.
Taigi, kiekvienas grįžtamojo funkcijos skambučių gauna savo kamino rėmo.
Taigi, jei jūs padarote 1000 rekursinių skambučius, gausite 1000 žetonų rėmus,
greitai ir sukelti per daug žetonų rėmeliai ir dalykų tiesiog pertrauka.
, Kad kodėl rekursyvūs funkcijos paprastai yra blogai.
Bet yra gražus rekursyvinių funkcijų poaibis vadinamas uodega-rekursinių funkcijas,
ir tai atsitinka būti pavyzdys, kur, jei kompiliatorius PRANEŠIMAI tai
ir ji turėtų, manau, Apsukite metalinis garsas, jei pereisite-O2 vėliavos
tada jis tai pastebės, uodega rekursinis ir kad viskas gerai.
>> Jis bus naudoti to paties kamino rėmo vėl ir vėl už kiekvieną grįžtamojo ryšio.
Ir taip, nes jūs naudojate tą patį kamino rėmelį jums nereikia jaudintis dėl
kada nors sukrauti perpildyta, ir tuo pačiu metu, kaip jūs sakėte anksčiau,
kur, kai grįšite tiesa, tada jis turi grąžinti iki visų šių kamino kadrų
ir 10-asis kvietimas SearchHelp turi grįžti į 9-ojo, turi grįžti į 8-oji.
Taip, kad nereikia atsitikti, kai funkcijos yra uodega rekursinis.
Ir taip, ką daro ši funkcija uodega rekursinis pranešimas, kad už bet kurį kvietimą į searchHelp
, rekursinis skambučio, kad tai yra, ką jis grąžina.
Taigi pirmojo kvietimo į SearchHelp, mes iš karto gražins false,
nedelsiant grąžinti tiesa, ar mes darome rekursinis raginimą SearchHelp
kur ką mes grįžti yra kas, kad skambutis grįžta.
Ir mes galime tai padaryti, jei mes padarėme kažką panašaus int x = SearchHelp, grąžinimo x * 2,
tik keletas atsitiktinį pasikeitimą.
>> Taigi dabar tai rekursinis skambutis, tai int x = SearchHelp rekursinis skambutis,
nebėra rekursinis uodega, nes ji iš tikrųjų turi grąžinti
atgal į ankstesnį kamino tarpą taip, kad raginimai funkcijos
tada gali kažką daryti su grįžimo vertės.
Taigi, tai nėra uodega rekursinis, bet tai, ką turėjo prieš tai gražiai uodega rekursinis. Taip.
[Studentas] Jei ne antrą atraminį režimą turėtų būti tikrinama pirmiausia
, nes ten gali būti situacija, kur kai pereisite argumentą
turite start = pabaigos, bet jie yra adata vertė.
Klausimas buvo ne mes paleisti į bylą, kur pabaigoje yra adata vertė
arba pradėti = Pabaigos, tinkamai pradėti = Pabaigos
ir jūs ne iš tikrųjų patikrinta, ypatingą vertę dar
tada pradėti + END / 2 tiesiog bus ta pati vertė.
Bet mes jau grįžo klaidingas ir mes niekada iš tikrųjų patikrinta vertę.
Taigi, bent jau, kai pirmajame kvietime, jei dydis yra 0, tada mes norime grąžinti reikšmę FALSE.
Bet jei dydis yra 1, tada pradžia nesiruošia į vienodą pabaigoje,
ir mes bent patikrinti vieną elementą.
Bet aš manau, kad tu teisus, kad mes gali baigtis tuo atveju, kai pradeda + END / 2,
pradžia galų gale buvo pati pradžia + galutiniam / 2,
bet mes niekada iš tikrųjų patikrinta, elementas.
>> Taigi, jei mes pirmiausia patikrina, yra viduryje elementas vertė mes ieškome,
tada mes galime iš karto grįžti tiesa.
Kita, jei jie lygūs, tada nėra prasmės toliau tęsti
nes mes tik ketina atnaujinti atveju, kai mes esame vieno elemento masyvo.
Jei tai vienas elementas yra ne vienas, mes ieškome,
tada viskas yra blogai. Taip.
[Studentas] dalykas yra tai, kad nuo dydžio iš tiesų yra didesnis nei masyvo elementų skaičius,
jau yra kompensuoti - >> Taigi bus dydis -
[Studentas] Pasakykite, jei masyvo dydis 0, tada SearchHelp tikrai bus patikrinti nuo 0 kaugė
pirmojo kvietimo.
Masyvas dydis 0, 0 - >> Taip.
Yra dar vienas dalykas, kad tai gali būti gera. Pagalvokime.
Taigi, jei masyvo turėjo 10 elementai ir vidurinis mes ketiname patikrinti 5 puslapis,
todėl mes patikrinti 5 ir tarkime, kad vertė yra mažesnė.
Taigi, mes mesti viską toli nuo 5 tolyn.
Taigi pradėkite + pabaiga / 2 bus mūsų naujas galas,
Taigi, yeah, ji visada liksi už masyvo pabaigos.
, Jei tai yra atveju, jei ji buvo net ar nelyginis, tada mes norėtume patikrinti, tarkim, 4,
bet mes vis dar mesti toli -
Taigi, yeah, pabaiga visada bus negalima realiai masyvo pabaigos.
Taigi, mes sutelkiant dėmesį į elementų, pabaiga visada bus po to vienas.
Ir todėl, jei pradžia ar kada nors vienodą pabaigą, mes esame masyvo dydžiui 0.
>> Kitas dalykas, aš galvoju, mes atnaujinti pradžios turi būti pradėti + END / 2,
todėl tai yra tas atvejis, Turiu problemų su, kur pradėti + END / 2
yra Mes tikriname elementas.
Tarkime, kad mes tai 10 elementų masyvą. Koks skirtumas.
Taigi pradėkite + pabaiga / 2 bus kažkas patiko šį vieną,
ir, jei tai ne vertė, tarkim, mes norime atnaujinti.
Vertė yra didesnė, todėl mes norime pažvelgti į šio masyvo pusę.
Taigi, kaip mes atnaujinti pradėti, mes atnaujinti pradėti dabar šis elementas.
Tačiau tai gali dirbti, arba bent jau, jūs galite padaryti pradžią + pabaiga / 2 + 1.
[Studentas] Jums nereikia būti pradėti + END [nesigirdi] >> Taip.
Mes jau patikrinta šį elementą ir žinau, tai ne vienas, mes ieškome.
Taigi mums nereikia atnaujinti pradžios šis elementas.
Mes galime tiesiog praleiskite jį ir atnaujinti pradžia turi būti šis elementas.
Ir yra ten kada nors, tarkim, kad tai buvo pabaiga
taip, tada pradėti būtų, pradėkite + END / 2 būtų tai,
pradėti + END - Taip, manau, kad tai gali baigtis begalinės rekursijos.
Tarkime, kad tai tik dydis 2 arba 1 dydžio masyvo masyvas. Manau, kad tai veiks.
Taigi šiuo metu, pradžia yra šis elementas ir pabaiga yra 1 už jos ribų.
Taigi yra šis elementas, kad mes ketiname patikrinti,
ir tada, kai mes atnaujiname pradžios mes atnaujinti pradžia turi būti 0 + 1/2,
kuris baigsis mums atgal su pradžia yra šis elementas.
>> Todėl mes patikrinti tą patį elementą, vėl ir vėl.
Taigi tai yra tuo atveju, kai kiekvienas rekursinis skambutis turi faktiškai atnaujinti kažką.
Taigi, mums reikia padaryti pradžią + END / 2 + 1, arba kitas atvejis
kai mes ne iš tikrųjų atnaujinimo pradžios.
Visiems žiūrėti, kad?
Gerai.
Ar kas nors turite klausimų dėl šio tirpalo arba bet daugiau komentarų?
Gerai. Ar kas nors turite kartotinis sprendimas, kad mes visi galime pažvelgti?
Ar mes visi tai padarysime rekursyviai?
Ar taip pat aš manau, jei jūs atidarėte svetimi, tada jums gali tekti viršesni už ankstesnį.
Ji automatiškai išsaugoti? Aš nesu teigiamas.
Ar kas nors turite kartotinis?
Mes galime vaikščioti per ją kartu, jei ne.
Idėja bus tas pats.
Ciklinis sprendimą.
Mes ketiname norite iš esmės padaryti tą pačią idėją
kur mes norime sekti naujos masyvo pabaigos ir nauja pradžia, masyvo
ir padaryti, kad vėl ir vėl.
Ir jei tai, ką mes nuolat stebėti, kaip pradžioje ir pabaigoje, kada susikerta,
tada mes ne suprato, kad tai ir mes galime grįžti klaidinga.
Taip, kaip man tai padaryti? Kiekvienas turite pasiūlymų ar kodas man traukti?
[Studentas] Ar while cikle. >> Taip.
Jūs ketinate norite padaryti kilpą.
>> Ar turite kodą gali atsigriebti, ar ką jūs ketinate pasiūlyti?
[Studentas] Manau, kad taip. >> Gerai. Tai leidžia lengviau. Koks buvo jūsų vardas?
[Studentas] Lucas.
Peržiūra 1. Gerai.
Mažai yra, ką mes vadinami pradėti prieš.
Up yra ne visai tai, ką mes vadinome pabaigoje prieš.
Tiesą sakant, dabar per masyvo pabaigos. Tai elementas, mes turėtume apsvarstyti.
Toks mažas, yra 0, masyvo dydis - 1,
ir dabar mes kilpų, taip pat patikrina,
Manau, galite vaikščioti per ją.
Koks buvo jūsų mąstymas per šį? Vaikščioti mus per savo kodą.
[Studentas] Žinoma. Ieškoti šieno kupetoje vertės viduryje ir palyginti ją su adata.
Taigi, jei jis didesnis nei jūsų adatos, tada jūs norite - O, iš tikrųjų, kad turėtų būti atgal.
Jūs ketinate norite išmesti dešinėje pusėje, ir taip taip, tai turėtų būti būdas.
[Bowden] Taigi tai turėtų būti mažesnis? Yra tai, kad ką jūs pasakėte? >> [Studentas] Yeah.
[Bowden] Gerai. Mažiau.
Taigi, jei tai, ką mes ieškome ne mažesnis nei tai, ką norime,
tada taip, mes norime išmesti į kairę pusę,
, o tai reiškia, mes atnaujinti viską, mes dirbame, kad
juda mažas masyvo teise.
Tai gerai atrodo.
Manau, kad tai turi tą pačią problemą, kad mes pasakė pirmiau paminėtu,
kur, jei mažai yra 0 ir yra 1, tada mažas + iki / 2 ketina įsteigti vėl tas pats.
>> O net jei tai ne tas atvejis, jis vis dar efektyviau, bent jau
tiesiog išmesti elementą, mes tiesiog atrodė, kuriuos mes žinome, yra negerai.
Toks mažas + aukštyn / 2 + 1 - >> [studentas] Tai turėtų būti kitas būdas.
[Bowden] Arba tai turėtų būti - 1, o kita turėtų būti + 1.
[Studentas] Ir ten turėtų būti dvigubai lygybės ženklo. >> [Bowden] Yeah.
[Studentas] Taip.
Gerai.
Ir, pagaliau, dabar, kad mes turime šį + 1 - 1 dalykas,
tai - ji gali būti - jis niekada mažas, kad galų gale, kurių vertė yra didesnė nei iki?
Manau, kad vienintelis būdas, kad gali atsitikti - Ar tai įmanoma? >> [Studentas] Nežinau.
Bet jei jis bus sutrumpintas ir tada gauna minus, kad 1 ir tada - >> Taip.
[Studentas] Tai galbūt gauti messed up.
Manau, kad tai turėtų būti gerai, tik todėl, kad
, kad jis galų gale mažesnis, jie turės būti lygus, manau.
Bet jei jie yra lygūs, tada mes nebūtų padarė while cikle prasideda
ir mes tiesiog būtų grąžintas vertę. Taigi, aš manau, kad mes gerai dabar.
Atkreipkite dėmesį, kad, nors ši problema nebėra rekursinis
taikoma tos pačios rūšies idėjų, kur mes galime pamatyti, kaip tai taip lengvai skolina pati
rekursinis sprendimą dėl to, kad mes tiesiog atnaujinti indeksus vėl ir vėl,
mes darome problema mažesni ir mažesni, mes sutelkiant dėmesį į masyvo pogrupyje.
[Studentas] Jei mažai yra 0 ir yra 1, jie abu turi būti 0 + 1/2, kuri būtų eiti į 0,
ir tada būtų + 1, vienas būtų - 1.
[Studentas] Kur mes patikrinti lygybę?
Pavyzdžiui, jei vidurinis yra iš tikrųjų adata?
Šiuo metu mes negalime tai daro? Oh!
Jei it's
Taip. Mes galime ne tik atlikti testą žemyn čia, nes tarkim pirmą viduryje -
[Studentas] Tai tikrai patinka neišmeskite jungiasi.
Taigi, jei jūs išmesti jungiasi, jūs turite patikrinti ji pirmą kartą arba nepriklausomai.
Ah. Taip. >> [Studentas] Yeah.
Taigi dabar mes išmesti vieną, šiuo metu mes pažvelgė,
tai reiškia, kad dabar mes turime taip pat turi
if (kaugė [(žemos + Up) / 2] == adata), tada mes galime grįžti tiesa.
Ir ar kitur arba tiesiog jei aš įdėti, tai reiškia, pažodžiui tą patį
, nes tai būtų grįžo tiesa.
Todėl aš įdėti else if, bet nesvarbu.
>> Else if, dar tai, ir tai yra bendras dalykas, aš
kai, net jei jis yra tuo atveju, kai viskas yra gerai čia,
kaip mažas, niekada negali būti didesnis nei iki, tai nėra verta samprotauti apie tai, ar tai tiesa.
Taigi, jūs galite taip pat pasakyti, o žemas, yra mažesnis arba lygus
o žemas yra mažesnis nei
todėl, jei jie kada nors yra lygus arba mažai atsitinka, kad pass up,
tada mes galime išeiti iš šio ciklo.
Klausimai, rūpesčius, komentarai?
Gerai. Tai gerai atrodo.
Dabar mes norime padaryti rūšiuoti.
Jei mes einame į mano antras peržiūros, mes matome tuos pačius numerius,
bet dabar jie nebėra rūšiuotų tvarka.
Ir mes norime įgyvendinti rūšiuoti naudojant bet kurį algoritmą O n log n.
Taigi, kuris algoritmas manote turėtume įgyvendinti čia? >> [Studentas] suliejimas rūšiuoti.
[Bowden] Taip. Sujungti rūšiuoti yra O (n log n), kad tai, ką mes ketiname daryti.
Ir problema bus labai panašus,
kur lengvai skolina pati į rekursinis sprendimo.
Mes taip pat galime sugalvoti kartotinis tirpalu, jei norime,
bet rekursija bus lengviau čia ir mes turėtume daryti, rekursija.
Aš manau, kad mes vaikščioti per sujungti rūšiuoti,
, nors yra puikus vaizdo suliejimo rūšiuoti. [Juokas]
Taigi sujungti rūšiuoti yra - aš eikvoti tiek daug šio dokumento.
O, yra tik vienas kairėje.
Taigi suliejimą.
O, 1, 3, 5.
Gerai.
Suliejimas trunka dvi atskiras masyvų.
Atskirai šios dvi matricos yra tiek surūšiuoti.
Taigi šis masyvas, 1, 3, 5, surūšiuoti. Šis masyvas, 0, 2, 4, surūšiuoti.
Dabar ką sujungti reikia padaryti, yra sujungti juos į vieną masyvą, kuri pati yra rūšiuojamos.
Taigi, mes norime masyvo dydis 6, kad ketina turėti šiuos elementus, viduje ji
rūšiuotas tvarka.
>> Ir todėl mes galime pasinaudoti dėl to, kad šios dvi matricos yra rūšiuojamos
tai padaryti linijinio laiko,
linijinis laikas reiškia, jei šis masyvas dydis x ir tai yra dydis m,
bendras algoritmas turėtų būti O (x + y). Gerai.
Taigi, pasiūlymai.
[Studentas] Ar mes galime pradėti iš kairės?
Todėl jūs įdėti 0 žemyn ir tada 1 ir tada čia esate ne 2.
Todėl natūra, kaip jums skirtuką, kad juda į dešinę. >> [Bowden] Yeah.
Tiek iš šių masyvų, jei mes tik sutelkti dėmesį į kairiausias elemento.
Kadangi abi matricos yra rūšiuojamos, mes žinome, kad šie 2 elementai
yra smulkiausi elementai arba masyvo.
Taigi, tai reiškia, kad 1 iš šių 2 elementai turi būti mažiausias elementas mūsų susijungusios masyvo.
Jis tiesiog taip atsitinka, kad mažiausias yra dešinėje Šiuo metu vienas.
Todėl mes 0, įdėkite jį į kairę, nes 0 yra mažiau nei 1,
todėl imasi 0, įdėkite ją į mūsų pirmąją poziciją, ir tada mes atnaujinti šį
sutelkti dėmesį į pirmojo elemento.
Ir dabar mes pakartoti.
Taigi dabar mes palyginti 2 ir 1. 1 yra mažesnis, todėl mes įterpti 1.
Mes atnaujinti šį žymiklį pažymėti šis vaikinas.
Dabar mes tai darome dar kartą, todėl 2. Tai bus atnaujinti, palyginti šias 2, 3.
Šis atnaujinimas, tada 4 ir 5.
Taigi, kad yra sujungti.
>> Ji turėtų būti gana akivaizdu, kad tai yra linijinis laikas, nes mes tiesiog pereiti per kiekvieno elemento kartą.
Ir kad didžiausias žingsnis siekiant įgyvendinti sujungti tarsi tai daro.
Ir tai nereiškia, kad sunku.
Pora dalykų, nerimauti yra, tarkim, mes buvo sujungti 1, 2, 3, 4, 5, 6.
Šiuo atveju mes galų gale tam atvejui, jei šis yra, bus mažesni,
tada mes atnaujinti šį žymeklį, tai vienas bus mažesni, atnaujinti,
tai vienas mažesnis, ir dabar jūs turite pripažinti,
, kai jūs iš tikrųjų paleisti iš elementų, palyginti su.
Kadangi mes jau visą šį masyvo,
viskas šioje matricoje dabar tiesiog įterpiamas į čia.
Taigi, jei mes kada nors paleisti į tašką, kai vienas iš mūsų masyvų jau visiškai susijungė,
tada mes tiesiog imtis visų Kita masyvo elementus ir įdėkite juos į masyvo pabaigos.
Taigi, mes galime tiesiog įdėkite 4, 5, 6. Gerai.
Tai yra vienas dalykas, kad atkreipti dėmesį.
Įgyvendinimo, kad turėtų būti 1 žingsnis.
Tada sujungti rūšiuoti remiantis, kad jis 2 žingsniai, 2 kvaili žingsniai.
Tegul tik šio masyvo.
Taigi, sujungti rūšiuoti, 1 pakopa yra rekursyviai nutraukti masyvą į dvi dalis.
Taigi padalinti šį masyvą į dvi dalis.
Dabar mes turime 4, 15, 16, 50 ir 8, 23, 42, 108.
Ir dabar mes jį dar kartą ir mes padalinti juos į dvi dalis.
Aš tiesiog daryti šioje pusėje.
Taigi, 4, 15 ir 16, 50.
Mes darysime tą patį čia.
Ir dabar mes padalinti jį į dvi dalis vėl.
Ir mes turime 4, 15, 16, 50.
Taigi, tai yra mūsų bazinį scenarijų.
Kai matricos yra 1 dydžio, tada mes nustojame su skirstymą į dvi dalis.
>> Dabar ką daryti su šiuo teiginiu?
Mes galų gale tai taip pat suskirstyti į 8, 23, 42, ir 108.
Taigi dabar, kad mes šiuo metu, dabar du sujungti rūšiuoti žingsnis yra tiesiog sujungti poras į sąrašus.
Taigi, mes norime sujungti šias. Mes tiesiog paskambinkite suliejimą.
Mes žinome, sujungti bus grąžinti juos rūšiuotas tvarka.
4, 15.
Dabar mes norime sujungti ir kad bus grąžinti sąrašą su rūšiuotų tvarka,
16, 50.
Mes sujungti tų, - aš negaliu rašyti - 8, 23 ir 42, 108.
Taigi, mes turime sulieti porų vienu metu.
Dabar mes tiesiog sujungti dar kartą.
Atkreipkite dėmesį, kad kiekvienas iš šių sąrašų, yra rūšiuojama savaime
ir tada mes galime tiesiog sujungti šiuos sąrašus gauti 4 dydžio sąrašą, kuris yra rūšiuojamas
ir sujungti šiuos du sąrašus gauti 4 dydžio sąrašą, kuriame vyksta rūšiavimas.
Ir, pagaliau, mes galime sujungti šiuos du sąrašus dydis 4 gauti vieną sąrašą, dydis 8, surūšiuoti.
Taigi, norint pamatyti, kad tai yra bendras n log n, mes jau matėme, kad sujungti yra tiesinė,
todėl, kai mes susiduriame su Sujungiant šiuos, kaip bendrų išlaidų suliejimą
šių dviejų sąrašų, yra tik 2, nes -
Ar gerai, O n, bet n čia yra tik šie 2 elementai, todėl 2.
Ir tai 2 bus 2 ir šių 2 bus 2 ir tai 2 bus 2,
visoje susilieja, kad mes turime padaryti, mes galų gale padaryti n.
Kaip ir 2 + 2 + 2 + 2 8, kuris yra n,
taip sujungti šio rinkinio kaina yra n.
Ir tada tas pats čia.
Mes sujungti šių 2, tada jos 2 ir individualiai tai sujungti per keturias operacijas,
tai sujungti užtruks keturias operacijas, tačiau dar kartą, tarp visų šių,
mes galų gale sujungti n viso dalykų, ir todėl šis žingsnis yra n.
Ir taip kiekvienas lygis trunka n elementai, nesujungti.
>> Kiek lygių yra?
Kiekviename lygmenyje, iš daugybės auga pagal dydį 2.
Čia mūsų matricos yra 1 dydžio, čia jie 2 dydžio, čia jie 4 dydžio,
ir, galiausiai, jie 8 dydžio.
Taigi, kadangi tai yra du kartus, yra ir bus iš viso n log iš šių lygių.
Taigi su log n lygių, kiekvienas lygis, atsižvelgiant n bendras operacijas,
mes gauname n log n algoritmas.
Turite klausimų?
Ar žmonės jau padarė pažangą, kaip įgyvendinti?
Ar kas nors jau yra valstybės, kur galiu tik atsigriebti savo kodą?
Aš galiu duoti vieną minutę.
Tai vienas bus ilgesnis.
Aš labai rekomenduoju pasikartotų -
Jūs neturite daryti Rekursija suliejimą
nes priešingu Rekursija suliejimą, jūs ketinate turi išlaikyti krūvą įvairių dydžių.
Galite, bet tai erzina.
Bet rekursija dėl pačios rūšies yra gana lengva.
Jūs tiesiog tiesiog paskambinti rūšiuoti kairę pusę, tarsi dešinėje pusėje. Gerai.
Kiekvienas turi ką galiu atsigriebti dar?
Kitaip aš duosiu minutę.
Gerai.
Kiekvienas turi ką mes galime dirbti su?
Arba dar mes tiesiog dirbti tai ir tada išplėskite iš ten.
>> Kiekvienas turi daugiau nei tai, kad aš galiu atsigriebti?
[Studentas] Taip. Galite traukti mano. >> Gerai.
Taip!
[Studentas] buvo daug sąlygų. >> O, šaudyti. Ar galite
[Studentas] Turiu ją išsaugoti. >> Taip.
Taigi, mes padarėme padaryti suliejimą atskirai.
Oh, bet tai nereiškia, kad blogai.
Gerai.
Taigi, rūšiuoti tiesiog paskambinę mergeSortHelp.
Paaiškinti mums, ką mergeSortHelp.
[Studentas] MergeSortHelp gana daug daro du pagrindinius veiksmus,
kuris yra rūšiuoti kiekvieną masyvo pusę ir tada sujungti juos abu.
[Bowden] Gerai, kad duoti man per sekundę.
Manau, kad tai - >> [studentas] Man reikia
Taip. Aš kažko trūksta.
Suliejimą, aš suprantu, kad man reikia sukurti naują masyvą
, nes aš negalėjo padaryti jį į vietą. >> Taip. Jūs galite ne. Ištaisyti.
[Studentas] Taigi, aš sukurti naują masyvą.
Aš pamiršau sujungti vėl pakeisti pabaigoje.
Gerai. Mes turime naują masyvą.
Merge sort, tai beveik visada tiesa.
Dalis geriau algoritmas laiko protingas išlaidas
beveik visada reikia naudoti šiek tiek daugiau atminties.
Taigi čia, nesvarbu, kaip jūs tai darote sujungti rūšiuoti,
jūs neišvengiamai reikia naudoti tam tikrą papildomą atmintį.
Jis arba ji sukūrė naują masyvą.
Ir tada jums sako, kad pabaigoje mes tiesiog reikia nukopijuoti naują masyvą, į pirminį masyvo.
[Studentas] Manau, kad taip, taip.
Aš nežinau, jei kuri veikia skaičiuojant nuoroda ar whatever -
Taip, jis bus dirbti. >> [Studentas] Gerai.
Ar jūs pabandykite paleisti? >> [Studentas] Ne, dar ne. >> Gerai.
Pabandykite paleisti jį, o tada aš kalbėti apie tai už antrą.
[Studentas] man reikia, kad visi funkcija prototipus ir viskas, nors, tiesa?
Funkcijos prototipus. O, tu kalbi kaip - Taip.
Rūšiuoti skambina mergeSortHelp.
>> Taigi, tam, kad rūšiuoti skambinti mergeSortHelp, mergeSortHelp turi arba buvo apibrėžta
prieš rūšiuoti ar mes tiesiog reikia prototipą. Tiesiog nukopijuokite ir įklijuokite kad.
Ir panašiai, mergeSortHelp ragina sujungti,
bet sujungti dar nebuvo apibrėžta, todėl mes galime tiesiog leiskite mergeSortHelp žinoti
, kad tai, ką sujungti atrodys, ir tai, kad.
Taigi mergeSortHelp.
Mes turime problemą čia, kur mes neturime bazinį scenarijų.
MergeSortHelp yra rekursinis, todėl bet rekursinis funkcija
going to reikia kažkokią bazine žinoti, kada sustoti rekursyviai pasivadino.
Kas yra mūsų bazinį scenarijų bus čia? Taip.
[Studentas] Jei dydis yra 1? >> [Bowden] Taip.
Taigi, kaip matėme teisę ten, mes sustojo išskaidyti masyvų
kartą patekome į masyvų yra 1, kuris neišvengiamai yra rūšiuojamos.
Taigi, jei dydis lygus 1, mes žinome, masyvas jau surūšiuoti,
todėl mes galime tik grįžti.
>> Atkreipkite dėmesį, kad negalioja, todėl mes negalime grįžti nieko ypatingą, mes tiesiog grįžti.
Gerai. Štai taip atrodo mūsų bazinį scenarijų.
Manau, mūsų bazinį scenarijų taip pat gali būti, jei atsitiktų būti sujungti masyvas dydžiui 0,
mes tikriausiai norite sustabdyti tam tikru momentu,
todėl mes galime tik pasakyti dydis mažiau nei 2 ar mažiau kaip arba lygi 1
kad tai bus dirbti bet kuriuo masyvo dabar.
Gerai.
Štai taip atrodo mūsų bazinį scenarijų.
Dabar jūs norite eiti su mumis per suliejimą?
Ką reiškia visi šie atvejai?
Čia, mes tiesiog daro tą pačią idėją, -
[Studentas] man reikia artimųjų dydį su visais mergeSortHelp skambučius.
Dydžio kaip aš pridėjo papildomą pirminiuose ir jo ten nėra, pavyzdžiui, dydžio / 2.
[Bowden] O, dydis / 2, dydis / 2. >> [Studentas] Taip, ir pirmiau funkcija, taip pat.
[Bowden]? >> [Studentas] Tiesiog dydis. >> [Bowden] Oh. Dydis, dydis? >> [Studentas] Yeah.
[Bowden] Gerai.
Leisk pagalvoti per sekundę.
Mes paleisti į klausimą?
Mes visada gydyti į kairę kaip 0. >> [Studentas] L.
Kad negerai. Atsiprašau. Ji turėtų būti pradžia. Taip.
[Bowden] Gerai. Man patinka, kad geriau.
Ir baigiasi. Gerai.
Taigi, dabar jūs norite eiti su mumis per suliejimą? >> [Studentas] Gerai.
Aš tiesiog vaikščioti per šio naujo masyvo, kad aš sukūriau.
Jo dydis yra masyvo dalies dydis, kad mes norime būti rūšiuojami
ir bando rasti elementą, kad aš įdėti į naują masyvo žingsnio.
Tai padaryti, kad, visų pirma, aš patikrinti, jei yra kairėje pusėje, masyvo ir toliau turi bet daugiau elementų,
ir jei jis nėra, tada jūs einate žemyn, kad dar būklės, kuris tiesiog sako
gerai, ji turi būti teisinga masyvo, ir mes įdėti, kad į dabartinę indekso newArray.
>> Ir tada kitaip, aš patikrinti, jei dešinėje pusėje masyvo taip pat baigiama,
tokiu atveju aš tiesiog įdėti kairėje.
Kad gali ne iš tikrųjų būtina. Nesu tikras.
Bet vistiek, kiti du patikrinimas, kuris iš dviejų yra mažesnis kairės į dešinę.
, O taip pat kiekvienu konkrečiu atveju, aš incrementing nepriklausomai nuo vietos rezervavimo ženklą, aš prieaugio.
[Bowden] Gerai.
Kad gerai atrodo.
Ar kas nors turite pastabų ar Taikoma arba klausimų?
Taigi keturiose bylose turime neštis savo daiktus į tiesiog yra arba atrodo, kad 5 -
bet mes turime apsvarstyti, ar į kairę masyvas buvo paleisti iš dalykų, mes turime sujungti,
, ar teisė masyvas buvo paleisti iš dalykų, mes turime sujungti
Aš nukreipta nieko.
Taigi,, ar kairę masyvas paleisti iš dalykų, arba teisę masyvas paleisti iš ką.
Tai yra du atvejai.
Mes taip pat reikia trivialus atvejis, ar į kairę dalykas yra mažiau nei teisingas dalykas.
Tai mes norime pasirinkti kairįjį patį.
Tai yra atvejai.
Taigi tai buvo teisus, todėl tai, kad.
Masyvas kairę. Tai 1, 2, 3. Gerai. Taigi, yeah, jie yra keturi dalykai, mes norime tai padaryti.
Ir mes negalime eiti per pasikartojantis sprendimą.
Aš nepatarčiau -
Sujungti rūšiuoti funkcijos pavyzdys, kuris yra ir ne uodega rekursinis
tai nėra lengva, kad jis uodega rekursinis,
bet taip pat ji nėra labai lengva, kad jis pasikartojantis.
Tai labai paprasta.
Šis Merge sort įgyvendinimą,
sujungti, nesvarbu, ką jūs darote, jūs ketinate kurti suliejimą.
>> Taigi sujungti tarsi pastatytas ant viršaus suliejimo rekursyviai yra tik šių trijų eilučių.
Keletą kartų, tai labiau erzina ir sunkiau galvoti apie.
, Bet pastebėsite, kad tai ne uodega rekursinis nuo mergeSortHelp - kai ji vadina save -
ji vis dar turi daryti tai, ko po šio rekursinis skambučių grąžos.
Taigi tai kamino rėmas turi ir toliau egzistuoti net paskambinus.
Ir tada, kai tai vadiname, kamino rėmas turi ir toliau egzistuoti
nes net po to kvietimo, mes vis dar reikia sujungti.
Ir tai yra Nenereikšmingas kad ši uodega rekursinis.
Turite klausimų?
Gerai.
Taigi vyksta rūšiuoti - O, yra du dalykai, aš noriu parodyti. Gerai.
Grįžtant rūšiuoti, mes tai padaryti greitai.
Ar paieškos terminą. Rūšiuoti? Rūšiuoti. Taip.
Grįžtant prie rūšies pradžia.
Mes norime sukurti algoritmą, kuris rūšių masyvo, naudodami bet kokį algoritmą
O n.
Taigi, kaip tai įmanoma? Ar kas nors turite rūšiuoti -
Aš užsiminė prieš ne -
Jei mes netrukus pasitaisys iš n log n O n,
mes turime tobulinti mūsų algoritmas laiko protingas,
o tai reiškia, ką mes ketiname reikia padaryti, kad už tai?
[Studentas] tarpas. >> Taip. Mes ketinate naudoti daugiau vietos.
Ir net ne tik daugiau vietos, tai eksponentiškai daugiau erdvės.
Todėl manau, kad šis algoritmas yra pseudo kažkas pseudo polinom -
Pseudo - Aš negaliu prisiminti. Pseudo kažką.
Bet tai reiškia, kad mes turime naudoti tiek daug vietos
, kad tai įmanoma, bet ne realus.
>> Ir kaip mes tai pasiekti?
Mes galime pasiekti tai, jei mes garantuojame, kad bet kuris konkretus elementas masyve
yra mažesnė už tam tikrą dydį.
Todėl galime tik pasakyti, kad dydis yra 200,
bet kuris masyvo elementas yra žemiau dydis 200.
Ir iš tikrųjų tai yra labai realus.
Jūs galite labai lengvai masyvą, kad jūs žinote viską, kas jame
bus mažiau nei kai kurios numerį.
Pavyzdžiui, jei turite kokių nors visiškai masyvi vektoriniu ar kažką
, bet jūs žinote, viskas bus nuo 0 iki 5,
tada jis bus žymiai greičiau tai padaryti.
Ir jungiasi bet elementų yra 5,
, todėl šis vertinimas, tai yra, kiek atminties jūs ketinate naudoti.
Taigi jungiasi yra 200.
Teoriškai visada privalo nuo sveikasis skaičius gali būti tik gali siekti 4 mlrd,
bet tai nerealus dalykas, nes tada mes norime būti, naudojant palydoviniu arba
4 mlrd tvarka. Taigi, kad nerealu.
Bet čia mes pasakyti mūsų jungiasi yra 200.
Pavyko tai daryti O n yra mes kitą masyve skaičiuojamas dydžio LAIKYTIS.
Taigi, iš tikrųjų, tai yra nuoroda - Aš iš tikrųjų nežinau, jei Apsukite metalinis garsas tai daro.
, Bet I 'GCC bent jau darant prielaidą, Apsukite metalinis garsas tai taip pat -
tai bus tik inicijuoti visą masyvą būti 0s.
Taigi, jei aš nenoriu padaryti, kad, tada aš galėčiau atskirai padaryti for (int i = 0;
i <privalomi; i + +) ir skaičius [i] = 0;
Taigi, dabar viskas yra inicializuoti iki 0.
Aš kartoti per mano masyvo,
ir tai, ką aš darau, tai aš skaičiuojant kiekvieno Leiskite eiti čia.
Mes turime 4, 15, 16, 50, 8, 23, 42, 108.
Ką aš skaičiuoti įvykių, kiekvienas iš šių elementų skaičius.
Leiskite pridėti pora daugiau čia su kai kuriais kartojasi.
Todėl vertė mes čia, kad vertė bus masyvas [i].
Taigi, gali būti 4 ar 8 ar kokia val.
Ir dabar aš skaičiuoti, kiek tos vertės, aš mačiau,
taip skaičiaus [val] + +;
Po to, kai tai bus padaryta, skaičius ketina atrodyti 0001.
Darykime skaičių [val] - LAIKYTIS + 1.
>> Dabar tai tik atsiskaityti už tai, kad mes pradedame nuo 0.
Taigi, jei 200 bus mūsų didžiausias skaičius,
tada 0 200 yra 201 dalykų.
Taigi skaičius, jis bus atrodyti 00.001, nes mes turime vieną 4.
Tada mes turime 0001, kur mes turime 1 8-ajame indekso skaičius.
Mes turime 2 23 indekso skaičius.
Mes turime 2 42-ąjį skaičiaus indekso.
Taigi, mes galime naudoti skaičius.
Taigi num_of_item = skaičius [i].
Ir todėl, jei num_of_item yra 2, tai reiškia, kad mes norime įterpti 2 skaičiaus i
į mūsų rūšiuotų masyvo.
Taigi, mes turime sekti, kaip toli mes į masyvo.
Taigi indeksas = 0.
Array - aš tiesiog rašyti.
Grafai -
masyvas [indeksas + +] = i;
Kad tai, ką aš noriu? Manau, kad tai, ko aš noriu.
Taip, tai gerai atrodo. Gerai.
Taigi, visi supranta, ką mano skaičiavimų masyvo tikslas?
Jis tikisi įvykių kiekvienos iš šių numerių skaičių.
Tada aš iteravimu per masyvas, kuris skaičiuoja,
osios pozicijos grafų masyve
yra i "numeris, kuris turėtų pasirodyti mano rūšiuotų masyvo.
Štai kodėl skaičius bus 1 iš 4
ir tikisi, kad bus 1 iš 8 Suskaičiavus 23 bus 2.
Taip, kad kiek jų norite įterpti į mano rūšiuotų masyvo.
Tada aš tiesiog tai padaryti.
Aš įterpiant num_of_item i į mano rūšiuotų masyvo.
>> Turite klausimų?
Ir tokiu būdu vėlgi, tai yra linijinis laikas, nes mes tiesiog iteravimu per vieną kartą,
tačiau ji taip pat linijinis, ką šis skaičius būna, kad,
ir todėl labai priklauso nuo to, ką jūsų jungiasi yra.
Jungiasi su 200, tai nėra taip blogai.
Jei jūsų jungiasi bus 10.000, tada, kad šiek tiek blogiau,
bet jei jūsų jungiasi bus 4 milijardų eurų, tai visiškai nerealu
ir šis masyvas turi būti dydis 4 mlrd., o tai nėra realu.
Taigi tai, kad. Turite klausimų?
[Nesigirdi studentas atsakas] >> Gerai.
Supratau, vienas kitas dalykas, kai mes buvome išgyvena.
Manau, kad problema buvo Lucas ir turbūt kiekvienas iš matėme.
Aš visiškai pamiršau.
Vienintelis dalykas, aš norėjau komentarą apie tai, kad kai jūs susiduriame su dalykų, pavyzdžiui, indeksų,
jūs niekada pamatyti tai, kai rašote už linijos,
, tačiau techniniu požiūriu, kai jūs susiduriame su šių rodiklių,
beveik visada turėtumėte susidoroti su nepasirašytos sveikieji skaičiai.
Dėl šios priežasties, kai jūs susiduriame su pasirašytų sveikieji skaičiai,
todėl, jei turite 2 pasirašytas sveikieji skaičiai ir įtraukite juos kartu
ir jie galų gale per didelis, tada jūs galų gale su neigiamas skaičius.
, Kad sveikasis skaičius perpildymo.
>> Jei galiu pridėti 2 mlrd 1 mlrd., Aš galų gale su neigiamu 1 mlrd.
Štai kaip sveikieji skaičiai kompiuteriuose.
Taigi problema su naudojant
Tai gerai, išskyrus atvejus, kai mažas atsitinka būti 2 mlrd. Ir atsitinka, turi būti 1 mlrd,
tada tai bus Neigiamas 1 milijardų ir tada mes ketiname padalyti iš 2
ir galų gale su neigiamu 500.000.000.
Taigi tai yra tik klausimas, jei atsitiktų reikia ieškoti per masyvo
milijardų dalykų.
Bet jei mažas + iki atsitinka perkrautas, tada, kad yra problema.
Kuo greičiau mes juos nepasirašytos nei 2 mlrd plius 1 mlrd 3 mlrd.
3 mlrd. Padalinti iš 2 yra 1,5 mlrd.
Todėl, kai tik jie nepasirašytos, viskas yra tobula.
Ir kad taip pat problema, kai rašote už kilpos,
Ir iš tikrųjų, tai tikriausiai ji automatiškai.
Tai tikrai bus tik klykauti ne jums.
Taigi, jei šis skaičius yra per didelis, kad būti tik sveikasis skaičius, bet ji tiktų sveikasis skaičius be ženklo,
klykauti jus, todėl tai, kodėl jūs niekada paleisti į šį klausimą.
Galite matyti, kad indeksas niekada bus neigiamas,
ir todėl, kai jūs iteravimu per masyvo,
jūs galite beveik visada pasakyti, unsigned int i, bet jūs tikrai turite.
Viskas vyksta gana daug dirbti lygiai taip pat.
Gerai. [Šnabžda] Kiek dabar laiko?
Paskutinis dalykas, aš norėjau parodyti, ir aš tiesiog padaryk tai tikrai greitai.
Jūs žinote, kaip mes # define, kad mes galėtume # define MAX kaip 5 ar kažką?
Tegul ne padaryti MAKS. # Define įpareigota kaip 200. Štai ką mes padarėme prieš.
Kuris apibrėžia konstanta, kuri yra tik ketina būti nukopijuotas ir įklijuotas
kur mes atsitikti rašyti LAIKYTIS.
>> Taigi, mes galime iš tikrųjų # apibrėžia.
# Mes galime nustatyti funkcijas.
Jie tikrai ne funkcijas, bet mes jiems skambinti funkcijos.
Pavyzdys galėtų būti kažkas panašaus max (x, y) yra apibrėžiama kaip (x <y y: x). Gerai.
Taigi, jūs turėtumėte priprasti prie trejopo operatoriaus sintaksė,
bet yra x mažiau nei y? Grįžti y, else return x.
Todėl jūs galite pamatyti, jūs galite padaryti šį atskirą funkciją,
ir funkcija gali būti, pavyzdžiui bool MAX trunka 2 argumentus, tai grąžinti.
Tai yra vienas iš labiausiai paplitusių, matau vyksta taip. Mes vadiname juos makrokomandas.
Tai yra makrokomanda.
Tai tik dėl to sintaksė.
Jūs galite rašyti makrokomandą daryti ką nori.
Jūs dažnai pamatyti makrokomandas derinimo printfs ir kita.
Todėl printf tipo, yra specialios konstantos C, kaip pabrėžiama LINE pabrėžti,
2 pabrėžia LINE pabrėžti,
ir ten taip pat manau, kad 2 pabrėžia FUNC. Kad gali būti. Kažkas panašaus.
Tie dalykai bus pakeistas su funkcijos pavadinimu
arba linijos, kad jūs.
Dažnai, galite parašyti, kad žemyn čia galėčiau tada tiesiog parašyti Derinimo printfs
Derinti ir ji bus atspausdinti eilutės numerį ir funkcijas, kad man atsitiktų būti
kad ji susidūrė su pareiškimą, kad DEBUG.
Ir jūs taip pat gali spausdinti kitus dalykus.
Taigi vienas dalykas, kurį turėtų atkreipti dėmesį, jei aš atsitikti, kad # define DOUBLE_MAX
kaip kažką panašaus į 2 * y ir 2 * x.
Taigi, dėl bet kokios priežasties, jums atsitikti, kad daug.
Todėl įsitikinkite, kad makro.
Tai iš tiesų sulaužyta.
Aš vadinčiau jį daro kažką panašaus DOUBLE_MAX (3, 6).
Taigi, ką turėtų būti grąžintas?
[Studentas] 12.
Taip, 12 turėtų būti grąžintas, ir 12 yra grąžinamas.
3 yra pakeičiamas x, 6 yra pakeičiamas y, ir mes grįžti 2 * 6, kuris yra 12.
Dabar, ką apie tai? Ką turėtų būti grąžintas?
[Studentas] 14. >> Idealiu atveju, 14.
Problema ta, kad, kaip maišos apibrėžia darbą, prisiminti tai pažodinis kopijuoti ir įklijuoti
beveik viską, todėl tai, ką tai bus aiškinama kaip
yra 3 kartus mažesni nei 1 plius 6, 2 kartus 1 plius 6, 2 kartus 3.
>> Taigi dėl šios priežasties jūs beveik visada wrap viską skliausteliuose.
Bet koks kintamasis, kurį beveik visada wrap skliausteliuose.
Yra atvejų, kur jūs neturite, kaip aš žinau, kad nereikia daryti, kad čia
nes mažiau, nei tai yra beveik visada tik ketina dirbti,
nors tai gali net būti tiesa.
Jei yra kažkas juokinga kaip DOUBLE_MAX (1 == 2),
tada, kad ketina gauti pakeisti 3 kartus mažesni nei 1 lygus, lygus 2,
ir taip, tada tai ketinate daryti 3 kartus mažesni nei 1, kad lygios 2,
kuris yra ne tai, ką norime.
Taigi, siekiant išvengti bet kokių operatorių pirmenybe problemas,
visada wrap skliausteliuose.
Gerai. Ir štai, 5:30.
Jei turite klausimų dėl pset, praneškite mums.
Jis turėtų būti įdomus, ir hakeris leidimas taip pat yra daug realesnis
nei hacker leidimas pernai, todėl tikimės, kad iš jūsų daug išbandyti jį.
Pernai buvo labai didele.
>> [CS50.TV]