1 00:00:00,000 --> 00:00:02,640 [Powered by Google Translate] [Seminaras: Techniniai Interviu] 2 00:00:02,640 --> 00:00:04,630 [Kenny J., Harvardo universitetas] 3 00:00:04,630 --> 00:00:08,910 [Tai CS50.] [CS50.TV] 4 00:00:08,910 --> 00:00:12,420 Hi everyone, Aš esu Kenny. Aš šiuo metu jaunesnysis studijuoja kompiuterių mokslas. 5 00:00:12,420 --> 00:00:17,310 Aš esu buvęs CS TF, ir aš noriu, aš turėjo tai, kai buvau antro kurso, 6 00:00:17,310 --> 00:00:19,380 ir tai, kodėl aš šį seminarą. 7 00:00:19,380 --> 00:00:21,370 Taigi, aš tikiuosi, kad jums patiks jį. 8 00:00:21,370 --> 00:00:23,470 Šis seminaras yra apie technines interviu, 9 00:00:23,470 --> 00:00:26,650 ir visi mano išteklius galima rasti šią nuorodą, 10 00:00:26,650 --> 00:00:32,350 šią nuorodą čia, išteklių pora. 11 00:00:32,350 --> 00:00:36,550 Todėl aš padariau problemų sąrašą, iš tikrųjų, nemažai problemų. 12 00:00:36,550 --> 00:00:40,800 Taip pat bendras ištekliai puslapis, kur mes galime rasti patarimų 13 00:00:40,800 --> 00:00:42,870 apie tai, kaip pasirengti pokalbiui, 14 00:00:42,870 --> 00:00:46,470 patarimų apie tai, ką jums reikia padaryti per faktinė interviu, 15 00:00:46,470 --> 00:00:51,910 taip pat, kaip spręsti problemas ir išteklius ateičiai. 16 00:00:51,910 --> 00:00:53,980 Tai viskas online. 17 00:00:53,980 --> 00:00:58,290 Ir tiesiog parašyti įžangą Šiame seminare Atsakomybės apribojimas 18 00:00:58,290 --> 00:01:00,690 kaip tai neturėtų - savo interviu rengimą 19 00:01:00,690 --> 00:01:02,800 neturėtų būti ribojamas į šį sąrašą. 20 00:01:02,800 --> 00:01:04,750 Tai tik reiškia būti vadovas, 21 00:01:04,750 --> 00:01:08,890 ir jums tikrai turėtų viską, ką sakau su druskos grūdų, 22 00:01:08,890 --> 00:01:14,620 bet taip pat naudoti viską, ką aš naudojamas, siekiant padėti jums jūsų interviu rengimo. 23 00:01:14,620 --> 00:01:16,400 >> Aš ruošiuosi pagreitinti per ateinančius keletą skaidrių 24 00:01:16,400 --> 00:01:18,650 todėl mes galime gauti į faktinę atvejų tyrimus. 25 00:01:18,650 --> 00:01:23,630 Programinės įrangos inžinerijos tikroje padėtyje interviu struktūra, 26 00:01:23,630 --> 00:01:26,320 paprastai tai yra nuo 30 iki 45 minučių, 27 00:01:26,320 --> 00:01:29,810 keli raundai, priklausomai nuo įmonės. 28 00:01:29,810 --> 00:01:33,090 Dažnai jums kodavimas balta lenta. 29 00:01:33,090 --> 00:01:35,960 Taigi balta lenta, kaip šis, bet dažnai dėl mažesnio masto. 30 00:01:35,960 --> 00:01:38,540 Jei esate turintys interviu telefonu, jūs tikriausiai naudojate 31 00:01:38,540 --> 00:01:44,030 arba collabedit arba "Google" dokumentus, kad jie gali matyti, kad jūs gyvenate kodavimo 32 00:01:44,030 --> 00:01:46,500 o jūs apklausiamas telefonu. 33 00:01:46,500 --> 00:01:48,490 Interviu pats yra paprastai 2 arba 3 problemos 34 00:01:48,490 --> 00:01:50,620 išbandyti savo informatikos žinias. 35 00:01:50,620 --> 00:01:54,490 Ir tai bus beveik neabejotinai įtraukti kodavimo. 36 00:01:54,490 --> 00:01:59,540 Klausimų tipų, kad jūs pamatysite paprastai yra duomenų struktūros ir algoritmai. 37 00:01:59,540 --> 00:02:02,210 Ir daro šių rūšių problemų, 38 00:02:02,210 --> 00:02:07,830 jie bus paprašyti jus, kaip, kas yra laiko ir erdvės sudėtingumą, Big O? 39 00:02:07,830 --> 00:02:09,800 Dažnai jie taip pat paprašyti aukštesnio lygio klausimus, 40 00:02:09,800 --> 00:02:12,530 , projektuojant sistemą, 41 00:02:12,530 --> 00:02:14,770 kaip jums išdėstyti savo kodą? 42 00:02:14,770 --> 00:02:18,370 Sąsajos, kokios klasės, kokie moduliai Ar turite savo sistemą,, 43 00:02:18,370 --> 00:02:20,900 ir kaip jie sąveikauja tarpusavyje? 44 00:02:20,900 --> 00:02:26,130 Taigi duomenų struktūros ir algoritmai, taip pat projektavimo sistemos. 45 00:02:26,130 --> 00:02:29,180 >> Keletas bendro pobūdžio patarimų, kol mes pasinerti į mūsų atvejų tyrimus. 46 00:02:29,180 --> 00:02:32,300 Manau, kad svarbiausia taisyklė visada būti mąstymas garsiai. 47 00:02:32,300 --> 00:02:36,980 Pokalbis turėtų būti jūsų šansas parodyti savo mąstymo procesą. 48 00:02:36,980 --> 00:02:39,820 Interviu interviu įvertinti 49 00:02:39,820 --> 00:02:42,660 kaip jūs manote ir kaip jūs einate per problema. 50 00:02:42,660 --> 00:02:45,210 Blogiausias dalykas, kurį galite padaryti, tai tylėti per visą interviu. 51 00:02:45,210 --> 00:02:50,090 Tai tiesiog nėra gera. 52 00:02:50,090 --> 00:02:53,230 Kai jums į klausimą, jūs taip pat norite įsitikinti, kad jūs suprantate, į klausimą. 53 00:02:53,230 --> 00:02:55,350 Taigi pakartoti klausimą savo žodžiais 54 00:02:55,350 --> 00:02:58,920 ir bando dirbti kruopščiai kelis paprastus testinius atvejus 55 00:02:58,920 --> 00:03:01,530 įsitikinkite, kad jums suprasti klausimą. 56 00:03:01,530 --> 00:03:05,510 Darbas per keletą bandymų atvejus, taip pat suteikti jums apie tai, kaip išspręsti šią problemą intuicija. 57 00:03:05,510 --> 00:03:11,210 Galbūt net atrasti keli modeliai, siekiant padėti jums išspręsti šią problemą. 58 00:03:11,210 --> 00:03:14,500 Jų didelis patarimas yra ne gauti nusivylė. 59 00:03:14,500 --> 00:03:17,060 Negalima gauti nusivylė. 60 00:03:17,060 --> 00:03:19,060 Interviu yra sudėtinga, tačiau blogiausia, ką galite padaryti, 61 00:03:19,060 --> 00:03:23,330 Be to, yra tylus, turi būti akivaizdžiai nusivylė. 62 00:03:23,330 --> 00:03:27,410 Jūs nenorite duoti, kad įspūdį apklausų. 63 00:03:27,410 --> 00:03:33,960 Vienas dalykas, kad jūs - taip, daug žmonių, kai jie eiti į interviu, 64 00:03:33,960 --> 00:03:37,150 jie bando pabandyti rasti geriausią sprendimą, 65 00:03:37,150 --> 00:03:39,950 tada, kai tikrai, ten paprastai yra akivaizdūs sprendimas. 66 00:03:39,950 --> 00:03:43,500 Tai gali būti lėtas, tai gali būti neefektyvus, bet jums tiesiog reikia nurodyti, 67 00:03:43,500 --> 00:03:46,210 tiesiog todėl jūs turite pradinį tašką, iš kurio dirbti geriau. 68 00:03:46,210 --> 00:03:48,270 Be to, nurodydama, kad sprendimas yra lėtas, kalbant apie 69 00:03:48,270 --> 00:03:52,160 Big O laikas sudėtingumas ar kosmoso sudėtingumą, 70 00:03:52,160 --> 00:03:54,450 bus parodyti pašnekovui, kad jūs suprantate, 71 00:03:54,450 --> 00:03:57,510 šie klausimai, kai rašyti kodą. 72 00:03:57,510 --> 00:04:01,440 Todėl nereikia bijoti sugalvoti nuo paprasčiausio algoritmo pirmą kartą 73 00:04:01,440 --> 00:04:04,950 ir tada dirbti geriau iš ten. 74 00:04:04,950 --> 00:04:09,810 Kokių nors klausimų, kiek? Gerai. 75 00:04:09,810 --> 00:04:11,650 >> Taigi, galime pasinerti į mūsų problemą. 76 00:04:11,650 --> 00:04:14,790 "Atsižvelgiant n sveikųjų skaičių masyvas, parašyti funkciją, kuri Shuffles masyvo 77 00:04:14,790 --> 00:04:20,209 tokios, kad visi sveikieji skaičiai n kombinacijų yra lygiai taip pat tikėtina. " 78 00:04:20,209 --> 00:04:23,470 Ir prisiimti turite atsitiktinį sveikąjį skaičių generatorių 79 00:04:23,470 --> 00:04:30,980 , kuris generuoja tam tikrame intervale, sveikasis skaičius nuo 0 iki i, pusė intervalas. 80 00:04:30,980 --> 00:04:32,970 Ar visi supranta, į šį klausimą? 81 00:04:32,970 --> 00:04:39,660 Aš jums n sveikųjų skaičių masyvas, ir aš noriu jums shuffle jį. 82 00:04:39,660 --> 00:04:46,050 Mano kataloge, parašiau kelias programas, kad parodytų, ką aš turiu galvoje. 83 00:04:46,050 --> 00:04:48,910 Aš ruošiuosi shuffle iš 20 elementų masyvas, 84 00:04:48,910 --> 00:04:52,490 nuo -10 iki 9, 85 00:04:52,490 --> 00:04:57,050 ir aš noriu, kad išėjimo panašus į šį sąrašą. 86 00:04:57,050 --> 00:05:02,890 Taigi tai yra mano surūšiuoti įvesties masyvas, ir aš noriu jums shuffle jį. 87 00:05:02,890 --> 00:05:07,070 Mes tai padaryti dar kartą. 88 00:05:07,070 --> 00:05:13,780 Ar visi supranta klausimą? Gerai. 89 00:05:13,780 --> 00:05:16,730 Todėl iki jums. 90 00:05:16,730 --> 00:05:21,220 Kokie yra keletas idėjų? Jūs galite padaryti jį kaip n ^ 2, n log n, n? 91 00:05:21,220 --> 00:05:34,400 Atidaryti pasiūlymus. 92 00:05:34,400 --> 00:05:37,730 Gerai. Taigi viena idėja, siūloma Emmy ", 93 00:05:37,730 --> 00:05:45,300 pirmiausia apskaičiuoti atsitiktinių skaičių, atsitiktinis sveikasis skaičius diapazone 0-20. 94 00:05:45,300 --> 00:05:49,840 Taigi manyti, mūsų masyvas yra 20 m ilgio. 95 00:05:49,840 --> 00:05:54,800 Mūsų diagrama 20 elementų, 96 00:05:54,800 --> 00:05:58,560 tai mūsų indėlis masyvas. 97 00:05:58,560 --> 00:06:04,590 Ir dabar, jos pasiūlymas yra sukurti naują masyvą, 98 00:06:04,590 --> 00:06:08,440 todėl tai bus išėjimo masyvas. 99 00:06:08,440 --> 00:06:12,880 Ir remiasi i grąžina rand 100 00:06:12,880 --> 00:06:17,580 Taigi, jei aš buvo, tarkim, 17, 101 00:06:17,580 --> 00:06:25,640 nukopijuokite 17 elementas į pirmąją poziciją. 102 00:06:25,640 --> 00:06:30,300 Dabar mums reikia ištrinti - mes turime perkelti visus elementus čia 103 00:06:30,300 --> 00:06:36,920 per tiek, kad mes turime spragą pabaigoje ir ne viduryje skyles. 104 00:06:36,920 --> 00:06:39,860 Ir dabar mes pakartokite šį procesą. 105 00:06:39,860 --> 00:06:46,360 Dabar mes pasirinkti naują atsitiktinis sveikasis skaičius tarp 0 ir 19. 106 00:06:46,360 --> 00:06:52,510 Mes turime naują aš čia, ir mes nukopijuokite šį elementą į šią poziciją. 107 00:06:52,510 --> 00:07:00,960 Tada mes pereiti elementus baigėsi ir mes pakartoti procesą, kol mes turime visiškai naują masyvą. 108 00:07:00,960 --> 00:07:05,890 Kas yra šio algoritmo veikimo laikas? 109 00:07:05,890 --> 00:07:08,110 Na, galime apsvarstyti šio poveikio. 110 00:07:08,110 --> 00:07:10,380 Perkeliant kiekvieną elementą. 111 00:07:10,380 --> 00:07:16,800 Kai pašaliname Tai aš, mes perkelti visus elementus, po to į kairę. 112 00:07:16,800 --> 00:07:21,600 Ir tai yra O (n) savikaina 113 00:07:21,600 --> 00:07:26,100 nes tai, ką, jei mes pašalinti pirmoji? 114 00:07:26,100 --> 00:07:29,670 Taigi kiekvieno atsargų, mes pašalinti 115 00:07:29,670 --> 00:07:32,170 Kiekviename leidime išvežti prisiima O (n) veikimą, 116 00:07:32,170 --> 00:07:41,520 nes mes n išsiuntimo, išsiuntimą, tai veda į O (n ^ 2) shuffle. 117 00:07:41,520 --> 00:07:49,550 Gerai. Taip gera pradžia. Gera pradžia. 118 00:07:49,550 --> 00:07:55,290 >> Be to, siūloma naudoti kažką, žinomą kaip Knuth shuffle, 119 00:07:55,290 --> 00:07:57,540 arba Fisher-Yates shuffle. 120 00:07:57,540 --> 00:07:59,630 Ir tai tikrai linijinis laikas shuffle. 121 00:07:59,630 --> 00:08:02,200 Ir idėja yra labai panašūs. 122 00:08:02,200 --> 00:08:05,160 Vėlgi, mes turime įvesties masyvo, 123 00:08:05,160 --> 00:08:08,580 bet vietoj to, naudojant du masyvų mūsų įvesties / išvesties, 124 00:08:08,580 --> 00:08:13,590 mes naudojame masyvo sekti mūsų išmaišytos dalis: pirmoji dalis, 125 00:08:13,590 --> 00:08:18,400 ir mes sekti, o tada mes palikti mūsų masyvas poilsio už unshuffled dalis. 126 00:08:18,400 --> 00:08:24,330 Taigi štai ką aš turiu galvoje. Mes pradėti su - mes pasirinkti i, 127 00:08:24,330 --> 00:08:30,910 masyvas 0-20. 128 00:08:30,910 --> 00:08:36,150 Mūsų dabartinė rodyklė nukreipta į pirmąjį indeksą. 129 00:08:36,150 --> 00:08:39,590 Mes pasirinkti kai aš čia 130 00:08:39,590 --> 00:08:42,740 ir dabar mes apsikeitimo. 131 00:08:42,740 --> 00:08:47,690 Taigi, jei tai buvo 5, ir tai buvo 4, 132 00:08:47,690 --> 00:08:57,150 masyvas bus 5 Čia ir 4 čia. 133 00:08:57,150 --> 00:09:00,390 Ir dabar mes pažymime žymeklį čia. 134 00:09:00,390 --> 00:09:05,770 Viskas į kairę išmaišytos 135 00:09:05,770 --> 00:09:15,160 ir viskas į dešinę unshuffled. 136 00:09:15,160 --> 00:09:17,260 Ir dabar mes galime pakartokite šį procesą. 137 00:09:17,260 --> 00:09:25,210 Mes pasirinkti atsitiktine tvarka indeksas nuo 1 iki 20 dabar. 138 00:09:25,210 --> 00:09:30,650 Taigi tarkime, kad mūsų nauja i čia. 139 00:09:30,650 --> 00:09:39,370 Dabar mes apsikeitimo Tai aš čia su mūsų dabartinės naują poziciją. 140 00:09:39,370 --> 00:09:44,790 Taigi mes Swapping pirmyn ir atgal, kaip šis. 141 00:09:44,790 --> 00:09:51,630 Leiskite man duoti kodą, kad būtų konkretesnis. 142 00:09:51,630 --> 00:09:55,290 Mes pradedame su mūsų pasirinkimas i - 143 00:09:55,290 --> 00:09:58,370 mes pradedame su i lygi 0, mes pasirinkti atsitiktinę vietą j 144 00:09:58,370 --> 00:10:02,420 į unshuffled masyvo dalį, aš iki n-1. 145 00:10:02,420 --> 00:10:07,280 Taigi, jei aš esu čia, pasirinkti atsitiktinį indeksą tarp čia ir iš masyvo poilsio, 146 00:10:07,280 --> 00:10:12,410 ir mes apsikeitimo. 147 00:10:12,410 --> 00:10:17,550 Tai kodas, būtina shuffle savo komplekta. 148 00:10:17,550 --> 00:10:21,670 Turite klausimų? 149 00:10:21,670 --> 00:10:25,530 >> Na, viena reikia Kyla klausimas, kodėl tai teisinga? 150 00:10:25,530 --> 00:10:28,360 Kodėl kiekvieną Kėliniai lygiai taip pat tikėtina? 151 00:10:28,360 --> 00:10:30,410 Ir aš ne eiti per tai įrodymas, 152 00:10:30,410 --> 00:10:35,970 bet gali būti įrodyta per daug problemų, kompiuterių mokslo indukcijos. 153 00:10:35,970 --> 00:10:38,520 Kaip daugelis iš jūsų yra susipažinę su indukcijos? 154 00:10:38,520 --> 00:10:40,590 Gerai. Cool. 155 00:10:40,590 --> 00:10:43,610 Todėl jūs galite įrodyti, kad šio algoritmo teisingumą paprastą indukcijos, 156 00:10:43,610 --> 00:10:49,540 ,, kur jūsų indukcija hipotezė būtų daryti prielaidą, kad 157 00:10:49,540 --> 00:10:53,290 mano shuffle grįžta kiekvieną Kėliniai lygiai taip pat tikėtina 158 00:10:53,290 --> 00:10:56,120 Pirmiausia aš elementų. 159 00:10:56,120 --> 00:10:58,300 Dabar i + 1. 160 00:10:58,300 --> 00:11:02,550 Ir beje mes renkamės į mūsų indekso j apsikeitimo, 161 00:11:02,550 --> 00:11:05,230 tai veda prie - ir tada jums išsiaiškinti detales, 162 00:11:05,230 --> 00:11:07,390 bent įrodymas, kodėl šis algoritmas grąžina 163 00:11:07,390 --> 00:11:12,800 Kėliniai kiekvienas vienodai tikėtinas tikimybe. 164 00:11:12,800 --> 00:11:15,940 >> Viskas gerai, problema. 165 00:11:15,940 --> 00:11:19,170 Taigi, "sveikųjų skaičių masyvas, postive, nulis, neigiamas, 166 00:11:19,170 --> 00:11:21,290 parašyti funkciją, kuri apskaičiuoja didžiausią sumą 167 00:11:21,290 --> 00:11:24,720 iš bet continueous įvesties masyvo subarray ". 168 00:11:24,720 --> 00:11:28,370 Čia yra pavyzdys, kad tuo atveju, jei visi skaičiai yra teigiami, 169 00:11:28,370 --> 00:11:31,320 šiuo metu geriausias pasirinkimas yra imtis daug įvairių. 170 00:11:31,320 --> 00:11:34,690 1, 2, 3, 4, = 10. 171 00:11:34,690 --> 00:11:36,780 Jei turite kokių nors negatyvus ten, 172 00:11:36,780 --> 00:11:38,690 šiuo atveju mes tiesiog norime pirmieji du 173 00:11:38,690 --> 00:11:44,590 , nes pasirenkant -1 ir / arba -3 atneš mūsų sumą. 174 00:11:44,590 --> 00:11:48,120 Kartais mums gali tekti pradėti iš masyvo viduryje. 175 00:11:48,120 --> 00:11:53,500 Kartais mes norime pasirinkti nieko bendro, tai geriausia ne imtis nieko. 176 00:11:53,500 --> 00:11:56,490 O kartais tai geriau imtis rudenį, 177 00:11:56,490 --> 00:12:07,510 nes po jo dalykas yra super didelis. Taigi kokių nors idėjų? 178 00:12:07,510 --> 00:12:10,970 (Studentas, neįskaitomai) >> Taip. 179 00:12:10,970 --> 00:12:13,560 Tarkime, aš nemanau, -1. 180 00:12:13,560 --> 00:12:16,170 Tada arba aš pasirinksiu 1.000 iki 20.000 181 00:12:16,170 --> 00:12:18,630 arba aš tiesiog pasirinkti 3 mlrd. 182 00:12:18,630 --> 00:12:20,760 Na, geriausias pasirinkimas yra imtis visų numerių. 183 00:12:20,760 --> 00:12:24,350 Tai -1, nepaisant to, kad būdamas neigiamas, 184 00:12:24,350 --> 00:12:31,340 visa suma yra geriau, nei aš negaliu imtis -1. 185 00:12:31,340 --> 00:12:36,460 Taigi vienas iš patarimų minėjau anksčiau pareikšti, kad visiškai akivaizdu, 186 00:12:36,460 --> 00:12:40,540 ir brutalia jėga sprendimas pirmas. 187 00:12:40,540 --> 00:12:44,340 Kas yra brutalia jėga šios problemos sprendimas? Taip? 188 00:12:44,340 --> 00:12:46,890 [Jane] Na, manau, brute force tirpalo 189 00:12:46,890 --> 00:12:52,600 būtų pridėti visus galimus derinius (nesuprantamas). 190 00:12:52,600 --> 00:12:58,250 [J.] Gerai. Taigi Jane idėja imtis visų įmanomų 191 00:12:58,250 --> 00:13:01,470 Aš tikiu, perfrazuojant - imtis visų įmanomų nuolat subarray 192 00:13:01,470 --> 00:13:07,840 apskaičiuoti jo sumą ir tada imtis visų galimų nuolatinių subarrays daugiausiai. 193 00:13:07,840 --> 00:13:13,310 Kas unikaliai identifikuoja subarray Mano indėlis masyvo? 194 00:13:13,310 --> 00:13:17,380 Pavyzdžiui, ką aš turiu du dalykai? Taip? 195 00:13:17,380 --> 00:13:19,970 (Studentas, neįskaitomai) >> Teisingai. 196 00:13:19,970 --> 00:13:22,130 Apatinę rodyklės ir viršutinė riba indeksas 197 00:13:22,130 --> 00:13:28,300 vienareikšmiškai nustato nuolat subarray. 198 00:13:28,300 --> 00:13:31,400 [Moteris studentas] Ar mes įvertinant tai unikalių skaičių masyvas? 199 00:13:31,400 --> 00:13:34,280 [J.] L. Taigi savo klausimą, mes darant prielaidą, kad mūsų masyvas - 200 00:13:34,280 --> 00:13:39,000 mūsų masyvas visi unikalūs numeriai ir atsakymas yra ne. 201 00:13:39,000 --> 00:13:43,390 >> Jei mes naudojame mūsų brute force tirpalą, po pradžios / pabaigos indeksai 202 00:13:43,390 --> 00:13:47,200 vienareikšmiškai nustato mūsų nuolat subarray. 203 00:13:47,200 --> 00:13:51,680 Taigi, jei mes pakartoti visų galimų pradėti įrašus, 204 00:13:51,680 --> 00:13:58,320 ir visiems galutiniams įrašų> arba = pradėti, ir 00:14:05,570 apskaičiuoti sumą, ir tada mes imtis didžiausią sumą, mes matėme iki šiol. 206 00:14:05,570 --> 00:14:07,880 Ar tai aišku? 207 00:14:07,880 --> 00:14:12,230 Kas yra big O šio tirpalo? 208 00:14:12,230 --> 00:14:16,660 Timewise. 209 00:14:16,660 --> 00:14:18,860 Ne visai n ^ 2. 210 00:14:18,860 --> 00:14:25,250 Atkreipkite dėmesį, kad mes kartoti nuo 0 iki n, 211 00:14:25,250 --> 00:14:27,520 kad viena kilpa. 212 00:14:27,520 --> 00:14:35,120 Mes vėl pakartoti beveik iš pat pradžių iki galo, o kitą už linijos. 213 00:14:35,120 --> 00:14:37,640 Ir dabar, kad mes turime Apibendrinant kiekvieną įrašą, 214 00:14:37,640 --> 00:14:43,810 kad kitas už linijos. Taigi, mes turime tris įdėtos kilpos, n ^ 3. 215 00:14:43,810 --> 00:14:46,560 Gerai. Tai eina kaip atskaitos tašką. 216 00:14:46,560 --> 00:14:53,180 Mūsų sprendimas yra ne blogiau nei n ^ 3. 217 00:14:53,180 --> 00:14:55,480 Ar visi supranta, brute force tirpalą? 218 00:14:55,480 --> 00:14:59,950 >> Gerai. Geresnis sprendimas yra vadinamas dinaminio programavimo idėja. 219 00:14:59,950 --> 00:15:03,040 Pavartojus per CS124, kuri yra algoritmai ir duomenų struktūros, 220 00:15:03,040 --> 00:15:05,680 jums bus labai gerai susipažinęs su šia technika. 221 00:15:05,680 --> 00:15:12,190 Ir idėja, pabandykite sukurti sprendimus mažesnių problemų. 222 00:15:12,190 --> 00:15:17,990 Ką reiškia tai, šiuo metu mes turime nerimauti dėl dviejų dalykų: pradžios ir pabaigos. 223 00:15:17,990 --> 00:15:29,340 Ir tai erzina. Ką daryti, jei mes galime atsikratyti vieno iš šių parametrų? 224 00:15:29,340 --> 00:15:32,650 Viena idėja yra - mes mūsų problema, 225 00:15:32,650 --> 00:15:37,470 rasti didžiausią sumą bet kokio diapazono subarray [O, n-1 metai]. 226 00:15:37,470 --> 00:15:47,400 Ir dabar mes turime naują subproblem, kai mes žinome, mūsų dabartinės i indekso 227 00:15:47,400 --> 00:15:52,520 mes žinome, privalo sudaryti. Esamo indekso Mūsų subarray turi baigtis. 228 00:15:52,520 --> 00:15:57,640 Taigi likusi problema yra, kur reikėtų pradėti mūsų subarray? 229 00:15:57,640 --> 00:16:05,160 Ar tai prasminga? Gerai. 230 00:16:05,160 --> 00:16:12,030 Taigi aš koduojami tai padaryti, ir pažvelkime, ką tai reiškia. 231 00:16:12,030 --> 00:16:16,230 Į codirectory, ten yra programa, vadinama subarray, 232 00:16:16,230 --> 00:16:19,470 ir tai trunka elementų skaičių, 233 00:16:19,470 --> 00:16:25,550 ir ji grąžina maksimaliai subarray sumą mano išmaišytos sąrašą. 234 00:16:25,550 --> 00:16:29,920 Taigi šiuo atveju, mūsų maksimalus subarray yra 3. 235 00:16:29,920 --> 00:16:34,850 Ir tai tik naudojant 2 ir 1. 236 00:16:34,850 --> 00:16:38,050 Leiskite jį vėl. Jis taip pat 3. 237 00:16:38,050 --> 00:16:40,950 Bet šį kartą, atkreipkite dėmesį, kaip mes turime 3. 238 00:16:40,950 --> 00:16:46,690 Mes priėmėme - mes tiesiog patį 3 239 00:16:46,690 --> 00:16:49,980 , nes jis apsuptas negatyvų iš abiejų pusių, 240 00:16:49,980 --> 00:16:55,080 kuris atneš suma, kurią <3. 241 00:16:55,080 --> 00:16:57,820 Leiskite veikti 10 elementų. 242 00:16:57,820 --> 00:17:03,200 Šį kartą tai 7, mes imtis lyderio 3 ir 4. 243 00:17:03,200 --> 00:17:09,450 Šį kartą tai 8 ir gauname, kad atsižvelgiant 1, 4 ir 3. 244 00:17:09,450 --> 00:17:16,310 Taigi, duoti jums apie tai, kaip intuicija problemą, mes galime išspręsti šią transformuoti, 245 00:17:16,310 --> 00:17:18,890 Paimkime bent šios subarray išvaizdą. 246 00:17:18,890 --> 00:17:23,460 Mes šį įvesties masyvą, ir mes žinome, atsakymas yra 8. 247 00:17:23,460 --> 00:17:26,359 Mes priimame 1, 4 ir 3. 248 00:17:26,359 --> 00:17:29,090 Bet pažvelkime, kaip mes iš tikrųjų gavo šį atsakymą. 249 00:17:29,090 --> 00:17:34,160 Pažvelkime maksimalaus subarray, kuris baigėsi kiekvieną iš šių indeksų. 250 00:17:34,160 --> 00:17:40,780 Kas yra maksimalus subarray, kad turi baigtis ne į pirmąją poziciją? 251 00:17:40,780 --> 00:17:46,310 [Studentų] Zero. >> Nulis. Tiesiog nereikia vartoti -5. 252 00:17:46,310 --> 00:17:50,210 Čia tai bus 0, taip pat. Taip? 253 00:17:50,210 --> 00:17:56,470 (Studentas, neįskaitomai) 254 00:17:56,470 --> 00:17:58,960 [J.] Oi, atsiprašau, tai yra -3. 255 00:17:58,960 --> 00:18:03,220 Taigi tai yra 2, tai yra -3. 256 00:18:03,220 --> 00:18:08,690 Gerai. Taip -4, kas, maksimalus subarray baigti šią poziciją 257 00:18:08,690 --> 00:18:12,910 kur -4 yra? Nuliui. 258 00:18:12,910 --> 00:18:22,570 Vienas? 1, 5, 8. 259 00:18:22,570 --> 00:18:28,060 Dabar, aš turi baigtis toje vietoje, kur -2 yra. 260 00:18:28,060 --> 00:18:39,330 Taigi, 6, 5, 7, ir naujausia yra 4. 261 00:18:39,330 --> 00:18:43,480 Žinant, kad tai yra mano įrašai 262 00:18:43,480 --> 00:18:48,130 transformuotų problema, kai aš turi liautis į kiekvieną iš šių indeksų, 263 00:18:48,130 --> 00:18:51,410 tada mano galutinis atsakymas yra teisingas, iššluoti per 264 00:18:51,410 --> 00:18:53,580 ir maksimalų skaičių. 265 00:18:53,580 --> 00:18:55,620 Taigi šiuo atveju tai 8. 266 00:18:55,620 --> 00:19:00,010 Tai reiškia,, kad maksimali subarray baigiasi šio rodiklio, 267 00:19:00,010 --> 00:19:04,970 ir pradėjo kažkur prieš jį. 268 00:19:04,970 --> 00:19:09,630 Ar visi supranta šį transformuoti subarray? 269 00:19:09,630 --> 00:19:22,160 >> Gerai. Na, galime išsiaiškinti, už tai nepasikartotų. 270 00:19:22,160 --> 00:19:27,990 Apsvarstykite tik pirmuosius kelis įrašai. 271 00:19:27,990 --> 00:19:35,930 Taigi čia buvo 0, 0, 0, 1, 5, 8. 272 00:19:35,930 --> 00:19:39,790 Ir tada ten buvo -2, ir kad išvedė jį žemyn iki 6. 273 00:19:39,790 --> 00:19:50,800 Taigi, jei aš vadinu padėtyje įrašas i subproblem (i), 274 00:19:50,800 --> 00:19:54,910 kaip aš galiu naudoti atsakyti į ankstesnį subproblem 275 00:19:54,910 --> 00:19:59,360 atsakyti šį subproblem? 276 00:19:59,360 --> 00:20:04,550 Jei aš žiūriu, tarkim, šis įrašas. 277 00:20:04,550 --> 00:20:09,190 Kaip aš galiu apskaičiuoti atsakymą 6 pažvelgus 278 00:20:09,190 --> 00:20:18,780 derinys šio masyvo ir atsakymai į ankstesnes šio masyvo subproblems? Taip? 279 00:20:18,780 --> 00:20:22,800 [Moteris studentas] sumų masyvo 280 00:20:22,800 --> 00:20:25,430 tokioje padėtyje anksčiau, todėl 8 281 00:20:25,430 --> 00:20:32,170 ir tada jums pridėti esamą subproblem. 282 00:20:32,170 --> 00:20:36,460 [J.] Taigi, jos pasiūlymas yra pažvelgti į šių dviejų skaičių, 283 00:20:36,460 --> 00:20:40,090 šis skaičius ir šį skaičių. 284 00:20:40,090 --> 00:20:50,130 Taigi tai 8 tai už subproblem atsakymui (i - 1). 285 00:20:50,130 --> 00:20:57,300 Ir leiskite paskambinti savo įvesties masyvo A 286 00:20:57,300 --> 00:21:01,470 Produktais tam kad rasti maksimaliai subarray, kad baigiasi ne i padėtyje, 287 00:21:01,470 --> 00:21:03,980 Aš turiu du pasirinkimus: galiu tęsti subarray 288 00:21:03,980 --> 00:21:09,790 ankstesniojo indekso, kuris baigėsi, arba pradėti naują masyvą. 289 00:21:09,790 --> 00:21:14,190 Jei aš būčiau toliau subarray, kuris prasidėjo ne ankstesniojo indekso, 290 00:21:14,190 --> 00:21:19,260 tai maksimali suma, kurią galiu pasiekti yra atsakymas į ankstesnį subproblem 291 00:21:19,260 --> 00:21:24,120 pridedant einamąjį masyvo įrašas. 292 00:21:24,120 --> 00:21:27,550 Bet aš taip pat turiu pasirinkti pradedant naują subarray 293 00:21:27,550 --> 00:21:30,830 tokiu atveju ši suma yra 0. 294 00:21:30,830 --> 00:21:42,860 Taigi atsakymas yra max 0, subproblem i - 1, plius dabartinis masyvas įrašas. 295 00:21:42,860 --> 00:21:46,150 Ar tai pasikartojimo prasmės? 296 00:21:46,150 --> 00:21:50,840 Mūsų pasikartojimas, kaip mes ką tik atrado, yra subproblem i 297 00:21:50,840 --> 00:21:54,740 yra lygi praėjusių subproblem ne daugiau, plius mano dabartinis masyvo įrašą, 298 00:21:54,740 --> 00:22:01,490 o tai reiškia, tęsti ankstesnę subarray, 299 00:22:01,490 --> 00:22:07,250 arba 0, pradėti naują subarray ne mano esamo indekso. 300 00:22:07,250 --> 00:22:10,060 Ir kai mes sukūrėme šį sprendimų lentelę, tada mūsų galutinis atsakymas, 301 00:22:10,060 --> 00:22:13,950 tiesiog padaryti linijinį nurašymas visoje subproblem masyvo 302 00:22:13,950 --> 00:22:19,890 ir maksimalų skaičių. 303 00:22:19,890 --> 00:22:23,330 Tai tiksli įgyvendinti tai, ką aš ką tik pasakė. 304 00:22:23,330 --> 00:22:27,320 Taigi, mes sukurti naują subproblem masyvą, subproblems. 305 00:22:27,320 --> 00:22:32,330 Pirmasis įrašas yra 0 arba pirmasis įrašas, daugiausia iš šių dviejų. 306 00:22:32,330 --> 00:22:35,670 Ir kitų subproblems 307 00:22:35,670 --> 00:22:39,810 mes naudojame tikslią pasikartojimo, mes ką tik atrado. 308 00:22:39,810 --> 00:22:49,960 Dabar mes apskaičiuoti mūsų subproblems masyvo daugiausiai, ir tai yra mūsų galutinis atsakymas. 309 00:22:49,960 --> 00:22:54,130 >> Taigi, kiek vietos mes šio algoritmo? 310 00:22:54,130 --> 00:23:01,470 Jei jūs tik tuomet, CS50, tada jums gali aptarti vietos labai daug. 311 00:23:01,470 --> 00:23:07,750 Na, vienas dalykas, reikia pažymėti, kad aš čia n yra vadinamas malloc. 312 00:23:07,750 --> 00:23:13,590 Ką tai rodo jums? 313 00:23:13,590 --> 00:23:17,450 Šis algoritmas naudoja tiesinę erdvę. 314 00:23:17,450 --> 00:23:21,030 Mes galime padaryti geriau? 315 00:23:21,030 --> 00:23:30,780 Ar yra kas nors, kad jūs pastebėsite, kad nereikėtų apskaičiuoti galutinį atsakymą? 316 00:23:30,780 --> 00:23:33,290 Manau, geriau klausimas, kokia informacija 317 00:23:33,290 --> 00:23:40,680 mes ne reikia atlikti visą kelią iki pabaigos? 318 00:23:40,680 --> 00:23:44,280 Dabar, jei pažvelgsime į šių dviejų linijų, 319 00:23:44,280 --> 00:23:47,720 rūpi tik ankstesnio subproblem 320 00:23:47,720 --> 00:23:50,910 o mes tik rūpintis apie didžiausią mes kada nors matė iki šiol. 321 00:23:50,910 --> 00:23:53,610 Apskaičiuoti mūsų galutinio atsakymo, mes nereikia visą masyvą. 322 00:23:53,610 --> 00:23:57,450 Mums reikia tik paskutinį numerį, paskutiniai du skaičiai. 323 00:23:57,450 --> 00:24:02,630 Paskutinio numerio už subproblem masyvą, ir paskutinis skaičius būtų maksimaliai. 324 00:24:02,630 --> 00:24:07,380 Taigi, iš tiesų, mes galime saugiklis šias kilpas kartu 325 00:24:07,380 --> 00:24:10,460 ir eiti linijinės erdvėje nuolat erdvėje. 326 00:24:10,460 --> 00:24:15,830 Aktualus suma iki šiol, čia pakeičia subproblem, mūsų subproblem masyvo vaidmenį. 327 00:24:15,830 --> 00:24:20,020 Taigi dabartinė suma, iki šiol yra atsakymas į ankstesnį subproblem. 328 00:24:20,020 --> 00:24:23,450 Ir ta suma, iki šiol užima vietą mūsų maks. 329 00:24:23,450 --> 00:24:28,100 Mes apskaičiuoti ne daugiau, kaip mes einame kartu. 330 00:24:28,100 --> 00:24:30,890 Ir taip mes einame iš linijinės erdvėje nuolat erdvę, 331 00:24:30,890 --> 00:24:36,650 ir mes taip pat turime linijinį mūsų subarray problemos sprendimą. 332 00:24:36,650 --> 00:24:40,740 >> Tokie klausimai gausite pokalbio metu. 333 00:24:40,740 --> 00:24:44,450 Kiek laiko sudėtingumas; kas yra erdvė sudėtingumas? 334 00:24:44,450 --> 00:24:50,600 Jūs galite padaryti geriau? Ar yra dalykų, kurie yra nebūtina išlaikyti aplink? 335 00:24:50,600 --> 00:24:55,270 Aš padariau, tai atkreipti dėmesį į tyrimus, kad jums reikia imtis savo 336 00:24:55,270 --> 00:24:57,400 kaip jūs dirbate per šių problemų. 337 00:24:57,400 --> 00:25:01,710 Visada turi būti užduoti sau klausimą: "Ar galiu tai padaryti geriau?" 338 00:25:01,710 --> 00:25:07,800 Iš tiesų, mes galime padaryti geriau nei tai? 339 00:25:07,800 --> 00:25:10,730 Rūšiuoti triukas klausimą. Jūs negalite, nes jums reikia 340 00:25:10,730 --> 00:25:13,590 bent jau perskaityti prisidėti prie problemos. 341 00:25:13,590 --> 00:25:15,570 Taigi tai, kad jums reikia bent jau perskaityti prisidėti prie šios problemos 342 00:25:15,570 --> 00:25:19,580 reiškia, kad jūs negalite padaryti geriau ne linijinis, 343 00:25:19,580 --> 00:25:22,870 ir jūs negalite padaryti geriau nei nuolat erdvę. 344 00:25:22,870 --> 00:25:27,060 Taigi, tai yra, iš tiesų, geriausias šios problemos sprendimas. 345 00:25:27,060 --> 00:25:33,040 Turite klausimų? Gerai. 346 00:25:33,040 --> 00:25:35,190 >> Vertybinių popierių rinkos problema: 347 00:25:35,190 --> 00:25:38,350 "Atsižvelgiant į tai masyvas n sveikieji skaičiai, teigiamas, nulį, arba neigiamas, 348 00:25:38,350 --> 00:25:41,680 kurios atstovauja akcijų kaina per n parų, 349 00:25:41,680 --> 00:25:44,080 parašyti funkciją apskaičiuoti maksimalų pelną, jūs galite padaryti 350 00:25:44,080 --> 00:25:49,350 atsižvelgiant į tai, kad jums pirkti ir parduoti lygiai 1 atsargų per šių n dienų. " 351 00:25:49,350 --> 00:25:51,690 Iš esmės, mes norime pirkti mažai, parduoti aukštos. 352 00:25:51,690 --> 00:25:58,580 Ir mes norime išsiaiškinti geriausią pelną mes galime padaryti. 353 00:25:58,580 --> 00:26:11,500 Grįžtant prie mano galo, kas yra iš karto aišku, paprasčiausias atsakymas, bet tai lėtas? 354 00:26:11,500 --> 00:26:17,690 Taip? (Studentas, neįskaitomai) >> Taip. 355 00:26:17,690 --> 00:26:21,470 >> Taigi, jūs tiesiog eiti, nors ir pažvelgti akcijų kainų 356 00:26:21,470 --> 00:26:30,550 kiekvienas laiko taškas (nesuprantamas). 357 00:26:30,550 --> 00:26:33,990 [J.] Gerai, todėl jos sprendimas - jos skaičiavimo pasiūlymas 358 00:26:33,990 --> 00:26:37,380 žemiausia ir apskaičiuojant didžiausias nebūtinai dirbti 359 00:26:37,380 --> 00:26:42,470 nes aukščiausia gali atsirasti prieš žemiausias. 360 00:26:42,470 --> 00:26:47,340 Taigi, kas yra brutalia jėga išspręsti šią problemą? 361 00:26:47,340 --> 00:26:53,150 Kokie yra du dalykai, kad man reikia vienareikšmiškai nustatyti pelną? Į dešinę. 362 00:26:53,150 --> 00:26:59,410 Brutalia jėga sprendimas - O, taip, Jurgio pasiūlymas, mes tik reikia dvi dienas 363 00:26:59,410 --> 00:27:02,880 unikaliai nustatyti šių dviejų dienų pelną. 364 00:27:02,880 --> 00:27:06,660 Taigi, mes apskaičiuoti kiekvieną porą, norite pirkti / parduoti, 365 00:27:06,660 --> 00:27:12,850 apskaičiuoti pelną, kuris gali būti neigiamas arba teigiamas arba lygus nuliui. 366 00:27:12,850 --> 00:27:18,000 Apskaičiuoti maksimalų pelną, kad mes gaminame po iteravimu per visas dienas porų. 367 00:27:18,000 --> 00:27:20,330 Tai bus mūsų galutinis atsakymas. 368 00:27:20,330 --> 00:27:25,730 Ir kad sprendimas bus O (n ^ 2), nes yra n pasirinkti dvi poros - 369 00:27:25,730 --> 00:27:30,270 dienų, kad jūs galite pasirinkti tarp galutinių dienų. 370 00:27:30,270 --> 00:27:32,580 Gerai, kad aš nesiruošia čia eiti per brutalia jėga tirpalo. 371 00:27:32,580 --> 00:27:37,420 Aš ruošiuosi pasakyti, kad yra n log n sprendimas. 372 00:27:37,420 --> 00:27:45,550 , Ką algoritmas jūs dabar žinote, kad yra n log n? 373 00:27:45,550 --> 00:27:50,730 Tai nėra triukas klausimas. 374 00:27:50,730 --> 00:27:54,790 >> Sujungti rūšiuoti. Sujungti rūšiuoti n log n, 375 00:27:54,790 --> 00:27:57,760 ir iš tiesų, vienas iš būdų išspręsti šią problemą yra naudoti 376 00:27:57,760 --> 00:28:04,400 sujungti rūšiuoti rūšies idėja vadinosi, apskritai, skaldyk ir valdyk. 377 00:28:04,400 --> 00:28:07,570 Ir idėja yra tokia. 378 00:28:07,570 --> 00:28:12,400 Norite apskaičiuoti geriausia pirkti / parduoti porą kairę pusę. 379 00:28:12,400 --> 00:28:16,480 Rasti geriausius pelno jūs galite padaryti, tik su pirmąja n per dvi dienas. 380 00:28:16,480 --> 00:28:19,780 Tada jūs norite oompute geriausia pirkti / parduoti porą dešinėje pusėje, 381 00:28:19,780 --> 00:28:23,930 taigi paskutinis n per dvi dienas. 382 00:28:23,930 --> 00:28:32,400 Ir dabar kyla klausimas, kaip mes atgal kartu sujungti šiuos sprendimus? 383 00:28:32,400 --> 00:28:36,320 Taip? (Studentas, neįskaitomai) 384 00:28:36,320 --> 00:28:49,890 >> Gerai. Taigi, leiskite man atkreipti paveikslėlį. 385 00:28:49,890 --> 00:29:03,870 Taip? (George, neįskaitomai) 386 00:29:03,870 --> 00:29:06,450 >> Būtent. Jurgio sprendimas yra visiškai teisus. 387 00:29:06,450 --> 00:29:10,040 Taip, kad jo pasiūlymas yra, pirma apskaičiuoti geriausią pirkti / parduoti porą, 388 00:29:10,040 --> 00:29:16,050 ir kad vyksta kairę pusę, todėl galime skambinti, kad į kairę, į kairę. 389 00:29:16,050 --> 00:29:20,790 Geriausia pirkti / parduoti porą, esantį dešinėje pusėje. 390 00:29:20,790 --> 00:29:25,180 Bet jei mes tik palyginti šiuos du skaičius, mes trūkstamus bylą 391 00:29:25,180 --> 00:29:30,460 kur mes perkame ir parduoti kažkur dešinėje pusėje. 392 00:29:30,460 --> 00:29:33,810 Mes perkame kairę pusę, parduoti dešinėje pusėje. 393 00:29:33,810 --> 00:29:38,490 Ir geriausias būdas apskaičiuoti geriausią pirkti / parduoti porą, kuri apima abi puses 394 00:29:38,490 --> 00:29:43,480 yra apskaičiuoti minimalų čia ir apskaičiuoti maksimalų čia 395 00:29:43,480 --> 00:29:45,580 ir imtis jų skirtumą. 396 00:29:45,580 --> 00:29:50,850 Taigi šių dviejų atvejų, kur pirkti / parduoti porą atsiranda tik čia, 397 00:29:50,850 --> 00:30:01,910 tik čia, arba abiejų puselės yra apibrėžta šių trijų skaičių. 398 00:30:01,910 --> 00:30:06,450 Taigi, mūsų algoritmas atgal kartu sujungti savo sprendimus, 399 00:30:06,450 --> 00:30:08,350 mes norime apskaičiuoti geriausia pirkti / parduoti porą 400 00:30:08,350 --> 00:30:13,120 kur mes perkame kairę pusę ir parduoti dešinėje pusėje. 401 00:30:13,120 --> 00:30:16,740 Ir geriausias būdas tai padaryti yra apskaičiuoti mažiausią kainą pirmąjį pusmetį, 402 00:30:16,740 --> 00:30:20,360 aukščiausia kaina, dešinėje pusėje, ir imtis jų skirtumą. 403 00:30:20,360 --> 00:30:25,390 Gautas pelną, šie trys skaičiai, jūs imtis iš trijų daugiausiai 404 00:30:25,390 --> 00:30:32,720 kad geriausias pelnas, kurį jūs galite padaryti per šių pirmųjų ir pabaigos dienų. 405 00:30:32,720 --> 00:30:36,940 Čia svarbios linijos yra raudonai. 406 00:30:36,940 --> 00:30:41,160 Tai rekursinis skambinti apskaičiuoti atsakymą į kairę pusę. 407 00:30:41,160 --> 00:30:44,760 Tai yra rekursinis kvietimas apskaičiuoti atsakymą dešinėje pusėje. 408 00:30:44,760 --> 00:30:50,720 Tai du kilpų apskaičiuoti MIN ir MAX kairėje ir dešinėje pusėje, atitinkamai. 409 00:30:50,720 --> 00:30:54,970 Dabar aš apskaičiuoti pelną, kuris apima abi puses, 410 00:30:54,970 --> 00:31:00,530 ir galutinis atsakymas yra daugiausiai iš šių trijų. 411 00:31:00,530 --> 00:31:04,120 Gerai. 412 00:31:04,120 --> 00:31:06,420 >> Taigi, tikrai, mes turime algoritmą, bet didesnis klausimas, 413 00:31:06,420 --> 00:31:08,290 kas yra laikas sudėtingumas? 414 00:31:08,290 --> 00:31:16,190 Ir priežastis, kodėl minėjau sujungti rūšiuoti yra tai, kad ši forma padalinti atsakymą 415 00:31:16,190 --> 00:31:19,200 į dvi ir tada atgal kartu sujungti savo sprendimus 416 00:31:19,200 --> 00:31:23,580 tiksliai Merge sort forma. 417 00:31:23,580 --> 00:31:33,360 Taigi, leiskite man eiti per trukmę. 418 00:31:33,360 --> 00:31:41,340 Jei mes apibrėžta funkcija T (n) žingsnių skaičius 419 00:31:41,340 --> 00:31:50,010 n parų, 420 00:31:50,010 --> 00:31:54,350 mūsų du pasikartojantys ragina 421 00:31:54,350 --> 00:32:00,460 kiekvieną iš jų kainuos t (n / 2), 422 00:32:00,460 --> 00:32:03,540 ir ten yra du iš šių pasiteiravimų. 423 00:32:03,540 --> 00:32:10,020 Dabar man reikia apskaičiuoti mažiausiai kairę pusę, 424 00:32:10,020 --> 00:32:17,050 Galiu padaryti n / 2 laiko, taip pat dešinėje pusėje daugiausiai. 425 00:32:17,050 --> 00:32:20,820 Todėl tai n. 426 00:32:20,820 --> 00:32:25,050 Ir tada plius kai nuolatinis darbas. 427 00:32:25,050 --> 00:32:27,770 Ir tai pasikartojimo lygtis 428 00:32:27,770 --> 00:32:35,560 yra būtent pasikartojimo lygtis sujungti rūšiuoti. 429 00:32:35,560 --> 00:32:39,170 Ir mes visi žinome, kad sujungti rūšiuoti n log n laiko. 430 00:32:39,170 --> 00:32:46,880 Todėl, mūsų algoritmas taip pat n log n laiko. 431 00:32:46,880 --> 00:32:52,220 Ar tai iteracijos prasmės? 432 00:32:52,220 --> 00:32:55,780 Tiesiog trumpai primenama apie tai: 433 00:32:55,780 --> 00:32:59,170 T (n) žingsnių apskaičiuoti maksimalų pelną 434 00:32:59,170 --> 00:33:02,750 per n parų. 435 00:33:02,750 --> 00:33:06,010 Būdas, mes padalinti mūsų rekursinių skambučius 436 00:33:06,010 --> 00:33:11,980 paskambinę mūsų sprendimas dėl pirmųjų n / 2 dienų 437 00:33:11,980 --> 00:33:14,490 kad vienas skambutis, 438 00:33:14,490 --> 00:33:16,940 ir tada vėl mes vadiname antrąjį pusmetį. 439 00:33:16,940 --> 00:33:20,440 Kad du ragina. 440 00:33:20,440 --> 00:33:25,310 Ir tada mes rasti mažiausiai kairėje pusėje, kurį mes galime padaryti eilutėmis, 441 00:33:25,310 --> 00:33:29,010 rasti daugiausia dešinėje pusėje, kurį mes galime padaryti eilutėmis. 442 00:33:29,010 --> 00:33:31,570 Taigi n / 2 + n / 2 yra tiesiog n. 443 00:33:31,570 --> 00:33:36,020 Tada mes turime tam tikrą pastovų darbą, kuris yra kaip daro aritmetines operacijas. 444 00:33:36,020 --> 00:33:39,860 Šie požymiai lygtis yra tiksliai sujungti rūšiuoti pasikartojimo lygtis. 445 00:33:39,860 --> 00:33:55,490 Taigi, mūsų shuffle algoritmas taip pat n log n. 446 00:33:55,490 --> 00:33:58,520 Taigi, kiek vietos naudojate? 447 00:33:58,520 --> 00:34:04,910 Eikime vėl į kodą. 448 00:34:04,910 --> 00:34:09,420 >> Geresnis klausimas yra, kaip kamino rėmai mes kada nors bet kuriuo momentu? 449 00:34:09,420 --> 00:34:11,449 Kadangi mes naudojame rekursija, 450 00:34:11,449 --> 00:34:23,530 kamino kadrų skaičius lemia mūsų vietos naudojimą. 451 00:34:23,530 --> 00:34:29,440 Apsvarstykite n = 8. 452 00:34:29,440 --> 00:34:36,889 Mes vadiname shuffle 8, 453 00:34:36,889 --> 00:34:41,580 , kurie kreipsis shuffle pirmieji keturi elementai, 454 00:34:41,580 --> 00:34:46,250 kurie kreipsis dėl pirmųjų dviejų įrašų shuffle. 455 00:34:46,250 --> 00:34:51,550 Taigi, mūsų kamino - tai mūsų kamino. 456 00:34:51,550 --> 00:34:54,980 Ir tada mes vėl skambinti shuffle 1, 457 00:34:54,980 --> 00:34:58,070 ir tai, ką mūsų bazinį scenarijų, todėl mes nedelsiant. 458 00:34:58,070 --> 00:35:04,700 Ar mes kada nors daugiau nei tai daug kamino kadrų? 459 00:35:04,700 --> 00:35:08,880 Nes kiekvieną kartą, kai mes darome pritaikymo, 460 00:35:08,880 --> 00:35:10,770 shuffle, rekursinis maldavimas 461 00:35:10,770 --> 00:35:13,950 mes padalinti mūsų apimtys per pusę. 462 00:35:13,950 --> 00:35:17,020 Taigi didžiausias skaičius kamino kadrų mes kada nors bet kuriuo momentu 463 00:35:17,020 --> 00:35:28,460 yra log n kamino kadrų tvarka. 464 00:35:28,460 --> 00:35:42,460 Kiekvieno aukšto rėmas yra pastovios vietos 465 00:35:42,460 --> 00:35:44,410 , todėl bendra suma erdvės, 466 00:35:44,410 --> 00:35:49,240 maksimali suma erdvėje mes kada nors naudoti yra O (log n) erdvė 467 00:35:49,240 --> 00:36:03,040 kur n yra dienų skaičius. 468 00:36:03,040 --> 00:36:07,230 >> Dabar, visada paklauskite savęs, "Ar mes padaryti geriau?" 469 00:36:07,230 --> 00:36:12,390 Ir visų pirma, mes galime sumažinti šią problema jau išspręsta? 470 00:36:12,390 --> 00:36:20,040 Patarimas: mes tik aptarti dvi kitas problemas prieš tai, ir tai nebus shuffle. 471 00:36:20,040 --> 00:36:26,200 Mes galime paversti šį akcijų rinkos problema į maksimalaus subarray problemos. 472 00:36:26,200 --> 00:36:40,100 Kaip mes galime tai padaryti? 473 00:36:40,100 --> 00:36:42,570 Vienas iš jūsų? "Emmy"? 474 00:36:42,570 --> 00:36:47,680 ("Emmy", neįskaitomai) 475 00:36:47,680 --> 00:36:53,860 [J.] Būtent. 476 00:36:53,860 --> 00:36:59,940 Taigi maksimalaus subarray problema, 477 00:36:59,940 --> 00:37:10,610 mes ieškome sumą, per nepertraukiamą subarray. 478 00:37:10,610 --> 00:37:16,230 Ir Emmy pasiūlymas dėl atsargų problemą, 479 00:37:16,230 --> 00:37:30,720 apsvarstyti pakeitimus ar deltą. 480 00:37:30,720 --> 00:37:37,440 Ir šį paveiksliuką - tai akcijų kaina, 481 00:37:37,440 --> 00:37:42,610 bet jei mes priėmėme skirtumą tarp kiekvieną dieną iš eilės - 482 00:37:42,610 --> 00:37:45,200 Taigi matome, kad maksimali kaina, maksimalų pelną, mes galime padaryti 483 00:37:45,200 --> 00:37:50,070 yra čia, jei mes perkame ir parduoti čia. 484 00:37:50,070 --> 00:37:54,240 Bet pažvelkime nuolat pažvelkime tuo subarray problema. 485 00:37:54,240 --> 00:38:02,510 Taigi čia, mes galime padaryti - iš čia į čia, 486 00:38:02,510 --> 00:38:08,410 mes turime teigiamus pokyčius, o tada eiti iš čia į čia mes turėti neigiamą. 487 00:38:08,410 --> 00:38:14,220 Bet tada, iš čia į čia mes turime didžiulį teigiamus pokyčius. 488 00:38:14,220 --> 00:38:20,930 Ir tai yra pakeitimai, kad mes norime Apibendrinant gauti mūsų galutinį pelną. 489 00:38:20,930 --> 00:38:25,160 Tada mes turime daugiau neigiamų pokyčių. 490 00:38:25,160 --> 00:38:29,990 Raktas į sumažinti mūsų atsargų problemą į mūsų maksimaliai subarray problemos 491 00:38:29,990 --> 00:38:36,630 atsižvelgti į deltą tarp dienų. 492 00:38:36,630 --> 00:38:40,630 Taigi, mes sukurti naują masyvą, vadinamą deltos, 493 00:38:40,630 --> 00:38:43,000 inicijuoti pirmąjį įrašą lygus 0, 494 00:38:43,000 --> 00:38:46,380 ir tada už kiekvieną deltos (i) leisti, kad skirtumas 495 00:38:46,380 --> 00:38:52,830 Mano indėlis array (i), array (i - 1). 496 00:38:52,830 --> 00:38:55,530 Tada mes vadiname mūsų įprastą procedūrą maksimalios subarray 497 00:38:55,530 --> 00:39:01,500 einančios Delta masyvo. 498 00:39:01,500 --> 00:39:06,440 Ir,, nes maksimalus subarray yra linijinė laiko, 499 00:39:06,440 --> 00:39:09,370 ir šis sumažėjimas, šis procesas kuriant šį delta masyvo, 500 00:39:09,370 --> 00:39:11,780 taip pat linijinis laikas, 501 00:39:11,780 --> 00:39:19,060 tada galutinis sprendimas išteklių yra O (n) darbo plius O (n) darbo, vis dar yra O (n) darbo. 502 00:39:19,060 --> 00:39:23,900 Taigi, mes turime linijinį laiko problemos sprendimo būdą. 503 00:39:23,900 --> 00:39:29,610 Ar visi supranta šią transformaciją? 504 00:39:29,610 --> 00:39:32,140 >> Apskritai, gera idėja, kad jūs visada turėtų turėti 505 00:39:32,140 --> 00:39:34,290 tai pabandyti sumažinti naują problemą, kad jūs matote. 506 00:39:34,290 --> 00:39:37,700 Jei atrodo, susipažinę su senosios problemos, 507 00:39:37,700 --> 00:39:39,590 pabandykite susiaurinant jį iki senosios problemos. 508 00:39:39,590 --> 00:39:41,950 Ir jei jūs galite naudoti visas priemones, kad jūs, naudojami ant senosios problemos 509 00:39:41,950 --> 00:39:46,450 spręsti naują problemą. 510 00:39:46,450 --> 00:39:49,010 Taigi, susivynioti, techniniai interviu yra sudėtinga. 511 00:39:49,010 --> 00:39:52,280 Tikriausiai kai šios problemos yra daugiau sudėtingų problemų 512 00:39:52,280 --> 00:39:54,700 , kad jūs galite pamatyti interviu, 513 00:39:54,700 --> 00:39:57,690 todėl, jei jūs neturite suprasti visas problemas, kad aš tiesiog, kuriems viskas gerai. 514 00:39:57,690 --> 00:40:01,080 Tai tik keletas iš sudėtingesnių problemų. 515 00:40:01,080 --> 00:40:03,050 Praktika, praktika, praktika. 516 00:40:03,050 --> 00:40:08,170 Aš davė daug problemų ruošinį, todėl tikrai jas patikrinti. 517 00:40:08,170 --> 00:40:11,690 Nuo jūsų interviu ir geros kloties. Visos mano ištekliai yra paskelbtas šią nuorodą, 518 00:40:11,690 --> 00:40:15,220 ir vienas iš mano vyresnysis draugų pasiūlė padaryti juoktis techninius interviu 519 00:40:15,220 --> 00:40:22,050 todėl, jei jus domina, elektroninio pašto adresas bus Yao tuo elektroninio pašto adresu. 520 00:40:22,050 --> 00:40:26,070 Jei turite kokių nors klausimų, galite paklausti. 521 00:40:26,070 --> 00:40:28,780 Ar jūs vaikinai turite konkrečius klausimus, susijusius su techninėmis interviu 522 00:40:28,780 --> 00:40:38,440 arba kokių nors problemų, mes matėme iki šiol? 523 00:40:38,440 --> 00:40:49,910 Gerai. Na, sėkmės ant savo interviu. 524 00:40:49,910 --> 00:40:52,910 [CS50.TV]