[Powered by Google Translate] [Adran 3 - Mwy cyfforddus] [Rob Bowden - Harvard University] [Mae hyn yn CS50. - CS50.TV] Felly, y cwestiwn cyntaf yn cael ei eirio yn rhyfedd. GDB yn gadael i chi "debug" rhaglen, ond, yn fwy penodol, beth mae'n ei gadael i chi ei wneud? 'N annhymerus' ateb hwnnw, ac nid wyf yn gwybod beth a ddisgwylir yn union, felly rwy'n dyfalu ei fod yn rhywbeth ar hyd y llinellau mae'n gadael i chi gam wrth gam gerdded drwy'r rhaglen, rhyngweithio ag ef, newidynnau newid, gwneud yr holl bethau hyn - yn y bôn yn gyfan gwbl rheoli gweithredu o raglen ac archwilio unrhyw ran benodol o weithredu y rhaglen. Felly y nodweddion hynny yn gadael i chi debug pethau. Iawn. Pam mae chwiliad deuaidd ei gwneud yn ofynnol bod amrywiaeth yn cael ei datrys? Pwy sydd eisiau i ateb hynny? [Myfyrwyr] Oherwydd nad yw'n gweithio os nad yw'n datrys. >> Yeah. [Chwerthin] Os na chaiff ei ddatrys, yna mae'n amhosibl i rannu yn ei hanner ac yn gwybod bod popeth ar y chwith yn llai a phopeth ar y dde yn fwy na gwerth canol. Felly, mae angen ei datrys. Iawn. Pam yn fath swigen yn O o n sgwâr? A oes unrhyw un yn gyntaf am roi cyflym iawn ar lefel uchel trosolwg o'r hyn y fath swigod yw? [Myfyrwyr] chi yn y bôn yn mynd drwy bob elfen, ac eich bod yn gwirio yr elfennau cyntaf. Os ydyn nhw'n allan o ble rydych yn eu cyfnewid, yna eich bod yn gwirio yr elfennau nesaf ac yn y blaen. Pan fyddwch yn cyrraedd y diwedd, yna rydych yn gwybod bod yr elfen fwyaf yn cael ei osod ar y diwedd, er mwyn i chi anwybyddu bod un yna byddwch yn dal i fynd drwy, a phob tro y mae'n rhaid i chi wirio un elfen yn llai hyd nes y byddwch yn gwneud unrhyw newidiadau. >> Yeah. Mae'n cael ei alw fath swigod oherwydd os ydych yn troi ar y rhesi ar ei ochr fel mae i fyny ac i lawr, fertigol, yna bydd y gwerthoedd mawr yn suddo i'r gwaelod a gwerthoedd bach yn swigen i fyny i ben. Dyna sut y cafodd ei enw. Ac ie, 'ch jyst yn mynd drwy. Byddwch yn dal i fynd drwy'r array, gyfnewid y gwerth mwy i gael y gwerthoedd mwyaf i'r gwaelod. Pam ei bod hi'n O o n sgwâr? Yn gyntaf, oes unrhyw un eisiau dweud pam y mae'n O o n sgwâr? [Myfyrwyr] Gan fod ar gyfer pob rhediad y mae'n mynd adegau n. Gallwch fod yn sicr eich bod wedi cymryd yr elfen fwyaf yr holl ffordd i lawr, yna rhaid i chi ailadrodd ar gyfer fel elfennau lawer. >> Yeah. Felly, yn cadw mewn cof yr hyn a fawr O olygu a beth yw ystyr Omega mawr. Mae'r O mawr yn debyg i'r uchaf rhwymo ar sut araf gall fod mewn gwirionedd redeg. Felly, drwy ddweud ei fod yn O o n sgwâr, nid yw'n O o n neu arall fyddai'n gallu rhedeg mewn amser llinol, ond mae'n O o n giwbiau oherwydd ei fod yn ffinio O o n giwbiau. Os yw'n ffinio gan O o n sgwâr, yna mae'n ffinio hefyd gan n giwbiau. Felly, mae'n cael ei n sgwâr, ac yn achos gwaethaf absoliwt na all ei wneud yn well na n sgwâr, a dyna pam ei fod yn O o n sgwâr. Felly, er mwyn gweld math bach ar sut y mae'n dod allan i fod yn n sgwâr, os oes gennym pum peth yn ein rhestr, y tro cyntaf a allai faint o gyfnewid rydym gallai fod angen i wneud er mwyn cael hyn? Gadewch i ni mewn gwirionedd yn unig - Faint o gyfnewid ydym yn mynd i gael i wneud yn y tymor cyntaf o fath swigen drwy'r casgliad? [Myfyrwyr] n - 1. >> Yeah. Os oes 5 elfen, rydym yn mynd i angen i wneud n - 1. Yna, ar yr ail un faint o gyfnewid ydym yn mynd i gael i wneud? [Myfyrwyr] n - 2. >> Yeah. Ac mae'r trydydd yn mynd i fod n - 3, ac yna ar gyfer hwylustod, byddaf yn ysgrifennu y ddwy flynedd ddiwethaf fel yna rydym yn mynd i angen i wneud 2 cyfnewid ac 1 cyfnewid. Amcana gall yr un olaf neu beidio mewn gwirionedd yn rhaid i ddigwydd. A yw'n cyfnewid? Nid wyf yn gwybod. Felly, mae'r rhain yn y cyfansymiau o gyfnewidiadau neu o leiaf gymariaethau rhaid i chi wneud. Hyd yn oed os nad ydych yn cyfnewid, bydd angen i chi gymharu'r gwerthoedd. Felly mae n - 1 cymariaethau yn y tymor cyntaf trwy y rhesi. Os ydych yn ail-drefnu pethau hyn, gadewch i ni mewn gwirionedd yn ei gwneud yn chwe pheth cymaint o bethau synnwyr 'n glws, ac yna bydda i'n gwneud 3, 2, 1. Felly, dim ond ad-drefnu y symiau hyn, rydym eisiau i weld faint o gymariaethau a wnawn yn y algorithm cyfan. Felly, os ydym yn dod â'r guys i lawr yma, yna rydym yn dal i fod ychydig crynhoi cymariaethau Fodd bynnag, roedd llawer. Ond os ydym yn crynhoi y rhain ac rydym yn crynhoi y rhain ac rydym yn crynhoi y rhain, mae'n dal i fod yr un broblem. Rydym yn unig yn crynhoi rhai grwpiau penodol. Felly, nawr rydym ni'n crynhoi 3 n yn. Nid dim ond 3 n yn. Mae bob amser yn mynd i fod yn n / 2 n yn. Felly dyma ni yn digwydd i gael 6. Pe bai gennym 10 peth, yna gallem wneud hyn grwpiad at 5 pâr gwahanol o bethau a darfod i fyny ag n + n + n + n + n. Felly, rydych chi'n bob amser yn mynd i gael n / 2 n, ac felly byddwn jot allan i n sgwâr / 2. Ac felly hyd yn oed er 'i' y ffactor o hanner, sy'n digwydd i ddod i mewn oherwydd y ffaith bod drwy bob iteriad dros yr amrywiaeth rydym yn cymharu 1 yn llai felly dyna sut yr ydym yn cael y dros 2, ond mae'n dal i fod yn n sgwâr. Nid ydym yn poeni am y ffactor cyson o hanner. Felly, mae llawer o mawr O pethau fel hyn yn dibynnu ar ddim ond math o wneud y math hwn o mathemateg, gwneud symiau rhifyddol a phethau cyfres geometrig, ond mae'r rhan fwyaf ohonynt yn y cwrs hwn yn eithaf syml. Iawn. Pam yn fath gosod yn Omega o n? Beth mae omega yn ei olygu? [Ddau fyfyriwr yn siarad ar unwaith - annealladwy] Yeah >>. Gall Omega chi feddwl fel y is rhwymo. Felly, ni waeth pa mor effeithlon yw eich gosod algorithm fath yw, waeth beth y rhestr sydd wedi pasio i mewn, mae bob amser yn rhaid i gymharu o leiaf n pethau neu mae'n rhaid iddo ailadrodd dros bethau n. Pam hynny? [Myfyrwyr] Oherwydd os bydd y rhestr yn cael ei datrys yn barod, yna trwy gylch 1 gallwch ond warantu bod yr elfen gyntaf yw'r lleiaf, a'r ail ailadroddiad gallwch warantu y ddau gyntaf yn oherwydd nad ydych yn gwybod bod y gweddill y rhestr yn cael ei datrys. >> Yeah. Os byddwch yn pasio mewn rhestr datrys yn llwyr, o leiaf rhaid i chi fynd dros yr holl elfennau i weld nad oes dim angen symud o gwmpas. Felly, pasio dros y rhestr a dweud oh, mae hyn yn cael ei drefnu eisoes, mae'n amhosibl i chi wybod ei fod yn datrys hyd nes eich bod yn gwirio pob elfen i weld eu bod mewn trefn sortio. Felly, yr isaf rhwymo ar fath rhoi i mewn yw Omega o n. Beth yr achos gwaethaf amser rhedeg o uno fath, achos gwaethaf O fawr eto? Felly, yn y senario achos gwaethaf, sut mae merge math rhedeg? [Myfyrwyr] N log n. >> Yeah. Mae'r cyflymaf algorithmau trefnu cyffredinol yn n log n. Ni allwch wneud yn well. Mae rhai achosion arbennig, ac os oes gennym amser heddiw - ond mae'n debyg won't - gallem weld un sy'n gwneud yn well na n log n. Ond yn yr achos cyffredinol, ni allwch wneud yn well na n log n. Ac uno fath yn digwydd i fod yn un y dylech wybod am y cwrs hwn sydd yn n log n. Ac felly byddwn mewn gwirionedd yn gweithredu hynny heddiw. Ac yn olaf, mewn dim mwy na tair brawddeg, sut yn gweithio fath dethol? Oes rhywun eisiau ateb, a byddaf yn cyfrif eich brawddegau oherwydd os byddwch yn mynd dros 3 - A oes unrhyw un yn cofio fath dethol? Dewis fath fel arfer yn eithaf hawdd i'w gofio yn unig gan y enw. 'Ch jyst ailadrodd dros y array, dod o hyd i beth bynnag yw gwerth mwyaf, neu lleiaf - mha drefn bynnag rydych yn didoli i mewn Felly, gadewch i ni ddweud ein bod yn didoli o'r lleiaf i'r mwyaf. Byddwch yn ailadrodd dros yr amrywiaeth, yn chwilio am beth bynnag yr elfen lleiaf yw, dewis, ac yna dim ond cyfnewid beth bynnag sydd yn y lle cyntaf. Ac yna ar y tocyn ail ar yr amrywiaeth, edrychwch am yr elfen lleiaf unwaith eto, dewis, ac yna eu cyfnewid gyda beth sydd yn yr ail safle. Felly, rydym yn unig yn dewis a dethol y gwerthoedd lleiaf a mewnosod i mewn i flaen y rhesi nes iddo gael ei datrys. Cwestiynau ar hynny? Mae'r rhain yn anochel yn ymddangos yn y ffurflenni yn rhaid i chi lenwi pan fyddwch yn cyflwyno'r pset. Mae'r rhai yn y bôn yr atebion i'r rheini. Iawn, felly, yn awr codio problemau. Rwyf eisoes yn anfon allan dros e-bost - nid oedd unrhyw un yn cael yr e-bost? Iawn. Rwyf eisoes yn anfon allan dros e-bost y gofod ein bod ni'n mynd i gael ei ddefnyddio, ac os ydych yn clicio ar fy enw - felly yr wyf yn meddwl fy mod i'n mynd i fod ar y gwaelod oherwydd y r yn ôl - ond os ydych yn clicio ar fy enw byddwch gweler 2 diwygiadau. Adolygu 1 yn mynd i gael ei gopïo I eisoes a gludo y cod i mewn Mannau am y peth chwilio yr ydych yn mynd i gael eu gweithredu. A bydd Revision 2 fod y peth math yr ydym yn gweithredu ar ôl hynny. Felly, gallwch glicio ar fy Revision 1 ac yn gweithio oddi yno. Ac yn awr rydym am weithredu chwiliad deuaidd. A oes unrhyw un eisiau i ddim ond yn rhoi pseudocode lefel uchel esboniad o'r hyn yr ydym yn mynd i gael ei wneud ar gyfer chwilio? Yeah. [Myfyrwyr] Rydych yn unig yn cymryd ganol y rhesi a gweld os yr hyn yr ydych yn chwilio am yn llai na hynny neu fwy na hynny. Ac os yw'n llai, byddwch yn mynd i'r hanner yn llai, ac os yw'n fwy, byddwch yn mynd i'r hanner yn fwy ac yn ailadrodd hynny nes eich bod dim ond yn cael un peth. [Bowden] Yeah. Sylwch fod ein rhifau amrywiaeth ei drefnu eisoes, ac felly mae hynny'n golygu y gallwn fanteisio ar hynny a allai yn gyntaf wirio, iawn, dwi'n chwilio am y rhif 50. Felly, gallaf fynd i mewn i'r canol. Canol yn anodd ei ddiffinio pan ei fod yn nifer hyd yn oed o bethau, ond gadewch i ni dim ond yn dweud y byddan byddwn bob amser yn gwtogi'r amser i'r canol. Felly dyma gennym 8 pethau, felly byddai'r canol fod yn 16. Dwi'n chwilio am 50, felly 50 yn fwy na 16. Felly nawr gallaf drin fy bôn amrywiaeth fel elfennau hyn. Gallaf daflu popeth o 16 drosodd. Nawr mae fy amrywiaeth yn unig y 4 elfen, a dywedaf eto. Felly, yna rwyf am ddod o hyd i'r canol unwaith eto, sydd yn mynd i fod yn 42. 42 yn llai na 50, er mwyn i mi daflu i ffwrdd y ddwy elfen. Dyma fy amrywiaeth sy'n weddill. Rydw i'n mynd i ddod o hyd i'r canol unwaith eto. Amcana 50 yn esiampl wael oherwydd fy mod bob amser yn taflu pethau i'r chwith, ond gan yr un mesur, os ydw i'n chwilio am rywbeth ac mae'n llai na'r elfen o bryd rwy'n edrych ar, Yna rwy'n mynd i daflu i ffwrdd popeth ar y dde. Felly, yn awr mae angen i ni weithredu. Sylwch fod angen i ni roi o ran maint. Ni all angen i ni hefyd galed-god maint. Felly, os byddwn yn cael gwared ar y # diffinio - Iawn. Sut y gallaf 'n glws chyfrif i maes beth yw maint y rhesi rhifau ar hyn o bryd? Faint o elfennau yn yr amrywiaeth rhifau? [Myfyrwyr] Rhifau, cromfachau,. Hyd? [Bowden] Nid yw hynny'n bodoli yn C. Angen. Hyd. Nid oes gan araeau eiddo, felly nid oes dim eiddo hyd araeau a fydd yn unig yn rhoi i chi waeth pa mor hir mae'n digwydd i fod. [Myfyrwyr] Gweler faint o gof sydd ganddo a'i rannu â faint - Yeah >>. Felly sut allwn ni weld faint o gof sydd ganddo? >> [Myfyrwyr] Sizeof. >> Yeah, sizeof. Sizeof yw'r gweithredwr sy'n mynd i ddychwelyd maint y rhesi rhifau. Ac mae hynny'n mynd i fod yn gyfanrifau, fodd bynnag, mae llawer o gwaith maint o gyfanrif ers hynny mae faint o gof mae'n mewn gwirionedd yn cymryd i fyny. Felly, os ydw i am nifer o bethau yn yr amrywiaeth, yna dwi'n mynd i eisiau ei rannu â faint o gyfanrif. Iawn. Felly, sy'n gadael i mi basio o ran maint yma. Pam ydw i'n angen i chi basio o ran maint o gwbl? Pam na allaf ond yn gwneud i fyny yma faint int = sizeof (tas wair) / sizeof (canolradd)? Pam nad yw hyn yn gweithio? [Myfyrwyr] Dyw hi ddim yn newidyn byd-eang. Haystack [Bowden] yn bodoli ac rydym yn pasio yn y niferoedd fel tas wair, ac mae hyn yn fath o foreshadowing o'r hyn sydd i ddod. Yeah. [Myfyrwyr] Haystack yn unig yw'r cyfeiriad ato, felly byddai'n dychwelyd pa mor fawr mae'r cyfeiriad hwnnw. Yeah. Yr wyf yn amau ​​mewn darlith yr ydych wedi gweld y simnai eto mewn gwirionedd, dde? Rydym wedi siarad yn unig am y peth. Felly, y corn simnai yw ble mae eich holl newidynnau yn mynd i gael eu storio. Unrhyw cof sydd wedi dyrannu ar gyfer newidynnau lleol yn mynd yn y simnai, a phob swyddogaeth yn cael ei ofod ei hun ar y simnai, ei ffrâm stac ei hun yw'r hyn fe'i gelwir. Felly, prif wedi ei ffrâm pentwr, a'r tu mewn ohono yn mynd i fodoli y amrywiaeth rhifau, ac mae'n mynd i fod o (nifer) sizeof maint. Mae'n mynd i gael faint y rhifau rhannu yn ôl maint y elfennau, ond bod yr holl byw o fewn ffrâm pentwr prif. Pan fyddwn yn galw chwilio, chwilio yn cael ei ffrâm pentwr ei hun, ei le ei hun i storio ei holl newidynnau lleol. Ond mae'r dadleuon - felly nid tas wair yn gopi o'r amrywiaeth gyfan. Nid ydym yn trosglwyddo yn y casgliad cyfan fel copi i chwilio. 'I jyst yn pasio gyfeiriad at y casgliad. Felly, gall chwilio gael gafael ar y rhifau drwy geirda hwn. Mae'n dal i gael mynediad at y pethau sy'n byw tu mewn ffrâm pentwr prif, ond yn y bôn, pan fyddwn yn mynd i awgrymiadau, a ddylai fod yn fuan, mae hyn yn beth awgrymiadau yn cael eu. Pointers yn unig gyfeiriadau at bethau, a gallwch ddefnyddio awgrymiadau i gael gafael ar bethau sydd mewn fframiau stac pethau eraill '. Felly hyd yn oed er bod y niferoedd yn lleol to main, gallwn barhau i gael mynediad iddo trwy'r pwyntydd. Ond gan ei fod dim ond pwyntydd ac mae'n dim ond cyfeiriad, sizeof (tas wair) dim ond yn dychwelyd y maint y cyfeiriad ei hun. Nid yw'n dychwelyd maint y peth mae'n pwyntio at. Nid yw'n dychwelyd y maint gwirioneddol y rhifau. Ac felly nid yw hyn yn mynd i weithio fel yr ydym am iddo. Cwestiynau ar hynny? Bydd awgrymiadau yn mynd i mewn yn fanwl llawer mwy gwaedlyd yn yr wythnosau i ddod. A dyma pam mae llawer o bethau yr ydych yn gweld, pethau chwilio mwyaf neu bethau fath, eu bod bron i gyd yn mynd i angen i gymryd y maint gwirioneddol y array, oherwydd yn C, nid oes gennym unrhyw syniad beth yw maint y rhesi yn. Mae angen i chi llaw ei drosglwyddo i mewn Ac ni allwch manually basio yn yr amrywiaeth cyfan oherwydd eich bod yn mynd heibio yn y cyfeiriad ac ni all gael y maint o'r cyfeiriad. Iawn. Felly, nawr rydym am i weithredu'r hyn Eglurwyd o'r blaen. Gallwch weithio arno am funud, ac nid oes rhaid i chi boeni am gael popeth yn berffaith 100% gweithio. Dim ond yn ysgrifennu i fyny 'r pseudocode hanner ar gyfer sut rydych chi'n meddwl y dylai weithio. Iawn. Nid oes angen i gael ei wneud yn gyfan gwbl â hyn eto. Ond oes unrhyw un yn teimlo'n gyfforddus â'r hyn sydd ganddynt hyd yn hyn, fel rhywbeth y gallwn weithio gyda gyda'n gilydd? A oes unrhyw un eisiau gwirfoddoli? Neu byddaf yn dewis ar hap. Nid oes rhaid i fod yn iawn gan unrhyw fesur, ond rhywbeth y gallwn addasu i gyflwr gweithio. [Myfyrwyr] Cadarn. >> Iawn. Felly a allwch arbed y diwygiad drwy glicio ar yr eicon Save bach. Rydych chi'n Ramya, dde? >> [Myfyrwyr] Yeah. >> [Bowden] Iawn. Felly nawr gallaf weld eich adolygu a gall pawb dynnu i fyny y diwygiad. Ac yma mae gennym - Iawn. Felly Ramya aeth gyda'r ateb recursive, sydd yn bendant yn ateb dilys. Mae dwy ffordd y gallwch wneud y broblem hon. Gallwch naill ai wneud yn iteraidd neu ailadroddus. Gall problemau y rhan fwyaf o ddod ar eu traws y gellir ei wneud recursively hefyd yn cael ei wneud yn iteraidd. Felly dyma ni wedi gwneud hynny ailadroddus. Oes rhywun eisiau i ddiffinio'r hyn y mae'n ei olygu i wneud swyddogaeth recursive? [Myfyrwyr] Pan fydd gennych swyddogaeth alw ei hun ac yna galw ei hun hyd nes ei fod yn dod allan gyda'r wir ac yn wir. >> Yeah. Mae swyddogaeth recursive yn unig yw swyddogaeth sy'n galw ei hun. Mae tri pheth mawr bod rhaid i swyddogaeth ailadroddus gael. Y cyntaf yn amlwg, mae'n galw ei hun. Yr ail yw'r achos sylfaenol. Felly, ar ryw bwynt y swyddogaeth mae angen i roi'r gorau i ffonio ei hun, a dyna beth yr achos sylfaenol ar gyfer. Felly, yma rydym yn gwybod y dylem roi'r gorau, dylem roi'r gorau i chwilio yn ein pan fydd yn dychwelyd dechrau diwedd - a byddwn yn mynd dros yr hyn mae'n ei olygu. Ond o'r diwedd, y peth olaf sy'n bwysig ar gyfer swyddogaethau recursive: rhaid i swyddogaethau'r rywsut gysylltu â'r achos sylfaenol. Fel os nad ydych chi'n mewn gwirionedd yn diweddaru unrhyw beth pan fyddwch yn gwneud yr alwad recursive ail, os ydych yn llythrennol dim ond galw swyddogaeth eto gyda'r un dadleuon ac nid oes unrhyw newidynnau byd-eang wedi newid neu unrhyw beth, fyddwch chi byth yn cyrraedd yr achos sylfaenol, yn yr achos hwnnw yn ddrwg. Bydd yn dychweliad diddiwedd a gorlif pentwr. Ond dyma rydym yn gweld bod y diweddariad yn digwydd gan ein bod yn diweddaru dechrau + diwedd / 2, rydym yn diweddaru'r ddadl diwedd yma, rydym yn diweddaru'r ddadl i ddechrau yma. Felly, yn yr holl alwadau recursive rydym yn diweddaru rhywbeth. Iawn. Ydych chi eisiau i gerdded i ni drwy eich ateb? >> Cadarn. Im 'yn arfer SearchHelp fel bod pob tro y byddaf yn gwneud yr alwad swyddogaeth Rwy'n cael y cychwyn o ble rwy'n chwilio amdano yn y casgliad a diwedd o ble rwy'n edrych y rhesi. Ar bob cam lle mae'n dweud ei fod yn elfen canol, sydd yn dechrau + diwedd / 2, yw bod gyfartal i'r hyn rydym yn chwilio amdano? Ac os ydyw, yna ni eu canfod, ac yr wyf yn dyfalu bod yn cael ei basio i fyny y lefelau o dychweliad. Ac os nad yw hynny'n wir, yna byddwn yn gwirio a yw'r gwerth canol y rhesi yn rhy fawr, ac os felly byddwn yn edrych ar hanner chwith y casgliad drwy fynd o'r dechrau i'r mynegai canol. Ac fel arall rydym yn ei wneud hanner diwedd. [Bowden] Iawn. Mae hynny'n swnio'n dda. Iawn, felly ychydig bethau, ac mewn gwirionedd, mae hyn yn beth lefel uchel iawn na fydd angen i chi wybod am y cwrs hwn, ond mae'n wir. Swyddogaethau recursive, byddwch bob amser yn clywed eu bod yn bargen wael oherwydd os ydych recursively ffonio eich hun gormod o weithiau, byddwch yn cael gorlif stac ers hynny, fel y dywedais o'r blaen, mae pob swyddogaeth yn cael ei ffrâm pentwr hun. Felly mae gan bob galwad y swyddogaeth ailadroddus yn cael ei ffrâm pentwr hun. Felly, os ydych yn gwneud 1,000 o alwadau recursive, byddwch yn cael 1,000 fframiau simnai, ac yn gyflym i chi arwain at orfod fframiau stac gormod a phethau yn unig torri. Felly dyna pam mae swyddogaethau recursive yn gyffredinol wael. Ond mae is-set 'n glws o swyddogaethau ailadroddus a elwir yn gynffon-recursive swyddogaethau, ac mae hyn yn digwydd i fod yn enghraifft o un lle os yw'r compiler hysbysiadau hyn ac y dylai fod, yr wyf yn meddwl - yn Clang os byddwch yn llwyddo yn y O2-faner yna bydd yn sylwi ar hyn yn gynffon ailadroddus ac yn gwneud pethau da. Bydd yn ail-ddefnyddio'r ffrâm pentwr un drosodd a throsodd ar gyfer pob galwad ailadroddus. Ac felly ers ydych chi'n defnyddio'r ffrâm pentwr un, nid oes angen i chi boeni am erioed stacio gorlifo, ac ar yr un pryd, fel y dywedasoch o'r blaen, lle ar ôl i chi ddychwelyd wir, yna mae'n rhaid iddo ddychwelyd i fyny pob un o'r fframiau stac a'r galw 10fed SearchHelp wedi dychwelyd i'r 9fed, yn gorfod dychwelyd i'r 8fed. Felly nid oes angen i hyn ddigwydd pan fydd swyddogaethau yn gynffon ailadroddus. Ac felly yr hyn sy'n gwneud y gynffon swyddogaeth recursive yw rhybudd ar gyfer unrhyw alwad a roddir i searchHelp yr alwad recursive ei fod yn gwneud yr hyn y mae'n dychwelyd. Felly, yn yr alwad gyntaf i SearchHelp, rydym naill ai ar unwaith dychwelyd ffug, dychwelyd ar unwaith yn wir, neu os byddwn yn gwneud galwad recursive i SearchHelp lle yr hyn yr ydym yn dychwelyd yr hyn yr alwad honno yn dychwelyd. Ac nid oeddem yn gallu gwneud hyn os ydym yn gwneud rhywbeth tebyg int x = SearchHelp, dychwelyd x * 2, dim ond rhywfaint o newid ar hap. Felly nawr alwad hon recursive, mae hyn yn int x = SearchHelp galwad recursive, yw bellach yn gynffon recursive oherwydd ei fod mewn gwirionedd yn rhaid i chi ddychwelyd yn ôl i ffrâm pentwr flaenorol fel bod y galwad blaenorol i'r swyddogaeth Yna gall wneud rhywbeth gyda'r gwerth dychwelyd. Felly, nid yw hyn yn gynffon recursive, ond yr hyn oedd gennym o'r blaen yn 'n glws cynffon ailadroddus. Yeah. Os na [myfyrwyr] yr achos ail ganolfan yn cael ei wirio 1 oherwydd gallai fod sefyllfa lle pan fyddwch yn ei drosglwyddo y ddadl ydych wedi dechrau = diwedd, ond maent yn werth nodwydd. Y cwestiwn Ni all oedd rydym yn rhedeg i mewn i'r achos lle diwedd yw gwerth nodwydd neu ddechrau = diwedd, yn briodol, yn dechrau = diwedd ac nad ydych wedi gwirio mewn gwirionedd y gwerth penodol hynny eto, yna dechreuwch + diwedd / 2 yn unig yn mynd i fod yn un gwerth. Ond rydym eisoes wedi dychwelyd ffug ac ni fyddwn byth yn gwirio mewn gwirionedd y gwerth. Felly, o leiaf, yn yr alwad gyntaf, os yw maint yw 0, yna rydym eisiau dychwelyd ffug. Ond os maint yw 1, yna nid yw dechrau yn mynd i ben cyfartal, a byddwn o leiaf yn gwirio yr un elfen. Ond yr wyf yn meddwl eich bod yn iawn yn y gallwn yn y pen draw mewn achos lle dechrau + diwedd / 2, dechrau dod i ben i fyny yr un fath â dechrau + diwedd / 2, ond ni fyddwn byth gwirio mewn gwirionedd yr elfen honno. Felly, os ydym yn gwiriwch yn gyntaf yw'r elfen ganol y gwerth rydym yn chwilio am, yna gallwn ar unwaith ddychwelyd yn wir. Arall os ydynt yn gyfartal, yna does dim pwynt i barhau ers i ni yn unig yn mynd i ddiweddaru at achos lle rydym ar amrywiaeth un-elfen. Os nad yw'r elfen unigol yw'r un yr ydym yn chwilio amdano, yna mae popeth yn anghywir. Yeah. [Myfyrwyr] Y peth yw bod ers faint mewn gwirionedd yn fwy na'r nifer o elfennau yn yr amrywiaeth, mae eisoes yn offset - >> Felly, bydd maint - [Myfyrwyr] Dywedwch os yr amrywiaeth oedd maint 0, yna bydd y SearchHelp mewn gwirionedd yn gwirio tas wair o 0 ar yr alwad gyntaf. Mae amrywiaeth o faint 0, felly mae'r 0 yw - >> Yeah. Mae peth arall hynny - gallai fod yn dda. Gadewch i ni feddwl. Felly, os yr amrywiaeth oedd gan 10 elfen a'r un canol ydym yn mynd i wirio yw mynegai 5, felly rydym yn gwirio 5, a gadewch i ni ddweud bod y gwerth yn llai. Felly, rydym yn taflu popeth i ffwrdd o 5 ymlaen. Felly dechrau + diwedd / 2 yn mynd i fod ein pen newydd, felly yeah, mae bob amser yn mynd i aros y tu hwnt i ddiwedd y rhesi. Os yw'n achos os oedd yn eilrif neu'n odrif, yna byddem yn gwirio, dyweder, 4, ond rydym yn dal i daflu i ffwrdd - Felly yeah, diwedd bob amser yn mynd i fod tu hwnt i ddiwedd gwirioneddol y rhesi. Felly, yr elfennau ydym yn canolbwyntio ar, diwedd bob amser yn mynd i fod yn un ar ôl hynny. Ac felly os dechrau gwneud erioed diwedd cyfartal, yr ydym mewn amrywiaeth o faint 0. Y peth arall yr wyf yn meddwl yw ein bod yn diweddaru dechrau cael ei ddechrau + diwedd / 2, felly mae hyn yn wir fy mod i'n cael trafferth gyda nhw, lle dechrau + diwedd / 2 yw'r elfen rydym yn gwirio. Lets 'ddeud gawsom y casgliad 10-elfen. Beth bynnag. Felly dechrau + diwedd / 2 yn mynd i fod yn rhywbeth fel yr un yma, ac os nad yw hynny'n werth, yn dweud ein bod am ddiweddaru. Mae'r gwerth yn fwy, felly rydym yn awyddus i edrych ar y hanner y rhesi. Felly, sut rydym yn diweddaru dechrau, rydym yn diweddaru dechrau yn hyn yn yr elfen hon. Ond efallai y bydd hyn yn dal i weithio, neu o leiaf, gallwch wneud dechrau + diwedd / 2 + 1. [Myfyrwyr] Nid oes angen i chi gael ei ddechrau + diwedd [Anghlywadwy] >> Yeah. Rydym wedi gwirio eisoes yr elfen hon ac yn gwybod nad yw'n un yr ydym yn chwilio amdano. Felly nid oes angen i ddiweddaru dechrau i fod yn yr elfen hon. Gallwn yn unig sgip a diweddaru dechrau i fod yn yr elfen hon. Ac a oes byth achos, gadewch i ni ddweud, bod hyn oedd diwedd, Byddai hynny wedyn yn dechrau yn hyn, yn dechrau + diwedd / byddai 2 yn hyn, dechrau + diwedd - Yeah, yr wyf yn meddwl y gall ddod i ben i fyny mewn dychweliad ddiddiwedd. Lets 'ddeud' i 'jyst amrywiaeth o faint 2 neu amrywiaeth o faint 1. Rwy'n credu y bydd hyn yn gweithio. Felly, ar hyn o bryd, cychwyn yw bod elfen a diwedd yw 1 y tu hwnt iddo. Felly, mae'r elfen ein bod ni'n mynd i wirio yw hwn yn un, ac yna pan fyddwn yn diweddaru dechrau, rydym yn diweddaru dechrau i fod yn 0 + 1/2, sydd yn mynd i orffen â ni yn ôl gyda dechrau yn yr elfen hon. Felly, rydym yn gwirio yr un elfen drosodd a throsodd. Felly, mae hyn yn wir lle mae'n rhaid i bob galwad recursive mewn gwirionedd yn diweddaru rhywbeth. Felly mae angen i wneud cychwyn + diwedd / 2 + 1, neu fel arall mae achos lle nad ydym yn mewn gwirionedd yn dechrau diweddaru. Mae pawb yn gweld hynny? Iawn. Oes gan unrhyw un cwestiynau ar yr ateb hwn neu sylwadau unrhyw mwy? Iawn. A oes unrhyw un wedi iteraidd ateb y gallwn i gyd edrych ar? Gwnaethom ni gyd yn ei wneud recursively? Neu hefyd yr wyf yn dyfalu os ydych yn agor iddi, yna efallai y bydd gennych gor-redeg eich un flaenorol. A yw'n awtomatig arbed? Dydw i ddim yn gadarnhaol. A oes unrhyw un wedi ailadroddol? Gallwn cerdded trwy ei gilydd os nad ydyw. Mae'r syniad yn mynd i fod yr un fath. Ailadroddol ateb. Rydym yn mynd i eisiau i yn y bôn gwneud yr un syniad lle rydym am gadw golwg ar y diwedd newydd y rhesi a dechrau newydd y rhesi a gwneud hynny drosodd a throsodd. Ac os yr hyn yr ydym yn cadw golwg ar y dechrau a diwedd erioed croestorri, hynny, nid ydym yn ei chael yn a gallwn ddychwelyd ffug. Felly, sut ydw i'n gwneud hynny? Dylai unrhyw un gennych unrhyw awgrymiadau neu god i mi dynnu i fyny? [Myfyrwyr] A oes dolen gyfnod. >> Yeah. Rydych yn mynd i eisiau i wneud dolen. A wnaethoch chi gael cod y gallwn i dynnu i fyny, neu beth oeddech chi'n mynd i awgrymu? [Myfyrwyr] Rwy'n credu hynny. >> Mae pob hawl. Mae hyn yn gwneud pethau'n haws. Beth oedd eich enw? [Myfyrwyr] Lucas. Adolygu 1. Iawn. Isel yw hyn yr ydym elwir yn dechrau cyn. Nid Up yn eithaf yr hyn yr ydym elwir ben cyn. A dweud y gwir, diwedd bellach o fewn y rhesi. Mae'n elfen dylem eu hystyried. Mor isel yw 0, i fyny yw maint y rhesi - 1, ac yn awr rydym yn dolennu, ac rydym yn gwirio - Amcana y gallwch chi gerdded drwyddo. Beth oedd eich ffordd o feddwl drwy hyn? Cerddwch i ni drwy eich cod. [Myfyrwyr] Cadarn. Edrychwch ar y gwerth tas wair yn y canol a'i gymharu â nodwydd. Felly, os yw'n fwy na'ch nodwydd, yna rydych am - oh, mewn gwirionedd, dylai hynny fod yn ôl. Rydych yn mynd i eisiau i daflu i ffwrdd yr hanner iawn, ac felly yeah, a ddylai fod y ffordd. [Bowden] Felly, dylai hyn fod yn llai? A yw bod yr hyn a ddywedasoch? >> [Myfyrwyr] Yeah. [Bowden] Iawn. Llai. Felly, os yw'r hyn rydym yn edrych ar yn llai na'r hyn yr ydym ei eisiau, Yna, yeah, rydym am i daflu i ffwrdd yr hanner chwith, sy'n golygu ein bod yn diweddaru popeth rydym yn ystyried drwy symud isel i'r dde y rhesi. Mae hyn yn edrych yn dda. Rwy'n credu ei fod yr un mater yr ydym yn dweud ar yr un blaenorol, lle os isel yw 0 a hyd yn 1, yna isel + i fyny / 2 yn mynd i sefydlu i fod yr un peth eto. A hyd yn oed os nad yw hynny'n wir, mae'n dal yn fwy effeithlon o leiaf i ychydig daflu i ffwrdd yr elfen ydym yn unig yn edrych ar y gwyddom ei fod yn anghywir. Felly isel + i fyny / 2 + 1 - >> [myfyrwyr] Dylai hynny fod y ffordd arall. [Bowden] Neu dylai hyn fod yn - 1 a dylai'r llall fod yn + 1. [Myfyrwyr] A dylai fod yn ddwbl arwydd hafal. >> [Bowden] Yeah. [Myfyrwyr] Yeah. Iawn. Ac yn olaf, nawr bod gennym y 1 + - 1 peth, yw hi - mae'n bosibl na fydd - a yw'n bosibl i erioed isel i roi diwedd ar i fyny gyda mwy o werth nag am i fyny? Rwy'n credu yr unig ffordd y gall hynny ddigwydd - A yw'n bosibl? >> [Myfyrwyr] Nid wyf yn gwybod. Ond os bydd yn mynd cwtogi ac yna yn cael minws bod 1 ac yna - >> Yeah. [Myfyrwyr] Byddai'n bosibl cael cyboledig i fyny. Rwy'n credu y dylai fod yn dda dim ond oherwydd ar ei gyfer yn y pen draw yn is byddai'n rhaid iddynt fod yn gyfartal, dwi'n meddwl. Ond os ydynt yn gyfartal, yna ni fyddem wedi gwneud y ddolen amser i ddechrau ac rydym fyddai dim ond wedi dychwelyd y gwerth. Felly, yr wyf yn meddwl ein bod ni'n dda yn awr. Hysbysiad bod hyd yn oed er bod hyn yn broblem bellach yn ailadroddus, yr un math o syniadau yn berthnasol lle gallwn weld sut y mae hyn mor hawdd cynnig ei hun i ateb recursive gan y ffaith bod ni jyst yn diweddaru'r mynegeion drosodd a throsodd, rydym yn gwneud y broblem yn llai ac yn llai, rydym yn canolbwyntio ar is-set o'r amrywiaeth. [Myfyrwyr] Os isel yw 0 a hyd yn 1, byddai'r ddau fod yn 0 + 1/2, a fyddai'n mynd i 0, ac yna byddai un yn + 1, byddai un yn - 1. [Myfyrwyr] Ble rydym yn gwirio cydraddoldeb? Fel os yw'r un canol mewn gwirionedd nodwydd? Nid ydym yn gwneud hynny ar hyn o bryd? Oh! Os it's - Ydw. Ni allwn wneud y prawf i lawr yma oherwydd gadewch i ni ddweud y canol cyntaf - [Myfyrwyr] Mae'n mewn gwirionedd yn hoffi â thaflu i ffwrdd y rhwymo. Felly, os byddwch yn ei daflu y rhwymo, rhaid i chi wirio yn gyntaf neu beth bynnag. Ah. Yeah. >> [Myfyrwyr] Yeah. Felly, erbyn hyn rydym wedi taflu un yr ydym ar hyn o bryd yn edrych ar, sy'n golygu ein bod bellach angen i ni hefyd os (tas wair [(isel + i fyny) / 2] == nodwydd), yna gallwn ddychwelyd yn wir. Ac os wyf yn rhoi arall neu dim ond os, mae'n golygu llythrennol yr un peth gan y byddai hyn wedi dychwelyd yn wir. Felly, byddaf yn rhoi arall os, ond does dim ots. Felly arall os yw hyn, arall y, ac mae hyn yn beth cyffredin i ei wneud lle hyd yn oed os mai dyma'r achos lle mae popeth yn dda yma, fel na ellir byth isel fod yn fwy nag am i fyny, nid yw'n werth rhesymu ynghylch a yw hynny'n wir. Felly, efallai y byddwch yn ogystal ddweud tra isel yn llai na neu'n hafal i neu tra isel yn llai na felly os byth y maent gyfartal neu isel yn digwydd i basio i fyny, yna gallwn dorri allan o hyn ddolen. Cwestiynau, pryderon, sylwadau? Iawn. Mae hyn yn edrych yn dda. Nawr rydym am ei wneud fath. Os ydym yn mynd i fy ail adolygiad, rydym yn gweld y rhifau un, ond erbyn hyn nad ydynt bellach er mwyn datrys. Ac rydym am i weithredu fath ddefnyddio unrhyw algorithm yn O o log n n. Felly, pa algorithm ydych chi'n meddwl y dylem weithredu yma? >> [Myfyrwyr] fath Cyfuno. [Bowden] Yeah. Cyfuno fath yw O (n log n), felly dyna beth ydym yn mynd i'w wneud. Ac mae'r broblem yn mynd i fod yn eithaf tebyg, lle mae'n yn addas i ateb ailadroddus. Gallwn hefyd ddod o hyd i ateb ailadroddol os ydym am, ond bydd dychweliad yn haws yma ac y dylem wneud dychweliad. Amcana y byddwn yn cerdded drwy uno fath yn gyntaf, er bod fideo hyfryd ar uno fath eisoes. [Chwerthin] Felly uno fath mae yna - yr wyf yn gwastraffu cymaint o'r papur hwn. O, dim ond un sydd ar ôl. Felly uno. Oh, 1, 3, 5. Iawn. Uno yn cymryd ddau arae ar wahân. Unigol y ddau arae ill dau datrys. Felly, mae hyn array, 1, 3, 5, didoli. Mae hyn yn array, 0, 2, 4, didoli. Nawr yr hyn y dylai ei wneud yw uno cyfuno i mewn i amrywiaeth un sydd ei hun yn datrys. Felly, rydym am amrywiaeth o maint 6 sy'n mynd i gael yr elfennau hyn y tu mewn ohono er mwyn datrys. Ac fel y gallwn fanteisio ar y ffaith bod y ddau arae yn cael eu datrys i wneud hyn mewn pryd llinol, ystyr amser llinol os yw hyn yn amrywiaeth x maint ac mae hyn yn y maint, yna dylai'r algorithm cyfanswm O (x + y). Iawn. Felly awgrymiadau. [Myfyrwyr] allem ddechrau o'r chwith? Felly byddwch yn rhoi o 0 i lawr yn gyntaf ac yna'r 1 ac yna dyma ydych chi yn y 2. Felly, mae'n fath o fel bod gennych tab sydd wedi symud i'r dde. >> [Bowden] Yeah. Ar gyfer y ddau o'r rhain araeau os ydym yn unig yn canolbwyntio ar yr elfen leftmost. Gan fod y ddwy araeau cael eu datrys, rydym yn gwybod bod y 2 elfen yw'r elfennau lleiaf yn y naill amrywiaeth. Felly mae hynny'n golygu bod yn rhaid i 1 o'r rheiny 2 elfen yr elfen lleiaf yn ein amrywiaeth unedig. Fel mae'n digwydd bod y lleiaf yw'r un ar y dde y tro hwn. Felly, rydym yn cymryd 0, rhowch ef ar y chwith oherwydd 0 yn llai nag 1, felly cymerwch 0, rhowch i mewn i'n safle cyntaf, ac yna rydym yn diweddaru hwn i yn awr yn canolbwyntio ar yr elfen gyntaf. Ac yn awr rydym yn ailadrodd. Felly, yn awr rydym yn cymharu 2 ac 1. 1 yn llai, felly byddwn yn mewnosod 1. Rydym yn diweddaru'r pwyntydd i bwyntio at y boi. Nawr rydym yn ei wneud eto, felly 2. Bydd hyn yn diweddaru, cymharu'r rhain 2, 3. Mae hwn yn diweddaru, yna 4 a 5. Felly dyna uno. Dylai fod yn weddol amlwg ei fod yn amser llinol ers i ni yn unig yn mynd ar draws pob elfen unwaith. A dyna yw'r cam mwyaf i weithredu'r uno fath yn gwneud hyn. Ac nid yw mor anodd. Mae pethau cwpl i chi boeni am yw gadewch i ni ddweud ein bod yn cyfuno 1, 2, 3, 4, 5, 6. Yn yr achos hwn rydym yn y pen draw yn y sefyllfa lle mae hyn yn un yn mynd i fod yn llai, yna rydym yn diweddaru'r pwyntydd, mae hyn yn un yn mynd i fod yn llai, diweddaru'r hyn, hyn yn un 'llai, ac yn awr mae'n rhaid i chi gydnabod pan fyddwch wedi mewn gwirionedd yn rhedeg allan o elfennau i gymharu â hwy. Ers i ni wedi defnyddio y casgliad cyfan, popeth yn y casgliad bellach yn mewnosod i mewn yma. Felly, os ydym byth yn rhedeg i mewn i'r pwynt lle mae un o'n araeau yn cael ei uno yn gyfan gwbl yn barod, yna rydym yn unig yn cymryd yr holl elfennau y rhesi eraill a rhowch nhw i mewn i ddiwedd y rhesi. Felly gallwn rhowch 4, 5, 6. Iawn. Dyna un peth i wylio allan amdano. Gweithredu a ddylai fod cam 1. Cyfuno didoli wedyn ar sail hynny, mae'n 2 gam, 2 cam gwirion. Gadewch i 'jyst roi'r casgliad. Felly uno fath, cam 1 yw recursively torri'r amrywiaeth i mewn i hanner. Rhannu Felly, mae hyn yn hanner amrywiaeth. Erbyn hyn mae gennym 4, 15, 16, 50 ac 8, 23, 42, 108. Ac yn awr rydym yn ei wneud eto, ac rydym yn rhannu'r rhain yn hanner. 'N annhymerus' jyst yn gwneud hynny ar yr ochr hon. Felly 4, 15 ac 16, 50. Byddem yn gwneud yr un peth dros yma. Ac yn awr rydym yn ei rannu'n hanner eto. Ac mae gennym 4, 15, 16, 50. Felly, dyna yw ein achos sylfaenol. Unwaith y bydd y araeau o faint 1, yna rydym yn dod i ben gyda hollti i mewn i hanner. Nawr beth ydym yn ei wneud â hyn? Rydym yn y pen draw bydd hyn hefyd yn torri i lawr i 8, 23, 42, a 108. Felly nawr ein bod yn y fan hon, yn awr gam dau o uno fath yn unig yw uno parau i y rhestrau. Felly, rydym am i uno rhain. Rydym yn unig yn galw uno. Rydym yn gwybod y bydd uno ddychwelyd y rhain er mwyn datrys. 4, 15. Nawr rydym am i uno rhain, a fydd yn dychwelyd rhestr gyda rheini er didoli, 16, 50. Rydym yn cyfuno rhai - Ni allaf ysgrifennu - 8, 23 a 42, 108. Felly, rydym wedi barau unedig unwaith. Nawr rydym yn unig uno eto. Sylwch fod pob un o'r rhestrau hyn yn cael ei ddidoli yn ei hun, ac yna gallwn dim ond uno rhestrau hyn i gael rhestr o faint 4 sy'n cael ei drefnu ac yn cyfuno'r ddwy restr i gael rhestr o faint 4 sy'n cael ei drefnu. Ac yn olaf, gallwn gyfuno'r rhai ddwy restr o faint 4 i gael un rhestr o faint 8 sy'n cael ei datrys. Felly, i weld bod hyn yn gyffredinol n n log, yr ydym eisoes yn gweld bod uno yn llinol, felly pan fyddwn yn delio â uno'r rhain, felly fel y gost gyffredinol o uno ar gyfer y ddwy restr yn unig 2 oherwydd - Neu yn dda, mae'n O n, ond n yma yn unig y 2 elfen, felly mae'n 2. A bydd y 2 yn 2 a bydd y rhain 2 yn 2 a bydd y 2 o 2, hynny ar draws yr holl uno y mae angen ei wneud, rydym yn y pen draw yn gwneud n. Fel 2 + 2 + 2 + 2 yn 8, sef n, felly y gost o uno yn y set hon yn n. Ac yna yr un peth yma. Byddwn yn cyfuno'r 2, yna y 2, ac yn unigol bydd hyn yn uno yn cymryd pedwar gweithrediad, Bydd hyn yn uno yn cymryd pedwar gweithrediad, ond unwaith eto, rhwng pob un o'r rhain, rydym yn y pen draw cyfuno n phethau cyfanswm, ac felly y cam hwn yn cymryd n. Ac felly mae pob lefel yn cymryd elfennau n cael eu huno. A faint o lefelau sydd yna? Ar bob lefel, mae ein casgliad yn tyfu yn ôl maint 2. Dyma ein araeau o faint 1, dyma maen nhw'n maint 2, dyma maen nhw'n maint 4, ac yn olaf, maen nhw'n maint 8. Felly, gan ei fod yn dyblu, mae yn mynd i fod cyfanswm o log n o'r lefelau hyn. Felly, gyda log n lefelau, bob lefel unigol gymryd n gweithrediadau cyfanswm, rydym yn cael log n n algorithm. Cwestiynau? A yw pobl sydd eisoes wedi gwneud cynnydd ar sut i weithredu hyn? A oes unrhyw un eisoes mewn cyflwr lle gall Fi jyst dynnu i fyny eu cod? Gallaf roi munud. Mae hyn yn un yn mynd i fod yn hirach. Byddwn yn argymell ailddigwydd - Nid oes rhaid i chi wneud dychweliad i uno oherwydd mae gwneud dychweliad i uno, rydych chi'n mynd i gael i basio criw o wahanol feintiau. Gallwch, ond mae'n blino. Ond dychweliad ar gyfer trefnu ei hun yn eithaf hawdd. 'Ch jyst llythrennol ffonio fath ar hanner chwith, math ar hanner cywir. Iawn. Dylai unrhyw un gennych unrhyw beth y gallaf ei dynnu i fyny eto? Neu arall 'n annhymerus' roi munud. Iawn. Dylai unrhyw un â rhywbeth y gallwn weithio gyda? Neu arall byddwn yn gweithio yn unig gyda hyn ac yna ehangu oddi yno. Dylai unrhyw un yn cael mwy na hyn y gallaf ei dynnu i fyny? [Myfyrwyr] Yeah. Gallwch dynnu i fyny fy un i. >> Mae pob hawl. Ie! [Myfyrwyr] Roedd llawer o amodau. >> O, saethu. Allwch chi - [Myfyrwyr] yn rhaid i mi achub. >> Yeah. Felly, rydym yn ddim yn gwneud y uno ar wahân. O, ond nid yw mor ddrwg. Iawn. Felly fath yn galw ei hun yn unig mergeSortHelp. Eglurwch i ni beth mergeSortHelp yn ei wneud. [Myfyrwyr] MergeSortHelp 'n bert lawer yn y ddau brif gam, a fydd yn datrys pob hanner y rhesi, ac yna i uno'r ddau ohonynt. [Bowden] Iawn, felly rhowch i mi ail. Rwy'n credu bod hyn - >> [myfyrwyr] angen i mi - Yeah. Rwy'n colli rhywbeth. Yn uno, yr wyf yn sylweddoli bod angen i mi greu casgliad newydd oherwydd ni allwn wneud hynny ar waith. >> Ydy. Nid ydych yn gallu. Cywir. [Myfyrwyr] Felly, yr wyf yn creu amrywiaeth newydd. Wedi anghofio ar ddiwedd uno i ail-newid. Iawn. Mae angen amrywiaeth newydd. Yn merge fath, mae hyn yn bron bob amser yn wir. Rhan o gost algorithm gwell amser-doeth bron bob amser yn angen i ddefnyddio cof ychydig yn fwy. Felly yma, ni waeth sut yr ydych yn ei wneud uno fath, byddech yn anochel angen i chi ddefnyddio rhai cof ychwanegol. Ef neu hi yn creu amrywiaeth newydd. Ac yna ydych yn dweud ar y diwedd, ond mae angen i gopïo amrywiaeth newydd i'r casgliad gwreiddiol. [Myfyrwyr] yr wyf yn meddwl hynny, yeah. Nid wyf yn gwybod os sy'n gweithio o ran gyfrif trwy gyfeirio neu beth bynnag - Yeah, bydd yn gweithio. >> [Myfyrwyr] Iawn. A wnaethoch chi roi cynnig ar redeg hyn? >> [Myfyrwyr] Na, ddim eto. >> Iawn. Ceisiwch redeg, ac yna byddaf yn siarad am y peth am eiliad. [Myfyrwyr] angen i mi gael yr holl prototeipiau swyddogaeth a phopeth, fodd bynnag, dde? Mae'r prototeipiau swyddogaeth. O, rydych yn golygu fel - Ydy. Trefnu yn galw mergeSortHelp. Felly, er mwyn i fath i alw mergeSortHelp, mae'n rhaid i mergeSortHelp naill ai wedi cael eu diffinio cyn didoli neu ni jyst angen y prototeip. Jyst adysgrifia a bastio hynny. Ac yn yr un modd, mergeSortHelp yn galw uno, ond nid yw uno wedi cael ei ddiffinio hyd yma, er mwyn i ni dim ond gadewch i mergeSortHelp gwybod bod dyna beth uno yn mynd i edrych fel, a dyna hynny. Felly mergeSortHelp. Mae gennym mater yma lle nad oes gennym achos sylfaenol. MergeSortHelp yn ailadroddus, felly recursive unrhyw swyddogaeth yn mynd i angen rhyw fath o achos sylfaenol i wybod pryd i roi'r gorau recursively galw ei hun. Beth yw ein achos sylfaenol yn mynd i gael ei yma? Yeah. [Myfyrwyr] Os yw maint yw 1? >> [Bowden] Ydw. Felly, fel y gwelsom iawn yno, rydym yn rhoi'r gorau i araeau hollti unwaith y byddwn yn mynd i mewn araeau o faint 1, sydd yn anochel yn cael eu didoli eu hunain. Felly os maint hafal i 1, rydym yn gwybod y casgliad yn cael ei datrys eisoes, er mwyn i ni fynd yn ôl. Hysbysiad bod yn ddi-rym, felly nid ydym yn dychwelyd unrhyw beth penodol, rydym yn unig yn dychwelyd. Iawn. Felly, dyna ein achos sylfaenol. Amcana y gallai ein achos sylfaenol hefyd fod os ydym yn digwydd bod yn cyfuno amrywiaeth o faint 0, mae'n debyg am roi'r gorau ar ryw adeg, fel y gallwn ddweud faint yn llai na 2 neu llai na neu'n hafal i 1 fel y bydd hyn yn gweithio ar gyfer unrhyw amrywiaeth yn awr. Iawn. Felly, dyna ein achos sylfaenol. Nawr ydych chi eisiau i gerdded ni drwy uno? Beth mae'r holl achosion hyn yn ei olygu? Up yma, rydym yn unig yn gwneud yr un syniad, y - [Myfyrwyr] angen i mi eu pasio maint gyda'r holl alwadau mergeSortHelp. I ychwanegu faint fel gynradd ychwanegol ac nid yw yno, fel maint / 2. [Bowden] O, maint / 2, maint / 2. >> [Myfyrwyr] Yeah, a hefyd yn y swyddogaeth uchod yn ogystal. [Bowden] Yma? >> [Myfyrwyr] Dim ond maint. >> [Bowden] Oh. Maint, faint? >> [Myfyrwyr] Yeah. [Bowden] Iawn. Gadewch i mi feddwl am eiliad. A ydym yn rhedeg i mewn i fater? Rydym bob amser yn trin y chwith fel 0. >> [Myfyrwyr] Rhif Mae hynny'n anghywir hefyd. Mae'n ddrwg gennym. Dylai fod yn dechrau. Yeah. [Bowden] Iawn. Rwy'n hoffi bod yn well. A diwedd. Iawn. Felly nawr rydych am i ni drwy gerdded uno? >> [Myfyrwyr] Iawn. Im 'jyst yn cerdded drwy'r amrywiaeth newydd yr wyf wedi'u creu. Ei faint yw maint y rhan y rhesi yr ydym am ei gael ei datrys ac yn ceisio dod o hyd i'r elfen y dylwn ei roi yn y cam casgliad newydd. Felly, i wneud hynny, yn gyntaf dwi'n gweld a yw'r hanner chwith y rhesi yn parhau i gael elfennau unrhyw mwy, ac os nad yw'n gwneud hynny, yna byddwch yn mynd i lawr at y cyflwr arall, a dim ond yn dweud iawn, rhaid iddo fod yn yr amrywiaeth cywir, a byddwn yn rhoi hynny yn y mynegai presennol newArray. Ac yna wahanol, yr wyf i'n gwirio a yw'r ochr dde y rhesi yn cael ei orffen hefyd, ac yn yr achos Fi jyst ei roi yn y chwith. Ni allai fod mewn gwirionedd yn angenrheidiol. Dwi ddim yn siŵr. Ond beth bynnag, y ddau arall gwirio pa un o'r ddau yn llai yn y chwith neu i'r dde. A hefyd ym mhob achos, rwy'n incrementing pa un bynnag dalfan I hicyn. [Bowden] Iawn. Mae hynny'n edrych yn dda. Oes gan unrhyw un sylwadau neu bryderon neu gwestiynau? Felly, y pedwar achos bod yn rhaid inni ddod â phethau i mewn dim ond bod - neu mae'n edrych fel pump - ond rhaid i ni ystyried a yw'r amrywiaeth chwith wedi rhedeg allan o bethau mae angen i ni uno, a yw'r amrywiaeth cywir wedi rhedeg allan o bethau mae angen i ni gyfuno - Rwy'n pwyntio at ddim byd. Felly, os yr amrywiaeth chwith wedi rhedeg allan o pethau neu y casgliad cywir wedi rhedeg allan o bethau. Mae'r rheini'n ddau achos. Rydym hefyd angen achos dibwys a yw'r peth chwith yn llai na'r peth iawn. Yna, rydym yn awyddus i ddewis y peth chwith. Dyna'r yr achosion. Felly, mae hyn yn iawn, felly dyna hynny. Array chwith. Mae'n 1, 2, 3. Iawn. Felly ie, y rhai yn y pedwar peth y gallem eisiau ei wneud. Ac ni fyddwn yn mynd dros iteraidd ateb. Ni fyddwn yn argymell - Cyfuno fath yn enghraifft o swyddogaeth sydd yn y ddau heb gynffon recursive, nid yw'n hawdd i'w wneud yn gynffon recursive, ond hefyd nid yw'n hawdd iawn i'w wneud yn ailadroddol. Mae hyn yn hawdd iawn. Mae hyn yn gweithredu o uno fath, uno, ni waeth beth ydych yn ei wneud, rydych chi'n mynd i adeiladu uno. Felly gyfuno math a adeiladwyd ar ben uno recursively yn unig yw tair llinell hyn. Iteraidd, mae'n fwy blino ac yn fwy anodd i feddwl amdano. Ond sylwch nad yw'n gynffon recursive ers mergeSortHelp - pan fydd yn galw ei hun - mae angen o hyd i wneud pethau ar ôl hyn yn dychwelyd galwadau ailadroddus. Felly, rhaid i'r ffrâm pentwr yn parhau i fodoli hyd yn oed wedi galw hyn. Ac yna pan fyddwch yn ffonio hyn, rhaid i'r ffrâm pentwr yn parhau i fodoli oherwydd hyd yn oed ar ôl yr alwad honno, rydym yn dal angen i uno. Ac mae'n nontrivial i wneud y gynffon ailadroddus. Cwestiynau? Mae pob hawl. Felly, mynd yn ôl i ddidoli - oh, mae dau beth rwyf eisiau dangos. Iawn. Mynd yn ôl i ddidoli, byddwn yn gwneud hyn yn gyflym. Neu chwilio. Trefnu? Trefnu. Yeah. Mynd yn ôl at y dechreuadau fath. Rydym am i greu algorithm sy'n didoli'r casgliad gan ddefnyddio unrhyw algorithm yng O n. Felly, sut mae hyn yn bosibl? A oes unrhyw un yn cael unrhyw fath o - Yr awgrymais yn blaen yn - Os ydym chi ar fin i wella o log n n i O n, rydym wedi gwella ein algorithm amser-ddoeth, sy'n golygu beth ydym yn mynd i angen i wneud i wneud iawn am hynny? [Myfyrwyr] Space. >> Yeah. Rydym yn mynd i fod yn defnyddio mwy o le. Ac nid hyd yn oed mwy o le, mae'n le gynt a chynt mwy. Felly, yr wyf yn meddwl y math hwn o algorithm yn rhywbeth ffug, ffug polynom - ffug - ni allaf gofio. Rhywbeth ffug. Ond mae'n oherwydd mae angen i ni ddefnyddio cymaint o le bod hyn yn gyraeddadwy ond nid yn realistig. A sut rydym yn cyflawni hyn? Gallwn gyflawni hyn os rydym yn gwarantu y bydd unrhyw elfen benodol yn yr amrywiaeth yn is na maint penodol. Felly, gadewch i 'jyst dweud bod maint yn 200, unrhyw elfen mewn arae yn is na maint 200. Ac mae hyn mewn gwirionedd yn realistig iawn. Gallwch yn hawdd iawn, mae gennym gasgliad eich bod yn gwybod popeth ynddo yn mynd i fod yn llai na rhai rhif. Fel os oes gennych rywfaint fector enfawr i ledaenu neu rywbeth ond eich bod yn gwybod popeth yn mynd i fod rhwng 0 a 5, yna mae'n mynd i fod yn sylweddol gyflymach i wneud hyn. Ac mae'r rhwymo ar unrhyw un o'r elfennau yw 5, felly mae hyn yn rhwymo, hynny yw faint o gof rydych chi'n mynd i gael ei ddefnyddio. Felly y rwymo yw 200. Mewn theori, mae yna bob amser rwymo gan y gall cyfanrif ond fod hyd at 4 biliwn, ond mae hynny'n afrealistig ers hynny byddem yn defnyddio gofod ar y drefn o 4 biliwn. Felly dyna afrealistig. Ond yma byddwn yn dweud ein rhwymo yw 200. Y tric i wneud yn O o n yn yr ydym yn gwneud amrywiaeth arall a elwir yn cyfrif o faint BOUND. Felly, mewn gwirionedd, mae hwn yn llwybr byr i - Dydw i ddim mewn gwirionedd yn gwybod os Clang yn gwneud hyn. Ond yn GCC o leiaf - Clang dybio I'm mae'n rhy - Bydd hyn yn unig ymgychwyn yr amrywiaeth gyfan i fod yn 0au. Felly, os nad wyf am wneud hynny, yna gallwn ar wahân ei wneud ar gyfer (i int = 0; i > Iawn. Sylweddolais un peth arall pan oeddem yn mynd drwyddo. Rwy'n meddwl bod y broblem yn Lucas, ac yn ôl pob tebyg mae pob un rydym wedi gweld. Yr wyf yn llwyr anghofio. Yr unig beth oeddwn am wneud sylwadau arno yw bod pan fyddwch yn delio gyda phethau fel mynegeion, dydych chi byth yn wir yn gweld hyn pan fyddwch yn ysgrifennu ar gyfer dolen, ond yn dechnegol, pryd bynnag y byddwch yn delio â mynegeion hyn, dylech 'n bert lawer bob amser yn delio gyda chyfanrifau heb eu harwyddo. Y rheswm am hyn yw pan fyddwch chi'n delio gyda chyfanrifau llofnodi, felly os oes gennych 2 gyfanrifau llofnodi a chi eu hychwanegu at ei gilydd ac maent yn dod i ben i fyny yn rhy fawr, yna byddwch yn darfod i fyny ag rhif negatif. Felly, dyna beth gorlif cyfanrif yw. Os byddaf yn ychwanegu 2 biliwn a 1 biliwn, yr wyf darfod i fyny ag negyddol 1 biliwn. Dyna sut gyfanrifau yn gweithio ar gyfrifiaduron. Felly, y broblem gyda defnyddio - Mae hynny'n iawn ac eithrio os isel yn digwydd i fod yn 2 biliwn ac i fyny yn digwydd i fod yn 1 biliwn, yna mae hyn yn mynd i fod yn negyddol 1 biliwn ac yna rydym yn mynd i rannu hynny gyda 2 a darfod i fyny ag negyddol 500 miliwn. Felly, mae hyn dim ond yn broblem os ydych yn digwydd bod yn chwilio drwy amrywiaeth o filiynau o bethau. Ond os + isel hyd yn digwydd i orlifo, yna mae hynny'n broblem. Cyn gynted ag y byddwn yn gwneud iddynt heb ei arwyddo, yna 2 biliwn a mwy 1 biliwn 3 biliwn. 3000000000 rhannu â 2 yw 1.5 biliwn. Felly, cyn gynted ag y maen nhw'n heb ei arwyddo, mae popeth yn berffaith. Ac felly dyna hefyd yn fater pan fyddwch yn ysgrifennu eich gyfer dolenni, ac mewn gwirionedd, mae'n debyg ei wneud yn awtomatig. Bydd yn gwirionedd dim ond gweiddi ar chi. Felly, os y nifer hwn yn rhy fawr i fod mewn dim ond cyfanrif ond byddai'n ffitio mewn cyfanrif heb ei arwyddo, bydd yn gweiddi arnoch chi, felly dyna pam na fyddwch yn rhedeg wir i mewn i'r mater. Gallwch weld na mynegai yn mynd i fod yn negyddol, ac felly pan fyddwch yn ailadrodd dros array, gallwch chi bron bob amser yn dweud heb ei arwyddo int i, ond nid oes yn rhaid i. Mae pethau'n mynd i weithio 'n bert lawer yr un mor dda. Iawn. [Sibrydion] Faint o'r gloch yw hi? Y peth olaf roeddwn i eisiau dangos - a byddaf yn gwneud hynny mewn gwirionedd gyflym. Rydych yn gwybod sut yr ydym wedi diffinio # fel y gallwn # ddiffinio MAX â 5 neu rywbeth? Gadewch i ni beidio gwneud MAX. # Diffinio BOUND â 200. Dyna beth a wnaethom o'r blaen. Sy'n diffinio cyson, sy'n cael ei dim ond yn mynd i gael ei gopïo a gludo lle bynnag y byddwn yn digwydd i ysgrifennu BOUND. Felly gallwn mewn gwirionedd yn gwneud mwy gyda # diffinio. Gallwn # ddiffinio swyddogaethau. Nid ydynt yn wirioneddol swyddogaethau, ond byddwn yn eu galw swyddogaethau. Enghraifft o hyn fyddai rhywbeth fel MAX (x, y) ei ddiffinio fel (x > Yn ddelfrydol, 14. Y broblem yw bod sut hash diffinio gwaith, cofiwch ei fod yn gopi llythrennol a gludo o bopeth 'n bert lawer, felly beth mae hyn yn mynd i gael eu dehongli fel yw 3 yn llai nag 1 a 6, 2 gwaith 1 a 6, 2 waith 3. Felly, ar gyfer y rheswm hwn, rydych bron bob amser yn lapio popeth mewn cromfachau. Unrhyw newidyn rydych bron bob amser lapio mewn cromfachau. Mae yna achosion lle nad oes rhaid i chi, fel yr wyf yn gwybod nad oes angen i mi wneud hynny yma oherwydd llai na 'n bert lawer bob amser yn unig yn mynd i weithio, er na allai fod hyd yn oed fod yn wir. Os oes rhywbeth chwerthinllyd fel DOUBLE_MAX (1 == 2), yna mae hynny'n mynd i gael eu disodli gyda 3 yn llai nag 1 yn dychwelyd gyfystyr â 2, ac felly, yna mae'n mynd i wneud 3 yn llai nag 1, yn bod 2 gyfartal, nad yw hyn yr ydym ei eisiau. Felly, er mwyn atal unrhyw weithredwr broblemau blaenoriaeth, bob amser yn lapio mewn cromfachau. Iawn. A dyna ni, 5:30. Os oes gennych unrhyw gwestiynau ar y pset, gadewch i ni wybod. Dylai fod yn hwyl, ac mae'r rhifyn haciwr hefyd yn llawer mwy realistig na'r argraffiad haciwr y llynedd, felly rydym yn gobeithio y bydd llawer o chi roi cynnig arni. Llynedd yn iawn llethol. [CS50.TV]