[Powered by Google Translate] [Semina: Ufundi Mahojiano] [Kenny Yu, Chuo Kikuu cha Harvard] [Hii ni CS50.] [CS50.TV] Hi kila mtu, mimi nina Kenny. I am sasa junior kusoma sayansi ya kompyuta. Mimi nina zamani CS TF, na mimi napenda alikuwa nilipokuwa underclassman, na kwamba sababu mimi nina kutoa semina hii. Hivyo Natumaini kufurahia. Semina hii ni kuhusu mahojiano ya kiufundi, na rasilimali yangu yote yanaweza kupatikana katika link hii, link hii hapa hapa, wanandoa wa rasilimali. Hivyo mimi alifanya orodha ya matatizo, kwa kweli, kabisa matatizo machache. Pia jumla ya rasilimali ukurasa ambapo tunaweza kupata tips juu ya jinsi ya kujiandaa kwa ajili ya mahojiano, vidokezo juu ya nini unatakiwa kufanya wakati wa mahojiano halisi, kama vile jinsi ya kukabili matatizo na rasilimali kwa ajili ya baadae. Ni wote online. Na tu kwa utangulizi semina hii, disclaimer, kama hii haipaswi - mahojiano yako maandalizi kusiishie tu kwa orodha hii. Hii ni tu maana ya kuwa kiongozi, na unapaswa dhahiri kuchukua kila kitu nasema pamoja na punje ya chumvi, lakini pia kutumia kila kitu mimi kutumika kukusaidia katika mahojiano maandalizi yako. Mimi nina kwenda kwa haraka kupitia slides michache ijayo ili tuweze kupata masomo halisi kesi. muundo wa mahojiano kwa postion uhandisi programu, kawaida ni dakika 30 hadi 45, nyingi raundi, kutegemea kampuni. Mara nyingi utasikia kuwa coding juu ya bodi nyeupe. Hivyo bodi nyeupe kama hii, lakini mara nyingi kwa kiwango kidogo. Kama wewe ni kuwa na mahojiano ya simu, pengine utasikia kutumia aidha collabedit au Doc Google ili waweze kuona mkiishi coding wakati wewe kuwa waliohojiwa juu ya simu. mahojiano yenyewe ni kawaida 2 au 3 matatizo kupima kompyuta yako sayansi maarifa. Na itakuwa karibu dhahiri kuhusisha coding. maswali ya aina hiyo utaona ni kawaida data miundo na algorithms. Na katika kufanya aina hii ya matatizo, watamwuliza wewe, kama, nini ni wakati na utata nafasi, kubwa O? Mara nyingi wao pia kuuliza maswali juu ya ngazi, hivyo, kubuni mfumo, jinsi gani unaweza kuweka nje code yako? Nini interfaces, kile madarasa, modules je, una katika mfumo wako, na jinsi gani haya kuingiliana pamoja? Hivyo data miundo na algorithms kama vile mifumo ya kubuni. Baadhi ya vidokezo ujumla kabla ya sisi kupiga mbizi katika kesi yetu masomo. Nadhani utawala muhimu zaidi ni daima kufikiri kwa sauti. mahojiano zinatakiwa kuwa nafasi yako ya kuonyesha mbali mawazo yako mchakato. hatua ya mahojiano ni kwa ajili ya mhojaji ili kupima jinsi wanafikiri na jinsi ya kwenda kwenye tatizo. Kitu mbaya unaweza kufanya ni kuwa kimya katika mahojiano nzima. Hiyo tu hakuna nzuri. Wakati wewe ni kupewa swali, wewe pia wanataka kuhakikisha unaelewa swali. Hivyo kurudia swali nyuma kwa maneno yako mwenyewe na jaribio la kazi ya uhakika chache kesi mtihani rahisi kuhakikisha unaelewa swali. Kufanya kazi kwa njia ya kesi chache mtihani pia kukupa Intuition juu ya jinsi ya kutatua tatizo hili. Unaweza hata kugundua ruwaza chache kukusaidia kutatua tatizo. Ncha yao kubwa ni si kupata frustrated. Je, si kupata frustrated. Mahojiano ni changamoto, lakini kitu mbaya unaweza kufanya, kwa kuongeza kuwa kimya, ni kuwa wazi imechanganyikiwa. Wewe hawataki kutoa hisia kwamba kwa mhojaji. Jambo moja kwamba - kwa hivyo, watu wengi, wakati wao kwenda katika mahojiano, wao kujaribu kujaribu kupata ufumbuzi bora ya kwanza, wakati kwa kweli, kuna kawaida ufumbuzi glaringly dhahiri. Inaweza kuwa polepole, inaweza kuwa ufanisi, lakini wewe lazima tu kueleza kuwa, hivyo tu una uhakika kuanzia ambayo kazi vizuri zaidi. Pia, akizungumzia nje ufumbuzi ni polepole, katika suala la kubwa O wakati utata au utata nafasi, itadhihirisha kwa mhojaji kwamba kuelewa masuala haya wakati wa kuandika code. Kwa hiyo msiwe na hofu ya kuja na algorithm rahisi kwanza na kisha kazi bora kutoka huko. Maswali yoyote hadi sasa? Sawa. Hivyo hebu kupiga mbizi katika tatizo letu kwanza. "Kutokana na safu ya integers n, kuandika kazi kwamba shuffles safu katika mahali vile kwamba permutations wote wa integers n wana uwezekano sawa. " Na kudhani kuwa inapatikana random integer jenereta kwamba inazalisha integer katika mbalimbali kutoka 0 kwa i, nusu mbalimbali. Je, kila mtu kuelewa swali hili? Mimi kukupa safu ya integers n, na Mimi nataka wewe shuffle yake. Katika orodha yangu, mimi aliandika programu chache kuonyesha namaanisha nini. Mimi naenda shuffle safu ya vipengele 20, kutoka -10 hadi 9, na mimi nataka wewe pato orodha kama hii. Hivyo hii ni pembejeo yangu sorted safu, na Mimi nataka wewe shuffle yake. Tutaweza kufanya hivyo tena. Je, kila mtu kuelewa swali? Sawa. Hivyo ni juu yako. Nini ni baadhi ya mawazo? Je, unaweza kufanya hivyo kama n ^ 2, n logi n, n? Fungua kwa mapendekezo. Sawa. Hivyo wazo moja, alipendekeza kwa Emmy, ni ya kwanza compute random idadi, random integer, katika mbalimbali 0-20. Hivyo kudhani safu yetu ina urefu wa 20. Katika mchoro wetu wa mambo ya 20, hii ni pembejeo yetu safu. Na sasa, pendekezo lake ni kujenga safu mpya, hivyo hii itakuwa safu pato. Na msingi i akarudi na rand - hivyo kama i alikuwa, hebu sema, 17, nakala ya kipengele 17 katika nafasi ya kwanza. Sasa sisi haja ya kufuta - tunahitaji kuhama vipengele vyote hapa juu ya hivyo kwamba tuna pengo mwishoni na mashimo hakuna katikati. Na sasa sisi kurudia utaratibu. Sasa sisi kuchukua mpya random integer kati ya 0 na 19. Tuna i mpya hapa, na sisi nakala hii ya kipengele katika nafasi hii. Kisha sisi kuhama vitu zaidi na sisi kurudia mchakato mpaka tuna mpya wetu kamili safu. Je, ni wakati wa kukimbia algorithm hii? Naam, hebu kuangalia matokeo ya. Sisi ni shifting kila kipengele. Wakati sisi kuondoa hii i, sisi ni shifting vipengele vyote baada ya upande wa kushoto. Na kwamba ni O (n) gharama kwa sababu nini kama sisi kuondoa kipengele kwanza? Hivyo kwa ajili ya kuondolewa kila, sisi kuondoa - kuondolewa kila incurs O (n) operesheni, na tangu tuna n removals, hii hupelekea shuffle O (n ^ 2). Sawa. Hivyo nzuri kuanza. Nzuri ya kuanza. Pendekezo lingine ni kutumia kitu inayojulikana kama shuffle Knuth, au shuffle Fisher-Yates. Na ni kweli linear wakati shuffle. Na wazo ni sawa sana. Tena, tuna mchango wetu safu, lakini badala ya kutumia arrays mbili kwa ajili ya pembejeo wetu / pato, sisi kutumia sehemu ya kwanza ya safu ya kuweka wimbo wa sehemu yetu huchanganywa, na sisi kuweka wimbo, na kisha sisi kuacha wengine wa safu yetu kwa ajili ya sehemu unshuffled. Hivyo hapa ni nini namaanisha. Sisi kuanza mbali na - sisi kuchagua i, safu 0-20. Pointer wetu wa sasa ni akizungumzia index kwanza. Sisi kuchagua baadhi hapa i na sasa sisi wabadilishane. Hivyo kama hii ilikuwa 5 na hii ilikuwa 4, safu kusababisha itakuwa na 5 hapa na 4 hapa. Na sasa tunaona marker hapa. Kila kitu kwa upande wa kushoto ni huchanganywa, na kila kitu kwa kulia unshuffled. Na sasa tunaweza kurudia utaratibu. Sisi kuchagua index random kati ya 1 na 20 sasa. Hivyo kudhani wetu mpya i ni hapa. Sasa sisi byta hii i na msimamo wetu wa sasa mpya hapa. Hivyo hatujui swapping na kurudi kama hii. Hebu kuleta code kufanya hivyo zaidi zege. Tunaweza kuanza na uchaguzi wetu wa i - sisi kuanza na i sawa na 0, tunachukua random mahali j katika sehemu unshuffled wa safu, i kwa n-1. Basi, ikiwa mimi niko hapa, kuchagua kati ya index random hapa na wengine wa safu, na sisi wabadilishane. Hii ni kanuni zote muhimu shuffle safu yako. Maswali yoyote? Naam, mmoja zinahitajika swali ni, kwa nini hili ni sahihi? Kwa nini ni kila permutation uwezekano sawa? Na mimi si kwenda kwa njia ya ushahidi wa hili, lakini matatizo mengi katika sayansi ya kompyuta inaweza kuthibitika kwa njia ya introduktionsutbildning. Jinsi wengi wewe ni ukoo na introduktionsutbildning? Sawa. Cool. Hivyo unaweza kuthibitisha usahihi wa algorithm hili kwa introduktionsutbildning rahisi, ambapo introduktionsutbildning yako hypothesis itakuwa, kudhani kuwa Shuffle yangu anarudi kila permutation uwezekano sawa hadi kwanza i vipengele. Sasa, fikiria i + 1. Na kwa njia ya sisi kuchagua index yetu j wabadilishane, hii husababisha - na kisha kazi nje maelezo, angalau ushahidi kamili ya nini algorithm hili hurejea kila permutation na uwezekano uwezekano sawa. Haki ya wote, karibu tatizo. Hivyo "kupewa safu ya integers, postive, sifuri, hasi, kuandika kazi ambayo inakokotoa Jumla upeo yoyote subarray continueous wa safu pembejeo. " mfano hapa ni, katika kesi ambapo wote idadi ni chanya, basi sasa chaguo bora ni kuchukua safu nzima. 1, 2, 3, 4, sawa na 10. Wakati una baadhi negatives huko, katika kesi hii sisi tu wanataka mbili kwanza kwa sababu kuchagua -1 na / au -3 ataleta Jumla yetu chini. Wakati mwingine sisi tupate kuwa na kuanza katikati ya safu. Wakati mwingine tunataka kuchagua kitu; ni bora si kuchukua kitu chochote. Na wakati mwingine ni bora kuchukua kuanguka, sababu jambo baada ya ni super kubwa. Hivyo mawazo yoyote? (Mwanafunzi, unintelligible) >> Yeah. Tuseme mimi wala kuchukua -1. Basi ama mimi kuchagua 1000 na 20,000, au mimi tu kuchagua bilioni 3. Naam, chaguo bora ni kuchukua namba zote. Hii -1, licha ya kuwa hasi, Jumla zima ni bora kuliko walikuwa mimi si kuchukua -1. Basi mmoja wa tips nilivyoeleza awali ilikuwa kueleza wazi wazi na nguvu brute ufumbuzi kwanza. Je, ni nguvu brute ufumbuzi katika tatizo hili? Yeah? [Jane] Vizuri, nadhani brute nguvu ufumbuzi itakuwa na kuongeza hadi mchanganyiko wote inawezekana (unintelligible). [Yu] Sawa. Hivyo wazo Jane ni kuchukua kila iwezekanavyo - Mimi nina kufafanua - ni kuchukua kila iwezekanavyo kuendelea subarray, compute Jumla yake, na kisha kuchukua upeo wa subarrays wote inawezekana kuendelea. Nini kipekee kubainisha subarray katika pembejeo safu yangu? Kama, nini mambo mawili Ninahitaji? Yeah? (Mwanafunzi, unintelligible) >> Haki. chini amefungwa juu ya index na juu amefungwa index kipekee huamua subarray kuendelea. [Kike mwanafunzi] Je, sisi kukadiria ni safu ya idadi ya kipekee? [Yu] No Hivyo swali lake, ni sisi kuchukua safu yetu - ni safu zetu zote idadi ya kipekee, na jibu ni hapana. Kama sisi kutumia nguvu zetu brute ufumbuzi, basi fahirisi kuanza / mwisho kipekee huamua subarray wetu kuendelea. Hivyo kama sisi iterate kwa entries wote inawezekana kuanza, na kwa entries mwisho wote> au = kuanza, na > Zero. Tu wala kuchukua -5. Hapa ni kwenda kuwa 0 vilevile. Yeah? (Mwanafunzi, unintelligible) [Yu] Oh, sorry, ni -3. Hivyo hii ni 2, hii ni -3. Sawa. Hivyo -4, nini subarray maximal kukomesha kwamba nafasi ambapo -4 ni saa? Zero. Moja? 1, 5, 8. Sasa, mimi lazima mwisho katika eneo ambapo -2 ni saa. Hivyo 6, 5, 7, na moja ya mwisho ni 4. Kujua kwamba haya ni entries yangu kwa tatizo kubadilishwa ambapo mimi lazima mwisho katika kila moja ya fahirisi hizi, basi jibu langu la mwisho ni wa haki, kuchukua zoa hela, na kuchukua idadi ya juu. Hivyo katika kesi hii ni 8. Hii ina maana kwamba subarray maximal inaishia katika index hii, na kuanza mahali fulani mbele yake. Je, kila mtu kuelewa hili subarray kubadilishwa? Sawa. Naam, hebu takwimu nje upprepning kwa hili. Hebu fikiria tu kwanza entries chache. Hivyo hapa ilikuwa 0, 0, 0, 1, 5, 8. Na kisha kulikuwa -2 hapa, na kwamba kuletwa ni chini ya 6. Hivyo kama mimi wito kuingia katika nafasi i subproblem (i), jinsi gani naweza kutumia jibu subproblem uliopita kujibu hii subproblem? Kama mimi kuangalia, hebu sema, kuingia hii. Ninawezaje compute jibu 6 kwa kuangalia mchanganyiko wa safu hii na majibu ya subproblems uliopita katika safu hii? Ndiyo? [Kike mwanafunzi] Wewe kuchukua safu ya maswali katika nafasi ya haki mbele yake, hivyo 8, na kisha kuongeza subproblem sasa. [Yu] Basi pendekezo lake ni kuangalia namba hizi mbili, idadi hii na idadi hii. Hivyo hii 8 inahusu jibu kwa subproblem (i - 1). Na hebu piga pembejeo yangu safu A. Ili kupata subarray maximal kwamba mwisho katika msimamo i, Nina maamuzi mawili: Mimi wanaweza ama kuendelea subarray kwamba kumalizika saa index uliopita, au kuanza safu mpya. Kama ningekuwa na kuendelea subarray ambayo ilianza katika index uliopita, kisha Jumla upeo naweza kufikia ni jibu kwa subproblem uliopita plus sasa safu ya kuingia. Lakini, mimi pia kuwa na uchaguzi wa kuanzia subarray mpya, katika kesi ambayo Jumla ni 0. Hivyo jibu ni max ya 0, subproblem i - 1, plus sasa kuingia safu. Je upprepning hii mantiki? Upprepning yetu, kama sisi tu kugundua, ni subproblem i ni sawa na upeo wa subproblem uliopita plus kuingia yangu ya sasa safu, ambayo ina maana ya kuendelea subarray uliopita, au 0, kuanza subarray mpya katika index yangu ya sasa. Na mara moja tumejenga hii meza ya ufumbuzi, basi jibu wetu wa mwisho, tu kufanya zoa linear hela safu subproblem na kuchukua idadi ya juu. Hii ni utekelezaji kamili ya kile tu alisema. Hivyo sisi kujenga mpya subproblem safu, subproblems. kwanza kuingia ni aidha 0 au ya kwanza kuingia, upeo wa wale wawili. Na kwa ajili ya mapumziko ya subproblems sisi kutumia upprepning halisi sisi kirahisi tu. Sasa sisi compute upeo wa safu yetu subproblems, na kwamba jibu yetu ya mwisho. Hivyo muda kiasi gani ni sisi kutumia katika algorithm hii? Kama ve tu kuchukuliwa CS50, basi unaweza kuwa kujadiliwa nafasi sana. Naam, jambo moja kukumbuka ni kwamba mimi kuitwa malloc hapa na n kawaida. Gani zinaonyesha kwamba na wewe? Algorithm hii inatumia nafasi linear. Je, tunaweza kufanya vizuri zaidi? Je, kuna kitu utaona kwamba ni unnecessary kwa compute jibu la mwisho? Nadhani swali bora ni, nini habari je, sisi si haja ya kubeba njia yote hadi mwisho? Sasa, kama sisi kuangalia mistari hii miwili, sisi tu huduma ya juu subproblem uliopita, na sisi tu huduma kuhusu upeo tumekuwa milele kuona hadi sasa. Compute jibu letu la mwisho, sisi hatuhitaji safu nzima. Tunahitaji tu namba ya mwisho, mwisho namba mbili. Mwisho idadi kwa safu subproblem, na namba ya mwisho kwa upeo. Hivyo, kwa kweli, tunaweza Fuse matanzi hizi pamoja na kwenda kutoka nafasi linear nafasi ya mara kwa mara. Hali Jumla hadi sasa, hapa, nafasi nafasi ya subproblem, subproblem yetu safu. Hivyo sasa jumla, hadi sasa, ni jibu kwa subproblem uliopita. Jumla na kwamba, hadi sasa, unafanyika ya max yetu. Sisi compute upeo kama sisi kwenda pamoja. Na hivyo sisi kwenda kutoka nafasi linear nafasi ya mara kwa mara, na sisi pia kuwa na ufumbuzi linear subarray tatizo letu. Hizi aina ya maswali utapata wakati wa mahojiano. Je, ni utata wakati; ni nini utata nafasi? Je, unaweza kufanya vizuri? Je, kuna mambo ambayo ni lazima kuweka kote? Mimi alifanya hivyo kuonyesha kwamba uchambuzi unapaswa kuchukua juu yako mwenyewe kama wewe ni kufanya kazi kwa njia ya matatizo haya. Daima kuwa na kuuliza wewe mwenyewe, "Naweza kufanya vizuri?" Kwa kweli, tunaweza kufanya vizuri zaidi kuliko haya? Aina ya swali hila. Huwezi, kwa sababu unahitaji angalau kusoma pembejeo kwa tatizo. Hivyo ukweli kwamba unahitaji angalau kusoma pembejeo kwa tatizo ina maana kwamba huwezi kufanya vizuri zaidi kuliko wakati linear, na huwezi kufanya vizuri zaidi kuliko nafasi ya mara kwa mara. Hivyo hii ni, kwa kweli, ufumbuzi bora wa tatizo hili. Maswali? Sawa. Hisa soko tatizo: "Kutokana na safu ya integers n, chanya, sifuri, au hasi, kwamba kuwakilisha bei ya hisa zaidi ya siku n, kuandika kazi kwa compute faida upeo unaweza kufanya kutokana na kwamba unaweza kununua na kuuza hasa 1 hisa ndani ya siku hizi n. " Kimsingi, tunataka kununua chini, kuuza high. Na tunataka takwimu nje faida bora tunaweza kufanya. Tukirudi kwenye ncha wangu, ni nini mara moja wazi, rahisi jibu, lakini ni polepole? Ndiyo? (Mwanafunzi, unintelligible) >> Ndiyo. >> Hivyo ingekuwa tu kwenda ingawa na kuangalia bei ya hisa katika kila hatua katika wakati, (unintelligible). [Yu] Sawa, hivyo ufumbuzi wake - pendekezo yake ya kompyuta chini na kompyuta ya juu si lazima kazi kwa sababu ya juu ili kutokea kabla ya chini. Hiyo ni nini brute force ufumbuzi wa tatizo hili? Je, ni mambo mawili ambayo nahitaji kipekee kuamua faida mimi kufanya? Haki. brute force ufumbuzi ni - oh, hivyo, pendekezo George ni sisi tu haja ya siku mbili kwa kipekee kuamua faida ya siku hizo mbili. Hivyo sisi compute kila jozi, kama kununua / kuuza, compute faida, ambayo inaweza kuwa hasi au chanya au sifuri. Compute faida kubwa kwamba sisi kufanya baada ya iterating juu ya jozi wote wa siku. Hiyo itakuwa jibu yetu ya mwisho. Na ufumbuzi kwamba itakuwa O (n ^ 2), kwa sababu kuna n kuchagua jozi mbili - ya siku kwamba unaweza kuchagua kati ya siku za mwisho. Okay, hivyo nina si kwenda na kwenda juu ya ufumbuzi brute force hapa. Mimi naenda kukuambia kwamba kuna n logi n ufumbuzi. Nini algorithm gani sasa kujua kwamba ni n logi n? Siyo suala hila. Changanya aina. Changanya aina ni n logi n, na kwa kweli, njia moja ya kutatua tatizo hili ni kutumia aina kuunganisha aina ya wazo kuitwa, kwa ujumla, kugawanya na kushinda. Na wazo ni kama ifuatavyo. Unataka compute bora kununua / kuuza jozi katika nusu kushoto. Kupata faida bora unaweza kufanya, na tu n kwanza juu ya siku mbili. Kisha unataka oompute bora kununua / kuuza jozi kwenye nusu haki, hivyo n mwisho juu ya siku mbili. Na sasa swali ni jinsi gani sisi kuunganisha hawa ufumbuzi nyuma pamoja? Ndiyo? (Mwanafunzi, unintelligible) >> Sawa. Hivyo basi mimi kuchora picha. Ndiyo? (George, unintelligible) >> Hasa. George ufumbuzi ni sahihi kabisa. Hivyo maoni yake ni, kwanza compute bora kununua / kuuza jozi, na kwamba hutokea katika nusu kushoto, hivyo hebu wito kwamba kushoto, kushoto. Best kununua / kuuza jozi kwamba hutokea katika nusu ya haki. Lakini kama sisi tu ikilinganishwa namba hizi mbili, sisi ni kukosa kesi ambapo sisi kununua hapa na kuuza mahali fulani katika nusu ya haki. Sisi kununua katika nusu kushoto, kuuza katika nusu ya haki. Na njia bora ya compute bora kununua / kuuza jozi kwamba spans halves wote ni kwa compute kima cha chini hapa na compute upeo hapa na kuchukua tofauti zao. Hivyo kesi mbili ambapo jozi kununua / kuuza hutokea tu hapa, tu hapa, au juu ya wote halves hufafanuliwa kwa namba hizi tatu. Hivyo algorithm yetu kwa kuunganisha ufumbuzi yetu nyuma pamoja, tunataka compute bora kununua / kuuza jozi ambapo sisi kununua kwa nusu kushoto na kuuza nusu ya haki. Na njia bora ya kufanya hivyo ni kwa compute bei ya chini katika nusu ya kwanza, bei ya juu katika nusu haki, na kuchukua tofauti zao. kusababisha tatu faida, hizi idadi tatu, unaweza kuchukua upeo wa tatu, na kwamba ni faida bora unaweza kufanya zaidi ya siku hizi kwanza na wa mwisho. Hapa mistari muhimu ni katika nyekundu. Huu ni wito wa kujirudia kwa compute jibu katika nusu kushoto. Huu ni wito wa kujirudia kwa compute jibu katika nusu ya haki. Hizi mbili kwa matanzi compute min na max juu ya nusu ya kushoto na kulia, kwa mtiririko huo. Sasa mimi compute faida spans halves wote, na jibu la mwisho ni upeo wa tatu hizi. Sawa. Hivyo, uhakika, tuna algorithm, lakini swali kubwa ni, kile ni utata wakati wa hili? Na sababu mimi zilizotajwa kuunganisha aina ni kwamba aina hii ya kugawanya jibu katika mbili na kisha kuunganisha ufumbuzi yetu nyuma pamoja ni hasa aina ya aina kuunganisha. Hivyo basi mimi kwenda kwa njia ya muda. Kama sisi defined t kazi (n) kuwa idadi ya hatua kwa n siku, zetu mbili kujirudia wito ni kila kwenda gharama t (n / 2), na kuna mawili ya simu hizi. Sasa nahitaji compute chini ya nusu ya kushoto, ambayo naweza kufanya katika n / 2 wakati, pamoja na upeo wa nusu ya haki. Hivyo hii ni haki ya n. Na kisha pamoja na baadhi ya kazi mara kwa mara. Na hii equation upprepning ni hasa equation upprepning kwa aina kuunganisha. Na sisi wote tunajua kwamba kuunganisha aina ni n logi n wakati. Kwa hiyo, algorithm yetu pia n logi n wakati. Je iteration hii mantiki? Tu recap mafupi ya hili: T (n) ni Idadi ya hatua ya compute faida upeo juu ya mwendo wa siku n. njia ya sisi wameigawanya wetu wito kujirudia ni kwa wito ufumbuzi yetu juu ya siku ya kwanza n / 2, hivyo kwamba moja ya simu, na kisha sisi kuwaita tena juu ya nusu ya pili. Basi hiyo ni mbili wito. Na kisha sisi kupata chini ya nusu ya kushoto, ambayo tunaweza kufanya katika muda linear, kupata upeo wa nusu haki, ambayo tunaweza kufanya katika muda linear. Hivyo n / 2 + n / 2 ni tu n. Basi tuna baadhi ya kazi mara kwa mara, ambayo ni kama kufanya hesabu. Hii equation upprepning ni hasa equation upprepning kwa aina kuunganisha. Hivyo, shuffle wetu algorithm ni pia n logi n. Hivyo muda kiasi gani ni sisi kutumia? Turudi kwa kificho. swali ni bora, jinsi wengi stack muafaka gani sisi milele kuwa wakati wowote? Tangu sisi ni kutumia recursion, idadi ya muafaka stack huamua nafasi yetu ya matumizi. Hebu fikiria n = 8. Tunatoa wito shuffle juu ya 8, ambayo nitakuita shuffle juu entries kwanza nne, ambayo nitakuita shuffle juu entries mbili za kwanza. Hivyo stack yetu ni - hii ni stack yetu. Na kisha sisi kuwaita shuffle tena juu ya 1, na kwamba ni nini msingi wetu ni kesi, hivyo sisi kurudi mara moja. Je, sisi milele kuwa na zaidi ya muafaka hii wengi stack? No sababu kila wakati sisi kufanya sala, sala ya kujirudia kwa Shuffle, sisi kugawanya kawaida yetu katika nusu. Hivyo idadi ya juu ya muafaka stack sisi milele kuwa wakati wowote ni juu ya utaratibu wa muafaka logi n stack. Kila sura stack ina nafasi ya mara kwa mara, na kwa hiyo jumla ya kiasi cha nafasi, kiasi cha upeo wa nafasi sisi milele kutumia ni O (logi n) nafasi ambapo n ni idadi ya siku. Sasa, ujihoji, "Je, sisi kufanya vizuri?" Na hasa, tunaweza kupunguza tatizo tumekuwa tayari kutatuliwa? hint: sisi tu kujadiliwa mbili matatizo mengine kabla ya haya, na si kwenda kuwa shuffle. Tunaweza kubadilisha soko hili la hisa tatizo katika tatizo maximal subarray. Tunawezaje kufanya hivyo? Moja ya wewe? Emmy? (Emmy, unintelligible) [Yu] Hasa. Hivyo tatizo maximal subarray, sisi ni kuangalia kwa jumla juu ya subarray kuendelea. Na pendekezo Emmy kwa tatizo hifadhi, kuzingatia mabadiliko, au delta. Na picha ya hii ni - hii ni bei ya hisa, lakini kama sisi alichukua tofauti kati ya kila siku mfululizo - hivyo tunaona kwamba bei ya upeo, upeo faida tunaweza kufanya ni kama sisi kununua na kuuza hapa hapa. Lakini hebu angalia kuendelea - hebu tuangalie tatizo subarray. Hivyo hapa, tunaweza kufanya - yanaenda hapa na hapa, tuna mabadiliko chanya, na kisha kwenda kutoka hapa na hapa tuna mabadiliko hasi. Lakini basi, inaenda hapa na hapa tuna kubwa mabadiliko chanya. Na haya ni mabadiliko ambayo tunataka jumla juu ya kupata faida yetu ya mwisho. Basi tuna zaidi hasi mabadiliko hapa. muhimu kwa kupunguza hisa zetu tatizo ndani ya tatizo letu maximal subarray ni kuzingatia delta kati ya siku. Hivyo sisi kujenga safu mpya inayoitwa delta, initialize ya kwanza kuingia kwa kuwa 0, na kisha kwa kila delta (i), basi kwamba kuwa tofauti wa pembejeo yangu array (i), na safu (i - 1). Kisha sisi kuwaita utaratibu wetu wa kawaida kwa subarray maximal kupita katika safu ya delta. Na kwa sababu subarray maximal ni linear muda, na hii kupunguza, mchakato huu wa kujenga hii safu delta, pia ni linear muda, basi suluhisho la mwisho kwa ajili ya hifadhi ni O (n) kazi pamoja na O (n) kazi, bado ni O (n) kazi. Hivyo tuna linear wakati ufumbuzi wa tatizo letu. Je, kila mtu kuelewa mabadiliko haya? Kwa ujumla, wazo nzuri kwamba unapaswa daima kuwa ni kujaribu kupunguza tatizo mpya kwamba wewe ni kuona. Kama inaonekana familiar na tatizo zamani, kujaribu kupunguza kwa tatizo zamani. Na kama unaweza kutumia zana zote kwamba ve kutumika kwenye tatizo zamani kutatua tatizo mpya. Hivyo wa kufuta, mahojiano ya kiufundi ni changamoto. Matatizo haya pengine baadhi ya matatizo magumu zaidi kwamba unaweza kuona katika mahojiano, hivyo kama huelewi matatizo yote kwamba mimi tu kufunikwa, ni sawa. Hizi ni baadhi ya matatizo ya changamoto zaidi. Mazoezi, mazoezi, mazoezi. Mimi alitoa na matatizo mengi katika karatasi ya mazoezi, hivyo dhahiri kuangalia wale nje. Na bahati nzuri juu ya mahojiano yako. Rasilimali yangu yote ni posted katika link hii, na mmoja wa marafiki zangu mwandamizi imetoa kufanya mahojiano maskhara kiufundi, hivyo kama wewe ni nia, barua pepe Will Yao katika anuani kwamba barua pepe. Kama una baadhi ya maswali, unaweza kuuliza mimi. Je, wewe guys kuwa maswali maalum kuhusiana na mahojiano ya kiufundi au matatizo yoyote tumeona hadi sasa? Sawa. Naam, bahati nzuri na mahojiano yako. [CS50.TV]