[Powered by Google Translate] [Odjeljak 3 - ugodnije]
[Rob Bowden - Sveučilište Harvard]
>> [Ovo je CS50. - CS50.TV]
>> Dakle, prvo pitanje neobično sročen.
GDB omogućuje "debug" program, ali, točnije, što to neka vam je činiti?
Odgovorit ću vam da je jedan, a ja ne znam što točno se očekuje,
pa sam guessing da je to nešto na tragu toga omogućuje vam korak po korak
kroz program, komunicirati s njom, promjena varijable, učiniti sve te stvari -
osnovi potpuno kontrolirati izvršenje programa
i pregledati bilo dano dio izvršenja programa.
Dakle, one značajke omogućuju ispravljanje stvari.
Ok.
Zašto binarno pretraživanje zahtijevaju da polje biti riješeno?
Tko želi odgovoriti na to?
[Student] Jer to ne radi, ako to nije riješeno. >> Da. [Smijeh]
Ako to nije sortiran, onda je nemoguće da ga dijeli na dva dijela
i znam da je sve na lijevoj strani je sve manje i sve desno
veća od srednje vrijednosti.
Dakle, to treba biti riješeno.
Ok.
Zašto je mjehurić vrsta u O iz n kvadrata?
Se bilo tko prvi žele dati vrlo brzo visokoj razini pregled onoga što balon vrsta je?
[Student] Vi zapravo proći kroz svaki element, a vi provjerite prvih nekoliko elemenata.
Ako oni od tamo gdje ih zamijeniti, a zatim provjerite sljedećoj nekoliko elemenata i tako dalje.
Kada dođete do kraja, onda znate da je najveći element koji se nalazi na kraju,
tako da zanemari da je jedan onda držati na ide kroz,
i svaki put morate provjeriti jedan manje elementa dok ne unesete promjene. >> Da.
To se zove mjehur vrsta jer ako flip niz na svojoj strani, tako da je gore i dolje, okomito,
onda velike vrijednosti će potonuti na dno i male vrijednosti će mjehurić do vrha.
To je kako je dobio ime.
I da, samo proći.
Možete zadržati ide kroz polje, zamjene veći vrijednost
dobiti najveće vrijednosti na dnu.
>> Zašto je to O n kvadrata?
Prvo, ne netko želi reći zašto je to O n kvadrat?
[Student] Jer za svaku vožnji to ide n puta.
Vi samo možete biti sigurni da ste uzeli najveći Element dokraja,
onda morate ponoviti onoliko elemenata. >> Da.
Dakle, imajte na umu ono veliko O znači i što velike Omega znači.
Veliki O je kao gornje granice o tome koliko sporo to zapravo može pokrenuti.
Dakle, rekavši da je O od n kvadrata, to nije O n inače će biti u mogućnosti to trčanje
u linearnom vremenu, ali to je O n kockicama
jer je omeđen O n kubu.
Ako je omeđen O iz n kvadrata, onda je omeđen također n kubu.
Dakle, to je n kvadratna, au apsolutnom najgorem slučaju to ne može učiniti bolje od n kvadrata,
što je razlog zašto je O od n na kvadrat.
Dakle, da vidi blagi matematiku na tome da izlazi da se n kvadratna,
ako imamo pet stvari u našem popisu, prvi put koliko swaps bismo mogli potencijalno trebate napraviti
kako bi se to? Ajmo zapravo samo -
Koliko swaps ćemo morati napraviti u prvoj vožnji bubble vrste kroz niz?
[Student] n - 1. >> Da.
>> Ako postoji pet elemenata, mi smo idući u morati napraviti n - 1.
Zatim na drugom jednom koliko swap ćemo morati napraviti?
[Student] n - 2. >> Da.
A treći će biti n - 3, a zatim za praktičnost ću napisati zadnji dvije
kao i onda ćemo morati napraviti dvije zamjene i jedan swap.
Valjda zadnji svibanj ili svibanj zapravo ne treba dogoditi.
Je li zamjena? Ne znam.
Dakle, to su ukupni iznosi swapova ili barem usporedbe morate napraviti.
Čak i ako ne zamijeniti, još uvijek je potrebno usporediti vrijednosti.
Dakle, tu su n - 1 usporedbe u prvoj vožnji kroz niz.
Ako preurediti ove stvari, ajmo zapravo čine ga šest stvari, tako stvari stog gore lijepo,
i onda ću napraviti 3, 2, 1.
Dakle, samo preraspodjela ove svote, želimo vidjeti koliko usporedbe možemo napraviti
u cijelom algoritam.
Dakle, ako vam donosimo ove momke ovdje dolje,
onda smo još uvijek samo zbrajanjem međutim mnoge usporedbe su postojale.
Ali ako ćemo sumirati to, a mi zaključimo to i mi zaključimo to,
to je još uvijek isti problem. Mi samo zbrojiti one posebne skupine.
>> Dakle, sada smo zbrajanjem tri n-a. To je ne samo tri n-a.
Uvijek će biti n / 2 n-a.
Dakle, ovdje mi se dogoditi da imaju šest.
Ako smo imali 10 stvari, onda bismo mogli učiniti ovo grupiranje za pet različitih parova stvarima
, a završiti s n + n + n + N + n.
Dakle, uvijek ćeš dobiti n / 2 n-a, i tako to ćemo ga pribilježiti se da n kvadrat / 2.
I tako, iako je čimbenik poluvremenu, što će se dogoditi da dođe u
zbog činjenice da se kroz svaku iteraciju preko niza ćemo usporediti jedan manje
tako da je, kako smo dobili više od dva, ali to je još uvijek n kvadratna.
Mi ne brinu o konstantnim faktorom od pola.
Dakle, puno velikih O stvari ovako se oslanja na samo vrsta radi ovu vrstu matematike,
radi aritmetičke sume i geometrijski niz stvari,
ali većina od njih u ovom kolegiju su prilično jednostavne.
Ok.
Zašto je umetanje vrsta u Omega od n? Što omega znači?
[Dva učenika govoreći odjednom - nerazumljivih] >> Da.
Omega možete misliti kao donja granica.
>> Dakle, bez obzira na to koliko je učinkovita vaša umetanje vrsta algoritam,
bez obzira na popisu koji je donesen u, to je uvijek usporediti barem n stvari
ili to mora ponoviti više n stvari.
Zašto je to?
[Student] Jer ako je popis već sortiran, zatim kroz prva iteracija
možete samo jamčiti da je prvi element koji je najmanje,
i drugi iteracija možete samo jamčiti prva dva su
jer ne znate da je ostatak popisa je razvrstan. >> Da.
Ako prođe u potpunosti sortirani popisu, barem ćete morati ići preko sve elemente
da se vidi da ništa ne treba biti ganut okolo.
Dakle, prolazeći preko popisa i govori oh, ovo je već razvrstani,
to je nemoguće za vas da znate da je izdvojiti do te provjeriti svaki element
da se vidi da su u sortiraju bi.
Dakle donju granicu unosa vrste je Omega n.
Što je najgore slučaj trčanje vrijeme spajanja vrste,
najgorem slučaju biti veliki O opet?
Dakle, u najgorem slučaju, kako se spajanje vrsta pokrenuti?
[Student] N log n. >> Da.
Najbrži opći sortiranje algoritmi su n log n. Vi ne možete učiniti bolje.
>> Postoje posebni slučajevi, a ako imamo vremena danas - ali mi vjerojatno won't -
mogli smo vidjeti onaj koji radi bolje od n log n.
No, u općem slučaju, ne možete učiniti bolje od n log n.
A spajanje vrsta se događa da se jedan te bi trebao znati za ovo naravno da je n log n.
I tako smo zapravo ćete biti provedbi koja danas.
I konačno, u ne više od tri rečenice, kako ne rade odabir sortiranja?
Da li netko želi odgovoriti, a ja ću brojati svoje kazne
jer ako idete preko 3 -
Se bilo tko sjetiti odabira vrste?
Izbor vrsta je obično prilično lako zapamtiti samo po imenu.
Vi samo ponoviti preko polja, pronaći ono što je najveća vrijednost ili najmanji -
god bi ste sortiranje u.
Pa recimo da smo sortiranje od najmanjih do najvećih.
Možete ponoviti preko polja, u potrazi za bilo minimalna element,
odaberite ga, a zatim ga zamijeniti samo ono što je na prvom mjestu.
A onda na drugom prolazu preko polja, tražiti minimalno elementa opet,
odaberite ga, a zatim ga zamijeniti s onim što je u drugom položaju.
Dakle, mi smo samo branje i odabiru minimalne vrijednosti
te ih umetanjem u prednjem dijelu polja dok se sortiraju.
Pitanja o tome?
>> To neminovno pojaviti u oblicima morate ispuniti kada ste podnošenja pset.
Oni su u osnovi odgovore na njih.
Ok, tako da sada kodiranja problema.
Već sam poslao preko e-maila - Je li netko uopće dobiti taj e-mail? Ok.
Već sam poslao preko e-maila prostor koji ćemo koristiti,
a ako kliknete na moje ime - pa mislim da ću biti na dnu
zbog retrogradne r - ali ako kliknete na moje ime vidjet ćete dvije izmjene.
Revizija 1 će se već sam kopirati i zalijepiti kôd u prostore
za pretraživanje stvar koju će morati provesti.
I Revizija 2 će biti vrsta stvar koja mi provesti nakon toga.
Dakle, možete kliknuti na mom Revizija 1 i raditi od tamo.
A sada želimo provesti binarnog pretraživanja.
>> Se bilo tko želi samo dati pseudocode visokoj razini objašnjenje
od čega ćemo morati napraviti za pretraživanje? Da.
[Student] Ti samo uzmi sredinu polja i vidjeti ako je ono što tražite
manji od onog ili više od toga.
A ako je manje, idete na polovicu da je manje,
a ako je više, možete ići do polovice koja je sve više i li to ponoviti dok ste upravo dobili jednu stvar.
[Bowden] Aha.
Uočite da naš brojevi niz već sortiran,
pa to znači da možemo iskoristiti da i mi prvo mogao provjeriti,
ok, ja sam u potrazi za brojem 50.
Dakle, ja mogu ići u sredini.
Srednji je teško definirati kad je čak i nekoliko stvari,
ali recimo samo da ćemo uvijek izrežite na sredini.
Dakle, ovdje imamo 8 stvari, tako da je srednji će biti 16 godina.
Ja sam u potrazi za 50, pa 50 je veća od 16 godina.
Dakle, sada sam u osnovi može liječiti moju lepezu kao tih elemenata.
Ja mogu baciti sve od 16 više.
Sada mi niz je samo ta četiri elementa, a ja ponavljam.
Pa onda želim pronaći sredinu opet, što će biti 42.
42 je manje od 50, tako da mogu baciti daleko ta dva elementa.
Ovo je moj preostali polje.
Ja ću naći sredinu opet.
Valjda 50 bio loš primjer, jer sam uvijek bio daleko bacanje stvari na lijevoj strani,
ali po istom mjerom, ako sam u potrazi za nečim
i to je manje od elementa Ja trenutno gledam,
onda ću baciti sve na desnoj strani.
Dakle, sada moramo provesti da.
Primijetit ćete da moramo proći u veličini.
Možemo također ne trebaju hard-code veličine.
Dakle, ako smo dobili osloboditi od koji # define -
Ok.
Kako mogu lijepo shvatiti što je veličina brojeva niz trenutno?
>> Koliko su elementi u brojkama niz?
[Student] Brojevi, zagrade,. Dužina?
[Bowden] To ne postoji u C.
Trebate. Duljina.
Polja nemaju svojstva, tako da ne postoji dužina svojstvo polja
samo da će vam dati ma koliko dugo se dogodi da se.
[Student] Vidi koliko memorije ima i podijeliti sa koliko - >> Da.
Dakle, kako možemo vidjeti koliko memorije ima? >> [Student] sizeof. >> Da, sizeof.
Sizeof je operator koji će se vratiti na veličinu brojeva niza.
I to će biti, međutim mnogi prirodni brojevi postoje trenuci veličine cijeli broj
budući da je koliko memorije to je zapravo uzimanje gore.
Dakle, ako želim broj stvari u polju,
onda ću žele podijeliti po veličini cijeli broj.
Ok. Dakle, koji vam omogućuje da prođem u veličini ovdje.
Zašto trebam proći u veličini uopće?
Zašto ne mogu učiniti samo ovdje int size = sizeof (plast) / sizeof (int)?
Zašto to ne rade?
[Student] To nije globalna varijabla.
[Bowden] plastu sijena postoji i mi smo prolazi u brojkama kao plastu sijena,
i to je vrsta nagovještaj onoga što će doći. Da.
[Student] plastu sijena je samo referenca na njega, tako da će se vratiti koliko je velika da referenca.
Da.
Sumnjam u predavanju koje ste vidjeli hrpu još stvarno, zar ne?
Upravo smo razgovarali o tome.
Dakle, stog je mjesto gdje sve svoje varijable će biti pohranjena.
>> Bilo memorije koja se dodjeljuje za lokalne varijable se događa u snopu,
i svaka funkcija dobiva svoj prostor na dimnjak, vlastiti stog okvir je ono što se zove.
Dakle, glavna ima svoj stog okvir, a unutar njega će postojati ovu brojeva niz,
i to će biti od veličine sizeof (brojevi).
To će imati veličinu brojeva podijeljenih po veličini elemenata,
ali da su svi živi u glavnom je stog okvir.
Kad mi zovemo pretraživanje, traži dobiva svoj stack okvir,
vlastiti prostor za pohranu svih svojih lokalnih varijabli.
No ti argumenti - tako plast nije kopija cijelog tog polja.
Mi ne prođe u cijelom nizu kao kopiju u potrazi.
To samo prolazi referencu na tom polju.
Dakle, traži se može pristupiti tim brojeve kroz ovaj referencu.
To je još uvijek pristupa stvari koje žive unutar glavnih je stog okvira,
ali u osnovi, kada smo dobili naputke, koji bi trebao biti uskoro,
to je ono što upućuje se.
Kazaljke su samo reference na stvari, a možete koristiti pokazivače za pristup stvari
koji su u drugim stvarima 'stog okvire.
Dakle, iako je broj lokalnih za glavni, još uvijek možete pristupiti putem ovog pokazivača.
No, budući da je samo pokazivač, a to je samo referenca,
sizeof (plast) samo vraća veličinu referencu sama.
To ne vrati na veličinu stvar to pokazuje da.
To ne vrati stvarnu veličinu brojeva.
I tako to ne ide na posao kao što smo željeli.
>> Pitanja o tome?
Pokazivači će nestati u znatno više krvavoj detalje u tjednima koji dolaze.
I to je razlog zašto puno stvari koje možete vidjeti, većina pretraživanja stvari ili sortiranje stvari,
oni su gotovo svi će morati uzeti stvarnu veličinu polja,
jer u C, nemamo pojma što je veličina polja je.
Morate ručno ga proći u.
I ne možete ručno proći u cijelom nizu jer ste upravo prolazi u odnosu
i to se ne može dobiti veličinu iz referencu.
Ok.
Dakle, sada želimo provesti što je ranije objašnjeno.
Možete raditi na tome za minutu,
i ne morate se brinuti o sve savršeno 100% radi.
Samo napišite do polovine pseudocode za koliko mislite da bi trebao raditi.
Ok.
Nema potrebe da se u potpunosti biti učinjeno s ovim gostiju.
Ali ne bilo tko osjeća ugodno s onim što su dosad,
kao nešto što možemo raditi s zajedno?
Se bilo tko želi volontirati? Ili sam nasumično će pokupiti.
To ne mora biti točno, po svim mjerilima, ali nešto možemo mijenjati u radno stanje.
[Student] Naravno. >> Ok.
Tako možete uštedjeti reviziju klikom na ikonu malo Save.
Ti si Ramya, zar ne? >> [Student] Aha. >> [Bowden] Ok.
Dakle, sada mogu vidjeti vaš reviziju i svatko se može podići reviziju.
A ovdje imamo - Ok.
Dakle Ramya otišao s rekurzivni rješenje, što je svakako vrijedi rješenje.
Postoje dva načina na koje možete napraviti ovaj problem.
Možete to učiniti iterativno ili rekurzivno.
Većina problema možete naići da se može obaviti rekurzivno također može biti učinjeno iterativno.
Dakle, ovdje smo to učinili rekurzivno.
>> Da li netko želi definirati što to znači da funkcija rekurzivna?
[Student] Kada imate funkciju se nazvati
i onda se pozvati dok ona izlazi s točno i istinito. >> Da.
Rekurzivna funkcija je samo funkcija koja se poziva.
Postoje tri velike stvari koje rekurzivna funkcija mora imati.
Prvi je očito, to se zove.
Drugi je osnovni slučaj.
Dakle, u nekom trenutku funkcija treba prestati se zove,
i to je ono baza slučaj je za.
Dakle, ovdje znamo da bismo trebali prestati, trebamo odustati u našoj potrazi
kada početi jednak kraj - i mi ćemo ići preko onoga što to znači.
Ali konačno, posljednja stvar koja je važna za rekurzivnih funkcija:
funkcije nekako mora pristupiti slučaj baze.
Sviđa mi se, ako niste zapravo ažuriranje ništa kada bi drugi rekurzivni poziv,
ako ste doslovno samo da zove funkciju ponovno s istim argumentima
i nema globalne varijable su se promijenile ili ništa,
nikada nećete postići slučaj bazu, u kojem slučaju to je loše.
To će biti beskonačan rekurzije i stog prelijevati.
No, ovdje vidimo da ažuriranje se događa jer smo ažuriranju započeti + kraj / 2,
ažurirat ćemo kraj argument ovdje, ažurirat ćemo početnu argument ovdje.
Tako je u svim rekurzivnim pozivima smo ažuriranja nešto. Ok.
Želite li nas provesti kroz svoje rješenje? >> Naravno.
Ja sam koristeći SearchHelp tako da svaki put kad sam napraviti ovu funkciju poziv
Imam početak gdje sam u potrazi za u polje i kraj
gdje tražim lepezu.
>> Na svakom koraku gdje je rekavši da je srednji element, koji je početak + kraj / 2,
je da jednak onome što tražimo?
A ako je, onda smo ga našli, i mislim da dobiva prošao gore razine rekurzije.
A ako to nije istina, onda smo provjeriti je li to srednja vrijednost niza je prevelika,
u kojem slučaju gledamo na lijevoj polovici niza odlaskom od početka do sredine indeksa.
I inače mi prekidnu polovicu.
[Bowden] Ok.
Zvuči dobro.
Ok, tako par stvari, i zapravo, ovo je vrlo visoka razina stvar
da nikada nećete znati za ovaj tečaj, ali to je istina.
Rekurzivno funkcije, uvijek čuti da su oni loš posao
jer ako rekurzivno nazivati ​​se previše puta, možete dobiti stack overflow
jer, kao što sam rekao prije, svaka funkcija dobiva svoj vlastiti stog okvir.
Dakle, svaki poziv rekurzivne funkcije dobiva svoj vlastiti stog okvir.
Dakle, ako bi 1000 rekurzivnih poziva, možete dobiti 1.000 stog okvire,
i brzo možete voditi da imaju previše stack okviri i stvari samo razbiti.
Dakle, to je razlog zašto rekurzivni funkcije su općenito loše.
No, tu je lijepo podskup rekurzivnih funkcija zove rep-rekurzivnih funkcija,
i to se događa da se primjer jedne gdje ako prevodilac Obavijesti to
i to bi, mislim - u zveka ako prođe to-O2 zastave
onda ćete primijetiti je to rep rekurzivna i napraviti stvari dobro.
>> To će ponovno isti stog okvir iznova i iznova za svaki rekurzivni poziv.
I tako jer ste koristeći istu stog okvir, ne morate brinuti o
ikada stog prelijeva, a istodobno, kao što ste rekli prije,
gdje kada se vratite istina, onda to mora vratiti do svih tih stog okvira
i 10. poziv na SearchHelp mora vratiti na 9., mora se vratiti na 8..
Tako da ne treba da se desi kada su funkcije rep rekurzivna.
I tako ono što čini ova funkcija rep rekurzivna je obavijest da je za bilo koju pozivom na searchHelp
rekurzivna poziva da se to što je ono što je povratka.
Tako je u prvom pozivu na SearchHelp, ili ćemo se odmah vratiti false,
odmah vratiti istina, ili ćemo napraviti rekurzivni poziv SearchHelp
gdje ono što smo povratka je ono što taj poziv se vraća.
I ne možemo to učiniti ako mi je nešto poput int x = SearchHelp, povratka x * 2,
samo su neki slučajni promjena.
>> Dakle, sada je to rekurzivna poziv, ovaj int x = SearchHelp rekurzivni poziv,
više nije rep rekurzivna, jer se zapravo ne mora vratiti
povratak na prethodnu stog okvira, tako da je prethodni poziv na funkciju
onda mogu nešto učiniti s povratnom vrijednosti.
Dakle, ovo nije rep rekurzivna, ali ono što smo imali prije nego što je lijepo rep rekurzivna. Da.
[Student] Ne bi drugi osnovni slučaj biti provjeren prvi
jer bi moglo biti situacija u kojoj kada prođe to argument
ste početi = kraj, ali oni su igla vrijednost.
Pitanje nije možemo izvoditi u slučaju kada na kraju je igla vrijednost
ili početak = kraj, na odgovarajući način, početi = kraj
i niste zapravo provjerio tu određenu vrijednost, ali,
onda početi + kraj / 2 samo će biti iste vrijednosti.
No, već smo se vratili lažna i nikad se nismo zapravo provjeriti vrijednost.
Tako barem, u prvom pozivu, ako je veličina 0, onda želimo vratiti false.
Ali, ako je veličina 1, zatim početak ne ide na ravnopravnoj kraju,
a mi ćemo barem provjeriti jedan element.
Ali mislim da si u pravu da možemo završiti u slučaju kada pokrenete + kraj / 2,
početak završi na isti način kao početak + end / 2,
ali mi nikada zapravo provjerio tog elementa.
>> Dakle, ako smo prvo provjerite je srednji element koji je vrijednost tražimo,
onda možemo odmah vratiti istina.
Jer ako su oni jednaki, onda nema smisla dalje
jer mi smo samo će ažurirati u slučaju kada smo na jednom elementu niza.
Ako je jedan element koji nije jedan tražimo,
onda je sve u redu. Da.
[Student] Stvar je u tome da je od veličine je zapravo veći od broja elemenata u polju,
tu je već pomak - >> Tako će površina -
[Student] Recimo, ako je polje je veličina 0, onda SearchHelp zapravo će provjeriti plast sijena od 0
na prvi poziv.
Niz ima veličinu 0, pa je 0 - >> Da.
Postoji još jedna stvar koja - to bi moglo biti dobro. Razmislimo.
Dakle, ako je polje imao 10 elemenata i srednje jednom ćemo provjeriti je indeks 5,
tako da smo provjeru 5, a recimo da je vrijednost manja.
Dakle, mi smo bacanje sve dalje od 5 nadalje.
Dakle, početi + kraj / 2 će biti naš novi kraj,
pa da, to je uvijek će ostati izvan kraja niza.
Ako je to slučaj, ako je to čak i čudno, onda bismo provjerili, kažu, 4,
ali mi smo još uvijek daleko bacanje -
Tako da, na kraju uvijek će biti izvan stvarnog kraja niza.
Dakle elementima smo s naglaskom na, na kraju uvijek će biti jedan nakon toga.
I tako, ako ne start ikad jednak kraj, mi smo u niz veličina 0.
>> Druga stvar koju sam mislio je da smo osvježavamo početak treba započeti + kraj / 2,
pa to je slučaj da sam poteškoća s, gdje je početak kraja + / 2
je element koji smo provjeru.
Ajmo reći da smo imali ovaj 10-elementa niz. God.
Dakle, početi + kraj / 2 će biti nešto poput ovoga,
a ako to nije vrijednost, recimo želimo ažurirati.
Vrijednost je veća, pa mi želimo da pogledate ovaj polovici niza.
Pa kako smo ažuriranju početak, ažurirat ćemo početi sada biti taj element.
No, to još uvijek može raditi, ili barem, što možete učiniti start + kraj / 2 + 1.
[Student] Ne treba započeti + kraj [nečujno] >> Da.
Već smo provjeriti taj element i znam da to nije onaj tražimo.
Dakle, ne trebamo ažurirati početak da se taj element.
Mi samo možemo ga preskočiti i ažurirati početi da se taj element.
I je li ikada slučaj, recimo, da je to bio kraj,
pa onda započeti će biti ovako, započeti + kraj / 2 će biti ovako,
započeti + kraj - Da, mislim da mogu završiti u beskrajnom rekurzije.
Recimo da je to samo niz veličine 2 ili nizom veličine 1. Mislim da će to raditi.
Dakle, trenutno, start je taj element i na kraju je jedan izvan njega.
Dakle, element koji ćemo provjeriti je li to jedan,
i onda kad smo ažurirali početak, ažurirat ćemo početi da bude 0 + 1/2,
koji će nam završiti natrag s početka se taj element.
>> Tako smo provjeru istog elementa iznova i iznova.
Dakle, ovo je slučaj gdje je svaki rekurzivni poziv zapravo mora ažurirati nešto.
Dakle, trebamo učiniti start + end / 2 + 1, ili pak postoji slučaj
gdje nismo zapravo ažuriranja početak.
Svatko vidi da?
Ok.
Ima li netko pitanja o ovoj otopini ili bilo više komentare?
Ok. Se bilo tko imati rješenje iterativnog da svi možemo pogledati?
Jesmo li svi to učiniti rekurzivno?
Ili također mislim ako njezin otvorena, onda možda ćete morati zanemariti svoju prethodnu jednom.
Da li to automatski spremiti? Nisam pozitivno.
Se bilo tko imati iterativni?
Možemo hodati kroz njega zajedno, ako ne.
Ideja će biti isti.
Iterativne rješenje.
Mi ćemo htjeti osnovi učiniti istu ideju
gdje želimo pratiti nove kraju niza i novi početak niza
i to iznova i iznova.
A ako je ono što smo praćenje kao početak i kraj ikad sijeku,
onda ga nismo pronašli, a možemo se vratiti false.
Pa kako ću to učiniti? Svatko ima prijedloge ili koda za mene podići?
[Student] Do while petlja. >> Da.
Ti si idući u ištanje to napraviti petlju.
>> Jeste li imali kod sam mogao podići, ili ono što si htio sugerirati?
[Student] Mislim da je tako. >> Redu. To čini stvari lakše. Što je vaše ime?
[Student] Lucas.
Revizija 1. Ok.
Slaba je ono što smo nazvali početi prije.
Gore nije baš ono što smo nazvali kraj prije.
Zapravo, na kraju je sada u polju. To je element koji bi trebali uzeti u obzir.
Tako nisko je 0, gore je veličina polja - 1,
a sada smo petlje, a mi smo provjeru -
Pretpostavljam da možete hodati kroz njega.
Što je vaše razmišljanje kroz to? Nas Šetnja kroz kodu.
[Student] Naravno. Pogledajte plastu sijena vrijednosti u sredini i usporedite ga iglom.
Dakle, ako je veći od vašeg igle, onda želite - Oh, zapravo, da bi trebao biti unatrag.
Ti si idući u ištanje to baciti desnu polovicu, pa da, to bi trebao biti način.
[Bowden] Dakle, to bi trebalo biti manje? Je li to ono što je rekao? >> [Student] Aha.
[Bowden] Ok. Manje.
Dakle, ako je ono što gledamo je manje od onoga što želimo,
onda da, želimo baciti lijevu polovicu,
što znači da smo ažuriranju sve smo s obzirom na
pomicanjem nisko na desno od polja.
Ovo izgleda dobro.
Mislim da ima isti problem da mi je rekao na prethodni mjesec,
gdje ako je niska razina 0 i do 1, a zatim niska + gore / 2 ide postaviti da se ista stvar ponovo.
>> A čak i ako to nije slučaj, to je još uvijek učinkovitija u najmanju ruku
jednostavno odbaciti element smo samo gledali što znamo je pogrešno.
Tako niska + gore / 2 + 1 - >> [student] To bi trebao biti drugi način.
[Bowden] Ili to treba biti - 1, a drugi bi trebao biti + 1.
[Student] I tu bi trebala biti dvostruka znaka jednakosti. >> [Bowden] Aha.
[Student] Aha.
Ok.
I na kraju, da sada imamo tu + 1 do 1 stvar,
je to - to ne može biti - je li to ikad moguće za niske završiti s vrijednošću većom od gore?
Mislim jedini način da se može dogoditi - Je li to moguće? >> [Student] ne znam.
Ali, ako to dobiva skraćen, a zatim dobiva minus da jedan i onda - >> Da.
[Student] To bi eventualno dobili messed up.
Mislim da bi trebao biti dobar samo zato
za to završiti niža morali bi biti jednaki, mislim.
No, ako su jednaki, onda mi ne bi učinio while petlja za početak
a mi bi samo vratili vrijednost. Dakle, mislim da smo dobro sada.
Primijetit ćete da iako je ovaj problem više nije rekurzivna,
Ista vrsta ideja primijeniti gdje možemo vidjeti kako se to tako lako dade
na rekurzivni rješenje po činjenici da smo samo ažuriranje indeksa iznova i iznova,
činimo Problem manji i manji, usredotočili smo se na podskup polja.
[Student] Ako je niska je 0 i do 1, oni će oboje biti 0 + 1/2, koja će ići na 0,
i onda će biti + 1, jedan će biti - 1.
[Student] Gdje smo provjeru jednakosti?
Kao i ako sredini je zapravo igla?
Mi trenutno ne radi? Oh!
Ako it's -
Da. Ne možemo samo napraviti test ovdje dolje, jer recimo prvi sredini -
[Student] To je zapravo sviđa ne bacaju vezan.
Dakle, ako ste baciti vezan, morate ga prvo provjerite ili što god.
Ah. Da. >> [Student] Aha.
Dakle, sada smo bačeni na jednom smo trenutno pogledao,
što znači da sada treba također imati
ako (plast [(niska + gore) / 2] == igla), onda se možemo vratiti istina.
I da li sam stavio drugi ili samo ako, to znači doslovno istu stvar
jer bi to vratilo istina.
Dakle, ja ću staviti još ako, ali to ne smeta.
>> Dakle, još ako je to, ostalo je ovo, i to je uobičajena stvar sam učiniti
gdje, čak i ako je to slučaj u kojem je sve dobro ovdje,
kao niska nikada ne može biti veći od gore, to nije vrijedno razmišljanja o tome da li je to istina.
Tako da se može, kao i reći dok niska je manja od ili jednaka
ili dok niska je manje od
pa ako su ikada jednaka ili niske dogodi proći gore,
onda možemo pobjeći iz ove petlje.
Pitanja, problemi, komentari?
Ok. Ovo izgleda dobro.
Sada želimo učiniti vrsta.
Ako ćemo ići na moj drugi revizije, vidimo iste brojeve,
ali sada više nisu u sortiraju bi.
I mi želimo provesti neku korištenja bilo algoritam u O n log n.
Dakle, koje algoritam ne mislite da bismo trebali provesti ovdje? >> [Student] Spajanje vrsta.
[Bowden] Aha. Spoji vrsta je O (n log n), tako da je ono što ćemo učiniti.
I problem će biti prilično slično,
gdje se lako dade na rekurzivni rješenje.
Mi također može doći do iterativnog rješenja, ako želimo,
ali rekurzije će biti lakše ovdje i mi trebali učiniti rekurzija.
Pretpostavljam da ćemo kroz spajanje sortiraj prvi,
iako je lijep video na spajanje kakve već. [Smijeh]
Dakle spojiti kakve postoje - ja gubit toliko ovoga rada.
Oh, tamo je samo jedan lijevo.
Dakle spojiti.
O, 1, 3, 5.
Ok.
Spajanje traje dva odvojena polja.
Pojedinačno ta dva polja su oba razvrstani.
Dakle, ovo polje, 1, 3, 5, sortirati. Ovo polje, 0, 2, 4, sortirati.
Sada ono spajanje treba učiniti je kombinirati ih u jedan niz koji je sama sortiraju.
Dakle, želimo niz veličine 6 koja će imati ove elemente unutar nje
u sortiraju bi.
>> I tako možemo iskoristiti činjenicu da su ta dva polja razvrstanih
to učiniti u linearnom vremenu,
linearni vremenski smisao ako je to polje je veličine x, a to je veličina y,
tada je ukupni algoritam treba biti O (x + y). Ok.
Dakle, prijedlozi.
[Student] Možemo početi s lijeve strane?
Tako ćete staviti 0 dolje, a zatim 1 i onda ovdje ste na dva.
Dakle, to je vrsta kao što imate karticu koja se kreće na desno. >> [Bowden] Aha.
Za oba polja, ako smo samo usredotočiti na lijevom elementa.
Budući da su oba polja razvrstani, znamo da su ove dvije elementi
su najmanji elementi u oba polja.
Dakle, to znači da je jedan od tih dvaju elemenata mora biti najmanji element u našem spojeni niz.
To samo tako dogodi da najmanji je jedan na desnoj ovom trenutku.
Dakle, uzmemo 0, umetnite ga na lijevoj strani, jer je 0 manje od 1,
tako da se 0, umetnite ga u našoj prvoj poziciji, a onda ćemo ažurirati ovaj
do sada usredotočiti na prvi element.
I sada smo ponoviti.
Dakle, sada smo usporediti dva i jedan. 1 je manji, pa ćemo umetnuti jedan.
Mi ažurirati ovu pokazivač ukazati na ovim tipom.
Sada smo to učiniti opet, pa dva. To će se ažurirati, usporedite ove dvije, tri.
Ova ažuriranja, a zatim četiri i pet.
Tako da je spajanje.
>> To bi trebao biti prilično očito da je to linearno vrijeme jer smo samo ići preko svakom elementu jednom.
I to je najveći korak prema provedbi spajanja vrsta je to.
I to nije tako teško.
Prije nekoliko stvari koje treba brinuti je recimo bili smo spajanjem 1, 2, 3, 4, 5, 6.
U tom slučaju možemo završiti u scenariju u kojem je ovo jedna će biti manja,
onda ćemo ažurirati ovaj pokazivač, ovo će biti manji, ažurirati ovaj,
ovaj je manji, a sada morate priznati
kada ste zapravo ponestane elemenata za usporedbu.
Budući da smo već koristili ovaj cijeli niz,
sve na ovom polju sada je samo umetnuta u ovdje.
Dakle, ako mi ikada naiđete na mjestu gdje je jedan od naših polja potpuno je spojio već,
onda mi samo uzeti sve elemente drugog niza i stavite ih na kraju niza.
Dakle, mi samo možemo umetnuti 4, 5, 6. Ok.
To je jedna stvar koju treba paziti.
Implementacija koji bi trebao biti korak 1.
Spoji sortirati onda na temelju toga, to je dva koraka, dva glup koraci.
Ajmo dati ovaj niz.
Dakle spojiti vrsta, korak 1 je rekurzivno razbiti niz na polovice.
Dakle podijeliti ovaj niz na polovice.
Mi sada imamo 4, 15, 16, 50 i 8, 23, 42, 108.
A sada smo to učiniti opet smo podijeljeni to na polovice.
Jednostavno ću to učiniti na ovoj strani.
Dakle 4, 15 i 16, 50.
Želimo učiniti istu stvar ovdje.
I sada smo ga podijeliti na polovice opet.
I mi imamo 4, 15, 16, 50.
Tako da je naša baza slučaj.
Nakon što su polja su veličine 1, onda ćemo prestati s podjelom na polovice.
>> Sada što ćemo učiniti s tim?
Mi završiti to će također razbiti u 8, 23, 42, i 108.
Dakle, sada da smo u ovom trenutku, sada korak dva od spajanja kakve samo spajanjem parova na popisima.
Dakle, želimo spajanje tih. Mi samo zovi spojiti.
Znamo pisma će se vratiti ih u sortiraju bi.
4, 15.
Sada želimo spojiti njih, i da će se vratiti popis s onima u sortiraju bi,
16, 50.
Mi spojiti one - Ja ne mogu pisati - 8, 23 i 42, 108.
Dakle, imamo spojene para odjednom.
Sada mi samo spojiti ponovno.
Primijetite da svaka od tih lista je razvrstani u sebi,
i onda mi samo možemo spojiti ove liste da biste dobili popis veličine 4 koji je sortiran
i spajanje ove dvije liste da biste dobili popis veličine 4 koji je sortiran.
I na kraju, možemo spojiti te dvije liste veličine 4 dobiti jedan popis veličine 8 koji je sortiran.
Dakle, da se vidi da je to ukupna n log n, što smo već vidjeli da pisma je linearna,
pa kad smo koja se bavi spajanjem tih, pa kao ukupni trošak spajanja
za ova dva popisa je samo dva, jer -
Ili dobro, to je O n, ali n ovdje je samo ta dva elementa, tako da je dvoje.
A ovo dvoje će biti dva i to dva će biti dva i to dva će biti 2,
pa preko svih spaja da trebamo učiniti, mi završiti radi n.
Kao 2 + 2 + 2 + 2 8, što je n,
tako da trošak spajanja u ovom setu je n.
I onda ista stvar ovdje.
Mi ćemo spojiti ove dvije, onda ti 2, a pojedinačno je ovo spajanje neće potrajati četiri operacije,
ova pisma će potrajati četiri operacije, ali opet, između svih njih,
smo završili spajanje n ukupno stvari, pa je ovaj korak ima n.
I tako svaki stupanj traje n elemenata se spojili.
>> A koliko razina postoje?
Na svakoj razini, naš niz raste po veličini dva.
Ovdje su naši polja su veličine 1, ovdje su veličine 2, ovdje su veličine 4,
i na kraju, oni veličine 8.
Dakle, budući da je udvostručenje, tu će biti ukupno log n od tih razina.
Dakle, s log n razina, svaka razina pojedinca uzimanje n ukupno poslovanje,
smo dobili n log n algoritam.
Pitanja?
Jeste ljudi već je napredak na tome kako implementirati ovo?
Je li itko već u stanju u kojem ja mogu samo podići svoj kod?
Ja mogu dati minutu.
Ovaj jedan će biti više.
Ja visoko preporučiti ponavljati -
Vi ne morate učiniti rekurzija za spajanje
jer to rekurzija za spajanje, ti si idući u morati proći hrpu različitih veličina.
Možete, ali to je neugodno.
Ali rekurzije za kakve sama je prilično jednostavan.
Vi samo doslovno nazvati vrsta na lijevoj polovici, sortiranje na desnoj polovici. Ok.
Svatko ima nešto ja mogu podići još?
Inače ću dati minutu.
Ok.
Svatko ima nešto što možemo raditi s?
Inače ćemo samo raditi s ovim, a zatim proširiti od tamo.
>> Svatko ima više od toga da ja mogu podići?
[Student] Aha. Možete podići minu. >> Redu.
Da!
[Student] Bilo je puno uvjeta. >> Oh, pucati. Može li -
[Student] Moram ga spasiti. >> Da.
Tako smo činio spajanje odvojeno.
Oh, ali to nije tako loše.
Ok.
Dakle, svojevrsna je sama samo zove mergeSortHelp.
Objasnite nam što mergeSortHelp radi.
[Student] MergeSortHelp prilično puno radi na dva glavna koraka,
koja je sortirati svaki polovicu polja, a zatim spojiti oboje.
[Bowden] Ok, tako da će mi dati drugi.
Mislim da je ovo - >> [student] trebam -
Da. Ja sam nešto nedostaje.
U spajanja, shvatio sam da moram stvoriti novi niz
jer ja ne mogu to učiniti na mjestu. >> Da. Vi ne možete. Ispravite.
[Student] Tako sam stvoriti novi niz.
Zaboravio sam na kraju spojiti na ponovno promijeniti.
Ok. Potreban nam je novi niz.
U spajanja vrste, to je gotovo uvijek točno.
Dio troškova boljeg algoritma vrijeme-mudar
je gotovo uvijek trebaju koristiti malo više memorije.
Dakle, ovdje, bez obzira koliko ti spojiti vrsta,
vi bi neizbježno morati koristiti neke dodatne memorije.
On ili ona je stvorio novi niz.
I onda reći na kraju samo trebamo kopirati novi niz u izvornom polju.
[Student] Mislim da je tako, da.
Ja ne znam da li radi u smislu računajući pozivom ili bilo što drugo -
Da, to će raditi. >> [Student] Ok.
Jeste li probati trčanje to? >> [Student] Ne, ne još. >> Ok.
Pokušajte ga izvodi, a onda ću razgovarati o tome za drugi.
[Student] moram imati sve funkcije prototipova i sve, zar ne?
Funkcija prototipovi. Oh, misliš kao - Da.
Sortiraj zove mergeSortHelp.
>> Dakle, kako bi za sortiranje na poziv mergeSortHelp, mergeSortHelp moraju ili su definirane
prije sortiraj ili samo trebamo prototip. Dovoljno je kopirati i zalijepiti da.
I slično, mergeSortHelp zove pisma,
ali pisma nije definirano, pa možemo samo neka mergeSortHelp znati
da to je ono pismo će izgledati, i to je to.
Dakle mergeSortHelp.
Imamo problem ovdje gdje nemamo osnovni slučaj.
MergeSortHelp je rekurzivna, tako da bilo rekurzivna funkcija
će trebati nekakvu bazu slučaju znati kada prestati rekurzivno se poziva.
Što je naša baza slučaj će ovdje biti? Da.
[Student] Ako je veličina jednog? >> [Bowden] Da.
Dakle, kao što smo vidjeli tamo, prestali smo cijepanje polja
kad smo ušli u polja veličine 1, koji su neizbježno se sortiraju.
Dakle, ako veličina jednaka 1, znamo niz već sortiran,
pa mi samo možemo vratiti.
>> Primijetit ćete da je praznina, tako da mi ne vrati ništa posebno, samo smo se vratili.
Ok. Dakle, to je naša baza slučaj.
Pretpostavljam da naš osnovni scenarij bi također mogao biti ako mi se dogoditi da se spajanjem niz veličine 0,
smo vjerojatno želite da se zaustavi u nekom trenutku,
pa mi samo možemo reći veličinu manje od 2 ili manje od ili jednako 1
tako da će to raditi za bilo niz sada.
Ok.
Dakle, to je naša baza slučaj.
Sada ne želite da nas kroz spajanja?
Što svi ti slučajevi znače?
Ovdje gore, mi samo radimo istu ideju, -
[Student] Moram se prolazi veličine sa svim mergeSortHelp pozive.
Dodao sam veličinu kao dodatni primarna i da to ne postoji, kao što su veličina / 2.
[Bowden] Oh, veličina / 2, površina / 2. >> [Student] Da, i također u gore funkciju kao dobro.
[Bowden] Ovdje? >> [Student] Samo veličina. >> [Bowden] Aha. Veličina, veličina? >> [Student] Aha.
[Bowden] Ok.
Dopustite mi da mislim na drugi.
Ne bježimo u pitanju?
Mi smo uvijek liječenju lijevo kao 0. >> [Student] Ne
To je u redu previše. Oprostite. To bi trebao biti početak. Da.
[Bowden] Ok. Sviđa mi se to bolje.
I kraj. Ok.
Dakle, sada želite da nas kroz spajanja? >> [Student] Ok.
Ja sam samo hodanje kroz ovaj novi niz koji sam stvorio.
Njegova veličina je veličina dijela polja da želimo biti razvrstani
i pokušava pronaći element koji sam trebala staviti u novi niz koraka.
Pa za to, prvo sam ček ako lijeva polovica niz nastavlja imati bilo više elemenata,
a ako se to ne dogodi, onda ići dolje na tom drugom stanju, što samo govori
ok, to mora biti u pravom niz, a mi ćemo to staviti u trenutnoj indeksa newArray.
>> A onda na neki drugi način, ja sam ček ako desnoj strani polja također je završio,
u kojem slučaju ja samo staviti u lijevo.
To zapravo ne bi moglo biti potrebno. Nisam siguran.
Ali svejedno, ostale dvije ček koji od dva su manji u lijevo ili desno.
I također u svakom slučaju, ja sam povećavanjem god rezervirano sam povećavati.
[Bowden] Ok.
To izgleda dobro.
Se bilo tko imati komentare ili nedoumica ili pitanja?
Dakle, u četiri slučaja koje moramo donijeti stvari u biti samo - ili to izgleda kao pet -
ali moramo uzeti u obzir da li lijevo polje je ponestalo stvari koje treba spojiti,
li pravo polje je ponestalo stvari moramo spojiti -
Ja sam pokazujući na ništa.
Dakle, da li lijevo polje je ponestalo stvari ili desno polje je ponestalo stvari.
Oni su dva slučaja.
Mi također trebaju trivijalan slučaj li lijevo stvar je manje nego pravu stvar.
Tada želimo izabrati lijevu stvar.
Oni su slučajevi.
Dakle, ovo je pravo, tako da je to.
Array lijevo. To je 1, 2, 3. Ok. Tako da, oni su četiri stvari koje možda želite učiniti.
I nećemo ići preko iterativno rješenje.
Ja ne bih preporučio -
Spoji vrsta je primjer funkcije koja je, kako se ne rep rekurzivna,
to nije lako napraviti to rep rekurzivna,
ali to nije vrlo lako napraviti to iterativan.
To je vrlo jednostavno.
Ova provedba spajanja vrste,
pisama, bez obzira što radite, idete izgraditi spajanje.
>> Dakle spojiti vrsta izgrađen na vrhu spajanja rekurzivno je samo ove tri linije.
Iterativno, to je više neugodno i teže da razmišljaju o tome.
Ali primijetite da to nije rep rekurzivna jer mergeSortHelp - kada sebe naziva -
to još uvijek treba raditi stvari nakon toga rekurzivnih poziva povrataka.
Dakle, ovo okvir stog mora nastaviti postojati čak i nakon pozivanja to.
I onda kada se to nazivamo, okvir stog mora nastaviti postojati
jer čak i nakon tog razgovora, još uvijek je potrebno spojiti.
I to je Netrivijalno da bi ovaj rep rekurzivna.
Pitanja?
U redu.
Dakle, ide natrag za sortiranje - Oh, postoje dvije stvari koje želim pokazati. Ok.
Vraćajući se vrsta, mi ćemo to učiniti brzo.
Ili traži. Sortiraj? Sortiraj. Da.
Vraćajući se na početke vrste.
Želimo stvoriti algoritam koji sortira array koristeći bilo algoritam
u O iz n.
Pa kako je to moguće? Se bilo tko imati bilo kakve -
Ja natuknuo prije na -
Ako smo oko poboljšanja od n log n na O od n,
smo poboljšali našu algoritam vrijeme-mudar,
što znači ono što ćemo morati učiniti da bi se za to?
[Student] Space. >> Da. Mi ćemo biti koristeći više prostora.
A nije ni samo više prostora, to je eksponencijalno više prostora.
Dakle, mislim da je ova vrsta algoritma je pseudo nešto, pseudo polinom -
pseudo - ja ne mogu sjetiti. Pseudo nešto.
Ali to je zato što mi je potrebno koristiti toliko prostora
da je to ostvarivo, ali nije realno.
>> I kako smo to postigli?
Možemo postići ako možemo jamčiti da će bilo koji određeni element u niz
je ispod određene veličine.
Dakle, neka je samo reći da je veličina 200,
bilo je element u niz ispod veličine 200.
I to je zapravo vrlo realna.
Možete vrlo lako imati niz da znate sve što je u njemu
će biti manje od nekog broja.
Kao i ako imate neke apsolutno masivan vektor ili nešto
ali znate sve će biti između 0 i 5,
onda će to biti znatno brže to učiniti.
, A vezani na bilo koji od elemenata 5,
pa to bound, to je koliko memorije ti si idući u biti koristeći.
Dakle, vezan je 200.
U teoriji je uvijek vezan jer cijeli može biti samo do 4000000000,
ali to je nerealno jer tada ćemo biti koristeći prostor
po nalogu 4000000000. Tako da je nerealno.
No, ovdje ćemo reći da je naša vezan je 200.
Trik kako to rade u O iz n je možemo napraviti još niz naziva grofovi veličine OBVEZU.
Tako zapravo, to je prečac za - ja zapravo ne znam da li jeka to.
No, u GCC-u najmanju ruku - Žao pretpostavku zveka to čini previše -
to će samo inicijalizirati cijelu lepezu biti 0s.
Dakle, ako ne želim to učiniti, onda sam odvojeno mogao učiniti za (int i = 0;
ja <bound; ja + +) i broji [i] = 0;
Dakle, sada je sve inicijalizirane na 0.
Ja iteraciju preko moje polje,
i što radim je sam brojanja svake - Idemo ovamo.
Imamo 4, 15, 16, 50, 8, 23, 42, 108.
Što Brojim je broj pojavljivanja svakog od tih elemenata.
Ajmo zapravo dodati par više ovdje s nekim ponavlja.
Dakle, vrijednost imamo ovdje, vrijednost koja će biti niz [i].
Dakle, Val mogao biti 4 ili 8 ili bilo što drugo.
I sada sam računajući koliko te vrijednosti koje sam vidio,
pa broji [val] + +;
Nakon što je to učinio, broji će izgledati nešto poput 0001.
Učinimo broji [val] - OBVEZU + 1.
>> Sada je samo na račun za činjenicu da smo počevši od 0.
Dakle, ako 200 će biti naš najveći broj,
zatim 0-200 je 201 stvari.
Dakle točaka, to će izgledati kao 00.001, jer imamo jedan 4.
Tada ćemo imati 0001 gdje ćemo imati jedan u 8. indeksa računati.
Mi ćemo imati dva u 23. indeksa računati.
Mi ćemo imati dva u 42. indeksa računati.
Dakle, možemo koristiti računati.
Dakle num_of_item = broji [i].
I tako, ako num_of_item je 2, to znači da želimo umetnuti dva broja i.
u našoj sortirani niz.
Dakle, moramo pratiti koliko smo u polju.
Dakle, indeks = 0.
Array - samo ću ga napisati.
Broji -
Niz [indeks + +] = i;
Je li to ono što želim? Mislim da je to ono što ja želim.
Da, to izgleda dobro. Ok.
Dakle, ne svatko razumije ono što je svrha mog broji niz je?
To je računajući broj pojavljivanja svakog od tih brojeva.
Tada sam Ponavljanje preko koje broji niz,
i ith položaj u broji niz
je broj i to bi se trebao pojaviti u mom sortirani niz.
To je razlog zašto grofovi 4 će biti jedan
i grofovi 8 će biti 1, grofovi 23 će biti dva.
Dakle, to je kako su mnogi od njih želim umetnuti u mom sortirani niz.
Onda sam to učiniti.
Ja sam umetanja num_of_item sam je u mojoj sortirani niz.
>> Pitanja?
I tako opet, ovo je linearno vrijeme jer smo tek Ponavljanje preko ovaj put,
ali to je također linearno u ono što taj broj se dogoditi da bude,
i tako to jako ovisi o tome što vaš je ograda.
Uz vezan za 200, to nije tako loše.
Ako je vaš vezan će biti 10.000, onda je to malo lošije,
ali ako vaš vezan će biti 4000000000, to je potpuno nerealno
i to polje će morati biti veličine 4 milijarde, što je nerealno.
Dakle, to je to. Pitanja?
[Nečujno učenik odgovor] >> Ok.
Shvatio sam jednu drugu stvar, kada smo bili prolazi kroz.
Mislim da je problem bio u Lucas-a i vjerojatno svi do jednog smo vidjeli.
Bio sam potpuno zaboravio.
Jedino što sam htio komentirati je da kada ste se bave stvarima poput indeksa,
nikad stvarno vidi to kada pišete za petlju,
ali tehnički, kad god se bave tim pokazateljima,
trebali prilično puno uvijek nositi sa nepoznate brojeva.
Razlog za to je kada ste se bave potpisanih brojeva,
pa ako imate dvije potpisane prirodna broja i dodajte ih zajedno
i oni završiti prevelika, onda ćete završiti s negativnim brojem.
Dakle, to je ono što cijeli prelijevati je.
>> Ako sam dodati dvije milijarde i jedne milijarde, ja završiti s negativnim jedne milijarde.
To je kako integeri raditi na računalima.
Dakle, problem s korištenjem -
To je u redu, osim ako niska dogodi da se dvije milijarde i gore dogodi da se 1 milijarda,
onda će to biti negativan jedne milijarde, a onda ćemo podijeliti da dvije
, a završiti s negativnim 500 milijuna.
Dakle, to je samo pitanje, ako vam se dogoditi da se u potrazi kroz niz
od milijarde stvari.
No, ako niska + do dogodi do prelijevanja, onda je to problem.
Čim smo ih nepotpisani, zatim 2000000000 plus 1 milijarde 3000000000.
3000000000 podijeljena dva je 1,5 milijardi eura.
Dakle, čim oni nepotpisani, sve je savršeno.
I tako to je također problem kada pišete vaš za petlje,
i zapravo, vjerojatno to čini automatski.
To će zapravo samo vikati na tebe.
Dakle, ako je taj broj prevelik da se u samo cijeli broj, ali to bi se uklopiti u nepotpisani cijeli,
to će vikati na vas, tako da je razlog zašto se nikada stvarno pokrenuti u pitanju.
Možete vidjeti da je indeks nikada neće biti negativan,
pa kad si Ponavljanje preko polja,
možete gotovo uvijek reći nepotpisani int i, ali ne stvarno morati.
Stvari idu na posao prilično jednako dobro.
Ok. [Šapuće] Što je to vrijeme?
Zadnja stvar koju sam htio pokazati - a ja ću samo to učiniti jako brzo.
Vi znate kako smo # define smo tako da smo # može definirati kao MAX 5 ili nešto?
Nemojmo raditi MAX. # Define OBVEZU kao 200. To je ono što smo učinili prije.
To definira konstantu, koja je upravo će se kopirati i zalijepiti
gdje god mi se dogoditi da napiše OBVEZU.
>> Dakle, mi zapravo može učiniti više s # definira.
Mi # mogu definirati funkcije.
Oni zapravo ne funkcionira, ali mi ćemo ih nazvati funkcije.
Primjer bi bio nešto poput MAX (x, y) je definiran kao (x <y y:? X). Ok.
Dakle, trebali naviknuti na ternarni operatera sintakse,
ali je x manji od y? Povratak y, drugi povratak x.
Tako možete vidjeti što mogu napraviti ovu posebnu funkciju,
i funkcija mogla biti kao bool MAX traje dva argumente, ovo vratiti.
Ovo je jedan od najčešćih one vidim učinio ovako. Zovemo ih makroi.
To je makro.
Ovo je samo sintaksa za to.
Možete pisati makronaredbe raditi što god želite.
Vi često vidjeti makronaredbe za ispravljanje pogrešaka printfs i stvari.
Dakle tipa printf, postoje posebni konstante u C kao donja LINE naglašavaju,
2 podvlači LINE naglašavaju,
a tu je i mislim dva naglašava FUNC. To bi moglo biti to. Nešto poput toga.
Te stvari će biti zamijenjena sa imenom funkcije
ili broj linija koje ste na.
Često ste napisali za ispravljanje pogrešaka printfs da ovdje dolje sam tada mogao samo napisati
Ispravljanje i ona će se ispisati linije broj i funkciju da sam se dogoditi da se u
da je naišao taj Debug izjavu.
A također možete ispisati druge stvari.
Dakle, jedna stvar koju treba paziti je ako sam se dogoditi da # define DOUBLE_MAX
kao nešto poput 2 * y i 2 * x.
Dakle, za bilo kojeg razloga, možete se dogoditi da to puno.
Dakle, čine ga makro.
To je zapravo slomljena.
Ja bih ga nazvati po nešto nalik DOUBLE_MAX (3, 6).
Pa što bi trebao biti vraćen?
[Student] 12.
Da, 12 bi trebalo biti vraćeno, a 12 se vratio.
3 dobiva zamijeniti za x, 6 dobiva zamijeniti za y, a mi vratiti 2 * 6, koji je 12.
Sada ono što o tome? Što treba vratiti?
[Student] 14. >> Idealnom slučaju, 14.
Pitanje je da kako hash definira rad, sjetite se da je doslovni kopirati i zalijepiti
od ljepušan velik dio sve, tako što će se to može tumačiti kao
je 3 manje od jedan plus šest, dva puta jedan plus šest, dva puta tri.
>> Dakle, iz tog razloga što je gotovo uvijek završiti sve što je u zagradama.
Svaka varijabla ste gotovo uvijek završiti u zagradama.
Postoje slučajevi gdje se ne moraju, kao što znam da ne trebam učiniti da se ovdje
jer manje nego što je prilično puno uvijek samo ide na posao,
iako to nije ni moglo biti istina.
Ako postoji nešto smiješno kao DOUBLE_MAX (1 == 2),
tada će se zamijeniti s tri manje od 1 jednaka jednaka 2,
pa onda će to učiniti tri manje od jedan, ne da jednaka 2,
koji nije ono što želimo.
Dakle, kako bi se spriječilo bilo operatera prednost problema,
Uvijek zamotajte u zagradama.
Ok. I to je to, 5:30.
Ako imate bilo kakvih pitanja o pset, javite nam.
To bi trebao biti zabavno, a haker izdanje također je puno realnija
od hakera izdanju prošle godine, pa se nadamo da puno od vas to probati.
Prošle godine je bila vrlo velika.
>> [CS50.TV]