1 00:00:00,000 --> 00:00:02,982 [FILMAS RULIS] 2 00:00:02,982 --> 00:00:06,461 [MŪZIKA ATSKAŅOTĀS] 3 00:01:12,660 --> 00:01:15,420 DEIVIDS MALANS: Labi, šis ir CS50. 4 00:01:15,420 --> 00:01:18,410 Un šī jau ir 3. nedēļa, kurā mēs atskatīsimies faktiski uz 0. nedēļu, 5 00:01:18,410 --> 00:01:21,400 kurā mēs pirmo reizi sākām. 6 00:01:21,400 --> 00:01:24,930 Un 0. nedēļā atcerieties, ka savā ziņā viss bija ļoti intuitīvi. 7 00:01:24,930 --> 00:01:26,465 Mēs runājām ne tikai par informācijas attēlojumu, bet arī par 8 00:01:26,465 --> 00:01:28,000 algoritmiem. 9 00:01:28,000 --> 00:01:30,450 Un mēs atkal un atkal runājām par tālruņu grāmatas saplēšanu. 10 00:01:30,450 --> 00:01:32,860 Un tas mums kaut kā noveda pie labāka risinājuma. 11 00:01:32,860 --> 00:01:35,790 Bet šodien mēs mēģināsim sākt formalizēt dažas no šīm idejām un tvert 12 00:01:35,790 --> 00:01:38,720 dažas no tām pašām idejām vēl nevis pseidokodā, bet arī faktiskā 13 00:01:38,720 --> 00:01:41,650 kodā. 14 00:01:41,650 --> 00:01:45,011 Bet mēs arī apsvērsim šo algoritmu efektivitāti, piemēram, cik labi 15 00:01:45,011 --> 00:01:48,372 un cik labi izstrādāti patiesībā ir mūsu algoritmi. 16 00:01:48,372 --> 00:01:51,754 Un, ja atceraties, kad mēs veidojām tālruņu kataloga piemēru, kur man 17 00:01:51,754 --> 00:01:55,136 vispirms bija algoritms, kas meklēja pa vienai lapai, pēc tam otrreiz 18 00:01:55,136 --> 00:01:58,518 pa divām lappusēm, un pēc tam, treškārt, sāku pārraut lietu uz pusēm, 19 00:01:58,518 --> 00:02:01,900 atcerieties, ka mēs, ar rokas mājienu, to analizēja šādi. 20 00:02:01,900 --> 00:02:04,954 Mēs ierosinājām, ja x ass šeit ir problēmas lielums, piemēram, 21 00:02:04,954 --> 00:02:08,008 lappušu skaits tālruņu grāmatā, un y ass ir laiks, kas nepieciešams 22 00:02:08,008 --> 00:02:11,062 problēmas atrisināšanai sekundēs, minūtēs, lapas plīsumos neatkarīgi 23 00:02:11,062 --> 00:02:14,117 no jūsu vienības. mērs ir, atcerieties, ka pirmais algoritms, kas ir 24 00:02:14,117 --> 00:02:17,171 taisna līnija, piemēram, ja jums būtu n lapas tālruņu grāmatā, tas 25 00:02:17,171 --> 00:02:20,225 varētu būt šāds slīpums n — un pastāv šī viena pret vienu saistība 26 00:02:20,225 --> 00:02:23,280 starp lapām un asarām. 27 00:02:23,280 --> 00:02:26,710 Divas lappuses vienlaikus, protams, bija divreiz ātrāks, bet joprojām 28 00:02:26,710 --> 00:02:30,140 ir tāda pati forma, dzeltenā līnija šeit norāda, ka jā, tas ir n virs 29 00:02:30,140 --> 00:02:33,570 2, varbūt plus 1, ja jums ir jāpalielina atpakaļ, kā mēs apspriedām. 30 00:02:33,570 --> 00:02:35,970 Bet patiesībā tas joprojām ir viens un tas pats algoritms vienā vai 31 00:02:35,970 --> 00:02:38,370 divās lapās vienlaikus. 32 00:02:38,370 --> 00:02:40,800 Bet trešais algoritms, atcerieties, bija šis šeit zaļā krāsā, kur mēs 33 00:02:40,800 --> 00:02:43,230 to saucām par logaritmisko attiecībā uz to, cik ātri vai cik lēni tas 34 00:02:43,230 --> 00:02:45,660 bija. 35 00:02:45,660 --> 00:02:48,242 Un patiešām, šī algoritma rezultāts bija tāds, ka mēs varētu pat 36 00:02:48,242 --> 00:02:50,825 dubultot tālruņu kataloga izmēru, un tas nav nekas liels — viens 37 00:02:50,825 --> 00:02:53,407 papildu lapas plīsums, un mēs no tālruņu kataloga izņemam vēl 1000 38 00:02:53,407 --> 00:02:55,990 lappuses. 39 00:02:55,990 --> 00:02:57,836 Tāpēc šodien mēs pārskatīsim dažas no šīm idejām, nedaudz 40 00:02:57,836 --> 00:02:59,683 formalizēsim tās, bet galu galā arī pārtulkosim dažas no tām, lai 41 00:02:59,683 --> 00:03:01,530 kodētu. 42 00:03:01,530 --> 00:03:04,565 Un tas viss tagad ir iespējams, jo mums, iespējams, ir zemāka līmeņa 43 00:03:04,565 --> 00:03:07,600 izpratne par to, kas patiesībā atrodas jūsu datorā. 44 00:03:07,600 --> 00:03:10,170 Tā, protams, ir jūsu datora RAM vai atmiņa. 45 00:03:10,170 --> 00:03:12,795 Un atcerieties, ka, ja mēs sākam to abstrahēt, jūsu datora atmiņa 46 00:03:12,795 --> 00:03:15,420 patiešām ir tikai baitu režģis. 47 00:03:15,420 --> 00:03:17,730 Patiesībā mums vairs nav jāskatās uz aparatūru. 48 00:03:17,730 --> 00:03:22,595 Un mēs apskatījām šādu baitu režģi, kurā katrs no šiem baitiem var 49 00:03:22,595 --> 00:03:27,460 tikt izmantots, lai saglabātu char, int, garu vai pat veselu virkni. 50 00:03:27,460 --> 00:03:31,145 Bet koncentrēsimies varbūt tikai uz šī apakškopu, jo pagājušajā 51 00:03:31,145 --> 00:03:34,830 nedēļā mēs, protams, uzsvērām masīvus, lietu glabāšanu masīvos. 52 00:03:34,830 --> 00:03:38,143 Un tas ļāva mums sākt saglabāt veselas virknes, rakstzīmju secības un 53 00:03:38,143 --> 00:03:41,456 pat veselu skaitļu masīvus, ja vēlējāmies, lai būtu vairāki, nevis 54 00:03:41,456 --> 00:03:44,770 tikai vairāki mainīgie. 55 00:03:44,770 --> 00:03:47,502 Bet galvenais ir tas, ka, ieskatoties masīvā datora atmiņā — un, 56 00:03:47,502 --> 00:03:50,234 piemēram, pieņemsim, ka šie veselie skaitļi šeit ir saglabāti —, 57 00:03:50,234 --> 00:03:52,966 mums, cilvēkiem, ir diezgan viegli uzlūkot to un uzreiz atrast 58 00:03:52,966 --> 00:03:55,698 skaitli 50. 59 00:03:55,698 --> 00:03:57,699 Jums ir šāds skats no putna lidojuma, no kurienes jūs sēžat uz visu 60 00:03:57,699 --> 00:03:59,700 ekrānā redzamo. 61 00:03:59,700 --> 00:04:02,500 Un tāpēc ir diezgan skaidrs, kā jūs nonākat pie skaitļa 50. 62 00:04:02,500 --> 00:04:06,720 Bet datoru pasaulē, protams, izrādās, ka tā ir aparatūra. 63 00:04:06,720 --> 00:04:10,440 Un datori mūsdienu vajadzībām vienlaikus var veikt tikai vienu lietu. 64 00:04:10,440 --> 00:04:12,630 Viņi nevar vienkārši uztvert visu un uzreiz atrast kādu skaitli, 65 00:04:12,630 --> 00:04:14,820 piemēram, 50. 66 00:04:14,820 --> 00:04:18,660 Tāpēc, iespējams, piemērota metafora ir uzskatīt, ka datora atmiņas 67 00:04:18,660 --> 00:04:22,500 masīvs patiešām ir slēgtu durvju secība. 68 00:04:22,500 --> 00:04:26,615 Un, ja dators vēlas atrast kādu vērtību masīvā, tam ir jādara 69 00:04:26,615 --> 00:04:30,730 digitālais ekvivalents, atverot visas šīs durvis pa vienai. 70 00:04:30,730 --> 00:04:32,410 Tagad kā kods to var izdarīt? 71 00:04:32,410 --> 00:04:35,595 Protams, pagājušajā nedēļā mēs ieviesām indeksus vai indeksus, 72 00:04:35,595 --> 00:04:38,780 saskaņā ar kuriem mēs parasti saucam masīva pirmo elementu atrašanās 73 00:04:38,780 --> 00:04:41,965 vietu 0, otro atrašanās vietu 1, trešo vietu 2 un tā tālāk - tā 74 00:04:41,965 --> 00:04:45,150 saukto 0 indeksētu. 75 00:04:45,150 --> 00:04:47,790 Un tas ļāva mums tagad savienot šo atmiņā notiekošo konceptuālo 76 00:04:47,790 --> 00:04:50,430 pasauli ar faktisko kodu, jo tagad mums bija šī kvadrātiekavas 77 00:04:50,430 --> 00:04:53,070 sintakse, ar kuras palīdzību mēs varētu meklēt kaut ko, ja tā 78 00:04:53,070 --> 00:04:55,710 vēlamies. 79 00:04:55,710 --> 00:04:59,380 Un izrādās, ja es tagad krāsošu šīs sarkanās, nevis dzeltenās, šķiet, 80 00:04:59,380 --> 00:05:03,050 ka mums šeit ir diezgan laba fiziskā metafora, kas ir paredzēta 81 00:05:03,050 --> 00:05:06,720 datora atmiņas masīvam, ja, piemēram, jūs glabājat kādu septiņi šādi 82 00:05:06,720 --> 00:05:10,390 skaitļi. 83 00:05:10,390 --> 00:05:13,710 Un tāpēc šodien mēs sākam ar noteikta veida algoritma izskatu. 84 00:05:13,710 --> 00:05:14,910 Tas ir meklēšanai. 85 00:05:14,910 --> 00:05:16,270 Meklēšana notiek visur. 86 00:05:16,270 --> 00:05:18,680 Mēs visi, iespējams, jau vairākas reizes dienā esam apmeklējuši 87 00:05:18,680 --> 00:05:21,090 vietni google.com vai kādu līdzvērtīgu vietni. 88 00:05:21,090 --> 00:05:25,110 Tādi uzņēmumi kā Google patiešām spēj ātri saņemt atbildes. 89 00:05:25,110 --> 00:05:26,700 Tātad, kā viņi to dara? 90 00:05:26,700 --> 00:05:29,882 Kā viņi uzglabā informāciju datoru atmiņā? 91 00:05:29,882 --> 00:05:31,590 Nu, padomāsim, kas tas īsti ir. 92 00:05:31,590 --> 00:05:34,500 Tā patiešām ir tikai problēma, kāda tā bija 0. nedēļā. 93 00:05:34,500 --> 00:05:38,253 Tomēr problēmas ievade pašlaik varētu būt septiņu skapīšu masīvs. 94 00:05:38,253 --> 00:05:40,920 Tā ir problēmas ievade, kuras iekšpusē ir skaitlis. 95 00:05:40,920 --> 00:05:44,363 Un varbūt vienkāršības labad mēs vēlamies tikai jā/nē, 96 00:05:44,363 --> 00:05:47,806 patiesu/nepatiesu atbildi — tas ir, jēga — par to, vai šajā masīvā ir 97 00:05:47,806 --> 00:05:51,250 vai nav kāds skaitlis, piemēram, 50. 98 00:05:51,250 --> 00:05:52,680 Tas nav tik izdomāts kā Google. 99 00:05:52,680 --> 00:05:55,500 Tas ne tikai saka, ka jā, mums ir meklēšanas rezultāti. 100 00:05:55,500 --> 00:05:57,300 Tas faktiski sniedz jums meklēšanas rezultātus. 101 00:05:57,300 --> 00:06:00,230 Bet tagad mēs saglabāsim to vienkāršu un tikai izvadīsim kā daļu no 102 00:06:00,230 --> 00:06:03,160 šīs problēmas, jā vai nē, patiess vai nepatiess, mēs esam atraduši 103 00:06:03,160 --> 00:06:06,090 meklēto numuru, ņemot vērā tādu ievadi kā šis masīvs. 104 00:06:06,090 --> 00:06:09,237 Bet izrādās, ka šīs melnās kastes iekšpusē, pie kuras mēs pastāvīgi 105 00:06:09,237 --> 00:06:12,385 atgriežamies, ir dažādi iespējamie algoritmi. 106 00:06:12,385 --> 00:06:14,122 Un mēs par to augstā līmenī konceptuāli runājām 0. nedēļā ar tālruņu 107 00:06:14,122 --> 00:06:15,860 katalogu. 108 00:06:15,860 --> 00:06:19,254 Bet šodien aplūkosim to nedaudz konkrētāk, izmantojot spēli, ar kuru 109 00:06:19,254 --> 00:06:22,648 daži no jums varētu būt uzauguši, proti, Monopols. 110 00:06:22,648 --> 00:06:24,724 Un tā aiz šīm durvīm, izrādās, slēpsies kaut kādas monopola naudas 111 00:06:24,724 --> 00:06:26,800 nominālvērtības. 112 00:06:26,800 --> 00:06:28,690 Bet šim nolūkam mums tagad ir divi brīvprātīgie. 113 00:06:28,690 --> 00:06:30,483 Ja vēlaties apsveikt pasauli? 114 00:06:30,483 --> 00:06:31,525 DŽEKSONS: Sveiki, es esmu Džeksons. 115 00:06:35,440 --> 00:06:37,220 STEFĀNIJA: Sveiki, mani sauc Stefānija. 116 00:06:37,220 --> 00:06:38,895 DEIVIDS MALANS: Un vai vēlaties kaut ko pastāstīt par sevi — gadiem, 117 00:06:38,895 --> 00:06:40,570 māju, kopmītni? 118 00:06:40,570 --> 00:06:43,030 STEFĀNIJA: Es pirmo gadu dzīvoju Metjūsā. 119 00:06:43,030 --> 00:06:43,780 DEIVIDS MALANS: Jauki. 120 00:06:43,780 --> 00:06:45,580 DŽEKSONS: Un es pirmo gadu esmu Kanādā. 121 00:06:45,580 --> 00:06:46,330 DEIVIDS MALANS: Jauki. 122 00:06:46,330 --> 00:06:48,670 Labi, laipni lūdzam mūsu abos brīvprātīgajos. 123 00:06:48,670 --> 00:06:50,710 Tātad, kāpēc mēs to nedarītu? 124 00:06:50,710 --> 00:06:54,460 Vai kāds no jums vēlētos brīvprātīgi pieteikt otru, lai dotos pirmais? 125 00:06:54,460 --> 00:06:55,510 STEFĀNIJA: Es iešu. 126 00:06:55,510 --> 00:06:56,560 DEIVIDS MALANS: Labi. 127 00:06:56,560 --> 00:06:58,300 Labi, Stefānija ir augšā pirmā. 128 00:06:58,300 --> 00:07:02,560 Un aiz vienām no šīm durvīm mēs esam paslēpuši monopola naudu 50. 129 00:07:02,560 --> 00:07:04,180 Un tāpēc mēs vēlamies, lai jūs atrastu 50. 130 00:07:04,180 --> 00:07:06,490 Mēs jums neko vairāk nestāstīsim par skapīšiem. 131 00:07:06,490 --> 00:07:08,900 Bet mēs vēlamies, lai jūs izpildītu noteiktu algoritmu. 132 00:07:08,900 --> 00:07:11,020 Un patiesībā es jums iedošu pseidokodu šim nolūkam. 133 00:07:11,020 --> 00:07:12,770 Un es jums došu tam nosaukumu. 134 00:07:12,770 --> 00:07:13,900 To sauc par lineāro meklēšanu. 135 00:07:13,900 --> 00:07:15,940 Un, kā norāda nosaukums, jūs diezgan daudz beigsit staigāt pa taisnu 136 00:07:15,940 --> 00:07:17,980 līniju. 137 00:07:17,980 --> 00:07:19,220 Bet kā tu to darīsi? 138 00:07:19,220 --> 00:07:21,195 Ļaujiet man ierosināt, ka pēc brīža jūsu pirmais solis būs domāt kā 139 00:07:21,195 --> 00:07:23,170 cilpa. 140 00:07:23,170 --> 00:07:25,225 Ko mēs vēlamies, lai jūs darītu katrā iterācijā katrā durvīm no 141 00:07:25,225 --> 00:07:27,280 kreisās uz labo pusi? 142 00:07:27,280 --> 00:07:30,175 Nu, ja aiz šīm durvīm ir 50, tad mēs vēlamies iet uz priekšu, lai jūs 143 00:07:30,175 --> 00:07:33,070 atgrieztos patiesi. 144 00:07:33,070 --> 00:07:35,860 Un, ja vēlaties, lepni paceliet 50 grupas labā. 145 00:07:35,860 --> 00:07:39,250 Pretējā gadījumā, ja jūs izietat visu šo cilpu un neesat atradis 146 00:07:39,250 --> 00:07:42,640 skaitli 50, jūs varat vienkārši sarūgtināt ar rokām. 147 00:07:42,640 --> 00:07:45,190 Nepatiesi — jūs neesat atradis skaitli 50. 148 00:07:45,190 --> 00:07:47,741 Tātad, lai būtu skaidrs, pirmais solis būs katrām durvīm no kreisās 149 00:07:47,741 --> 00:07:50,293 uz labo pusi. 150 00:07:50,293 --> 00:07:51,460 Kā jūs vēlētos sākt? 151 00:07:55,610 --> 00:07:56,495 Jā. 152 00:07:56,495 --> 00:07:57,840 Ak, un tad - jā. 153 00:07:57,840 --> 00:07:58,340 Tur mēs ejam. 154 00:07:58,340 --> 00:08:00,365 Jā. 155 00:08:00,365 --> 00:08:04,040 Un, ja vēlaties vismaz pateikt, labi, labi aktierspēli šeit. 156 00:08:04,040 --> 00:08:06,140 Ko jūs tā vietā atradāt? 157 00:08:06,140 --> 00:08:07,970 STEFĀNIJA: Nav 50, bet 20. 158 00:08:07,970 --> 00:08:08,900 DEIVIDS MALANS: Ak, labi. 159 00:08:08,900 --> 00:08:10,280 Tātad pirmais solis bija neveiksmīgs. 160 00:08:10,280 --> 00:08:11,870 Tātad, pāriesim uz otro soli. 161 00:08:11,870 --> 00:08:14,453 Ko jūs plānojat darīt tālāk šajā cilpā? 162 00:08:14,453 --> 00:08:16,370 STEFĀNIJA: Es pārvācos uz blakus durvīm. 163 00:08:16,370 --> 00:08:17,037 DEIVIDS MALANS: Labi. 164 00:08:20,790 --> 00:08:22,100 STEFĀNIJA: Gandrīz. 165 00:08:22,100 --> 00:08:23,100 DEIVIDS MALANS: Labi, gandrīz. 166 00:08:23,100 --> 00:08:23,790 Sava veida. 167 00:08:23,790 --> 00:08:25,110 Tā vietā 500. 168 00:08:25,110 --> 00:08:26,280 Nākamais skapītis? 169 00:08:26,280 --> 00:08:30,200 STEFĀNIJA: Es labprātāk ņemtu to. 170 00:08:30,200 --> 00:08:30,700 Nē. 171 00:08:33,840 --> 00:08:36,558 DEIVIDS MALANS: Labi, mēs nerunājam auditorijai? 172 00:08:36,558 --> 00:08:38,260 STEFĀNIJA: Tas bija 10. 173 00:08:38,260 --> 00:08:39,789 DEIVIDS MALANS: Labi, tā turpini. 174 00:08:39,789 --> 00:08:40,974 Šis tagad ir trešais solis. 175 00:08:45,470 --> 00:08:46,310 STEFĀNIJA: Ak, cilvēk. 176 00:08:49,850 --> 00:08:51,260 DEIVIDS MALANS: Pieci, labi. 177 00:08:51,260 --> 00:08:52,670 Pārbaudāmi vēl daži skapīši. 178 00:08:57,296 --> 00:08:58,790 STEFĀNIJA: Mazliet skumji, puiši. 179 00:09:02,527 --> 00:09:04,360 DEIVIDS MALANS: Labi, no otras puses līdz pēdējam. 180 00:09:07,710 --> 00:09:09,070 STEFĀNIJA: Ir 1. 181 00:09:09,070 --> 00:09:10,022 Kaut kā tuvu. 182 00:09:10,022 --> 00:09:10,980 DEIVIDS MALANS: Labi. 183 00:09:10,980 --> 00:09:12,780 Un visbeidzot pēdējais solis. 184 00:09:12,780 --> 00:09:15,780 Ir skaidrs, ka jūs, iespējams, esat šeit iekārtojies. 185 00:09:15,780 --> 00:09:17,340 STEFĀNIJA: Ejam! 186 00:09:17,340 --> 00:09:19,920 DEIVIDS MALANS: Labi, tātad skaitlis 50. 187 00:09:23,500 --> 00:09:25,870 Un Stefānija, ja drīkst, ļaujiet man šeit uzdot jums jautājumu. 188 00:09:25,870 --> 00:09:28,890 Tātad ekrānā šis ir tikko izpildītais pseidokods. 189 00:09:28,890 --> 00:09:31,830 Pieņemsim, ka es tomēr esmu izdarījis to, ko daudzi no mums ir 190 00:09:31,830 --> 00:09:34,770 ieraduši darīt, ja jums ir ja stāvoklis. 191 00:09:34,770 --> 00:09:36,730 Jums bieži ir arī cita filiāle. 192 00:09:36,730 --> 00:09:38,760 Pieņemsim, ka es to būtu izdarījis tagad. 193 00:09:38,760 --> 00:09:40,220 Un es to atzīmēju sarkanā krāsā, lai būtu skaidrs, ka tas ir 194 00:09:40,220 --> 00:09:41,680 nepareizi. 195 00:09:41,680 --> 00:09:44,360 Bet kas būtu bijis slikts šajā kodā, izmantojot if un else, vai jūs 196 00:09:44,360 --> 00:09:47,040 varētu teikt? 197 00:09:47,040 --> 00:09:48,360 Vai ir kādi instinkti? 198 00:09:55,620 --> 00:10:00,210 STEFĀNIJA: Tad jūs varētu atcelt kodu, pirms atrodat 50. 199 00:10:00,210 --> 00:10:01,020 DEIVIDS MALANS: Jā, tieši tā. 200 00:10:01,020 --> 00:10:02,070 STEFĀNIJA: Es domāju, ka tu būtu mūžīgi skumja. 201 00:10:02,070 --> 00:10:02,460 DEIVIDS MALANS: Patiešām. 202 00:10:02,460 --> 00:10:05,127 Kad Stefānija bija atvērusi pirmo skapīti, viņa būtu atradusi 20. 203 00:10:05,127 --> 00:10:06,630 20, protams, nav 50. 204 00:10:06,630 --> 00:10:07,838 Viņa būtu lēmusi par nepatiesu. 205 00:10:07,838 --> 00:10:10,547 Bet, protams, viņa nebija pārbaudījusi visus pārējos skapīšus. 206 00:10:10,547 --> 00:10:14,221 Šķiet, ka tā ir galvenā detaļa, kurai, ieviešot pseidokodu, mēs 207 00:10:14,221 --> 00:10:17,896 faktiski izejam cauri — tāpat kā mēs to darījām — un tikai atgriežam 208 00:10:17,896 --> 00:10:21,570 false, pat ne ar citu, bet tieši cilpas beigās. mēs sasniedzam šo 209 00:10:21,570 --> 00:10:25,245 līniju tikai tad, ja neatgriežam patiesību agrāk. 210 00:10:25,245 --> 00:10:26,620 Nu, ejam uz priekšu un darīsim to. 211 00:10:26,620 --> 00:10:27,360 Ļaujiet man paņemt no jums mikrofonu. 212 00:10:27,360 --> 00:10:28,930 Ja vēlaties apsēsties blakus Džeksonam? 213 00:10:28,930 --> 00:10:31,180 Un Džekson, pēc mirkļa mēs liksim tev nākt klāt. 214 00:10:31,180 --> 00:10:34,170 Kārter, ja jūs neiebilstat pārkārtot mūsu skapīšus. 215 00:10:34,170 --> 00:10:36,090 Bet tikmēr ļaujiet man norādīt, kā mēs tagad varētu pārvērst to pašu 216 00:10:36,090 --> 00:10:38,010 ideju kodā. 217 00:10:38,010 --> 00:10:40,658 Diezgan augsts līmenis, diezgan orientēts uz angļu valodu ar šo 218 00:10:40,658 --> 00:10:43,306 pseidokodu — bet patiesībā tagad, kopš pagājušās nedēļas, mums ir 219 00:10:43,306 --> 00:10:45,954 sintakse, ar kuras palīdzību Stefānija un drīzumā Džeksons varētu 220 00:10:45,954 --> 00:10:48,602 uzskatīt šo skapīti, šo skapīšu komplektu, kā patiešām masīvu, 221 00:10:48,602 --> 00:10:51,250 izmantojot iekavas. apzīmējums. 222 00:10:51,250 --> 00:10:52,865 Tātad tagad mēs varam nedaudz pietuvināt mūsu pseidokodu faktiskajam 223 00:10:52,865 --> 00:10:54,480 kodam. 224 00:10:54,480 --> 00:10:58,520 Un veids, piemēram, datorzinātnieks tulkotu diezgan augsta līmeņa 225 00:10:58,520 --> 00:11:02,560 angļu pseidokodu, piemēram, šo, kaut ko, kas ir nedaudz tuvāks C vai 226 00:11:02,560 --> 00:11:06,600 jebkurai valodai, kas atbalsta masīvus, būtu nedaudz slēptāks. 227 00:11:06,600 --> 00:11:09,060 Taču tuvākajās dienās jūs redzēsiet vairāk šīs sintakses. 228 00:11:09,060 --> 00:11:13,260 i no 0 līdz n mīnus 1 — tas joprojām ir pseidokods. 229 00:11:13,260 --> 00:11:15,495 Bet tas ir angļu valodai līdzīgais veids, kā izteikt to, ko mēs zinām 230 00:11:15,495 --> 00:11:17,730 kā for cilpu. 231 00:11:17,730 --> 00:11:22,116 Ja 50 ir aiz durvīm iekavas i, es diskusiju labad pieņemu, ka durvis 232 00:11:22,116 --> 00:11:26,503 tagad ir mana mainīgā, šī septiņu durvju masīva, nosaukums. 233 00:11:26,503 --> 00:11:30,370 Bet tad pārējā loģika, pārējais pseidokods patiešām ir tāds pats. 234 00:11:30,370 --> 00:11:33,432 Un tā jūs ar laiku atklāsiet, ka programmētāji, datorzinātnieki 235 00:11:33,432 --> 00:11:36,495 vispār, kad jūs sākat izteikt idejas, algoritmus kādam citam, tā 236 00:11:36,495 --> 00:11:39,558 vietā, lai varbūt darbotos šajā līmenī šeit, jums tagad ir jauns 237 00:11:39,558 --> 00:11:42,621 vārdu krājums, patiešām jauna sintakse, ko varat esiet nedaudz 238 00:11:42,621 --> 00:11:45,684 precīzāks, neiedziļinoties faktiskā C koda rakstīšanas nezālēs, bet 239 00:11:45,684 --> 00:11:48,747 vismaz tagad darot kaut ko tādu, kas ir nedaudz tuvāk manipulēšanai 240 00:11:48,747 --> 00:11:51,810 ar šādu masīvu. 241 00:11:51,810 --> 00:11:55,140 Tātad Džekson, vai jūs vēlētos piecelties? 242 00:11:55,140 --> 00:11:56,760 Labi. 243 00:11:56,760 --> 00:11:57,360 jā, jā. 244 00:11:57,360 --> 00:11:59,010 Šeit arī atbalsts Džeksonam. 245 00:11:59,010 --> 00:12:00,780 Jauki. 246 00:12:00,780 --> 00:12:04,470 Un tagad es atļaušos jums pieņemt, ka Stefānijai nebija. 247 00:12:04,470 --> 00:12:07,260 Stefānija noteikti darīja visu iespējamo, meklējot no kreisās puses 248 00:12:07,260 --> 00:12:10,050 uz labo, izmantojot lineāro meklēšanu, kā mēs to tagad sauksim. 249 00:12:10,050 --> 00:12:12,180 Bet tie bija diezgan nejaušā secībā, vai ne? 250 00:12:12,180 --> 00:12:15,030 Tur bija 20, tur bija 1 un tad 50. 251 00:12:15,030 --> 00:12:17,070 Tāpēc mēs apzināti sajaucām lietas un nesakārtojām skaitļus viņas 252 00:12:17,070 --> 00:12:19,110 vietā. 253 00:12:19,110 --> 00:12:21,810 Bet Kārters tikko laipni nāca klajā, lai jūs, Džekson, sakārtotu 254 00:12:21,810 --> 00:12:24,510 skaitļus iepriekš. 255 00:12:24,510 --> 00:12:27,090 Un mēs vēlētos, lai jūs šoreiz, līdzīgi kā 0. nedēļā, kaut ko darītu 256 00:12:27,090 --> 00:12:29,670 atkal un atkal, bet šoreiz izmantojot to, ko mēs tagad saucam par 257 00:12:29,670 --> 00:12:32,250 bināro meklēšanu. 258 00:12:32,250 --> 00:12:35,580 Konceptuāli tas ir tieši tāds pats algoritms kā 0. nedēļā. 259 00:12:35,580 --> 00:12:38,015 Bet, ja mēs to tulkojam šī masīva kontekstā, mēs tagad varētu teikt 260 00:12:38,015 --> 00:12:40,450 kaut ko līdzīgu šim. 261 00:12:40,450 --> 00:12:42,990 Pirmais solis Džeksonam varētu būt uzdot jautājumu — ja 50 atrodas 262 00:12:42,990 --> 00:12:45,530 aiz vidējām durvīm, kur, iespējams, viņš ir veicis prāta aprēķinus, 263 00:12:45,530 --> 00:12:48,070 lai noskaidrotu, kas ir vidus, tad viņš vienkārši atgriezīsies 264 00:12:48,070 --> 00:12:50,610 patiesi. 265 00:12:50,610 --> 00:12:53,070 Un cerams, ka mums veiksies un 50 būs uzreiz. 266 00:12:53,070 --> 00:12:58,290 Protams, ir vēl vismaz divas citas iespējas, kura būtu kas? 267 00:12:58,290 --> 00:13:01,290 50 ir attiecībā uz šīm durvīm? 268 00:13:01,290 --> 00:13:03,930 Jā, pa kreisi vai pa labi, alternatīvi. 269 00:13:03,930 --> 00:13:06,555 Tātad, ja 50 ir mazāks par vidējām durvīm, tad, domājams, Džeksons 270 00:13:06,555 --> 00:13:09,180 vēlēsies iet pa kreisi. 271 00:13:09,180 --> 00:13:12,090 Citādi, ja 50 ir lielāks par vidējām durvīm, viņš gribēs iet pa labi, 272 00:13:12,090 --> 00:13:15,000 līdzīgi kā es fiziski to darīju pagājušajā nedēļā ar tālruņu 273 00:13:15,000 --> 00:13:17,910 katalogu, sadalot un iekarojot no kreisās uz labo pusi. 274 00:13:17,910 --> 00:13:20,020 Bet patiesībā ir ceturtais gadījums. 275 00:13:20,020 --> 00:13:21,540 Vispirms uzliksim to uz tāfeles. 276 00:13:21,540 --> 00:13:25,530 Kas vēl šeit varētu notikt, kas Džeksonam būtu jāapsver? 277 00:13:25,530 --> 00:13:26,170 Jā. 278 00:13:26,170 --> 00:13:28,590 Ak, tā tur nav. 279 00:13:28,590 --> 00:13:32,037 Tāpēc ļaujiet man atgriezties un labot savu pseidokodu šeit un 280 00:13:32,037 --> 00:13:35,485 vienkārši pateikt Džeksons: ja mēs jums nedosim durvis vispār, vai 281 00:13:35,485 --> 00:13:38,932 galu galā, kad viņš sadala un iekaro, ja viņam vairs nav durvju, mums 282 00:13:38,932 --> 00:13:42,380 tas ir jārīkojas. situāciju, lai uzvedība būtu definēta. 283 00:13:42,380 --> 00:13:45,515 Labi, tātad ar to teikto: Džekson, vai vēlaties atrast mums numuru 50 284 00:13:45,515 --> 00:13:48,650 un mutiski pastāstīt par to, ko jūs darāt un atrodat? 285 00:13:48,650 --> 00:13:52,860 DŽEKSONS: Labi, tāpēc izskatās, ka šīs ir vidējās durvis. 286 00:13:52,860 --> 00:13:55,290 Tāpēc es to atvēršu. 287 00:13:55,290 --> 00:13:57,030 Bet tas ir 20, nevis 50. 288 00:13:57,030 --> 00:13:59,622 DEIVIDS MALANS: Ak! 289 00:13:59,622 --> 00:14:01,080 Kas tev tagad darās galvā? 290 00:14:01,080 --> 00:14:03,785 DŽEKSONS: Tāpēc tagad es meklēju, jo 50 ir augstāks par 20, es vēlos 291 00:14:03,785 --> 00:14:06,490 skatīties pa labi. 292 00:14:06,490 --> 00:14:07,440 DEIVIDS MALANS: Labi. 293 00:14:07,440 --> 00:14:10,270 DŽEKSONS: Un meklējiet jaunās vidējās durvis, kas būtu šeit. 294 00:14:10,270 --> 00:14:11,700 DEIVIDS MALANS: Jauki. 295 00:14:11,700 --> 00:14:13,740 DŽEKSONS: Un tas ir 100 — slikti. 296 00:14:13,740 --> 00:14:16,560 Bet 50 ir mazāks par 100. 297 00:14:16,560 --> 00:14:20,520 Tāpēc tagad jāskatās pa kreisi, kas būtu šeit. 298 00:14:20,520 --> 00:14:21,240 Un ta-da. 299 00:14:21,240 --> 00:14:21,990 DEIVIDS MALANS: Jauki. 300 00:14:21,990 --> 00:14:25,680 Ļoti labi paveikts arī šoreiz. 301 00:14:25,680 --> 00:14:29,680 Tāpēc paldies, pirmkārt, mūsu brīvprātīgajiem. 302 00:14:29,680 --> 00:14:32,034 Un patiesībā, tā kā jūs esat Monopola cienītājs, kā mēs esam tik 303 00:14:32,034 --> 00:14:34,388 informēti, mums ir Kembridžas Monopola izdevums ar visiem jūsu 304 00:14:34,388 --> 00:14:36,743 Hārvardas izlases veidiem. 305 00:14:36,743 --> 00:14:37,410 DŽEKSONS: Nekādā gadījumā. 306 00:14:37,410 --> 00:14:38,460 DEIVIDS MALANS: Lūk. 307 00:14:38,460 --> 00:14:38,970 STEFĀNIJA: Paldies. 308 00:14:38,970 --> 00:14:40,095 DŽEKSONS: Liels paldies. 309 00:14:40,095 --> 00:14:41,332 DEIVIDS MALANS: Paldies mūsu brīvprātīgajiem, ka viņi atrada mūs 50 310 00:14:41,332 --> 00:14:42,570 gadus vecus. 311 00:14:42,570 --> 00:14:46,940 Tātad - tas bija populārāks, nekā mēs gaidījām. 312 00:14:46,940 --> 00:14:49,500 Tātad, šeit mēs varam to vēl vienu reizi pārvērst par kaut ko mazliet 313 00:14:49,500 --> 00:14:52,060 tuvāku kodam. 314 00:14:52,060 --> 00:14:54,576 Un atkal, joprojām pseidokods — bet šeit, tagad, varētu būt vēl viens 315 00:14:54,576 --> 00:14:57,092 formulējums tieši tam, ko Džeksons tikko izdarīja, vienkārši 316 00:14:57,092 --> 00:14:59,608 izmantojot masīvu nomenklatūru, kur jūs varat būt nedaudz precīzāks 317 00:14:59,608 --> 00:15:02,124 ar saviem norādījumiem un atstāt to kāda cita ziņā. visbeidzot 318 00:15:02,124 --> 00:15:04,640 tulkojiet to kodā. 319 00:15:04,640 --> 00:15:06,640 Bet šeit mums ir tāds pats jautājums sākumā. 320 00:15:06,640 --> 00:15:08,650 Ja durvis nav atstātas, atgrieziet nepatiesu. 321 00:15:08,650 --> 00:15:12,260 Ja 50 ir aiz durvīm, iekavējiet vidējo, tāpēc es šeit pieņemu, jo tas 322 00:15:12,260 --> 00:15:15,870 ir pseidokods, ka kaut kur esmu veicis garīgo vai faktisko 323 00:15:15,870 --> 00:15:19,480 matemātiku, lai noskaidrotu, kas ir vidējā rādītājs. 324 00:15:19,480 --> 00:15:23,395 Piemēram, ja masīvā ir septiņas durvis, tā būtu vieta 0, 1, 2, 3, 4, 325 00:15:23,395 --> 00:15:27,310 5, 6. 326 00:15:27,310 --> 00:15:30,415 Tātad kaut kā esmu paņēmis kopējo durvju skaitu, 7, dalījis ar 2, lai 327 00:15:30,415 --> 00:15:33,520 atrastu vidu. 328 00:15:33,520 --> 00:15:34,430 Tas ir 3 un 1/2. 329 00:15:34,430 --> 00:15:35,680 Mums jātiek galā ar noapaļošanu. 330 00:15:35,680 --> 00:15:37,795 Bet pietiek pateikt, ka vidējā indeksa atrašanai ir labi definēta 331 00:15:37,795 --> 00:15:39,910 formula. 332 00:15:39,910 --> 00:15:41,595 Ņemot vērā kopējo skapīšu skaitu, sadaliet to ar 2 un pēc tam 333 00:15:41,595 --> 00:15:43,280 attiecīgi noapaļojiet. 334 00:15:43,280 --> 00:15:46,035 Tātad, domājams, tas ir tas, ko Džeksons izdarīja, vienkārši skaitot 335 00:15:46,035 --> 00:15:48,790 vai savā galvā, lai atrastu mūs ar 3. durvīm. 336 00:15:48,790 --> 00:15:52,210 Nevis trešās durvis, ceturtās durvis, bet durvju kronšteins 3. 337 00:15:52,210 --> 00:15:54,205 Tātad tas ir tikai sakāms, ja 50 ir aiz durvīm iekavas vidū, 338 00:15:54,205 --> 00:15:56,200 atgriezieties patiesi. 339 00:15:56,200 --> 00:15:57,200 Tas tā nebija. 340 00:15:57,200 --> 00:15:58,960 Tā vietā viņš atrada 20 dolāru banknoti. 341 00:15:58,960 --> 00:16:02,860 Citādi, ja 50 ir mazāks par durvju kronšteinu vidū, turpiniet — un 342 00:16:02,860 --> 00:16:06,760 tagad tas kļūst interesanti — meklējiet durvis no 0 caur durvīm no 343 00:16:06,760 --> 00:16:10,660 vidus mīnus 1. 344 00:16:10,660 --> 00:16:12,730 Tāpēc tagad tas kļūst mazliet vairāk par nezālēm. 345 00:16:12,730 --> 00:16:16,600 Bet, ja vidējais ir 3, šis šeit, ko mēs tagad vēlamies, lai Džeksons 346 00:16:16,600 --> 00:16:20,470 meklētu, ja būtu bijis 50 — ja skaitlis būtu bijis mazāks, mēs 347 00:16:20,470 --> 00:16:24,340 vēlamies sākt ar 0 iekava un turpināt šo. 348 00:16:24,340 --> 00:16:26,318 Un mēs apzināti atņemam 1, jo kāda jēga atkal skatīties tajā pašā 349 00:16:26,318 --> 00:16:28,297 skapī? 350 00:16:28,297 --> 00:16:31,270 Tikpat labi mēs varētu izdarīt no 0 līdz vidum mīnus 1. 351 00:16:31,270 --> 00:16:34,195 Ja 50 ir lielāks par durvju kronšteinu vidējo, kas tas bija, ko mēs 352 00:16:34,195 --> 00:16:37,120 tad darījām? 353 00:16:37,120 --> 00:16:40,207 Tātad Džeksons intuitīvi meklēja durvis vidus plus 1 caur durvīm n 354 00:16:40,207 --> 00:16:43,295 mīnus 1. 355 00:16:43,295 --> 00:16:44,857 Un godīgi sakot, tas kļūst nedaudz kaitinoši, ja šeit ir plusi un 356 00:16:44,857 --> 00:16:46,420 mīnusi. 357 00:16:46,420 --> 00:16:47,780 Bet tikai padomājiet, ko tas nozīmē. 358 00:16:47,780 --> 00:16:49,090 Šīs ir vidējās durvis. 359 00:16:49,090 --> 00:16:52,620 Un pēc tam Džeksons turpināja meklēt caur durvīm, kas ir plus 1, jo 360 00:16:52,620 --> 00:16:56,150 nav jēgas meklēt šo vēlreiz. 361 00:16:56,150 --> 00:17:00,751 Un tad pēdējais elements jebkurā masīvā ar izmēru n, kur n ir tikai 362 00:17:00,751 --> 00:17:05,352 mūsu sākuma skaitlis izmēram, vienmēr būs n mīnus 1. 363 00:17:05,352 --> 00:17:06,310 Tas nebūs n. 364 00:17:06,310 --> 00:17:10,839 Tas būs n mīnus 1, jo mēs vienmēr sākam skaitīt masīvus no 0. 365 00:17:10,839 --> 00:17:13,634 Šeit mums ir šīs tieši tādas pašas idejas tulkojums pseidokodā, kas 366 00:17:13,634 --> 00:17:16,430 ir nedaudz tuvāks C. 367 00:17:16,430 --> 00:17:18,490 Un šeit mēs nonākam pilnā aplī līdz 0. nedēļai. 368 00:17:18,490 --> 00:17:20,955 0. nedēļā bija diezgan intuitīvi iedomāties šādas problēmas 369 00:17:20,955 --> 00:17:23,420 sadalīšanu un pārvarēšanu. 370 00:17:23,420 --> 00:17:26,275 Bet, ja tagad, kad veicat automātisko pabeigšanu un meklējat 371 00:17:26,275 --> 00:17:29,130 sarakstu, pārdomājat savu iPhone, Android tālruni vai tamlīdzīgu 372 00:17:29,130 --> 00:17:31,985 informāciju, iespējams, ja tālrunī nav daudz draugu, ģimenes vai 373 00:17:31,985 --> 00:17:34,840 kolēģu, zini ko? 374 00:17:34,840 --> 00:17:37,780 Lineārā meklēšana, vienkārši pārbaudot katru meklētās personas vārdu, 375 00:17:37,780 --> 00:17:40,720 varētu būt pilnīgi piemērota. 376 00:17:40,720 --> 00:17:43,070 Taču pastāv iespēja, ka jūsu tālrunis būs gudrāks par to, it īpaši, 377 00:17:43,070 --> 00:17:45,420 ja gadu gaitā jūsu kontaktpersonu sarakstā ir vairāki desmiti, simti, 378 00:17:45,420 --> 00:17:47,770 tūkstoši. 379 00:17:47,770 --> 00:17:49,540 Kas būtu labāks par lineāro meklēšanu? 380 00:17:49,540 --> 00:17:51,340 Nu, iespējams, binārā meklēšana. 381 00:17:51,340 --> 00:17:55,180 Bet, bet, bet-- ir pieņēmums, prasība, kas ir kas? 382 00:17:55,180 --> 00:18:00,005 Kāpēc Džeksons, piemēram, Stefānija, varēja atrast 50 tikai trīs 383 00:18:00,005 --> 00:18:04,830 soļos, nevis pilnos septiņos? 384 00:18:04,830 --> 00:18:06,570 Jo masīvs bija sakārtots. 385 00:18:06,570 --> 00:18:08,280 Un tāpēc šī ir sava veida teaser par to, pie kā mums šodien būs 386 00:18:08,280 --> 00:18:09,990 jāatgriežas vēlāk. 387 00:18:09,990 --> 00:18:12,780 Nu, cik daudz pūļu tas prasīja tādam kā Kārters? 388 00:18:12,780 --> 00:18:14,910 Cik daudz pūļu jūsu tālrunim ir nepieciešams, lai iepriekš sakārtotu 389 00:18:14,910 --> 00:18:17,040 visus šos vārdus un numurus? 390 00:18:17,040 --> 00:18:19,650 Jo varbūt patiesībā tas nav tā laika vērts. 391 00:18:19,650 --> 00:18:21,930 Tagad kāds, piemēram, Google, iespējams, kaut kādā veidā kārto 392 00:18:21,930 --> 00:18:24,210 tīmekļa lapu datubāzi. 393 00:18:24,210 --> 00:18:28,245 Varat iedomāties, ka tas ir ļoti lēns, ja vietnē google.com ierakstāt 394 00:18:28,245 --> 00:18:32,280 kaķus vai kaut ko citu, ja viņi lineāri meklēja visā datu kopā. 395 00:18:32,280 --> 00:18:35,430 Ideālā gadījumā viņi dara kaut ko nedaudz gudrāku. 396 00:18:35,430 --> 00:18:38,820 Tāpēc mēs tagad formalizēsim tieši šāda veida analīzi. 397 00:18:38,820 --> 00:18:42,180 Un tas nebūs tik daudz matemātisks, jo tas joprojām būs intuitīvs. 398 00:18:42,180 --> 00:18:44,970 Bet mēs jūs iepazīstināsim ar kādu žargonu, kādu terminoloģiju, ko 399 00:18:44,970 --> 00:18:47,760 vairums programmētāju vai datorzinātnieku varētu izmantot, analizējot 400 00:18:47,760 --> 00:18:50,550 savus algoritmus. 401 00:18:50,550 --> 00:18:53,670 Tagad formalizēsim, kas ir šāda veida analīze. 402 00:18:53,670 --> 00:18:55,290 Tāpēc šobrīd es apgalvoju, ka binārā meklēšana ir labāka nekā lineārā 403 00:18:55,290 --> 00:18:56,910 meklēšana. 404 00:18:56,910 --> 00:18:59,100 Bet cik labāk un kāpēc tieši tā? 405 00:18:59,100 --> 00:19:01,120 Nu, tas viss atgriežas pie šāda veida grafika. 406 00:19:01,120 --> 00:19:04,830 Tātad, atcerieties, šādi mēs analizējām tālruņu katalogu 0. nedēļā. 407 00:19:04,830 --> 00:19:08,460 Un atcerieties, ka mums patiešām bija šīs formulas, aptuvenas 408 00:19:08,460 --> 00:19:12,090 formulas, kas aprakstīja šo trīs algoritmu darbības laiku — pa vienai 409 00:19:12,090 --> 00:19:15,720 lapai, pa divām lappusēm un pēc tam atkal un atkal saplēšot uz pusēm. 410 00:19:15,720 --> 00:19:19,380 Un precīzi, ja jūs saskaitāt lapu skaitu, kurām es pieskāros, vai 411 00:19:19,380 --> 00:19:23,040 lapu skaitu, kurām es saplēstu, ir godīgi teikt, ka pirmais 412 00:19:23,040 --> 00:19:26,700 algoritms, sliktākajā gadījumā, kopā varēja aizņemt n lapas. 413 00:19:26,700 --> 00:19:28,980 Tas nenotika, jo es tajā laikā meklēju Džonu Hārvardu, kas ir 414 00:19:28,980 --> 00:19:31,260 alfabēta sākumā. 415 00:19:31,260 --> 00:19:34,845 Bet, ja es meklētu kādu ar uzvārdu Z, man būtu bijis jāturpina iet un 416 00:19:34,845 --> 00:19:38,430 iet, sliktākajā gadījumā cauri visām n lapām. 417 00:19:38,430 --> 00:19:41,940 Nav tik slikti otrajam algoritmam, un tāpēc mēs darām n dalītu ar 2. 418 00:19:41,940 --> 00:19:43,920 Un pat tie ir mazliet balti meli. 419 00:19:43,920 --> 00:19:48,270 Tas, iespējams, ir n dalīts ar 2 plus 1, ja man nāksies dubultot. 420 00:19:48,270 --> 00:19:52,030 Bet atkal es to daru vispārīgāk, lai aptvertu šo lietu būtību. 421 00:19:52,030 --> 00:19:54,485 Un tad mēs patiešām nokļuvām nezālē ar līdzīgu log base 2 notikumu 422 00:19:54,485 --> 00:19:56,940 šim trešajam un pēdējam algoritmam. 423 00:19:56,940 --> 00:19:59,360 Un tajā laikā mēs apgalvojām, ka ikreiz, kad jūs dalāt kaut ko uz 424 00:19:59,360 --> 00:20:01,780 pusēm, uz pusēm, uz pusēm, pastāv iespēja, ka tiks izmantots kaut 425 00:20:01,780 --> 00:20:04,200 kāds logaritms. 426 00:20:04,200 --> 00:20:05,340 Un mēs to redzēsim šodien. 427 00:20:05,340 --> 00:20:09,010 Bet šodien mēs faktiski sāksim lietot datorzinātņu terminoloģiju. 428 00:20:09,010 --> 00:20:13,590 Un mēs noformēsim šo neprecizitāti, ja vēlaties. 429 00:20:13,590 --> 00:20:17,270 Parasti mums būs vienalga, cik soļus veic kāds algoritms, jo tas 430 00:20:17,270 --> 00:20:20,950 nebūs tik izglītojoši, it īpaši, ja varbūt rīt jums būs ātrāks dators 431 00:20:20,950 --> 00:20:24,630 nekā šodien. 432 00:20:24,630 --> 00:20:27,510 Nebūtu godīgi salīdzināt skaitļus pārāk precīzi. 433 00:20:27,510 --> 00:20:30,720 Mēs patiešām vēlamies ar rokas mājienu tikai iegūt priekšstatu par 434 00:20:30,720 --> 00:20:33,930 to, cik lēns vai ātrs ir algoritms. 435 00:20:33,930 --> 00:20:36,000 Tātad apzīmējums šeit ir apzināts. 436 00:20:36,000 --> 00:20:38,310 Tas burtiski ir lielais O, bieži slīprakstā un tiek dēvēts par lielo 437 00:20:38,310 --> 00:20:40,620 O. 438 00:20:40,620 --> 00:20:43,920 Tātad pirmais algoritms ir lielajā O no n. 439 00:20:43,920 --> 00:20:47,760 Otrais algoritms ir lielajā O no n, kas dalīts ar 2. 440 00:20:47,760 --> 00:20:51,480 Trešais algoritms ir lielajā O no log bāzes 2 no n. 441 00:20:51,480 --> 00:20:54,690 Bet pat tā ir sava veida nevajadzīga detaļa. 442 00:20:54,690 --> 00:20:57,960 Lietojot lielo O apzīmējumu, jums tiešām ir vienalga, redzēsim, 443 00:20:57,960 --> 00:21:01,230 mazākie pasūtījuma nosacījumi. 444 00:21:01,230 --> 00:21:04,500 Mēs nerūpēsimies par dalītu ar 2, jo jūs zināt ko? 445 00:21:04,500 --> 00:21:07,720 Šo algoritmu forma ir gandrīz vienāda. 446 00:21:07,720 --> 00:21:11,340 Un patiešām ideja — pats algoritms būtībā ir tāds pats. 447 00:21:11,340 --> 00:21:13,620 Vienu lapu vietā es daru divas. 448 00:21:13,620 --> 00:21:16,441 Bet, ja jūs man izmetat miljoniem lapu, miljardiem lappušu, šie 449 00:21:16,441 --> 00:21:19,263 algoritmi patiešām darbosies tāpat kā n kļūst ļoti liels, virzās uz 450 00:21:19,263 --> 00:21:22,085 bezgalību. 451 00:21:22,085 --> 00:21:23,585 Un tas pats attiecas uz logaritmiem. 452 00:21:23,585 --> 00:21:25,948 Pat ja esat nedaudz sarūsējis, izrādās, ka neatkarīgi no tā, vai 453 00:21:25,948 --> 00:21:28,312 veicat aprēķinu ar baļķa bāzi 2, baļķu bāzi 3, baļķa pamatni 10, 454 00:21:28,312 --> 00:21:30,676 varat vienkārši reizināt vienu ar otru, lai patiešām iegūtu to pašu 455 00:21:30,676 --> 00:21:33,040 formulu. 456 00:21:33,040 --> 00:21:36,155 Tas nozīmē tikai teikt, ka datorzinātnieks parasti teiktu, ka pirmie 457 00:21:36,155 --> 00:21:39,270 divi algoritmi ir n soļu secībā. 458 00:21:39,270 --> 00:21:42,690 Trešais algoritms ir log n soļu secībā. 459 00:21:42,690 --> 00:21:46,350 Un mums nav īsti vienalga, ko mēs domājam ārpus tā. 460 00:21:46,350 --> 00:21:48,060 Un šis lielais O apzīmējums, kā mēs redzēsim, un patiesībā ļaujiet 461 00:21:48,060 --> 00:21:49,770 man tālināt. 462 00:21:49,770 --> 00:21:53,375 Ja varat iedomāties, ka pēkšņi padarīsit x asi daudz garāku — tātad 463 00:21:53,375 --> 00:21:56,980 vairāk lappušu ekrānā vienlaikus —, patiešām svarīgas būs šo līkņu 464 00:21:56,980 --> 00:22:00,585 formas, jo iztēlojieties, kā tālināt, tālummaināt. tālināt, tālināt, 465 00:22:00,585 --> 00:22:04,190 tālināt, un, tā kā n kļūst daudz, daudz, daudz lielāks uz x ass, 466 00:22:04,190 --> 00:22:07,795 sarkanā un dzeltenā līnija būtībā izskatīsies vienādi, tiklīdz n ir 467 00:22:07,795 --> 00:22:11,400 pietiekami liela. 468 00:22:11,400 --> 00:22:14,378 Bet zaļā līnija nekad neizskatīsies tāpat. 469 00:22:14,378 --> 00:22:16,420 Tā būs principiāli atšķirīga forma. 470 00:22:16,420 --> 00:22:19,810 Un tā ir lielā O intuīcija, lai gūtu priekšstatu par šādiem 471 00:22:19,810 --> 00:22:23,200 veiktspējas rādītājiem. 472 00:22:23,200 --> 00:22:25,410 Tātad šeit ir lielais O. 473 00:22:23,200 --> 00:22:27,845 Šeit, iespējams, ir izplatīta formula, ko datorzinātnieks, noteikti 474 00:22:27,845 --> 00:22:32,490 ievada kontekstā, varētu izmantot, analizējot algoritmus. 475 00:22:32,490 --> 00:22:35,765 Un uz brīdi apsvērsim, kurš no mūsu pirmajiem diviem algoritmiem — 476 00:22:35,765 --> 00:22:39,040 lineārā meklēšana un binārā meklēšana — ietilpst šajās kategorijās. 477 00:22:39,040 --> 00:22:44,318 Tāpēc es tos sakārtoju no lēnākā uz ātrāko, tāpēc secība n kvadrātā. 478 00:22:44,318 --> 00:22:46,355 Mēs to vēl neesam redzējuši, taču tas mēdz būt lēns, jo tas ir 479 00:22:46,355 --> 00:22:48,392 kvadrātisks. 480 00:22:48,392 --> 00:22:49,350 Jūs darāt n reizes n. 481 00:22:49,350 --> 00:22:51,090 Tam ir jāsaskaita daudzas darbības. 482 00:22:51,090 --> 00:22:53,190 Labāk šodien būs n log n. 483 00:22:53,190 --> 00:22:54,630 Vēl labāk būs n. 484 00:22:54,630 --> 00:22:56,190 Pat labāk par to ir log n. 485 00:22:56,190 --> 00:23:00,193 Un vislabākā ir tā sauktā secība 1, piemēram, viens solis vai varbūt 486 00:23:00,193 --> 00:23:04,196 divi soļi, varbūt pat 1000 soļi, bet fiksēts, ierobežots soļu skaits, 487 00:23:04,196 --> 00:23:08,200 kas nekad nemainās neatkarīgi no tā, cik liels ir n. 488 00:23:08,200 --> 00:23:10,885 Tāpēc, ņemot vērā šo diagrammu, lai būtu skaidrs, lineāra meklēšana — 489 00:23:10,885 --> 00:23:13,570 apsvērsim sliktāko gadījumu. 490 00:23:13,570 --> 00:23:16,880 Sliktākajā gadījumā, cik soļu bija jāveic kādam, piemēram, 491 00:23:16,880 --> 00:23:20,190 Stefānijai, lai atrastu problēmas risinājumu, pieņemot, ka ir nevis 492 00:23:20,190 --> 00:23:23,500 septiņas durvis, bet gan n durvis? 493 00:23:23,500 --> 00:23:25,160 Jā? 494 00:23:25,160 --> 00:23:26,540 Tātad pēc n. 495 00:23:26,540 --> 00:23:28,280 Un šajā gadījumā tas ir tieši n. 496 00:23:28,280 --> 00:23:30,905 Bet ziniet ko, iespējams, ka tas ir 2n, jo Stefānijai tas prasīja 497 00:23:30,905 --> 00:23:33,530 pāris soļus. 498 00:23:33,530 --> 00:23:34,460 Viņai vajadzēja pacelt fiksatoru. 499 00:23:34,460 --> 00:23:35,360 Viņai bija jāatver durvis. 500 00:23:35,360 --> 00:23:36,318 Varbūt tas ir trīs soļi. 501 00:23:36,318 --> 00:23:37,530 Viņai bija jāuzrāda nauda. 502 00:23:37,530 --> 00:23:39,170 Tātad tagad ir 3n, 2n. 503 00:23:39,170 --> 00:23:41,990 Bet mums nerūp šis precizitātes līmenis. 504 00:23:41,990 --> 00:23:45,660 Mēs patiešām rūpējamies tikai par fundamentālo operāciju skaitu. 505 00:23:45,660 --> 00:23:47,540 Tāpēc mēs teiksim jā, pēc kārtas n. 506 00:23:47,540 --> 00:23:51,320 Tā varētu būt augšējā robeža, mēs to sauksim par lineāro meklēšanu. 507 00:23:51,320 --> 00:23:53,030 Un kā ar bināro meklēšanu? 508 00:23:53,030 --> 00:23:57,970 Džeksona gadījumā vai vispār es 0. nedēļā, ja ir n durvis, cik soļus 509 00:23:57,970 --> 00:24:02,910 vajadzēja Džeksonam vai man, izmantojot bināro meklēšanu? 510 00:24:02,910 --> 00:24:04,860 Šajā gadījumā tie bija burtiski trīs. 511 00:24:04,860 --> 00:24:07,200 Bet tā nav formula. 512 00:24:07,200 --> 00:24:09,690 Jā, tātad tas ir žurnāla n secībā. 513 00:24:09,690 --> 00:24:11,970 Un patiešām, ja ir septiņas durvis, tas ir gandrīz astoņas, ja jūs 514 00:24:11,970 --> 00:24:14,250 tikai nedaudz noapaļojat. 515 00:24:14,250 --> 00:24:18,480 Patiešām, ja ņemat baļķu bāzi 2 no 8, tas faktiski dod mums 3. 516 00:24:18,480 --> 00:24:19,813 Tātad matemātika faktiski tiek pārbaudīta. 517 00:24:19,813 --> 00:24:22,272 Un, ja jūs neesat apmierināts ar logaritmiem, nekas. 518 00:24:22,272 --> 00:24:23,670 Vienkārši padomājiet par to intuitīvi. 519 00:24:23,670 --> 00:24:27,010 2. bāzes logaritms tikai atkal un atkal kaut ko sadala. 520 00:24:27,010 --> 00:24:31,370 Tātad šajā diagrammā, ja mēs uzskatām lielo O, kas ir skaidrs, tas 521 00:24:31,370 --> 00:24:35,730 ļauj aprakstīt algoritma darbības laika secību — piemēram, tā 522 00:24:35,730 --> 00:24:40,090 lielumu —, bet tas arī apraksta, precīzāk, augšējo robežu. 523 00:24:40,090 --> 00:24:43,150 Tātad, piemēram, sliktākajā gadījumā šie ir diezgan labi rādītāji, 524 00:24:43,150 --> 00:24:46,210 kas parāda, cik labi – vai drīzāk, cik slikti – varētu būt lineārā 525 00:24:46,210 --> 00:24:49,270 meklēšana un binārā meklēšana. 526 00:24:49,270 --> 00:24:49,770 Kāpēc? 527 00:24:49,770 --> 00:24:52,425 Pieņemsim, ka meklējat 1000 lappušu tālruņu grāmatā un personas vārds 528 00:24:52,425 --> 00:24:55,080 sākas ar Z. 529 00:24:55,080 --> 00:24:56,320 Algoritms joprojām būs n soļu secībā. 530 00:24:56,320 --> 00:24:56,820 Kāpēc? 531 00:24:56,820 --> 00:25:01,080 Jo, lai to atrastu, var būt jāveic tikpat daudz kā visas n darbības. 532 00:25:01,080 --> 00:25:05,250 Tagad tas ne vienmēr notiks praksē. 533 00:25:05,250 --> 00:25:08,893 Ja es izmantoju lielo O kā augšējo robežu, būtu jauki, ja būtu 534 00:25:08,893 --> 00:25:12,536 atbilstoša apakšējā robeža, it īpaši, ja vēlaties ņemt vērā ne tikai 535 00:25:12,536 --> 00:25:16,180 sliktākos, bet varbūt arī labākos gadījumus. 536 00:25:16,180 --> 00:25:18,040 Tātad, ko mēs šeit varētu izmantot? 537 00:25:18,040 --> 00:25:20,200 Nu, tas ir lielais Grieķijas omega simbols. 538 00:25:20,200 --> 00:25:23,036 Tātad omega ir simbols, ko datorzinātnieks parasti izmanto, lai 539 00:25:23,036 --> 00:25:25,873 aprakstītu algoritma zemāko robežu, bieži vien labākā gadījuma 540 00:25:25,873 --> 00:25:28,710 kontekstā, lai gan ne obligāti. 541 00:25:28,710 --> 00:25:32,490 Tātad apakšējā robeža nozīmē, cik maz soļu var veikt algoritms? 542 00:25:32,490 --> 00:25:33,990 Un arī šeit tās pašas formulas. 543 00:25:33,990 --> 00:25:36,270 Un mēs laika gaitā aizpildīsim šīs tukšās vietas. 544 00:25:36,270 --> 00:25:38,820 Daži algoritmi vienmēr var veikt vismaz n soļus kvadrātā vai n soļu 545 00:25:38,820 --> 00:25:41,370 secībā. 546 00:25:41,370 --> 00:25:45,660 Dažiem var būt tikai n log n vai n, vai log n, vai 1. 547 00:25:45,660 --> 00:25:49,320 Tātad kaut kas līdzīgs lineārajiem meklējumiem — kad Stefānija sāka 548 00:25:49,320 --> 00:25:52,980 ar lineāro meklēšanu, viņai šoreiz uz skatuves nepaveicās. 549 00:25:52,980 --> 00:25:55,350 Bet kā būtu, ja viņa būtu darījusi, un pirmās durvis, ko viņa atvēra, 550 00:25:55,350 --> 00:25:57,720 būtu 50? 551 00:25:57,720 --> 00:26:03,005 Kā jūs varētu aprakstīt lineārās meklēšanas apakšējo robežu šajā tā 552 00:26:03,005 --> 00:26:08,290 dēvētajā labākajā gadījumā, izmantojot šo iespējamo atbilžu sarakstu? 553 00:26:08,290 --> 00:26:09,530 Jā? 554 00:26:09,530 --> 00:26:11,060 Jā, tātad omega no 1. 555 00:26:11,060 --> 00:26:15,025 Tāpēc labākajā gadījumā apakšējā robeža, cik soļus var veikt lineārai 556 00:26:15,025 --> 00:26:18,990 meklēšanai, lai kaut ko atrastu, varētu būt tikai viens solis. 557 00:26:18,990 --> 00:26:19,490 Kāpēc? 558 00:26:19,490 --> 00:26:23,270 Jo varbūt, ja Stefānijai būtu paveicies un mēs būtu aizpildījuši šos 559 00:26:23,270 --> 00:26:27,050 skapīšus ar numuriem citā secībā, lai viņa varētu būt atvērusi pirmo 560 00:26:27,050 --> 00:26:30,830 skapīti, un var, skaitlis 50 varētu būt tur, tāpēc zemākā robeža, 561 00:26:30,830 --> 00:26:34,610 iespējams, varētu būt omega. no 1 lineārajai meklēšanai. 562 00:26:34,610 --> 00:26:35,990 Un kā tagad ar Džeksonu? 563 00:26:35,990 --> 00:26:37,440 Viņš izmantoja bināro meklēšanu. 564 00:26:37,440 --> 00:26:40,940 Tāpēc viņš ienira problēmas vidū. 565 00:26:40,940 --> 00:26:42,980 Bet kāda būtu zemākā robeža binārajai meklēšanai, izmantojot šo 566 00:26:42,980 --> 00:26:45,020 loģiku? 567 00:26:45,020 --> 00:26:45,980 Jā? 568 00:26:45,980 --> 00:26:47,460 Jā, tātad atkal, omega no 1. 569 00:26:47,460 --> 00:26:47,960 Kāpēc? 570 00:26:47,960 --> 00:26:49,580 Jo varbūt viņam vienkārši paveicas. 571 00:26:49,580 --> 00:26:53,300 Un tiešām, skapīšu vidū varēja būt skaitlis 50. 572 00:26:53,300 --> 00:26:54,060 Tā nebija. 573 00:26:54,060 --> 00:26:57,055 Un tāpēc Džeksona faktiskajā praksē nozīmīgāka būtu bijusi lielā O 574 00:26:57,055 --> 00:27:00,050 diskusija. 575 00:27:00,050 --> 00:27:02,923 Bet lielais O un omega, augšējā un apakšējā robeža ļauj 576 00:27:02,923 --> 00:27:05,796 datorzinātniekam pacīnīties par to, kas varētu notikt sliktākajā 577 00:27:05,796 --> 00:27:08,670 gadījumā, kas var notikt labākajā gadījumā? 578 00:27:08,670 --> 00:27:10,468 Un jūs pat varat iegūt vēl precīzāku, piemēram, vidējo korpusu vai 579 00:27:10,468 --> 00:27:12,267 tamlīdzīgu. 580 00:27:12,267 --> 00:27:15,220 Un tas patiešām ir tas, ko inženieri varētu darīt pie tāfeles 581 00:27:15,220 --> 00:27:18,173 uzņēmumā, universitātē, izstrādājot algoritmu un mēģinot argumentēt, 582 00:27:18,173 --> 00:27:21,126 kāpēc viņu algoritms ir labāks par kādu citu, izmantojot šāda veida 583 00:27:21,126 --> 00:27:24,080 analīzi. 584 00:27:24,080 --> 00:27:28,013 Un, lai jūs to redzētu, izrādās, ka, ja kādam algoritmam ir identiska 585 00:27:28,013 --> 00:27:31,946 augšējā un apakšējā robeža, jūs faktiski varat izmantot arī lielo 586 00:27:31,946 --> 00:27:35,880 grieķu teta. 587 00:27:35,880 --> 00:27:38,210 Un tas ir pēdējais no grieķu simboliem šodien. 588 00:27:38,210 --> 00:27:43,130 Bet grieķu teta norāda uz augšējās un apakšējās robežas sakritību. 589 00:27:43,130 --> 00:27:44,702 Tas ir, tie ir viens un tas pats. 590 00:27:44,702 --> 00:27:46,961 Tas nebija gadījums mūsu diskusijai pirms sekundes par lineāro 591 00:27:46,961 --> 00:27:49,220 meklēšanu, nevis bināro meklēšanu. 592 00:27:49,220 --> 00:27:53,095 Bet jūs varētu izmantot viena veida formulas, ja izrādās, ka jūsu 593 00:27:53,095 --> 00:27:56,970 augšējā un apakšējā robeža ir vienāda. 594 00:27:56,970 --> 00:28:01,094 Piemēram, ja es burtiski saskaitītu visus, kas atrodas šajā telpā — 595 00:28:01,094 --> 00:28:05,219 viens, divi, trīs, četri, pieci, seši un tā tālāk, jūs faktiski 596 00:28:05,219 --> 00:28:09,343 varētu teikt, ka skaitīšana šādā veidā ir n teta, jo labākajā 597 00:28:09,343 --> 00:28:13,468 gadījumā. gadījumā, tas prasīs man n punktus, cilvēkus auditorijā. 598 00:28:13,468 --> 00:28:15,260 Sliktākajā gadījumā tas mani aizvedīs n. 599 00:28:15,260 --> 00:28:18,380 Tas vienmēr prasīs n soļus, ja es vēlos saskaitīt visus istabā. 600 00:28:18,380 --> 00:28:20,930 Jūs nevarat darīt labāk par to, ja vien neizlaižat cilvēkus. 601 00:28:20,930 --> 00:28:26,150 Tas būtu piemērs aprocei kaut kam, kur teta vietā ir ģermāni. 602 00:28:26,150 --> 00:28:30,343 Vai tagad ir kādi jautājumi par lielo O, omega vai teta, kas tagad ir 603 00:28:30,343 --> 00:28:34,536 tikai formālāki rīki rīku komplektā, lai runātu par mūsu algoritmu 604 00:28:34,536 --> 00:28:38,730 dizainu? 605 00:28:38,730 --> 00:28:42,050 Vai ir kādi jautājumi? 606 00:28:42,050 --> 00:28:42,860 Nē? 607 00:28:42,860 --> 00:28:44,720 Neredzot nevienu. 608 00:28:44,720 --> 00:28:45,560 Ak, vai tas ir... jā? 609 00:28:45,560 --> 00:28:46,840 Nē? 610 00:28:46,840 --> 00:28:48,250 Labi, mēs esam labi. 611 00:28:48,250 --> 00:28:50,125 Tātad, iesim uz priekšu un pārtulkosim to, iespējams, par kādu 612 00:28:50,125 --> 00:28:52,000 faktisku kodu. 613 00:28:52,000 --> 00:28:53,900 Ļaujiet man pāriet uz VS Code šeit. 614 00:28:53,900 --> 00:28:57,090 Un paskatīsimies, vai mēs tagad nevaram tulkot dažas no šīm idejām 615 00:28:57,090 --> 00:29:00,280 faktiskā kodā, ne tik daudz izmantojot jaunu sintaksi. 616 00:29:00,280 --> 00:29:01,800 Mēs joprojām darbosimies šajā masīvu pasaulē tāpat kā pagājušajā 617 00:29:01,800 --> 00:29:03,320 nedēļā. 618 00:29:03,320 --> 00:29:06,300 Tāpēc ļaujiet man iet uz priekšu un izveidot programmu ar nosaukumu 619 00:29:06,300 --> 00:29:09,280 search.c, izpildot koda vietu search.c manā terminālī. 620 00:29:09,280 --> 00:29:12,010 Un tad šeit augšā, iesim uz priekšu un iekļaujam mūsu parasto, tāpēc 621 00:29:12,010 --> 00:29:14,740 iekļaujiet cs50.h, lai es varētu saņemt informāciju. 622 00:29:14,740 --> 00:29:18,370 Iekļaujiet standarta io.h, lai es varētu izdrukāt kādu rezultātu. 623 00:29:18,370 --> 00:29:20,755 Mēs izdarīsim int main void, kuras nozīmi mēs sākām ķircināt 624 00:29:20,755 --> 00:29:23,140 pagājušajā nedēļā. 625 00:29:23,140 --> 00:29:24,895 Tas, ka tas šodien atkal ir spēkā neesošs, nozīmē, ka nav 626 00:29:24,895 --> 00:29:26,650 komandrindas argumentu. 627 00:29:26,650 --> 00:29:28,580 Un ļaujiet man iet uz priekšu un darīt to. 628 00:29:28,580 --> 00:29:31,710 Ļaujiet man iet uz priekšu un diskusiju labad paziņot par statisku 629 00:29:31,710 --> 00:29:34,840 masīvu, piemēram, masīvu, kas nekad nemainās. 630 00:29:34,840 --> 00:29:38,065 Un sintakse tam būs dot man masīvu, ko sauc par cipariem, izmantojot 631 00:29:38,065 --> 00:29:41,290 kvadrātiekavās. 632 00:29:41,290 --> 00:29:45,675 Un es tūlīt to inicializēšu uz 20, 500, 10, 5, 100, 1 un 50, kas 633 00:29:45,675 --> 00:29:50,060 atgādina tās pašas nominālvērtības kā iepriekš. 634 00:29:50,060 --> 00:29:52,070 Tātad šī ir nedaudz jauna sintakse, ko mēs, iespējams, neesam 635 00:29:52,070 --> 00:29:54,080 redzējuši. 636 00:29:54,080 --> 00:29:57,846 Un šeit esošās cirtainās lencēs, kas atšķiras no cilpām un cilpām un 637 00:29:57,846 --> 00:30:01,613 funkcijām, vienkārši sakiet kompilatoram, lūdzu, iedodiet man jebkura 638 00:30:01,613 --> 00:30:05,380 izmēra masīvu, kurā ir šie skaitļi no kreisās uz labo pusi. 639 00:30:05,380 --> 00:30:07,800 Es varētu arī izmantot pagājušās nedēļas sintaksi, lai pateiktu kaut 640 00:30:07,800 --> 00:30:10,220 ko līdzīgu šim. 641 00:30:10,220 --> 00:30:13,090 Apskatīsim, 1, 2, 3, 4, 5, 6, 7 nominālvērtības. 642 00:30:13,090 --> 00:30:15,250 Alternatīvi es varētu darīt to. 643 00:30:15,250 --> 00:30:20,410 Un tad es varētu teikt, ka skaitļu iekava 0 ir vienāda ar 20, skaitļu 644 00:30:20,410 --> 00:30:25,570 iekava 1 ir vienāda ar 500. 645 00:30:25,570 --> 00:30:27,572 Un es varētu to darīt vēl piecas reizes. 646 00:30:27,572 --> 00:30:28,780 Tas ir tikai nedaudz garlaicīgi. 647 00:30:28,780 --> 00:30:30,655 Ja jūs zināt skaitļus iepriekš, jums nav jāstāsta sastādītājam, cik 648 00:30:30,655 --> 00:30:32,530 to ir. 649 00:30:32,530 --> 00:30:35,980 Varat vienkārši ļaut tam izdomāt, ka jūsu skaitļi būs 10, 500, 10, 5, 650 00:30:35,980 --> 00:30:39,430 100, 1 un 50. 651 00:30:39,430 --> 00:30:42,550 Tātad, šādi jūs statiski definējat masīvu. 652 00:30:42,550 --> 00:30:45,380 Labi, ļaujiet man vienkārši pajautāt lietotājam numuru. 653 00:30:45,380 --> 00:30:47,700 Mēs to nosauksim par n, izmantojot get_int un pieprasot ievadīt 654 00:30:47,700 --> 00:30:50,020 numuru — tātad nekā jauna. 655 00:30:50,020 --> 00:30:53,680 Un tagad ļaujiet man iet uz priekšu un ieviest lineāro meklēšanu. 656 00:30:53,680 --> 00:30:55,600 Un pseidokodā, kas mums bija šim iepriekš, tika izmantots kāds 657 00:30:55,600 --> 00:30:57,520 masīvam līdzīgs apzīmējums. 658 00:30:57,520 --> 00:30:59,620 Ļaujiet man iet uz priekšu un sākt līdzīgi. 659 00:30:59,620 --> 00:31:01,945 Attiecībā uz int i — un jūs gandrīz vienmēr sākat skaitīt ar i pēc 660 00:31:01,945 --> 00:31:04,270 vienošanās. 661 00:31:04,270 --> 00:31:06,490 Tātad tas, iespējams, ir labs sākumpunkts. 662 00:31:06,490 --> 00:31:09,790 Es to darīšu tik ilgi, kamēr man būs mazāks par 7. 663 00:31:09,790 --> 00:31:12,675 Nav labākais dizains, lai kodētu 7, bet tas ir tikai demonstrācijas 664 00:31:12,675 --> 00:31:15,560 nolūkos, jo es zinu, cik skaitļus es tur ievietoju. 665 00:31:15,560 --> 00:31:16,992 Un tad es dodos uz i++. 666 00:31:16,992 --> 00:31:19,271 Tāpēc tagad man ir cilpas sākums, kas tikai ļaus man atkārtot visu 667 00:31:19,271 --> 00:31:21,550 masīvu. 668 00:31:21,550 --> 00:31:22,760 Un ļaujiet man pajautāt šo. 669 00:31:22,760 --> 00:31:27,236 Ja pašreizējais skaitlis vietā i ir vienāds ar n, kas ir cilvēka 670 00:31:27,236 --> 00:31:31,713 ievadītais skaitlis, tad ejam uz priekšu un darīsim kaut ko 671 00:31:31,713 --> 00:31:36,190 vienkāršu, piemēram, printf, citāts un citāts, atrasts, slīpsvītra n. 672 00:31:36,190 --> 00:31:39,400 Un pēc mūsu diskusijas pagājušajā nedēļā, lai norādītu, ka tas ir 673 00:31:39,400 --> 00:31:42,610 veiksmīgs, es atgriezīšu 0, ja es to atradīšu. 674 00:31:42,610 --> 00:31:45,625 Un, ja es to neatradīšu, es vienkārši došos šeit un pēc noklusējuma 675 00:31:45,625 --> 00:31:48,640 saku, ka nav atrasts, ar slīpsvītru n. 676 00:31:48,640 --> 00:31:52,135 Un tikai konvencijas labad — ak, tikai labam pasākumam katrai 677 00:31:52,135 --> 00:31:55,630 konvencijai es atgriezīšu 1 vai, tiešām, jebkuru vērtību, kas nav 0. 678 00:31:55,630 --> 00:31:57,130 0, atsaukšana, nozīmē panākumus. 679 00:31:57,130 --> 00:31:59,910 Un jebkurš cits vesels skaitlis mēdz nozīmēt sava veida kļūdu, 680 00:31:59,910 --> 00:32:02,690 neatkarīgi no skaitļa, kuru meklēju. 681 00:32:02,690 --> 00:32:06,670 Tātad, lai pārskatītu, vienīgais, kas šeit ir jauns, ir sintakse. 682 00:32:06,670 --> 00:32:09,980 Mēs veidojam septiņu skaitļu masīvu, šos skaitļus. 683 00:32:09,980 --> 00:32:13,035 Un pēc tam mēs šeit patiešām esam izcēluši lineārās meklēšanas 684 00:32:13,035 --> 00:32:16,090 ieviešanu. 685 00:32:16,090 --> 00:32:19,315 Es domāju, ka šī ir C versija, ko Stefānija darīja uz tāfeles, 686 00:32:19,315 --> 00:32:22,540 turpretim tagad masīvu sauc par cipariem, nevis durvīm. 687 00:32:22,540 --> 00:32:25,460 Bet es domāju, ka tas ir gandrīz tas pats. 688 00:32:25,460 --> 00:32:27,920 Ļaujiet man iet uz priekšu, atvērt savu termināļa logu un palaist 689 00:32:27,920 --> 00:32:30,380 veikt meklēšanu. 690 00:32:30,380 --> 00:32:32,518 Šķiet, ka apkopo, ./search. 691 00:32:32,518 --> 00:32:34,310 Un ejam uz priekšu un meklēsim numuru. 692 00:32:34,310 --> 00:32:36,230 Sāksim ar to, ko darījām iepriekš, 50. 693 00:32:36,230 --> 00:32:37,340 Un tas ir atrasts. 694 00:32:37,340 --> 00:32:39,770 Dosimies uz priekšu un palaidīsim to vēlreiz, ./search. 695 00:32:39,770 --> 00:32:42,500 Pameklēsim sākumā varbūt 20. 696 00:32:42,500 --> 00:32:43,670 Tas arī ir atrasts. 697 00:32:43,670 --> 00:32:47,195 Palaidīsim to vēl vienu reizi, meklējot līdzīgus 1000, kas nav starp 698 00:32:47,195 --> 00:32:50,720 nomināliem. 699 00:32:50,720 --> 00:32:52,980 Un tas patiešām nav atrasts. 700 00:32:52,980 --> 00:32:56,140 Tāpēc mēs esam pārņēmuši ideju no 0. nedēļas, kas tagad ir 701 00:32:56,140 --> 00:32:59,300 formalizēta 3. nedēļā, un tagad to pārtulkojām kodā. 702 00:32:59,300 --> 00:33:05,500 Vai jums ir jautājumi par šo lineārās meklēšanas ieviešanu? 703 00:33:05,500 --> 00:33:07,570 Lineārā meklēšana. 704 00:33:07,570 --> 00:33:08,680 Nekas. 705 00:33:08,680 --> 00:33:11,810 Ak, šodien tik veiksmīgi. 706 00:33:11,810 --> 00:33:14,296 Tātad, paskatīsimies, vai mēs nevaram padarīt šo nedaudz 707 00:33:14,296 --> 00:33:16,783 interesantāku un redzēsim, vai mēs nevaram paklupt aiz detaļas, kas 708 00:33:16,783 --> 00:33:19,270 būs svarīgas C. 709 00:33:19,270 --> 00:33:21,300 Un tā vietā, lai veiktu skaitļus, ļaujiet man iet uz priekšu un darīt 710 00:33:21,300 --> 00:33:23,330 to. 711 00:33:23,330 --> 00:33:25,030 Mēs paliksim pie Monopola tēmas. 712 00:33:25,030 --> 00:33:27,730 Un es nokļuvu truša bedrē, lasot Wikipedia rakstu par monopolu. 713 00:33:27,730 --> 00:33:30,735 Un oriģinālie gabali vai žetoni, kas tika piegādāti kopā ar Monopolu, 714 00:33:30,735 --> 00:33:33,740 un izrādās, ka mēs varam attēlot tos ar stīgām. 715 00:33:33,740 --> 00:33:36,455 Tāpēc es izveidošu masīvu, ko sauc par virknēm, daudzskaitlī, 716 00:33:36,455 --> 00:33:39,170 neatkarīgi no šeit norādītā izmēra. 717 00:33:39,170 --> 00:33:44,346 Un pašas pirmās monopola daļas tajā laikā bija kaujas kuģis, ar kuru 718 00:33:44,346 --> 00:33:49,523 varēja spēlēt, zābaks, lielgabals, gludeklis, uzpirkste un cilindrs, 719 00:33:49,523 --> 00:33:54,700 no kuriem daži mūsdienās varētu būt no spēles. 720 00:33:54,700 --> 00:33:57,890 Izrādās, viņi tos ir mainījuši — nebija ne jausmas — gadu gaitā. 721 00:33:57,890 --> 00:34:00,170 Tātad, tagad ir virkņu masīvs. 722 00:34:00,170 --> 00:34:02,055 Ļaujiet man iet uz priekšu un piedāvāt lietotājam tagad, nevis veselu 723 00:34:02,055 --> 00:34:03,940 skaitli. 724 00:34:03,940 --> 00:34:05,955 Es tagad vēlos meklēt kādu no šīm virknēm, joprojām izmantojot 725 00:34:05,955 --> 00:34:07,970 lineāro meklēšanu. 726 00:34:07,970 --> 00:34:10,905 Tāpēc ļaujiet man izveidot virkni s, iestatiet to vienādu ar 727 00:34:10,905 --> 00:34:13,840 get_string, pamudiniet lietotāju meklēt virkni. 728 00:34:13,840 --> 00:34:16,690 Un tad es domāju, ka mans kods šeit ir gandrīz vienāds, izņemot vienu 729 00:34:16,690 --> 00:34:19,540 detaļu. 730 00:34:19,540 --> 00:34:21,850 Tagad man ir masīvs, ko sauc par virknēm. 731 00:34:21,850 --> 00:34:24,040 Man tagad ir mainīgais ar nosaukumu s. 732 00:34:24,040 --> 00:34:27,535 Taču izrādās, ka šo koda rindiņu nedarbosies iemeslu dēļ, kurus 733 00:34:27,535 --> 00:34:31,030 nākamnedēļ izpētīsim sīkāk. 734 00:34:31,030 --> 00:34:33,955 Un izrādās, ka iemesls ir saistīts ar to, ko mēs pagājušajā nedēļā 735 00:34:33,955 --> 00:34:36,880 apspriedām par to, kas īsti ir virkne. 736 00:34:36,880 --> 00:34:39,355 Un kas atkal ir virkne? 737 00:34:39,355 --> 00:34:41,000 Virkne ir masīvs. 738 00:34:41,000 --> 00:34:46,474 Tomēr izrādās, ka vienāds ar vienāds nevarēs dāsni salīdzināt visas 739 00:34:46,474 --> 00:34:51,949 masīvā esošās rakstzīmes tikai tāpēc, ka izmantojat vienlīdzīgus. 740 00:34:51,949 --> 00:34:54,650 Izrādās, ka nesalīdzinās katru burtu. 741 00:34:54,650 --> 00:34:58,854 Par laimi, virkņu bibliotēkā, ko ieviesām pagājušajā nedēļā, ir šīs 742 00:34:58,854 --> 00:35:03,058 problēmas risinājums. 743 00:35:03,058 --> 00:35:05,850 Problēmas iemeslu mēs sīkāk izpētīsim nākamnedēļ. 744 00:35:05,850 --> 00:35:09,126 Bet pagaidām ziniet, ka, ja vēlaties salīdzināt virknes C — it īpaši, 745 00:35:09,126 --> 00:35:12,403 ja esat ienācis klasē, zinot mazliet Java vai Python vai kādu citu 746 00:35:12,403 --> 00:35:15,680 valodu, jūs nevarat izmantot vienlīdzību vienāds. 747 00:35:15,680 --> 00:35:18,500 Pat ja jūs varētu izmantot Scratch, jūs nevarat izmantot C. 748 00:35:18,500 --> 00:35:21,620 Tātad tas, kas man šeit ir jādara, ir šis. 749 00:35:21,620 --> 00:35:26,430 Man ir jāuzdod jautājums, vai funkcijas str salīdzināt vai strcomp 750 00:35:26,430 --> 00:35:31,240 atgriešanas vērtība ir vienāda ar 0, kad tā tiek nodota pašreizējā 751 00:35:31,240 --> 00:35:36,050 virknē, un tā ir lietotāja ievade? 752 00:35:36,050 --> 00:35:38,866 Tātad, ja izlasīsit šīs funkcijas, ko sauc par str salīdzināt, 753 00:35:38,866 --> 00:35:41,683 dokumentāciju, redzēsit, ka tai ir vajadzīgas divas virknes kā 754 00:35:41,683 --> 00:35:44,500 ievade, pirmā un otrā. 755 00:35:44,500 --> 00:35:46,970 Pēc tam kāds pirms vairākiem gadu desmitiem uzrakstīja kodu, kurā, 756 00:35:46,970 --> 00:35:49,440 iespējams, tiek izmantota cilpa for vai cilpa, lai salīdzinātu katru 757 00:35:49,440 --> 00:35:51,910 rakstzīmi katrā no šīm virknēm. 758 00:35:51,910 --> 00:35:56,290 Un izrādās, ka tas atgriež 0, ja tie faktiski ir vienādi. 759 00:35:56,290 --> 00:35:59,365 Izrādās, arī citās situācijās tas atgriezīs pozitīvu skaitli vai 760 00:35:59,365 --> 00:36:02,440 negatīvu skaitli. 761 00:36:02,440 --> 00:36:06,625 Vai ir kāda intuīcija, kāpēc varētu būt noderīgi izmantot funkciju, 762 00:36:06,625 --> 00:36:10,810 kas ļauj pārbaudīt, vai divas virknes ir vienādas? 763 00:36:10,810 --> 00:36:12,820 Ja tie nav vienādi, kas vēl varētu būt interesanti uzzināt, 764 00:36:12,820 --> 00:36:14,830 salīdzinot divas virknes? 765 00:36:18,474 --> 00:36:19,391 Ja noteiktas vērtības ir? 766 00:36:19,391 --> 00:36:23,347 STUDENTS: [NEdzirdams] 767 00:36:23,347 --> 00:36:24,430 DEIVIDS MALANS: Labi, iespējams. 768 00:36:24,430 --> 00:36:26,950 Varbūt vēlaties uzzināt, cik viņi ir līdzīgi. 769 00:36:26,950 --> 00:36:28,810 Un tas patiešām ir algoritms pats par sevi. 770 00:36:28,810 --> 00:36:31,410 Bet str salīdzināt ir nedaudz vienkāršāk nekā tas. 771 00:36:31,410 --> 00:36:33,040 STUDENTS: [NEdzirdams] 772 00:36:35,850 --> 00:36:37,883 DEIVIDS MALANS: Tieši tā, ja jūs mēģināt sakārtot visu virkņu 773 00:36:37,883 --> 00:36:39,916 sarakstu alfabēta secībā, tāpat kā tālrunis, iespējams, ir paredzēts 774 00:36:39,916 --> 00:36:41,950 jūsu kontaktpersonām vai adrešu grāmatai. 775 00:36:41,950 --> 00:36:45,900 Izrādās, ka str salīdzināt faktiski atgriezīs pozitīvu skaitli vai 776 00:36:45,900 --> 00:36:49,850 negatīvu skaitli vai 0, pamatojoties uz to, vai tas vispirms ir 777 00:36:49,850 --> 00:36:53,800 alfabēta secībā vai vēlāk, vai faktiski vienāds. 778 00:36:53,800 --> 00:36:55,130 Tātad tā var būt noderīga lieta. 779 00:36:55,130 --> 00:36:57,005 Un tas ir tikai teaser zemāka līmeņa skaidrojumam, ko mēs redzēsim 780 00:36:57,005 --> 00:36:58,880 nākamnedēļ. 781 00:36:58,880 --> 00:37:00,315 Tāpēc tagad ļaujiet man šķērsot pirkstus un redzēt, vai es sapratu 782 00:37:00,315 --> 00:37:01,750 pareizi. 783 00:37:01,750 --> 00:37:05,410 Ļaujiet man iet uz priekšu un veikt meklēšanu. 784 00:37:05,410 --> 00:37:08,590 Kompilēja, lai gan lēni. 785 00:37:08,590 --> 00:37:10,255 Meklējiet ar punktu ar slīpsvītru un meklēsim kaut ko līdzīgu 786 00:37:10,255 --> 00:37:11,920 uzpirkstenei. 787 00:37:11,920 --> 00:37:14,048 Un mēs redzam, ka tas patiešām ir atrasts. 788 00:37:14,048 --> 00:37:16,554 Citādi meklēsim kaut ko tādu, kā es zinu, ka tur nav, piemēram, 789 00:37:16,554 --> 00:37:19,060 sacīkšu mašīnu, kas tur bija, kad es uzaugu. 790 00:37:19,060 --> 00:37:23,227 Bet nu, segmentācijas vaina, kodols izmests. 791 00:37:23,227 --> 00:37:25,810 Un patiesībā daži no jums jau iepriekš ir paklupuši šo kļūdu. 792 00:37:25,810 --> 00:37:27,220 Vai kāds vēlas atzīties, ka to redzējis? 793 00:37:27,220 --> 00:37:29,695 Tātad, jā, ne tas, par ko mēs esam runājuši, un, godīgi sakot, ne 794 00:37:29,695 --> 00:37:32,170 tas, ko es tikko gribēju. 795 00:37:32,170 --> 00:37:34,450 Bet arī to redzēsim nākamnedēļ. 796 00:37:34,450 --> 00:37:39,920 Jebkura intuīcija, kāpēc mana programma tikko sabojājās. 797 00:37:39,920 --> 00:37:41,900 Loģiku īsti nemainīju. 798 00:37:41,900 --> 00:37:43,550 Tā joprojām ir lineāra meklēšana. 799 00:37:43,550 --> 00:37:46,280 Ļaujiet man paslēpt termināli, lai jūs varētu redzēt visu kodu uzreiz. 800 00:37:46,280 --> 00:37:48,065 Vienīgais, ko es izdarīju, bija pārslēgšana no veseliem skaitļiem uz 801 00:37:48,065 --> 00:37:49,850 virknēm. 802 00:37:49,850 --> 00:37:52,310 Un es pārgāju uz str salīdzināt šeit. 803 00:37:52,310 --> 00:37:54,205 Bet notika segmentācijas kļūda. 804 00:37:54,205 --> 00:37:57,080 Interesanti, ka tas kaut kā ir saistīts ar datora atmiņu. 805 00:37:57,080 --> 00:37:57,996 Jā. 806 00:37:57,996 --> 00:38:00,690 STUDENTS: [NEdzirdams] 807 00:38:01,470 --> 00:38:03,670 DEIVIDS MALANS: Jā, un tas ir smalks, bet precīzs. 808 00:38:03,670 --> 00:38:06,716 Tātad šajā masīvā kopā ir viens, divi, trīs, četri, pieci, seši 809 00:38:06,716 --> 00:38:09,763 elementi, salīdzinot ar septiņiem monopola nominālvērtību skaitļiem, 810 00:38:09,763 --> 00:38:12,810 kas mums bija iepriekš. 811 00:38:12,810 --> 00:38:13,888 Un šī ir vieta, redzi? 812 00:38:13,888 --> 00:38:15,930 Sava veida gadījums, tas atgriezās man iekost. 813 00:38:15,930 --> 00:38:19,490 Fakts, ka es iekodēju šo vērtību, nevis varbūt atdalīju to kā 814 00:38:19,490 --> 00:38:23,050 konstanti vai deklarēju augstāku, kaut kā mani satrauca, jo tagad es 815 00:38:23,050 --> 00:38:26,610 atkārtoju 6. izmēra masīvu. 816 00:38:26,610 --> 00:38:29,430 Bet skaidrs, ka es eju vienu soli par tālu, jo es burtiski atkārtošu 817 00:38:29,430 --> 00:38:32,250 septiņas, nevis sešas reizes. 818 00:38:32,250 --> 00:38:35,580 Tāpēc šķiet, ka es skatos uz atmiņu, kas ir šeit. 819 00:38:35,580 --> 00:38:37,530 Un tiešām, nākamnedēļ mēs koncentrēsimies uz atmiņu. 820 00:38:37,530 --> 00:38:38,860 Un tā ir tikai slikta lieta. 821 00:38:38,860 --> 00:38:41,666 Tātad izredzes ir tādas, ka pat neredzot jūsu šīs pagājušās nedēļas 822 00:38:41,666 --> 00:38:44,473 kodu, ja kādam no jums ir bijušas segmentācijas kļūdas, iespējams, 823 00:38:44,473 --> 00:38:47,280 jūs aizskārāt atmiņu, kurai jums nevajadzētu būt. 824 00:38:47,280 --> 00:38:49,290 Jūs, iespējams, cilpājāt pārāk daudz reižu. 825 00:38:49,290 --> 00:38:52,770 Iespējams, esat izmantojis negatīvu skaitli, lai iekļūtu masīvā. 826 00:38:52,770 --> 00:38:55,220 Kopumā jūs aizskārāt atmiņu, kurai jums nevajadzētu būt. 827 00:38:55,220 --> 00:38:57,720 Un jūs pieskārāties atmiņas segmentam, kam jums nevajadzētu būt. 828 00:38:57,720 --> 00:39:00,060 Tomēr labojums, vismaz manā gadījumā, ir vienkāršs. 829 00:39:00,060 --> 00:39:01,300 Vienkārši nedari tā. 830 00:39:01,300 --> 00:39:03,210 Tāpēc ļaujiet man to pārkompilēt. 831 00:39:03,210 --> 00:39:06,870 Veiciet meklēšanu ar slīpsvītru. 832 00:39:06,870 --> 00:39:10,320 Un es atkal meklēšu sacīkšu automašīnu, Enter. 833 00:39:10,320 --> 00:39:11,850 Un tagad tas nesakrīt. 834 00:39:11,850 --> 00:39:13,630 Bet tas man saka, ka tas nav atrasts. 835 00:39:13,630 --> 00:39:15,335 Tik smalks, bet kaut kas tāds, aiz kura jūs, iespējams, jau esat 836 00:39:15,335 --> 00:39:17,040 paklupis. 837 00:39:17,040 --> 00:39:23,190 Tad jautājumi par to, ko es tikko izdarīju, tīši vai citādi. 838 00:39:23,190 --> 00:39:24,423 Jā, priekšā. 839 00:39:24,423 --> 00:39:27,849 STUDENTS: Viena lieta ir tāda, ka programma joprojām darbojas, ja 840 00:39:27,849 --> 00:39:31,275 atgriežat — ja neatgriežat 0, atgrieziet 1. 841 00:39:31,275 --> 00:39:33,220 darīt [NEdzirdams]? 842 00:39:33,220 --> 00:39:34,720 DEIVIDS MALANS: Tiešām labs jautājums. 843 00:39:34,720 --> 00:39:38,920 Tātad programma joprojām darbosies, pat ja es neatgriezīšu 0 vai 1. 844 00:39:38,920 --> 00:39:41,425 Patiesībā ļaujiet man to darīt un uz sekundi paslēpt savu termināļa 845 00:39:41,425 --> 00:39:43,930 logu. 846 00:39:43,930 --> 00:39:48,040 Atbrīvosimies no atdeves šeit. 847 00:39:48,040 --> 00:39:50,810 Tomēr skatieties, kas šeit notiek. 848 00:39:50,810 --> 00:39:53,710 Ļaujiet man to pārkompilēt, veikt meklēšanu. 849 00:39:53,710 --> 00:39:55,610 Ļaujiet man ritināt manu kodu šeit. 850 00:39:55,610 --> 00:39:57,560 Ļaujiet man turpināt meklēšanu ar slīpsvītru. 851 00:39:57,560 --> 00:40:00,180 Un ļaujiet man iet uz priekšu un meklēt pirmo lietu sarakstā, kaujas 852 00:40:00,180 --> 00:40:02,800 kuģi, tāpēc es zinu, ka tas ir jāatrod. 853 00:40:02,800 --> 00:40:04,690 Nospiedu Enter. 854 00:40:04,690 --> 00:40:05,858 Huh, interesanti. 855 00:40:05,858 --> 00:40:07,150 Tātad teikts, ka atrasts nav atrasts. 856 00:40:07,150 --> 00:40:11,496 Bet vai jūs saprotat, kāpēc, loģiski, šajā gadījumā? 857 00:40:11,496 --> 00:40:12,980 STUDENTS: Vai cilpa joprojām darbojas? 858 00:40:12,980 --> 00:40:13,910 DEIVIDS MALANS: Tieši tā. 859 00:40:13,910 --> 00:40:15,302 Tātad cilpa joprojām darbojas. 860 00:40:15,302 --> 00:40:17,010 Tāpēc šim jautājumam ir daži risinājumi. 861 00:40:17,010 --> 00:40:21,080 Es, piemēram, varētu kaut kā izlauzties no koda šeit. 862 00:40:21,080 --> 00:40:24,200 Bet tas joprojām izraisīs 18. rindas izpildi. 863 00:40:24,200 --> 00:40:26,600 Tā vietā es varētu vienkārši atgriezties šeit. 864 00:40:26,600 --> 00:40:29,390 Man nav noteikti jāatgriež 1 apakšā. 865 00:40:29,390 --> 00:40:31,867 Taču pagājušajā nedēļā es izteicu šo apgalvojumu, ka tas mēdz būt 866 00:40:31,867 --> 00:40:34,345 noderīgi, jo jūsu programmas kļūst arvien sarežģītākas, lai vismaz 867 00:40:34,345 --> 00:40:36,822 norādītu, gluži kā īsts programmētājs, kļūdu kodus, ja kaut kas noiet 868 00:40:36,822 --> 00:40:39,300 greizi. 869 00:40:39,300 --> 00:40:41,695 Tātad 0 atgriešana galvenajā ir vienkāršākais veids, kā norādīt, ka 870 00:40:41,695 --> 00:40:44,090 mans kods ir pabeigts. 871 00:40:44,090 --> 00:40:46,340 Esmu gatavs veiksmīgi iziet, tas arī viss. 872 00:40:46,340 --> 00:40:50,280 Bet šeit es noteikti varētu atgriezt 0, jo tas nav liels darījums. 873 00:40:50,280 --> 00:40:52,740 Tā patiesībā nav kļūda, kas būtu pelnījusi kaitināt lietotāju ar kaut 874 00:40:52,740 --> 00:40:55,200 kādu uznirstošo logu, ka kaut kas nogāja greizi. 875 00:40:55,200 --> 00:40:57,765 Bet atgriešanās 1 ir tikai zemāka līmeņa signalizācijas veids, eh, tā 876 00:40:57,765 --> 00:41:00,330 īsti neatrada to, ko meklēju. 877 00:41:00,330 --> 00:41:03,510 Un atcerieties, ka no pagājušās nedēļas jūs to varat redzēt šādi. 878 00:41:03,510 --> 00:41:05,785 Ja es to vēlreiz kompilēju, tagad, kad esmu atsaucis šīs izmaiņas, 879 00:41:05,785 --> 00:41:08,060 veiciet meklēšanu. 880 00:41:08,060 --> 00:41:10,992 Un, ja es veicu punktveida slīpsvītras meklēšanu un meklēju kaujas 881 00:41:10,992 --> 00:41:13,925 kuģi, kas patiešām ir atrasts, atcerieties, ka es varu izpildīt šo 882 00:41:13,925 --> 00:41:16,857 maģisko komandu, atbalss dolāra zīmes jautājuma zīmi, kuru jūs bieži 883 00:41:16,857 --> 00:41:19,790 neizpildīsit. 884 00:41:19,790 --> 00:41:22,790 Bet tas parāda, kas galvenais atgriezās. 885 00:41:22,790 --> 00:41:25,910 Ja es vēlreiz palaistu meklēšanu un meklēju sacīkšu automašīnu, kas 886 00:41:25,910 --> 00:41:29,030 nav atrasta, es redzu, ka nav atrasta, bet es varu arī palaist šo 887 00:41:29,030 --> 00:41:32,150 komandu vēlreiz un redzēt, ka, ak, tā atgrieza 1. 888 00:41:32,150 --> 00:41:34,800 Tāpēc tagad, ja jūs pārsteidzat dažus mēnešus, dažus gadus, kad 889 00:41:34,800 --> 00:41:37,450 faktiski rakstāt kodu uzņēmumā vai lielākiem projektiem, iespējams, 890 00:41:37,450 --> 00:41:40,100 vēlēsities automatizēt programmatūru. 891 00:41:40,100 --> 00:41:43,100 Jūs, iespējams, nevēlaties, lai cilvēks to obligāti palaistu manuāli. 892 00:41:43,100 --> 00:41:45,730 Jūs varētu vēlēties, lai kods tiktu automatizēts ar kādu nakts 893 00:41:45,730 --> 00:41:48,360 procesu vai kaut ko tamlīdzīgu. 894 00:41:48,360 --> 00:41:52,135 Izmantojot šos izejas kodus, programma var noteikt jā vai nē, ka cits 895 00:41:52,135 --> 00:41:55,910 kods ir izdevies vai neizdevās. 896 00:41:55,910 --> 00:42:01,850 Citi jautājumi par lineāro meklēšanu šādā veidā. 897 00:42:01,850 --> 00:42:02,350 Nē? 898 00:42:02,350 --> 00:42:06,970 Labi, labi, pārtulkosim to par vienu citu C iezīmi, tagad iekļaujot 899 00:42:06,970 --> 00:42:11,590 šīs divas idejas vienā citā programmā. 900 00:42:11,590 --> 00:42:14,097 Tāpēc es izveidošu tālruņu grāmatu programmā C, veicot koda telpas 901 00:42:14,097 --> 00:42:16,605 tālruņu grāmatas punktu C. 902 00:42:16,605 --> 00:42:19,817 Apvienosim dažas no šīm idejām un īstenosim šo ideju par īstā vārda 903 00:42:19,817 --> 00:42:23,030 meklēšanu tālruņu grāmatā un numura atgūšanu. 904 00:42:23,030 --> 00:42:25,545 Tāpēc es iešu uz priekšu un ātri iekļaušu dažas no tām pašām lietām, 905 00:42:25,545 --> 00:42:28,060 cs50.h, lai mēs varētu saņemt ievadi. 906 00:42:28,060 --> 00:42:30,860 standarta io dot h, lai mēs varētu izdrukāt izvadi. 907 00:42:30,860 --> 00:42:35,320 Un es iepriekš iekļaušu string.h gadījumam, ja mums tas ir vajadzīgs. 908 00:42:35,320 --> 00:42:39,010 int main void, šodien nav nepieciešami komandrindas argumenti. 909 00:42:39,010 --> 00:42:42,650 Un tagad ļaujiet man dot sev vārdu masīvu šai tālruņu grāmatai. 910 00:42:42,650 --> 00:42:45,040 Tātad virkņu nosaukumi ir vienādi. 911 00:42:45,040 --> 00:42:47,940 Un tad cirtainajās lencēs, kā būtu, ja Kārters būs viena persona 912 00:42:47,940 --> 00:42:50,840 tālruņu katalogā, bet es pats Deivids – otrs. 913 00:42:50,840 --> 00:42:52,152 Tāpēc mēs to saīsināsim, lai mums nebūtu jāievada pārāk daudz 914 00:42:52,152 --> 00:42:53,465 nosaukumu. 915 00:42:53,465 --> 00:42:55,840 Bet šī ir tālruņu grāmata ar diviem cilvēkiem. 916 00:42:55,840 --> 00:42:59,628 Pieņemsim, ka mēs vēlamies paturēt prātā arī Kārtera tālruņa numuru. 917 00:42:59,628 --> 00:43:01,420 Tātad tas nav tikai teikšana atrasts vai neatrasts. 918 00:43:01,420 --> 00:43:05,320 Tā burtiski meklē mūsu tālruņu numurus kā pareizu tālruņu grāmatu. 919 00:43:05,320 --> 00:43:09,440 Šobrīd īsti nav iespējas to izdarīt. 920 00:43:09,440 --> 00:43:12,975 Es varētu darīt kaut ko dīvainu, piemēram, pēc Kārtera likt skaitli, 921 00:43:12,975 --> 00:43:16,510 piemēram, 617-495-1000. 922 00:43:16,510 --> 00:43:22,460 Es varbūt varētu darīt kaut ko līdzīgu 949-468-2750 pēc manis. 923 00:43:22,460 --> 00:43:25,300 Bet tagad jūs kaut kā darāt visu ābolu un apelsīnu lietu. 924 00:43:25,300 --> 00:43:26,470 Tagad tas nav stīgas. 925 00:43:26,470 --> 00:43:28,420 Tā ir virkne int, string int. 926 00:43:28,420 --> 00:43:31,240 Labi, varbūt es varētu vienkārši izveidot visas šīs virknes. 927 00:43:31,240 --> 00:43:34,600 Bet tagad tā ir tikai konceptuāla ābolu un apelsīnu sajaukšana. 928 00:43:34,600 --> 00:43:36,425 Tāpat kā jā, tas ir četru virkņu masīvs. 929 00:43:36,425 --> 00:43:38,650 Bet tagad jūs izmantojat goda sistēmu, lai zinātu, ka pirmā virkne ir 930 00:43:38,650 --> 00:43:40,875 vārds, otrā virkne ir skaitlis, trešā virkne ir — jūs varat to 931 00:43:40,875 --> 00:43:43,100 izdarīt. 932 00:43:43,100 --> 00:43:45,110 Bet tas ir mazliet kapāt, ja tā var teikt. 933 00:43:45,110 --> 00:43:47,300 Tātad, kas varētu būt tīrāks par šo? 934 00:43:47,300 --> 00:43:51,390 Tā vietā, lai apvienotu savus tālruņu numurus vienā masīvā ar mūsu 935 00:43:51,390 --> 00:43:55,480 vārdiem, ko vēl mēs varētu darīt, kas, iespējams, ir nedaudz labāks? 936 00:43:55,480 --> 00:43:56,440 Sakiet to nedaudz skaļāk. 937 00:43:58,960 --> 00:44:01,197 2D masīvs, iespējams, kaut kas, ko mēs varētu darīt. 938 00:44:01,197 --> 00:44:03,405 Es tagad padarīšu to vēl vienkāršāku, jo mēs tos neesam izmantojuši 939 00:44:03,405 --> 00:44:05,614 pēc nosaukuma, lai gan tas ir, mēs redzējām pagājušajā nedēļā, 940 00:44:05,614 --> 00:44:07,823 tehniski, kas ir argv. 941 00:44:07,823 --> 00:44:10,240 Ko vēl es varu darīt, ja vēlos saglabāt vārdus un numurus? 942 00:44:10,240 --> 00:44:11,147 Jā. 943 00:44:11,147 --> 00:44:12,220 STUDENTS: [NEdzirdams] 944 00:44:12,220 --> 00:44:13,690 DEIVIDS MALANS: Jā, ļaujiet man iet ar šo ieteikumu. 945 00:44:13,690 --> 00:44:14,607 Tas ir nedaudz vienkāršāk. 946 00:44:14,607 --> 00:44:16,788 Tā vietā, lai sarežģītu lietas burtiski dažādās dimensijās, ļaujiet 947 00:44:16,788 --> 00:44:18,970 man iet uz priekšu un veikt virkni. 948 00:44:18,970 --> 00:44:21,730 Nu, es varētu darīt int skaitļus. 949 00:44:21,730 --> 00:44:22,690 Bet zini ko? 950 00:44:22,690 --> 00:44:25,945 Lai mēs varētu atbalstīt pieturzīmes, piemēram, domuzīmes vai pat 951 00:44:25,945 --> 00:44:29,200 iekavas vai valstu kodus, es to darīšu. 952 00:44:29,200 --> 00:44:32,930 Es izveidošu virknes skaitļus, lai varētu attēlot Kārtera numuru kā 953 00:44:32,930 --> 00:44:36,660 citātu un 1 ASV, 617-495-1000, komplektā ar defisēm, kā tas ir ASV 954 00:44:36,660 --> 00:44:40,390 pieņemts. 955 00:44:40,390 --> 00:44:47,930 Un tad es iešu uz priekšu un rakstīšu +1-949-468-2750 semikolu. 956 00:44:47,930 --> 00:44:50,895 Un tagad, zemāk, ļausim lietotājam meklēt šajā tālruņu katalogā, 957 00:44:50,895 --> 00:44:53,860 tāpat kā 0. nedēļā. 958 00:44:53,860 --> 00:44:55,960 Virknes nosaukums ir vienāds ar iegūt virkni. 959 00:44:55,960 --> 00:44:57,975 Un pajautāsim lietotājam vārdu, iespējams, Deivids vai Kārters vai 960 00:44:57,975 --> 00:44:59,990 kāds cits. 961 00:44:59,990 --> 00:45:01,850 Un tagad no jauna ieviesīsim lineāro meklēšanu. 962 00:45:01,850 --> 00:45:05,920 Tātad 4, es saņemu 0. 963 00:45:01,850 --> 00:45:07,510 es esmu mazāks par 2 Un dari, kā es saku, nevis kā es daru. 964 00:45:07,510 --> 00:45:09,760 Es domāju, ka mums vajadzētu piesargāties no šīs stingrās kodēšanas, 965 00:45:09,760 --> 00:45:12,010 taču pagaidām mēs to padarīsim vienkārši. 966 00:45:12,010 --> 00:45:13,220 i++. 967 00:45:13,220 --> 00:45:15,185 Un tad šajā for cilpā es domāju, ka mums ir visas sastāvdaļas, lai to 968 00:45:15,185 --> 00:45:17,150 atrisinātu. 969 00:45:17,150 --> 00:45:21,074 Tātad, ja str atgriešanās vērtību salīdzina visu vārdu iekavas i, 970 00:45:21,074 --> 00:45:24,998 salīdzinot ar vārdu, ko ievadījis cilvēks, ja tas viss ir vienāds ar 971 00:45:24,998 --> 00:45:28,922 0, tas ir, visas rakstzīmes šajās divās virknēs ir vienādas, tad es 972 00:45:28,922 --> 00:45:32,846 domāju mēs varam iet uz priekšu un teikt, ka atrasts, tāpat kā 973 00:45:32,846 --> 00:45:36,770 pagājušajā reizē. 974 00:45:36,770 --> 00:45:37,520 Bet zini ko? 975 00:45:37,520 --> 00:45:40,130 Izdrukāsim Kārtera vai manu tālruņa numuru. 976 00:45:40,130 --> 00:45:44,770 Tātad tika atrasti procenti s, un mēs pievienosim skaitļus, iekava i. 977 00:45:44,770 --> 00:45:47,800 Un konsekvences labad es atgriezīšu šeit 0. 978 00:45:47,800 --> 00:45:50,700 Un, lai būtu skaidrs, es pateikšu kaut ko līdzīgu, piemēram, printf 979 00:45:50,700 --> 00:45:53,600 not found. 980 00:45:53,600 --> 00:45:56,240 Un tad es atgriezīšu arī 1. 981 00:45:56,240 --> 00:45:58,120 Atgādinot, šeit ir viss kods. 982 00:45:58,120 --> 00:46:01,610 Tas ir gandrīz tāds pats kā iepriekš, tikai tagad tas ir noderīgi. 983 00:46:01,610 --> 00:46:03,460 Es nesaku tikai atrasts vai neatrasts. 984 00:46:03,460 --> 00:46:07,180 Es atradu numuru monopolā, vai es atradu gabalu monopolā. 985 00:46:07,180 --> 00:46:09,880 Es meklēju vienā masīvā, vienā no virknēm. 986 00:46:09,880 --> 00:46:12,730 Un tad es drukāju no otra masīva, atbildi. 987 00:46:12,730 --> 00:46:16,105 Ļaujiet man iet uz priekšu un palaist kompilatoru, izveidot tālruņu 988 00:46:16,105 --> 00:46:19,480 katalogu, Enter. 989 00:46:19,480 --> 00:46:21,070 Labi, tas ir daudzsološi, bez kļūdām. 990 00:46:21,070 --> 00:46:22,720 Punktu slīpsvītra tālruņu grāmata tagad. 991 00:46:22,720 --> 00:46:26,350 Un meklēsim, piemēram, Kārters Enter. 992 00:46:26,350 --> 00:46:28,060 Labi, mēs atradām Kārtera numuru. 993 00:46:28,060 --> 00:46:29,393 Labi, ļaujiet man to izdarīt vēlreiz. 994 00:46:29,393 --> 00:46:30,960 Tālruņu grāmata, meklēsim Deividu. 995 00:46:30,960 --> 00:46:32,960 Labi, šķiet, esam atraduši Deivida numuru. 996 00:46:32,960 --> 00:46:34,502 Labi, darīsim to pēdējo reizi. 997 00:46:34,502 --> 00:46:35,410 Tālruņu grāmata, ievadiet. 998 00:46:35,410 --> 00:46:37,360 Un tagad mēs meklēsim Džonu Hārvardu. 999 00:46:37,360 --> 00:46:40,060 Ievadiet, nav atrasts. 1000 00:46:40,060 --> 00:46:42,790 Labi, tāpēc es uzdrošinos teikt, lai arī ar minimālu testēšanu, šis 1001 00:46:42,790 --> 00:46:45,520 kods ir pareizs. 1002 00:46:45,520 --> 00:46:48,190 Vai kāds tagad vēlētos kritizēt dizainu? 1003 00:46:48,190 --> 00:46:51,910 Vai kaut kas jūs, iespējams, neapmierina šo pieeju? 1004 00:46:55,120 --> 00:46:58,315 Un kā vienmēr, padomājiet par to, kā, ja programma kļūst garāka, 1005 00:46:58,315 --> 00:47:01,510 sarežģītāka, kā varētu izvērsties šādi lēmumi. 1006 00:47:01,510 --> 00:47:02,448 Jā. 1007 00:47:02,448 --> 00:47:04,400 STUDENTS: Ja i ir mazāks par 2. 1008 00:47:04,400 --> 00:47:07,865 DAVID MALAN: Labi, ja i ir mazāks par 2, tātad tehniski, ja es 1009 00:47:07,865 --> 00:47:11,330 mainīšu cilvēku skaitu šajā tālruņu grāmatā, man būs jāatjaunina i. 1010 00:47:11,330 --> 00:47:13,290 Un mēs jau esam redzējuši, ka es sevi ievedu nepatikšanās. 1011 00:47:13,290 --> 00:47:14,165 Tātad tas ir slikts dizains. 1012 00:47:14,165 --> 00:47:15,005 Labi. 1013 00:47:15,005 --> 00:47:17,857 STUDENTS: Pieņemsim, ka tālruņu grāmatai pievienojat kādas personas 1014 00:47:17,857 --> 00:47:20,710 vārdu, bet jums nav atbilstošā numura. 1015 00:47:20,710 --> 00:47:24,730 tas [dzirdams] kāda cilvēka numurs. 1016 00:47:24,730 --> 00:47:25,480 DEIVIDS MALANS: Jā. 1017 00:47:25,480 --> 00:47:28,180 Tāpēc es atkal paļaujos uz sevi, lai nesabojātos. 1018 00:47:28,180 --> 00:47:31,000 Ja es pievienoju Džonu vai kādu citu pirmajam masīvam, bet aizmirstu 1019 00:47:31,000 --> 00:47:33,820 pievienot viņu numuru otrajam masīvam, galu galā lietas mainīsies un 1020 00:47:33,820 --> 00:47:36,640 būs nekonsekventas. 1021 00:47:36,640 --> 00:47:39,010 Un tad kods tajā brīdī būs nepareizs. 1022 00:47:39,010 --> 00:47:41,215 Tātad slikts dizains, kas mani sagatavo nākotnes neveiksmēm, ja 1023 00:47:41,215 --> 00:47:43,420 vēlaties. 1024 00:47:43,420 --> 00:47:44,860 Citas domas? 1025 00:47:44,860 --> 00:47:45,460 Jā. 1026 00:47:45,460 --> 00:47:49,816 STUDENTS: [NEdzirdams] tātad, ja jūs būtu 1027 00:47:49,816 --> 00:47:52,848 bet ne galvenais [NEdzirdams] 1028 00:47:52,848 --> 00:47:54,140 DEIVIDS MALANS: Jā, tiešām labi. 1029 00:47:54,140 --> 00:47:55,550 Mēs pieņemam tādu pašu secību. 1030 00:47:55,550 --> 00:47:59,452 No kreisās uz labo pusi virzās vārdi, bet no kreisās uz labo - cipari. 1031 00:47:59,452 --> 00:48:01,160 Bet tā ir tikai goda sistēma. 1032 00:48:01,160 --> 00:48:04,103 Piemēram, kodā burtiski nekas neliedz man mainīt secību kāda iemesla 1033 00:48:04,103 --> 00:48:07,047 dēļ vai varbūt kārtot nosaukumus. 1034 00:48:07,047 --> 00:48:08,588 Piemēram, tie tagad ir sakārtoti, un varbūt tas ir apzināti, bet 1035 00:48:08,588 --> 00:48:10,130 varbūt tā nav. 1036 00:48:10,130 --> 00:48:12,920 Tātad arī šī goda sistēma šeit vienkārši nav laba. 1037 00:48:12,920 --> 00:48:16,205 Es varētu šeit ievietot komentāru, lai atgādinātu sev, piezīmi sev, 1038 00:48:16,205 --> 00:48:19,490 vienmēr atjaunināt masīvus tādā pašā veidā. 1039 00:48:19,490 --> 00:48:22,790 Bet kaut kas galu galā notiks, it īpaši, ja mums ir nevis divi, bet 1040 00:48:22,790 --> 00:48:26,090 trīs, bet 30 300 vārdi un skaitļi. 1041 00:48:26,090 --> 00:48:29,670 Būtu jauki glabāt visus saistītos datus kopā. 1042 00:48:29,670 --> 00:48:33,820 Un tāpēc faktiski viena jaunā C funkcija, ko mēs šodien ieviesīsim, 1043 00:48:33,820 --> 00:48:37,970 ir tāda, kas faktiski ļauj mums ieviest mūsu pašu datu struktūras. 1044 00:48:37,970 --> 00:48:41,950 Masīvus var uzskatīt par ļoti vieglu datu struktūru, jo tā ļauj 1045 00:48:41,950 --> 00:48:45,930 grupēt saistītus datus aizmugures pret aizmuguri. 1046 00:48:45,930 --> 00:48:48,170 Un šādi tiek īstenotas stīgas. 1047 00:48:48,170 --> 00:48:51,560 Tie ir datu struktūra, kas efektīvi ieviesta ar masīvu. 1048 00:48:51,560 --> 00:48:54,330 Taču ar C un citām valodām jūs varat izgudrot savus datu tipus 1049 00:48:54,330 --> 00:48:57,100 neatkarīgi no tā, vai tie ir viendimensijas, pat divdimensiju vai ne 1050 00:48:57,100 --> 00:48:59,870 tikai. 1051 00:48:59,870 --> 00:49:03,535 Un ar C, vai varat īpaši izveidot savus tipus, kuriem ir savi 1052 00:49:03,535 --> 00:49:07,200 nosaukumi? 1053 00:49:07,200 --> 00:49:11,790 Tā, piemēram, vai nebūtu bijis jauki, ja C nāktu ar, nevis tikai char 1054 00:49:11,790 --> 00:49:16,380 un int un floats un long un citi. 1055 00:49:16,380 --> 00:49:19,970 Vai nebūtu jauki, ja C nāktu ar datu tipu ar nosaukumu persona? 1056 00:49:19,970 --> 00:49:22,790 Un ideālā gadījumā cilvēkam būtu vārds un numurs. 1057 00:49:22,790 --> 00:49:24,860 Tagad tas ir nedaudz naivi un nereāli. 1058 00:49:24,860 --> 00:49:28,460 Piemēram, kāpēc viņi definētu personu, kurai ir tikai šie divi lauki. 1059 00:49:28,460 --> 00:49:30,950 Protams, cilvēki varēja nepiekrist tam, kas ir cilvēks. 1060 00:49:30,950 --> 00:49:32,300 Tāpēc viņi to atstāj mums. 1061 00:49:32,300 --> 00:49:34,555 C autori mums iedeva visus šos primitīvus, ints un pludiņus, stīgas 1062 00:49:34,555 --> 00:49:36,810 un tā tālāk. 1063 00:49:36,810 --> 00:49:40,590 Bet tagad mūsu ziņā ir tos izmantot interesantākā veidā, lai mēs 1064 00:49:40,590 --> 00:49:44,370 varētu izveidot personu mainīgo masīvu, ja vēlaties, masīvā, ko sauc 1065 00:49:44,370 --> 00:49:48,150 par cilvēkiem, lai to šeit daudzkārt. 1066 00:49:48,150 --> 00:49:49,740 Tātad, kā mēs to darīsim? 1067 00:49:49,740 --> 00:49:52,496 Nu, pagaidām tikai noteiksim, ka cilvēkam pasaulē būs vārds un 1068 00:49:52,496 --> 00:49:55,253 numurs, par ko mēs varētu visu dienu strīdēties, kam vēl cilvēkam 1069 00:49:55,253 --> 00:49:58,010 vajadzētu būt. 1070 00:49:58,010 --> 00:49:58,677 Un tas ir labi. 1071 00:49:58,677 --> 00:50:01,790 Galu galā jūs varat izdomāt savu cilvēku. 1072 00:50:01,790 --> 00:50:04,145 Pašlaik es izmantoju tikai divus mainīgos, lai definētu personas 1073 00:50:04,145 --> 00:50:06,500 vārdu un numuru. 1074 00:50:06,500 --> 00:50:10,580 Bet vai nebūtu jauki iekapsulēt, tas ir, apvienot šos divus datu 1075 00:50:10,580 --> 00:50:14,660 tipus jaunā un uzlabotā datu tipā, ko sauc par personu. 1076 00:50:14,660 --> 00:50:17,360 Un sintakse tam būs šāda. 1077 00:50:17,360 --> 00:50:18,800 Tātad tas ir mazliet kumoss. 1078 00:50:18,800 --> 00:50:21,960 Bet jūs, iespējams, varat secināt, ko daži no tiem šeit dara. 1079 00:50:21,960 --> 00:50:24,500 Tātad izrādās, ka C ir atslēgvārds typedef. 1080 00:50:24,500 --> 00:50:28,310 Kā norāda nosaukums, tas ļauj jums noteikt savu veidu. 1081 00:50:28,310 --> 00:50:31,550 Struktūra ir norāde, ka tā ir struktūra. 1082 00:50:31,550 --> 00:50:34,130 Tā ir kā struktūra, kurā ir vairākas vērtības, kuras jūs mēģināt 1083 00:50:34,130 --> 00:50:36,710 definēt. 1084 00:50:36,710 --> 00:50:39,490 Un tad pašā apakšā, ārpus cirtainajām lencēm, ir tā veida nosaukums, 1085 00:50:39,490 --> 00:50:42,270 kuru vēlaties izveidot. 1086 00:50:42,270 --> 00:50:44,530 Tāpēc šajā konkrētajā gadījumā jums nav rīcības brīvības izvēlēties 1087 00:50:44,530 --> 00:50:46,790 typedef vai struct. 1088 00:50:46,790 --> 00:50:48,665 Bet jūs varat nosaukt lietu, kā vien vēlaties. 1089 00:50:48,665 --> 00:50:52,590 Un jūs varat ievietot visu, ko vēlaties, kā arī. 1090 00:50:52,590 --> 00:50:56,980 Un, tiklīdz koda apakšā tiek izpildīts semikolu, katrai rindai pēc 1091 00:50:56,980 --> 00:51:01,370 tam tagad var būt piekļuve personas datu tipam kā vienam mainīgajam 1092 00:51:01,370 --> 00:51:05,760 vai kā visam masīvam. 1093 00:51:05,760 --> 00:51:08,010 Tātad, ja es vēlos to turpināt, ļaujiet man iet uz priekšu un darīt 1094 00:51:08,010 --> 00:51:10,260 to. 1095 00:51:10,260 --> 00:51:12,230 Ļaujiet man atgriezties pie sava C koda šeit. 1096 00:51:12,230 --> 00:51:17,610 Un es iešu uz priekšu un mainīšu tikai dažas lietas. 1097 00:51:17,610 --> 00:51:19,110 Dosimies uz priekšu un darīsim to. 1098 00:51:19,110 --> 00:51:21,175 Es iešu uz priekšu un, pirmkārt, atbrīvošos no šiem diviem kodētajiem 1099 00:51:21,175 --> 00:51:23,240 masīviem. 1100 00:51:23,240 --> 00:51:26,710 Un ļaujiet man iet uz priekšu un mana faila augšdaļā izgudrot šo 1101 00:51:26,710 --> 00:51:30,180 tipu, tātad typedef struct. 1102 00:51:30,180 --> 00:51:34,470 Tā iekšpusē būs virknes nosaukums un pēc tam virknes numurs. 1103 00:51:34,470 --> 00:51:36,780 Un tad struktūras nosaukums būs persona. 1104 00:51:36,780 --> 00:51:39,363 Un paraugprakse liek man to definēt faila pašā augšdaļā, lai faktiski 1105 00:51:39,363 --> 00:51:41,946 to varētu izmantot jebkura mana funkcija, lai gan šajā gadījumā man 1106 00:51:41,946 --> 00:51:44,530 ir tikai galvenā. 1107 00:51:44,530 --> 00:51:47,100 Tagad, ja es gribētu, es varētu to izdarīt. 1108 00:51:47,100 --> 00:51:50,370 Persona P1 un persona P2. 1109 00:51:50,370 --> 00:51:53,040 Bet mēs zinām no pagājušās nedēļas, ka tas jau ir slikts dizains. 1110 00:51:53,040 --> 00:51:56,542 Ja vēlaties, lai viena veida mainīgajam būtu vairāki gadījumi, ko tā 1111 00:51:56,542 --> 00:52:00,044 vietā vajadzētu izmantot? 1112 00:52:00,044 --> 00:52:01,046 STUDENTS: [NEdzirdams] 1113 00:52:01,046 --> 00:52:02,470 DEIVIDS MALANS: Un... STUDENTS: Masīvs. 1114 00:52:02,470 --> 00:52:03,637 DEIVIDS MALANS: Jā, masīvs. 1115 00:52:03,637 --> 00:52:05,230 Tāpēc ļaujiet man pat neiet pa šo ceļu. 1116 00:52:05,230 --> 00:52:06,700 Tā vietā ļaujiet man to izdarīt. 1117 00:52:06,700 --> 00:52:09,727 Persona būs masīva veids. 1118 00:52:09,727 --> 00:52:11,980 Bet es to nosaukšu... es to varētu saukt par personām. 1119 00:52:11,980 --> 00:52:13,720 Bet angļu valodā mēs parasti sakām cilvēki. 1120 00:52:13,720 --> 00:52:15,190 Tāpēc es piezvanīšu masīva cilvēkiem. 1121 00:52:15,190 --> 00:52:18,055 Un es vēlos, lai šajā masīvā pastāvētu divi cilvēki, lai gan es 1122 00:52:18,055 --> 00:52:20,920 noteikti varētu mainīt šo numuru, lai tas būtu jebko, ko vēlos. 1123 00:52:20,920 --> 00:52:24,055 Kā tagad ievietot personas vārdu un pēc tam ievietot numuru tās pašas 1124 00:52:24,055 --> 00:52:27,190 personas iekšpusē? 1125 00:52:27,190 --> 00:52:28,990 Nu, šodien mazliet jauna sintakse. 1126 00:52:28,990 --> 00:52:30,520 Es iešu uz priekšu un pateikšu to. 1127 00:52:30,520 --> 00:52:34,420 Personu iekava 0 tikai dod man pirmo personu masīvā. 1128 00:52:34,420 --> 00:52:35,570 Tas nav jaunums. 1129 00:52:35,570 --> 00:52:38,205 Bet, ja vēlaties iedziļināties šīs personas atmiņā, izmantojiet 1130 00:52:38,205 --> 00:52:40,840 punktu. 1131 00:52:40,840 --> 00:52:44,870 Un tad jūs vienkārši norādiet tajā esošā atribūta nosaukumu. 1132 00:52:44,870 --> 00:52:47,175 Tātad, ja es vēlos iestatīt pirmās personas vārdu Kārters, es 1133 00:52:47,175 --> 00:52:49,480 vienkārši izmantoju tā saukto punktu apzīmējumu. 1134 00:52:49,480 --> 00:52:53,080 Un tad, ja es vēlos iestatīt Kārtera numuru, izmantojot punktu 1135 00:52:53,080 --> 00:52:56,680 apzīmējumu, es darītu šādi: +1-617-495-1000. 1136 00:52:56,680 --> 00:53:00,205 Un tad, ja es vēlos darīt to pašu ar sevi, es tagad dotu cilvēkiem, 1137 00:53:00,205 --> 00:53:03,730 kas iekava 1 punkts vārds ir vienāds ar citātu un citātu Deividu. 1138 00:53:03,730 --> 00:53:08,380 Un tad cilvēki 1. iekavas nekustīga punkta skaitlis ir vienāds ar 1139 00:53:08,380 --> 00:53:13,030 citātu +1-949-468-2750. 1140 00:53:13,030 --> 00:53:15,820 Un tagad, mana faila apakšā, es domāju, ka mana loģika var palikt 1141 00:53:15,820 --> 00:53:18,610 nemainīga. 1142 00:53:18,610 --> 00:53:21,490 Es joprojām varu šajā rindiņā pieprasīt lietotājam tās personas 1143 00:53:21,490 --> 00:53:24,370 vārdu, kuru viņš vēlas meklēt. 1144 00:53:24,370 --> 00:53:26,700 Pagaidām, lai gan es atzīstu, ka tas nav labākais dizains, es to daru 1145 00:53:26,700 --> 00:53:29,030 tikai demonstrācijas dēļ, es atstāšu abus tur, jo es zinu, ka man ir 1146 00:53:29,030 --> 00:53:31,360 divi cilvēki. 1147 00:53:31,360 --> 00:53:34,100 Bet šeit tas būs jāmaina. 1148 00:53:34,100 --> 00:53:37,000 Es vairs nevēlos salīdzināt nosaukumus i. 1149 00:53:37,000 --> 00:53:42,190 Ko es vēlos šeit ierakstīt kā pirmo argumentu str salīdzināšanai? 1150 00:53:42,190 --> 00:53:43,900 Ko es gribu šeit darīt? 1151 00:53:43,900 --> 00:53:44,960 Jā. 1152 00:53:44,960 --> 00:53:46,800 STUDENTS: Cilvēku vārds. 1153 00:53:46,800 --> 00:53:49,140 DEIVIDS MALANS: Tātad cilvēki, kurus es nosaucu, jā. 1154 00:53:49,140 --> 00:53:51,810 Tāpēc es vēlos iedziļināties cilvēku masīvā i-tajā vietā, jo tieši to 1155 00:53:51,810 --> 00:53:54,480 dara mana cilpa. 1156 00:53:54,480 --> 00:53:55,890 Tas atjaunina i atkal un atkal. 1157 00:53:55,890 --> 00:53:58,087 Un tad paskaties uz vārdu, un tas ir labi. 1158 00:53:58,087 --> 00:53:59,670 Es domāju, ka tagad man arī tas ir jāmaina. 1159 00:53:59,670 --> 00:54:01,890 Ko es vēlos izdrukāt, ja persona ir atrasta? 1160 00:54:01,890 --> 00:54:02,445 Kāds cits? 1161 00:54:05,070 --> 00:54:08,850 Ko es te gribu drukāt, ja atradu personas vārdu? 1162 00:54:08,850 --> 00:54:09,360 Jā. 1163 00:54:09,360 --> 00:54:10,890 STUDENTS: [NEdzirdams] 1164 00:54:10,890 --> 00:54:12,390 DEIVIDS MALANS: Sakiet to nedaudz skaļāk. 1165 00:54:12,390 --> 00:54:13,795 STUDENTS: Cilvēki, kuriem ir skaitlis. 1166 00:54:13,795 --> 00:54:14,670 DEIVIDS MALANS: Lieliski. 1167 00:54:14,670 --> 00:54:17,490 Tātad cilvēki iekavās i dot skaitli, ja tiešām es vēlos izdrukāt 1168 00:54:17,490 --> 00:54:20,310 atbilstošo numuru šai personai. 1169 00:54:20,310 --> 00:54:22,930 Un tad es domāju, ka pārējais mans kods var palikt nemainīgs. 1170 00:54:22,930 --> 00:54:25,040 Ļaujiet man turpināt un atkārtoti palaist tālruņu kataloga izveidi, 1171 00:54:25,040 --> 00:54:27,150 lai atkārtoti kompilētu šo versiju. 1172 00:54:27,150 --> 00:54:28,170 Līdz šim viss ir labi. 1173 00:54:28,170 --> 00:54:29,400 Punktu slīpsvītra tālruņu grāmata. 1174 00:54:29,400 --> 00:54:31,598 Iesim uz priekšu un ierakstīsim Kārtera vārdu, atrasts. 1175 00:54:31,598 --> 00:54:33,390 Labi, ejam uz priekšu un palaidīsim to vēlreiz. 1176 00:54:33,390 --> 00:54:35,273 Deivida vārds, atrasts. 1177 00:54:35,273 --> 00:54:36,940 Dosimies uz priekšu un izpildīsim to vēl vienu reizi. 1178 00:54:36,940 --> 00:54:40,260 Šajā gadījumā ierakstiet, piemēram, John Harvard, nav atrasts. 1179 00:54:40,260 --> 00:54:43,710 Tātad būtībā kods nav tik atšķirīgs. 1180 00:54:43,710 --> 00:54:46,090 Lineārā meklēšana joprojām darbojas tāpat. 1181 00:54:46,090 --> 00:54:48,690 Un es atzīstu, ka tas izskatās neglīts. 1182 00:54:48,690 --> 00:54:50,520 Tagad mēs esam izveidojuši divu rindiņu risinājumu ar piecām koda 1183 00:54:50,520 --> 00:54:52,350 rindiņām. 1184 00:54:52,350 --> 00:54:55,912 Bet, ja mēs pārtīsim nedēļu vai divas, kad sākam saglabāt informāciju 1185 00:54:55,912 --> 00:54:59,475 failos, mēs jūs iepazīstināsim ar tādiem failiem kā csv faili, 1186 00:54:59,475 --> 00:55:03,037 komatatdalītas vērtības vai izklājlapu faili, kurus noteikti kādā 1187 00:55:03,037 --> 00:55:06,600 brīdī esat atvēris savā Mac vai personālajā datorā. pagātnē. 1188 00:55:06,600 --> 00:55:09,195 Pietiek ar to, ka mēs drīz apgūsim paņēmienus informācijas, piemēram, 1189 00:55:09,195 --> 00:55:11,790 vārdu un numuru, glabāšanai failos. 1190 00:55:11,790 --> 00:55:14,220 Un tajā brīdī mēs nedarīsim neko tādu, kas ir kaut kas tāds uzmācīgā 1191 00:55:14,220 --> 00:55:16,650 skaitļa 2 kodēšana un manuāli mana un Kārtera vārda un numura 1192 00:55:16,650 --> 00:55:19,080 ierakstīšana mūsu programmā. 1193 00:55:19,080 --> 00:55:21,750 Mēs dinamiski nolasīsim informāciju no faila. 1194 00:55:21,750 --> 00:55:25,180 Un pēc dažām nedēļām mēs to dinamiski nolasīsim no datu bāzes. 1195 00:55:25,180 --> 00:55:28,685 Bet pagaidām tas ir tikai sintaktisks veids, kā mēs varam izveidot 1196 00:55:28,685 --> 00:55:32,190 2. izmēra masīvu, kurā katrā ir viena persona. 1197 00:55:32,190 --> 00:55:35,330 Mēs varam atjaunināt pirmās personas vārdu un numuru, atjaunināt 1198 00:55:35,330 --> 00:55:38,470 otrās personas vārdu un numuru, un pēc tam vēlāk meklēt šos vārdus un 1199 00:55:38,470 --> 00:55:41,610 izdrukāt atbilstošos numurus. 1200 00:55:41,610 --> 00:55:44,220 Un šajā ziņā tas ir labāks dizains. 1201 00:55:44,220 --> 00:55:44,730 Kāpēc? 1202 00:55:44,730 --> 00:55:49,065 Jo mans personas datu tips tagad ietver visu, ko nozīmē būt personai, 1203 00:55:49,065 --> 00:55:53,400 vismaz šajā šaurajā pasaulē. 1204 00:55:53,400 --> 00:55:56,847 Un, ja es vēlos kaut ko pievienot, piemēram, jēdzienam par personu, 1205 00:55:56,847 --> 00:56:00,295 es varētu iet līdz savam tipam def, un rīt pievienot katram cilvēkam 1206 00:56:00,295 --> 00:56:03,743 adresi un sākt to arī lasīt. 1207 00:56:03,743 --> 00:56:05,160 Un tagad tā nav goda sistēma. 1208 00:56:05,160 --> 00:56:08,685 Tas nav vārdu masīvs, skaitļu masīvs, adrešu masīvs un viss pārējais, 1209 00:56:08,685 --> 00:56:12,210 ko jūs varētu iedomāties saistībā ar personu. 1210 00:56:12,210 --> 00:56:17,223 Tas viss ir iekapsulēts, kas ir tāda paša veida mākslas termins. 1211 00:56:17,223 --> 00:56:19,441 Ja daži no jums ir iepriekš programmējuši, tas atgādina kaut ko, ko 1212 00:56:19,441 --> 00:56:21,660 sauc par objektorientētu programmēšanu. 1213 00:56:21,660 --> 00:56:23,190 Bet mēs vēl neesam tur. 1214 00:56:23,190 --> 00:56:24,690 C nav tas. 1215 00:56:24,690 --> 00:56:29,863 Jautājumi par šo struktūras izmantošanu vai šo jauno sintakse, kur 1216 00:56:29,863 --> 00:56:35,037 punktu operators šeit patiešām ir sulīgs. 1217 00:56:35,037 --> 00:56:35,620 Vai ir kādi jautājumi? 1218 00:56:35,620 --> 00:56:36,522 Jā. 1219 00:56:36,522 --> 00:56:39,414 STUDENTS: [NEdzirdams] 1220 00:56:42,800 --> 00:56:44,420 DEIVIDS MALANS: Kurā līnijas numurā? 1221 00:56:44,420 --> 00:56:46,063 STUDENTS: 16. 1222 00:56:46,063 --> 00:56:46,730 DEIVIDS Malans: 16? 1223 00:56:46,730 --> 00:56:48,980 Tātad, jā, tik sintaktiski mēs pagājušajā nedēļā ieviesām 1224 00:56:48,980 --> 00:56:51,230 kvadrātiekavas. 1225 00:56:51,230 --> 00:56:53,270 Tātad, ja cilvēki iekava 0, tas nozīmē, ka pāriet uz pirmo personu 1226 00:56:53,270 --> 00:56:55,310 masīvā. 1227 00:56:55,310 --> 00:56:58,400 Tas bija kā tad, kad Stefānija burtiski atvēra šīs durvis. 1228 00:56:58,400 --> 00:56:59,990 Tas ir durvju kronšteins 0. 1229 00:56:59,990 --> 00:57:02,330 Bet tas, protams, ir 0 iekava. 1230 00:57:02,330 --> 00:57:04,580 Šodien punkts ir jauna sintakse. 1231 00:57:04,580 --> 00:57:07,485 Tas nozīmē, ka ieejiet šajā cilvēkā atmiņā un paskatieties uz vārdu, 1232 00:57:07,485 --> 00:57:10,391 kurā viņi atrodas, un iestatiet to kā Kārters un dariet to pašu ar 1233 00:57:10,391 --> 00:57:13,297 numuru. 1234 00:57:13,297 --> 00:57:13,880 Tātad tas arī viss. 1235 00:57:13,880 --> 00:57:16,145 Tas ir tāpat kā: atveriet skapīša durvis, ieejiet tajās un pārbaudiet 1236 00:57:16,145 --> 00:57:18,410 vai iestatiet vārdu un numuru. 1237 00:57:18,410 --> 00:57:19,040 Jā. 1238 00:57:19,040 --> 00:57:29,280 STUDENTS: Vai varat iestatīt noklusējumu [NESAKAMS] 1239 00:57:29,280 --> 00:57:30,840 DEIVIDS MALANS: Ar īpašībām viss ir kārtībā. 1240 00:57:30,840 --> 00:57:31,530 Labs jautājums. 1241 00:57:31,530 --> 00:57:34,050 Vai struktūrā var iestatīt noklusējuma vērtības? 1242 00:57:34,050 --> 00:57:35,100 Īsa atbilde, nē. 1243 00:57:35,100 --> 00:57:37,593 Un šeit C kļūst mazāk spējīgs izmantot nekā modernākas valodas, 1244 00:57:37,593 --> 00:57:40,086 piemēram, Python un Java un citas, kurās jūs faktiski to varat 1245 00:57:40,086 --> 00:57:42,580 izdarīt. 1246 00:57:42,580 --> 00:57:44,860 Tātad, pārejot uz Python pēc dažām nedēļām, mēs redzēsim, kā mēs 1247 00:57:44,860 --> 00:57:47,140 varam sākt risināt šādas problēmas. 1248 00:57:47,140 --> 00:57:51,450 Bet pagaidām jūsu ziņā ir inicializēt vārdu un numuru. 1249 00:57:51,450 --> 00:57:52,832 Jā. 1250 00:57:52,832 --> 00:57:55,540 STUDENTS: [NEdzirdams] 1251 00:58:04,123 --> 00:58:05,540 DEIVIDS MALANS: Tiešām labs jautājums. 1252 00:58:05,540 --> 00:58:08,470 Kā mēs varam pielāgot vai kritizēt to, ko es daru? 1253 00:58:08,470 --> 00:58:11,125 Šī ir viena no retajām situācijām, kad es liekulīgi teiktu, dari, kā 1254 00:58:11,125 --> 00:58:13,780 es saku, nevis kā es daru. 1255 00:58:13,780 --> 00:58:15,745 Es izmantoju diezgan neglītas līnijas, piemēram, šī, tikai lai 1256 00:58:15,745 --> 00:58:17,710 ieviestu sintaksi. 1257 00:58:17,710 --> 00:58:20,550 Bet mana šodienas pedagoģiskā prasība ir tāda, ka galu galā, kad mēs 1258 00:58:20,550 --> 00:58:23,390 sāksim glabāt vārdus un numurus vai citas lietas failos vai datu 1259 00:58:23,390 --> 00:58:26,230 bāzēs, jums nebūs šīs atlaišanas. 1260 00:58:26,230 --> 00:58:29,030 Jums būs viena koda rindiņa vai divas koda rindas, kas nolasa 1261 00:58:29,030 --> 00:58:31,830 informāciju no faila vai datu bāzes un pēc tam aizpilda visu masīvu 1262 00:58:31,830 --> 00:58:34,630 ar šiem datiem. 1263 00:58:34,630 --> 00:58:37,015 Pagaidām es to daru tikai manuāli, lai koncentrētos tikai uz jauno 1264 00:58:37,015 --> 00:58:39,400 sintaksi, bet tas arī viss. 1265 00:58:39,400 --> 00:58:42,640 Tāpēc piedodiet par sliktu dizainu jau šodien. 1266 00:58:42,640 --> 00:58:45,740 Citi jautājumi par šo? 1267 00:58:45,740 --> 00:58:47,595 Labi, tas jau ir bijis daudz. 1268 00:58:47,595 --> 00:58:50,470 Kāpēc gan mums vispirms paņemt 10 minūšu pārtraukumu ar uzkodām. 1269 00:58:50,470 --> 00:58:53,020 Vestibilā ir daži apburoši cepumi. 1270 00:58:53,020 --> 00:58:55,900 Labi, esam atpakaļ. 1271 00:58:55,900 --> 00:58:59,125 Un līdz šim acīmredzami ir labi, ja jūsu dati ir sakārtoti, jo varat 1272 00:58:59,125 --> 00:59:02,350 izmantot bināro meklēšanu. 1273 00:59:02,350 --> 00:59:05,540 Jūs zināt nedaudz vairāk par datiem. 1274 00:59:05,540 --> 00:59:07,980 Bet izrādās, ka šķirošana pati par sevi ir arī problēma, kas 1275 00:59:07,980 --> 00:59:10,420 jāatrisina. 1276 00:59:10,420 --> 00:59:13,692 Un jūs varētu domāt, labi, ja šķirošana būs diezgan ātra, mums tas 1277 00:59:13,692 --> 00:59:16,964 noteikti jādara pirms meklēšanas sākšanas, jo tas tikai paātrinās 1278 00:59:16,964 --> 00:59:20,237 visu mūsu meklēšanu. 1279 00:59:20,237 --> 00:59:22,854 Bet, ja kārtošana ir lēna, rodas jautājums, vai mums ir jāmācās 1280 00:59:22,854 --> 00:59:25,472 kārtot savus datus, ja meklēsim datus tikai vienu, varbūt divas 1281 00:59:25,472 --> 00:59:28,090 reizes? 1282 00:59:28,090 --> 00:59:30,550 Un tāpēc šeit, iespējams, būs kompromiss. 1283 00:59:30,550 --> 00:59:33,250 Tāpēc apskatīsim, ko īsti nozīmē kārtot datus. 1284 00:59:33,250 --> 00:59:35,950 Mūsu gadījumā tas būs vienkārši un tiks izmantoti skaitļi. 1285 00:59:35,950 --> 00:59:38,415 Bet pasaules Google gadījumā tās var būt faktiskas tīmekļa lapas, 1286 00:59:38,415 --> 00:59:40,880 personas vai tamlīdzīgi. 1287 00:59:40,880 --> 00:59:43,485 Tātad, šeit ir mūsu tipiskais attēls šķirošanai, jebkuras problēmas 1288 00:59:43,485 --> 00:59:46,090 risināšanai. 1289 00:59:46,090 --> 00:59:48,190 Ieeja kreisajā pusē un izvade labajā pusē. 1290 00:59:48,190 --> 00:59:54,340 Mūsu kārtošanas problēmas ievade būs kāda nešķirota vērtību kopa. 1291 00:59:54,340 --> 00:59:57,940 Ideālā gadījumā izvade būs tāda pati sakārtoto vērtību kopa. 1292 00:59:57,940 --> 01:00:01,230 Un, ja mēs to darām konkrēti, pieņemsim, ka mēs vēlamies kārtot šo 1293 01:00:01,230 --> 01:00:04,520 skaitļu sarakstu, 7, 2, 5, 4, 1, 6, 0, tātad visi skaitļi ir no 0 1294 01:00:04,520 --> 01:00:07,810 līdz 7. 1295 01:00:07,810 --> 01:00:09,757 Bet tie ir kaut kā nejauši sajaukti. 1296 01:00:09,757 --> 01:00:11,590 Tas būs problēmas ievads. 1297 01:00:11,590 --> 01:00:14,790 Un tagad mērķis ir tos sakārtot tā, lai jūs patiešām iegūtu 0, 1, 2, 1298 01:00:14,790 --> 01:00:17,990 3, 4, 5, 6, 7. 1299 01:00:17,990 --> 01:00:20,945 Tātad izrādās, ka ir daudz dažādu veidu, kā mēs faktiski varam kārtot 1300 01:00:20,945 --> 01:00:23,900 šādus skaitļus šeit. 1301 01:00:23,900 --> 01:00:26,736 Un patiesībā, lai papildinātu mūsu agrāko meklēšanas piemēru, vai 1302 01:00:26,736 --> 01:00:29,573 mēs, iespējams, varētu ātri panākt, lai kādi astoņi brīvprātīgie nāk 1303 01:00:29,573 --> 01:00:32,410 pie darba, ja jums patīk parādīties internetā? 1304 01:00:32,410 --> 01:00:39,100 Ja vēlaties izdarīt 1, 2, 3, 4, 5, 6, 7, 8, kā būtu? 1305 01:00:39,100 --> 01:00:40,255 Labi, nāc lejā. 1306 01:00:45,040 --> 01:00:47,970 Labi. 1307 01:00:47,970 --> 01:00:50,560 Nāciet šurp, un es jums katram iedošu numuru. 1308 01:00:50,560 --> 01:00:54,475 Un, ja vēlaties sākt sakārtot sevi tādā pašā secībā, jūs redzat 1309 01:00:54,475 --> 01:00:58,390 skaitļus uz tāfeles. 1310 01:00:58,390 --> 01:01:01,425 Tāpēc skatieties virs galvas un sakārtojiet sevi no kreisās puses uz 1311 01:01:01,425 --> 01:01:04,460 labo tādā pašā secībā. 1312 01:01:04,460 --> 01:01:06,210 Un lai ir pirmais no jums — ideāls. 1313 01:01:06,210 --> 01:01:10,420 Ja vēlaties nākt tieši šeit, kā būtu tieši saskaņā ar šo? 1314 01:01:10,420 --> 01:01:13,990 Labi, un vēl daži cipari. 1315 01:01:13,990 --> 01:01:14,980 Labi. 1316 01:01:14,980 --> 01:01:19,810 Numurs 2, 6 un ideāls. 1317 01:01:19,810 --> 01:01:21,625 Tikai pareizais numurs, labi. 1318 01:01:21,625 --> 01:01:22,858 Ak, ak. 1319 01:01:22,858 --> 01:01:24,400 Labi, mēs ejam, numur trīs. 1320 01:01:24,400 --> 01:01:24,968 Labi. 1321 01:01:24,968 --> 01:01:26,260 Tāpēc veiksim ātru pārbaudi. 1322 01:01:26,260 --> 01:01:30,867 Mums ir 7, 2, 5, 4, 1, 6, 0, 3, pagaidām ļoti labi. 1323 01:01:30,867 --> 01:01:32,688 Vai vēlaties tikai nedaudz pagriezties šādā veidā, lai atbrīvotu 1324 01:01:32,688 --> 01:01:34,510 mazliet vairāk vietas? 1325 01:01:34,510 --> 01:01:38,090 Labi, un tagad padomāsim, kas mums ir uz skatuves. 1326 01:01:38,090 --> 01:01:40,780 Vai vēlaties katrs ātri sasveicināties ar auditoriju? 1327 01:01:40,780 --> 01:01:42,070 RAJANS: Sveiki, mani sauc Raiens. 1328 01:01:42,070 --> 01:01:45,597 Esmu pirmo gadu no Pennypacker. 1329 01:01:45,597 --> 01:01:46,930 ITSELLE: Sveiki, mani sauc Itselle. 1330 01:01:46,930 --> 01:01:49,177 Strādāju pirmo gadu. 1331 01:01:49,177 --> 01:01:50,260 LŪSIJA: Sveiki, mani sauc Lūsija. 1332 01:01:50,260 --> 01:01:52,400 Un es esmu pirmo gadu no Greenough. 1333 01:01:52,400 --> 01:01:53,650 ŠILOHS: Sveiki, mani sauc Šilo. 1334 01:01:53,650 --> 01:01:55,927 Es esmu pirmo gadu Viglsvortā. 1335 01:01:55,927 --> 01:01:57,010 DŽEKS: Sveiki, mani sauc Džeks. 1336 01:01:57,010 --> 01:01:59,877 Un es esmu pirmo gadu Štrausā. 1337 01:01:59,877 --> 01:02:01,210 KETRINA: Sveiki, mani sauc Katrīna. 1338 01:02:01,210 --> 01:02:02,787 Strādāju pirmo gadu. 1339 01:02:02,787 --> 01:02:04,120 MAIKLS: Sveiki, mani sauc Maikls. 1340 01:02:04,120 --> 01:02:06,063 Es strādāju pirmo gadu Pennypacker. 1341 01:02:06,063 --> 01:02:07,480 MUHAMMAD: Sveiki, mani sauc Muhameds. 1342 01:02:07,480 --> 01:02:09,047 Es mācos Metjūsā pirmo gadu. 1343 01:02:09,047 --> 01:02:10,630 DEIVIDS MALANS: Sveiki, jauki, laipni lūdzam uz klāja. 1344 01:02:10,630 --> 01:02:11,240 Labi. 1345 01:02:11,240 --> 01:02:14,470 Tāpēc tagad apsvērsim, kā mēs varētu kārtot savus laipnos 1346 01:02:14,470 --> 01:02:17,700 brīvprātīgos šeit, lai tos sakārtotu no mazākajiem līdz lielākajiem, 1347 01:02:17,700 --> 01:02:20,930 lai, iespējams, mēs varētu izmantot kaut ko gudrāku nekā tikai 1348 01:02:20,930 --> 01:02:24,160 lineāro meklēšanu. 1349 01:02:24,160 --> 01:02:26,019 Mēs faktiski varam izmantot bināro meklēšanu, pieņemot, ka tie jau ir 1350 01:02:26,019 --> 01:02:27,878 sakārtoti. 1351 01:02:27,878 --> 01:02:30,239 Tāpēc ļaujiet man ierosināt vispirms apsvērt algoritmu, kuram 1352 01:02:30,239 --> 01:02:32,600 faktiski ir nosaukums, ko sauc par atlases kārtošanu. 1353 01:02:32,600 --> 01:02:36,270 Un atlases kārtošana būs tāda, kurā burtiski es vai tiešām jūs kā 1354 01:02:36,270 --> 01:02:39,940 programmētājs atkal un atkal atlasa mazāko elementu un pēc tam 1355 01:02:39,940 --> 01:02:43,610 ievieto tos attiecīgajā vietā. 1356 01:02:43,610 --> 01:02:47,115 Tāpēc ļaujiet man iet uz priekšu un sākt to šeit, sākot ar numuru 7. 1357 01:02:47,115 --> 01:02:49,240 Šobrīd 7 ir mazākais skaitlis, ko esmu atradis. 1358 01:02:49,240 --> 01:02:52,610 Tāpēc es to ņemšu vērā ar garīgo mainīgo, ja vēlaties. 1359 01:02:52,610 --> 01:02:53,710 Es tagad iešu tālāk. 1360 01:02:53,710 --> 01:02:56,325 Skaitlis 2 acīmredzami ir mazāks, tāpēc es tikai atjaunināšu savu 1361 01:02:56,325 --> 01:02:58,940 garīgo atgādinājumu, ka 2 tagad ir mazākais, faktiski aizmirstot par 1362 01:02:58,940 --> 01:03:01,555 7. numuru. 1363 01:03:01,555 --> 01:03:02,440 5, ne mazāks. 1364 01:03:02,440 --> 01:03:03,370 4, ne mazāks. 1365 01:03:03,370 --> 01:03:04,170 1, mazāks. 1366 01:03:04,170 --> 01:03:05,920 Un es to pieminēšu garīgi. 1367 01:03:05,920 --> 01:03:07,030 6, ne mazāks. 1368 01:03:07,030 --> 01:03:08,200 0, pat mazāks. 1369 01:03:08,200 --> 01:03:11,140 Es to pieminēšu, jo tagad esmu aizmirsis visu pārējo. 1370 01:03:11,140 --> 01:03:13,180 Un tagad numurs 3 nav mazāks. 1371 01:03:13,180 --> 01:03:14,290 Nu kā tevi atkal sauc? 1372 01:03:14,290 --> 01:03:14,630 MIKELS: Maikls. 1373 01:03:14,630 --> 01:03:16,240 DEIVIDS MALANS: Tātad Maikls ir 0. numurs. 1374 01:03:16,240 --> 01:03:18,310 Viņš, protams, pieder tur lejā. 1375 01:03:18,310 --> 01:03:21,550 Bet diemžēl... tu esi... RAJANS: Raiens. 1376 01:03:21,550 --> 01:03:23,360 DEIVIDS MALANS: Raiens ir ceļā. 1377 01:03:23,360 --> 01:03:24,580 Tātad, kas mums jādara? 1378 01:03:24,580 --> 01:03:27,570 Kā mums vajadzētu sākt kārtot šo sarakstu? 1379 01:03:27,570 --> 01:03:30,510 Kur jāiet ciparam 0? 1380 01:03:30,510 --> 01:03:31,012 Jā. 1381 01:03:31,012 --> 01:03:32,220 Vai vēlaties to pateikt skaļāk? 1382 01:03:32,220 --> 01:03:34,545 STUDENTS: Es domāju, ka apmainīšu. 1383 01:03:34,545 --> 01:03:36,670 DEIVIDS MALANS: Jā, ejam uz priekšu un apmainīsimies. 1384 01:03:36,670 --> 01:03:39,190 Tātad, ja vēlaties iet uz priekšu un 0, turpiniet, kur ir 7. 1385 01:03:39,190 --> 01:03:41,170 Mums jāatbrīvo vieta 7. numuram. 1386 01:03:41,170 --> 01:03:45,530 Tā būtu krāpšanās, ja varbūt visi pieklājīgi pakāptos uz sāniem. 1387 01:03:45,530 --> 01:03:46,030 Kāpēc? 1388 01:03:46,030 --> 01:03:48,750 Jo, ja mēs iedomājamies visus mūsu brīvprātīgos kā masīvu, piemēram, 1389 01:03:48,750 --> 01:03:51,470 tas ir neprātīgs darba apjoms, lai katrs masīva elements pārvietotos 1390 01:03:51,470 --> 01:03:54,190 pa kreisi, lai atbrīvotu vietu. 1391 01:03:54,190 --> 01:03:55,765 Tāpēc mēs turpināsim to darīt vienkārši un vienkārši izliksim tos, 1392 01:03:55,765 --> 01:03:57,340 kas šobrīd atrodas. 1393 01:03:57,340 --> 01:04:00,880 Tagad varbūt mums paveicas, un numurs 7 patiesībā ir tuvāk galamērķim. 1394 01:04:00,880 --> 01:04:03,250 Varbūt mums nepaveicas, un tas aiziet tālāk. 1395 01:04:03,250 --> 01:04:05,260 Bet mēs esam atrisinājuši vismaz vienu problēmu. 1396 01:04:05,260 --> 01:04:07,770 Ja mums sākumā bija n problēmas, tagad mums ir n mīnus 1, jo skaitlis 1397 01:04:07,770 --> 01:04:10,280 0 patiešām ir īstajā vietā. 1398 01:04:10,280 --> 01:04:12,705 Tātad, ja es turpināšu rīkoties šādi, ļaujiet man iet uz priekšu un 1399 01:04:12,705 --> 01:04:15,130 pateikt 2, kas pašlaik ir mazākais. 1400 01:04:15,130 --> 01:04:18,040 5, nē, 4, nē, 1 šobrīd mazākais. 1401 01:04:18,040 --> 01:04:19,000 Es došu prātā. 1402 01:04:19,000 --> 01:04:22,690 6, 7, 3, un tagad ļaujiet man pauzēt. 1403 01:04:22,690 --> 01:04:26,000 1 acīmredzami tagad ir mazākais elements. 1404 01:04:26,000 --> 01:04:27,760 Vai tad man vajadzēja turpināt? 1405 01:04:27,760 --> 01:04:30,690 Nu, izrādās, vismaz tā kā esmu definējis atlases kārtošanu, man ir 1406 01:04:30,690 --> 01:04:33,620 jāturpina, jo es tikai apgalvoju, ka lietoju vienu mainīgo savā 1407 01:04:33,620 --> 01:04:36,550 prātā, lai atcerētos tobrīd mazāko elementu. 1408 01:04:36,550 --> 01:04:39,070 Es neesmu tik gudrs kā mēs, cilvēki, lai atcerētos, pagaidiet, 1 1409 01:04:39,070 --> 01:04:41,590 noteikti tagad ir mazākais. 1410 01:04:41,590 --> 01:04:43,190 Man nav visas šīs atmiņas. 1411 01:04:43,190 --> 01:04:45,590 Tāpēc es tikai sekoju līdzi mazākajam. 1412 01:04:45,590 --> 01:04:46,910 Tātad numur 1, jūsu vārds bija? 1413 01:04:46,910 --> 01:04:47,410 DŽEKS: Džeks. 1414 01:04:47,410 --> 01:04:49,300 DEIVIDS MALANS: Džek, kur Džekam jāiet? 1415 01:04:49,300 --> 01:04:50,380 Droši vien tur. 1416 01:04:50,380 --> 01:04:51,670 Un kā tevi sauc? 1417 01:04:51,670 --> 01:04:51,880 ITSELLE: Itselle. 1418 01:04:51,880 --> 01:04:54,655 DEIVIDS MALANS: Labi, Džeks un Itselle, ja vēlaties apmainīties 1419 01:04:54,655 --> 01:04:57,430 vietām, tagad esam atrisinājuši divas no n kopējām problēmām. 1420 01:04:57,430 --> 01:04:58,990 Un tagad mēs to darīsim nedaudz ātrāk. 1421 01:04:58,990 --> 01:05:02,665 Ja katrs no jums vēlas sākt apmainīt, kā es atrodu īsto cilvēku, tad 1422 01:05:02,665 --> 01:05:06,340 5 mazākie, 4 mazāki, 2 ir mazāki. 1423 01:05:06,340 --> 01:05:07,750 Jāturpina pārbaudīt. 1424 01:05:07,750 --> 01:05:09,572 Labi, 2 bija mazāki. 1425 01:05:09,572 --> 01:05:11,780 Labi, tagad es atgriezīšos sākumā. 1426 01:05:11,780 --> 01:05:13,090 Labi, 4 ir mazs. 1427 01:05:13,090 --> 01:05:14,050 5 nav. 1428 01:05:14,050 --> 01:05:14,740 6 nav. 1429 01:05:14,740 --> 01:05:16,120 7 — ak, 3 ir mazs. 1430 01:05:16,120 --> 01:05:17,770 Kur tu vēlies doties? 1431 01:05:17,770 --> 01:05:18,670 Labi, labi. 1432 01:05:18,670 --> 01:05:19,810 Es atgriezīšos šeit. 1433 01:05:19,810 --> 01:05:21,060 Un es varu būt nedaudz gudrs. 1434 01:05:21,060 --> 01:05:24,950 Man nav jāiet līdz galam, jo es zinu, ka šie cilvēki jau ir sakārtoti. 1435 01:05:24,950 --> 01:05:26,630 Tāpēc es varu vismaz nedaudz optimizēt. 1436 01:05:26,630 --> 01:05:27,970 Tātad tagad 5 ir mazs. 1437 01:05:27,970 --> 01:05:28,720 6 ir mazs. 1438 01:05:28,720 --> 01:05:30,160 7 ir 4, 4 ir mazāks. 1439 01:05:30,160 --> 01:05:33,080 Ja gribi iet tur vietā. 1440 01:05:33,080 --> 01:05:34,810 Un tagad šeit lietas kļūst interesantas. 1441 01:05:34,810 --> 01:05:37,075 Es varu optimizēt, vairs neskatoties uz šiem cilvēkiem, jo viņu 1442 01:05:37,075 --> 01:05:39,340 problēma acīmredzami ir atrisināta. 1443 01:05:39,340 --> 01:05:42,970 Bet tagad 5 ir mazs, 6 nav, 7 nav. 1444 01:05:42,970 --> 01:05:45,010 Labi, 5, tu vari palikt tur, kur esi. 1445 01:05:45,010 --> 01:05:49,420 Tagad cilvēks istabā acīmredzami jautās, kāpēc es tērēju vairāk laika. 1446 01:05:49,420 --> 01:05:52,630 Bet ar atlases kārtošanu, kā es to līdz šim esmu definējis, man 1447 01:05:52,630 --> 01:05:55,840 joprojām ir jāpārbauda 6. kontrole, kas ir mazākā, nevis 7. 1448 01:05:55,840 --> 01:05:58,520 Un tagad mans pēdējais solis, labi, tie visi ir savās vietās. 1449 01:05:58,520 --> 01:06:00,700 Tātad arī šeit ir šī dihotomija starp to, kas mums visiem ir, ir šis 1450 01:06:00,700 --> 01:06:02,880 visas problēmas skatījums no putna lidojuma, kur ir skaidrs, kur 1451 01:06:02,880 --> 01:06:05,060 ikvienam ir jāiet. 1452 01:06:05,060 --> 01:06:09,137 Bet datoram, kas to īsteno ar masīvu, patiešām ir jābūt metodiskākam. 1453 01:06:09,137 --> 01:06:10,720 Un patiesībā mēs šeit ietaupām soli. 1454 01:06:10,720 --> 01:06:13,780 Ja mēs patiešām to darītu, neviens no šiem skaitļiem nebūtu redzams. 1455 01:06:13,780 --> 01:06:16,840 Visi astoņi mūsu brīvprātīgie atrastos aizslēgtu durvju iekšpusē. 1456 01:06:16,840 --> 01:06:19,220 Un tikai tad mēs tos varējām redzēt pa vienam. 1457 01:06:19,220 --> 01:06:21,670 Bet mēs tagad koncentrējamies tikai uz šķirošanas aspektu. 1458 01:06:21,670 --> 01:06:24,320 Tāpēc ļaujiet man tikai, pirms mēs šeit veicam vēl vienu 1459 01:06:24,320 --> 01:06:26,970 demonstrāciju, ierosināt, ka tas, ko es patiešām tikko šeit izdarīju 1460 01:06:26,970 --> 01:06:29,620 pseidokodā, bija kaut kas līdzīgs šim. 1461 01:06:29,620 --> 01:06:32,605 Attiecībā uz i no 0 līdz n mīnus 1, paturot prātā, ka 0 vienmēr ir 1462 01:06:32,605 --> 01:06:35,590 masīva kreisā puse. 1463 01:06:35,590 --> 01:06:38,110 n mīnus 1 vienmēr ir masīva labais gals. 1464 01:06:38,110 --> 01:06:41,920 Ja i no 0 līdz n mīnus 1, es atradu mazāko skaitli starp skaitļu 1465 01:06:41,920 --> 01:06:45,730 iekavas i un skaitļu iekavas n mīnus 1. 1466 01:06:45,730 --> 01:06:48,610 Un tas ir ļoti gudrs veids, kā izteikt šo optimizāciju. 1467 01:06:48,610 --> 01:06:51,490 Es vienmēr sāku no skaitļu iekavas i, lai kur arī atrastos. 1468 01:06:51,490 --> 01:06:53,200 Un tad viss pārējais pa labi. 1469 01:06:53,200 --> 01:06:56,890 Un tieši tas ļāva man ignorēt jau sakārtotos brīvprātīgos. 1470 01:06:56,890 --> 01:06:59,750 Tomēr, ja manā pēdējā rindiņā ir teikts, ka mazāko skaitli apmainiet 1471 01:06:59,750 --> 01:07:02,610 ar skaitļiem i, domāju, ka tas īsteno to, ko mūsu cilvēki darīja, 1472 01:07:02,610 --> 01:07:05,470 fiziski ejot uz citu vietu. 1473 01:07:05,470 --> 01:07:09,220 Labi, tad tas būtu tas, ko mēs sauksim par atlases kārtošanu. 1474 01:07:09,220 --> 01:07:11,290 Dosimies uz priekšu un izmantosim otru pieeju, izmantojot algoritmu, 1475 01:07:11,290 --> 01:07:13,360 ko es saukšu par burbuļu kārtošanu. 1476 01:07:13,360 --> 01:07:14,725 Taču, lai to izdarītu, jums visiem ir jāatjauno sākotnējā atrašanās 1477 01:07:14,725 --> 01:07:16,090 vieta. 1478 01:07:16,090 --> 01:07:17,920 Ja vēlaties atgriezties šajā pozīcijā, uz tāfeles ir neliela 1479 01:07:17,920 --> 01:07:19,750 krāpšanās lapa. 1480 01:07:19,750 --> 01:07:22,093 Un ļaujiet man izmantot principiāli atšķirīgu pieeju, jo man īsti 1481 01:07:22,093 --> 01:07:24,436 nepatīk atlases kārtošana tāda, kāda tā ir, jo tā ir sava veida liela 1482 01:07:24,436 --> 01:07:26,780 staigāšana uz priekšu un atpakaļ. 1483 01:07:26,780 --> 01:07:30,620 Un daudzās pastaigas liek domāt par daudz, daudz soļu atkal un atkal. 1484 01:07:30,620 --> 01:07:32,090 Tātad, ko es varētu darīt tā vietā? 1485 01:07:32,090 --> 01:07:34,410 Burbuļu kārtošana liks man nedaudz intuitīvāk koncentrēties tikai uz 1486 01:07:34,410 --> 01:07:36,730 mazākām problēmām. 1487 01:07:36,730 --> 01:07:38,605 Un paskatīsimies, vai tas mani aizvedīs kaut kur citur. 1488 01:07:38,605 --> 01:07:41,137 Tātad, ja es tikai skatos uz šo sarakstu, neskatoties uz visiem 1489 01:07:41,137 --> 01:07:43,670 pārējiem, 7. un 2., tā acīmredzami ir problēma. 1490 01:07:43,670 --> 01:07:44,170 Kāpēc? 1491 01:07:44,170 --> 01:07:45,500 Jo tu neesi no ierindas. 1492 01:07:45,500 --> 01:07:47,810 Tāpēc vispirms atrisināsim vienu nelielu problēmu. 1493 01:07:47,810 --> 01:07:49,570 Tātad 7 un 2, kāpēc jūs neapmainīsit? 1494 01:07:49,570 --> 01:07:54,160 Es zinu, ka 2 tagad ir labākā vietā, jo viņai noteikti ir mazāk par 7. 1495 01:07:54,160 --> 01:07:55,540 Tāpēc es domāju, ka tagad varu turpināt. 1496 01:07:55,540 --> 01:07:57,350 7 un 5, problēma. 1497 01:07:57,350 --> 01:07:58,390 Tātad atrisināsim to. 1498 01:07:58,390 --> 01:07:59,830 7 un 4, problēma. 1499 01:07:59,830 --> 01:08:02,380 Atrisināsim to, 7 un 1, atrisināsim to. 1500 01:08:02,380 --> 01:08:03,970 7 un 6, atrisināsim to. 1501 01:08:03,970 --> 01:08:05,080 7 un 0, atrisiniet to. 1502 01:08:05,080 --> 01:08:06,550 7 un 3, atrisiniet to. 1503 01:08:06,550 --> 01:08:07,330 Labi, darīts. 1504 01:08:07,330 --> 01:08:09,130 Sakārtots, vai ne? 1505 01:08:09,130 --> 01:08:11,780 Vai arī, protams, nē, ja paskatās uz šiem skaitļiem šeit. 1506 01:08:11,780 --> 01:08:14,530 Bet būtībā mēs esam nedaudz atvairījušies no problēmas. 1507 01:08:14,530 --> 01:08:17,020 7 tiešām ir īstajā vietā. 1508 01:08:17,020 --> 01:08:21,170 Tātad mums ir maksimāli n mīnus 1 citas problēmas, kas jāatrisina. 1509 01:08:21,170 --> 01:08:23,660 Tātad, kā to izdarīt? 1510 01:08:23,660 --> 01:08:25,700 Es domāju, ka varu atkārtot to pašu loģiku. 1511 01:08:25,700 --> 01:08:26,770 Ļaujiet man iet šeit. 1512 01:08:26,770 --> 01:08:28,210 2 un 5, labi. 1513 01:08:28,210 --> 01:08:29,800 5 un 4, Nr. 1514 01:08:29,800 --> 01:08:31,330 5 un 1, Nr. 1515 01:08:31,330 --> 01:08:32,590 5 un 6, jā. 1516 01:08:32,590 --> 01:08:34,660 6 un 0, nē. 1517 01:08:34,660 --> 01:08:36,760 6 un 3, Nr. 1518 01:08:36,760 --> 01:08:39,191 Tātad tagad mēs esam atrisinājuši divas no problēmām. 1519 01:08:39,191 --> 01:08:40,949 Un kas ir jauki burbuļu šķirošanā, vismaz pēc šī skatiena tas ir 1520 01:08:40,949 --> 01:08:42,707 jauki un vienkārši. 1521 01:08:42,707 --> 01:08:43,540 Tas ir jauki un vietēji. 1522 01:08:43,540 --> 01:08:46,510 Un jūs tikai pakāpeniski risiniet arvien vairāk problēmu. 1523 01:08:46,510 --> 01:08:48,010 Tāpēc turpināsim un darīsim to vēlreiz. 1524 01:08:48,010 --> 01:08:50,080 Un es to izdarīšu — mēs to varam izdarīt ātrāk. 1525 01:08:50,080 --> 01:08:51,760 2 un 4, mēs zinām, ir labi. 1526 01:08:51,760 --> 01:08:59,200 4 un 1, 4 un 5, 5 un 0, 5 un 3, 5 un 6, 6 un 7, labi. 1527 01:08:59,200 --> 01:09:01,390 Tātad mēs atgriežamies, 2 un 1. 1528 01:09:01,390 --> 01:09:03,340 Ak, tagad vēl viens problēmas risinājums. 1529 01:09:03,340 --> 01:09:09,939 2 un 4, 4 un 0, 4 un 3, 4 un 5, 5 un 6, 6 un 7. 1530 01:09:09,939 --> 01:09:12,417 Un tāpēc ievērojiet 2 — tā nosaukumā lielākie elementi ir sasnieguši 1531 01:09:12,417 --> 01:09:14,895 ceļu uz augšu. 1532 01:09:14,895 --> 01:09:16,617 Šķiet, ka tas notiek tieši tad, kad mēs novēršam dažas atlikušās 1533 01:09:16,617 --> 01:09:18,340 problēmas. 1534 01:09:18,340 --> 01:09:19,120 Tātad gandrīz pabeigts. 1535 01:09:19,120 --> 01:09:23,335 1 un 2, 2 un 0, 2 un 3, 3 un 4, 4 un 5, 5 un 6, 6 un 7, gandrīz 1536 01:09:23,335 --> 01:09:27,550 gatavs. 1537 01:09:27,550 --> 01:09:29,830 Acīmredzot mums, cilvēkiem, tas izskatās paveikts. 1538 01:09:29,830 --> 01:09:32,529 Kā es varu droši zināt kā datoru? 1539 01:09:32,529 --> 01:09:34,449 Kāds man būtu visdrošākais veids, kā tagad iet, tas nav izdarīts, 1540 01:09:34,449 --> 01:09:36,370 atvainojiet. 1541 01:09:36,370 --> 01:09:38,080 Tā ir kļūda. 1542 01:09:38,080 --> 01:09:43,390 Labi, 1 un 0, 1 un 2, 2 un 3, 3 un 4, 4 un 5, 5 un 6, 6 un 7. 1543 01:09:43,390 --> 01:09:47,899 Labi, tagad tas ir acīmredzami sakārtots mums pārējiem uz skatuves. 1544 01:09:47,899 --> 01:09:50,290 Kā es varu apstiprināt tik daudz kā kodu? 1545 01:09:50,290 --> 01:09:52,670 Jūs to darāt ar prātu, tikai paskatoties uz šo. 1546 01:09:52,670 --> 01:09:56,080 Kā dators, kods, droši zinātu, ka šis saraksts tagad ir sakārtots? 1547 01:09:56,080 --> 01:09:57,000 Jā. 1548 01:09:57,000 --> 01:09:58,500 STUDENTS: vēl vienu reizi [dzirdams]. 1549 01:09:58,500 --> 01:10:00,000 DEIVIDS MALANS: Darīsim vēl vienu reizi. 1550 01:10:00,000 --> 01:10:03,512 Un skaties, kādu secinājumu izdarīt? 1551 01:10:03,512 --> 01:10:05,490 STUDENTS: Ka vispār nekas nav jāpārslēdzas. 1552 01:10:05,490 --> 01:10:07,175 DEIVIDS MALANS: Jā, darīsim to vēl vienu reizi, lai gan tas ir 1553 01:10:07,175 --> 01:10:08,860 nedaudz izšķērdīgi. 1554 01:10:08,860 --> 01:10:11,674 Bet loģiski, ja es vēlreiz, vēlreiz un vēlreiz pārlasu visu sarakstu, 1555 01:10:11,674 --> 01:10:14,489 salīdzinot pārus, un tajā laikā nedaru nekādu darbu, tagad ir 1556 01:10:14,489 --> 01:10:17,303 acīmredzami loģiski droši vienkārši apstāties, jo pretējā gadījumā es 1557 01:10:17,303 --> 01:10:20,118 tērēju savu laiku, veicot tas pats atkal un atkal, ja neviens 1558 01:10:20,118 --> 01:10:22,933 faktiski nekustas. 1559 01:10:22,933 --> 01:10:25,350 Tāpēc es baidos, ka mums visiem nav monopola spēles. 1560 01:10:25,350 --> 01:10:26,767 Bet mums ir astoņas stresa bumbas. 1561 01:10:26,767 --> 01:10:30,090 Un aplausi, ja mēs varētu, mūsu brīvprātīgajiem. 1562 01:10:30,090 --> 01:10:33,910 Ja vēlies savus numurus nolikt tur plauktā. 1563 01:10:33,910 --> 01:10:36,720 Tātad, ja mēs to uz brīdi apsveram, paldies. 1564 01:10:36,720 --> 01:10:39,340 Liels paldies. 1565 01:10:39,340 --> 01:10:42,150 Protams. 1566 01:10:42,150 --> 01:10:44,230 Paldies. 1567 01:10:44,230 --> 01:10:44,730 Protams. 1568 01:10:44,730 --> 01:10:46,800 Tātad, ja mēs tagad ņemam vērā šos divus algoritmus, kurš no tiem ir 1569 01:10:46,800 --> 01:10:48,870 labāks? 1570 01:10:48,870 --> 01:10:52,410 Vai ir kāda intuīcija par to, vai atlases kārtošana pirmā ir labāka 1571 01:10:52,410 --> 01:10:55,950 vai sliktāka nekā otrā? 1572 01:10:55,950 --> 01:10:58,020 Kādas domas? 1573 01:10:58,020 --> 01:10:58,860 Jā. 1574 01:10:58,860 --> 01:11:03,620 jo tas ir mazāk darba [dzirdams].. 1575 01:11:03,620 --> 01:11:06,275 DEIVIDS MALANS: Šķiet, ka burbuļu kārtošana ir mazāk darba, jo īpaši 1576 01:11:06,275 --> 01:11:08,930 tāpēc, ka es koncentrējos uz šīm lokalizētajām problēmām. 1577 01:11:08,930 --> 01:11:11,460 Cita intuīcija? 1578 01:11:11,460 --> 01:11:14,580 Atlases kārtošana pret burbuļu kārtošanu. 1579 01:11:14,580 --> 01:11:17,000 Ļaujiet man ierosināt, lai mēs mēģinātu to kvantificēt, lai mēs 1580 01:11:17,000 --> 01:11:19,420 varētu to kaut kādā veidā analizēt. 1581 01:11:19,420 --> 01:11:22,590 Un tas nav uzdevums, ko mēs pastāvīgi veiksim daudziem algoritmiem. 1582 01:11:22,590 --> 01:11:24,940 Bet tie ir diezgan reprezentatīvi algoritmiem. 1583 01:11:24,940 --> 01:11:28,960 Tātad mēs varam domāt par šo lietu veiktspēju vai dizainu. 1584 01:11:28,960 --> 01:11:32,140 Tātad, šeit ir mans pseidokods atlases kārtošanai, un saskaņā ar tā 1585 01:11:32,140 --> 01:11:35,320 nosaukumu es tikai iteratīvi atlasu nākamo mazāko elementu atkal un 1586 01:11:35,320 --> 01:11:38,500 atkal. 1587 01:11:38,500 --> 01:11:41,890 Tātad, kā mēs varam analizēt kaut ko līdzīgu šim? 1588 01:11:41,890 --> 01:11:44,960 Mēs to varētu vienkārši izdarīt uz papīra zīmuļa un saskaitīt soļu 1589 01:11:44,960 --> 01:11:48,030 skaitu, kas, šķiet, loģiski izriet no koda. 1590 01:11:48,030 --> 01:11:50,460 Mēs varētu burtiski saskaitīt soļu skaitu, ko es gāju atkal un atkal, 1591 01:11:50,460 --> 01:11:52,890 no kreisās uz labo pusi. 1592 01:11:52,890 --> 01:11:55,596 Mēs varētu arī vienkārši saskaitīt salīdzinājumu skaitu, ko es veicu 1593 01:11:55,596 --> 01:11:58,302 ar katru no iesaistītajām personām. 1594 01:11:58,302 --> 01:12:00,510 Un es to darīju ātri atlases veidā. 1595 01:12:00,510 --> 01:12:02,730 Bet katru reizi, kad skatījos uz cilvēku, kurš mēģina izlemt, vai es 1596 01:12:02,730 --> 01:12:04,950 vēlos atcerēties, ka skaitlis ir mazākais? 1597 01:12:04,950 --> 01:12:07,200 Šis skaitlis, es salīdzināju divas vērtības ar zīmi vienāds ar 1598 01:12:07,200 --> 01:12:09,450 vienāds vai mazāks vai lielāks par, vismaz tad, ja mēs to būtu 1599 01:12:09,450 --> 01:12:11,700 izdarījuši kodā. 1600 01:12:11,700 --> 01:12:13,110 Tātad tā mēdz būt norma. 1601 01:12:13,110 --> 01:12:16,570 Analizējot šādus algoritmus, skaitot salīdzinājumu skaitu, jo tā ir 1602 01:12:16,570 --> 01:12:20,030 sava veida globāla mērvienība, ko varam izmantot, lai pilnībā 1603 01:12:20,030 --> 01:12:23,490 salīdzinātu dažādus algoritmus. 1604 01:12:23,490 --> 01:12:27,400 Tāpēc arī padomājiet, ka vispārīgā gadījumā, ja mums ir vairāk nekā 1605 01:12:27,400 --> 01:12:31,310 astoņi brīvprātīgie, vairāk nekā septiņas durvis, mēs varam 1606 01:12:31,310 --> 01:12:35,220 vispārināt savu masīvu kopumā, jo tas ir pirmais elements 0. iekavā. 1607 01:12:35,220 --> 01:12:37,770 Un tā beigas vienmēr ir n mīnus 1. 1608 01:12:37,770 --> 01:12:42,485 Tātad masīvi vai durvis, šajā gadījumā vai brīvprātīgie, vienmēr tiek 1609 01:12:42,485 --> 01:12:47,200 skaitliski indeksēti no 0 līdz n mīnus 1, ja to kopā ir n. 1610 01:12:47,200 --> 01:12:50,940 Tātad, kā mēs analizējam atlases kārtošanas kodu? 1611 01:12:50,940 --> 01:12:56,370 Nu, cik soļus man vajadzēja, lai atrastu pirmo mazāko elementu? 1612 01:12:56,370 --> 01:12:59,613 Vai precīzāk, cik daudz salīdzinājumu man vajadzēja veikt, kad es 1613 01:12:59,613 --> 01:13:02,856 gāju no kreisās uz labo pusi, lai atrastu mūsu pirmo mazāko cilvēku, 1614 01:13:02,856 --> 01:13:06,100 kas galu galā bija 0? 1615 01:13:06,100 --> 01:13:09,310 Cik daudz salīdzinājumu veicu, ejot no kreisās uz labo pusi? 1616 01:13:09,310 --> 01:13:15,850 Ja uz skatuves būtu astoņi cilvēki, cik daudz es salīdzinu? 1617 01:13:15,850 --> 01:13:18,280 Piemēram, ja ir astoņi cilvēki, es salīdzināju šos cilvēkus. 1618 01:13:18,280 --> 01:13:22,210 Tad šī persona, šī persona, jā. 1619 01:13:22,210 --> 01:13:23,412 Jā, kopā septiņi, vai ne? 1620 01:13:23,412 --> 01:13:25,594 Jo, ja uz skatuves ir astoņi cilvēki, kopā var veikt tikai septiņus 1621 01:13:25,594 --> 01:13:27,777 salīdzinājumus, jo pretējā gadījumā jūs salīdzinātu vienu numuru ar 1622 01:13:27,777 --> 01:13:29,960 sevi. 1623 01:13:29,960 --> 01:13:34,260 Tātad šķiet, ka vispārīgā gadījumā, ja jums ir n skaitļi, kurus 1624 01:13:34,260 --> 01:13:38,560 mēģināt kārtot, vispirms jāsalīdzina mazākais elements — n mīnus 1. 1625 01:13:38,560 --> 01:13:41,275 Kopā varbūt n soļi no kreisās uz labo pusi. 1626 01:13:41,275 --> 01:13:43,652 Bet salīdzinājumu skaits, kas, manuprāt, ir tikai noderīga 1627 01:13:43,652 --> 01:13:46,030 mērvienība, ir n mīnus 1. 1628 01:13:46,030 --> 01:13:48,490 Kā būtu ar nākamā mazākā cilvēka atrašanu? 1629 01:13:48,490 --> 01:13:50,845 Cik soļu man bija jāveic, lai atrastu nākamo mazāko skaitli, kas galu 1630 01:13:50,845 --> 01:13:53,200 galā bija skaitlis 1? 1631 01:13:55,790 --> 01:13:56,855 Jā. 1632 01:13:56,855 --> 01:13:58,340 STUDENTS: [NESASKAMS] n mīnus 2. 1633 01:13:58,340 --> 01:13:59,600 DEIVIDS MALANS: Jā, tātad tikai n mīnus 2. 1634 01:13:59,600 --> 01:13:59,870 Kāpēc? 1635 01:13:59,870 --> 01:14:01,610 Jo es jau biju atrisinājis vienu problēmu. 1636 01:14:01,610 --> 01:14:03,210 Kāds jau bija pareizajā pozīcijā. 1637 01:14:03,210 --> 01:14:05,490 Būtu muļķīgi tos skaitīt atkal un atkal. 1638 01:14:05,490 --> 01:14:07,345 Tāpēc es varu samazināt savu salīdzinājumu skaitu nākamajai kārtai 1639 01:14:07,345 --> 01:14:09,200 līdz n mīnus 2. 1640 01:14:09,200 --> 01:14:12,350 Trešā kārta, lai atrastu trešo mazāko skaitli, būtu n mīnus 3. 1641 01:14:12,350 --> 01:14:14,773 Un tad punkts, punkts, punkts, iespējams, šis stāsts, šī formula 1642 01:14:14,773 --> 01:14:17,196 beidzas, kad jums ir tikai viens pēdējais pāris, cilvēki beigās, ko 1643 01:14:17,196 --> 01:14:19,620 salīdzināt. 1644 01:14:19,620 --> 01:14:23,063 Tātad, ja tas nedaudz atgādina kaut kādu atkārtošanos no vidusskolas 1645 01:14:23,063 --> 01:14:26,506 vai vidusskolas matemātikas, fizikas vai tamlīdzīgi, ļaujiet man 1646 01:14:26,506 --> 01:14:29,949 tikai noteikt, ka, ja jūs patiešām veicat šo matemātiku un to 1647 01:14:29,949 --> 01:14:33,392 vispārināt, tas ir tas pats, kas n reizes. n mīnus 1 dalīts ar 2. 1648 01:14:33,392 --> 01:14:35,100 Un, ja jūs esat sarūsējis par to, nekas liels. 1649 01:14:35,100 --> 01:14:38,906 Vienkārši atcerieties, ka ikreiz, kad saskaitīsiet šāda veida 1650 01:14:38,906 --> 01:14:42,713 sērijas, kaut ko plus kaut ko nedaudz mazāku un kaut ko nedaudz 1651 01:14:42,713 --> 01:14:46,520 mazāku, no kuriem katrs atšķiras ar 1, jūs iegūsit šo formulu. 1652 01:14:42,302 --> 01:14:46,991 n reizes n mīnus 1 pār 2Ja mēs, protams, to reizinām, tas tiešām ir n 1653 01:14:46,991 --> 01:14:51,680 kvadrātā mīnus n, viss dalīts ar 2. 1654 01:14:51,680 --> 01:14:54,110 Ja mēs to turpinām reizināt, tas ir n kvadrātā dalīts ar 2 mīnus n 1655 01:14:54,110 --> 01:14:56,540 pār 2. 1656 01:14:56,540 --> 01:14:59,840 Un tagad mums ir sava veida vārdu krājums, ar kuru mēs varam runāt 1657 01:14:59,840 --> 01:15:03,140 par šī algoritma efektivitāti un dizainu. 1658 01:15:03,140 --> 01:15:06,350 Bet godīgi sakot, man ir vienalga par šo precizitātes līmeni, 1659 01:15:06,350 --> 01:15:09,560 piemēram, n kvadrātā dalīts ar 2 mīnus n dalīts ar 2. 1660 01:15:09,560 --> 01:15:13,103 Kad n kļūst patiešām liels, kurš no šiem simboliem, kurš no šiem 1661 01:15:13,103 --> 01:15:16,646 terminiem patiešām dominēs, kļūs par lielāko soļu kopējās vērtības 1662 01:15:16,646 --> 01:15:20,190 ietekmētāju? 1663 01:15:20,190 --> 01:15:20,690 vai ne? 1664 01:15:20,690 --> 01:15:21,890 Tas ir laukums, vai ne? 1665 01:15:21,890 --> 01:15:23,382 Tas noteikti nav n dalīts ar 2. 1666 01:15:23,382 --> 01:15:24,590 Tā ir kāda brīvlaika skūšanās. 1667 01:15:24,590 --> 01:15:27,800 Bet n kvadrātā, kad n kļūst liels, kļūs patiešām liels. 1668 01:15:27,800 --> 01:15:29,990 Ja n ir 100, tad n kvadrātā ir lielāks. 1669 01:15:29,990 --> 01:15:32,570 Ja n ir miljons, n kvadrātā tiešām ir lielāks. 1670 01:15:32,570 --> 01:15:35,892 Un tātad dienas beigās, kad mēs patiesībā runājam tikai par rokas 1671 01:15:35,892 --> 01:15:39,215 analīzes vilni un augšējo robežu, ja vēlaties, pieņemsim tikai to, ka 1672 01:15:39,215 --> 01:15:42,537 atlases kārtojums, kā šeit analizēts, tas ir n kvadrātu soļu secībā. 1673 01:15:42,537 --> 01:15:45,860 . 1674 01:15:45,860 --> 01:15:47,690 Tas nav precīzi n kvadrātveida soļi. 1675 01:15:47,690 --> 01:15:52,830 Bet zini ko? 1676 01:15:47,690 --> 01:15:51,470 n kvadrātā dalīts ar 2, intuīcija šeit varētu būt tāda, labi, tā ir 1677 01:15:51,470 --> 01:15:55,250 puse no tā. 1678 01:15:55,250 --> 01:15:56,910 n kvadrātā ir tas, kas patiešām ir svarīgs, jo n kļūst ļoti, ļoti 1679 01:15:56,910 --> 01:15:58,570 liels. 1680 01:15:58,570 --> 01:16:00,507 Un tieši tad jūs sākat domāt un mēģināt atrisināt pasaules Google 1681 01:16:00,507 --> 01:16:02,445 problēmas. 1682 01:16:02,445 --> 01:16:04,967 Kad n kļūst liels, tad jums ir jābūt gudrākam, nevis vienkārši naivam 1683 01:16:04,967 --> 01:16:07,490 jebkura algoritma ieviešanai. 1684 01:16:07,490 --> 01:16:12,480 Tātad, kur tad šis algoritms ietilpst šajā kategorijā? 1685 01:16:12,480 --> 01:16:16,045 Nu, n kvadrātā, izrādās, ir n kvadrātu soļu secībā, sliktākajā 1686 01:16:16,045 --> 01:16:19,610 gadījumā neatkarīgi no tā, vai tas ir sakārtots vai nē. 1687 01:16:19,610 --> 01:16:22,630 Tomēr izrādās, ka zemākā robeža, ja ņemam vērā šo pašu kodu, 1688 01:16:22,630 --> 01:16:25,650 pieņemsim labāko scenāriju, piemēram, uz skatuves kāpa mūsu astoņi 1689 01:16:25,650 --> 01:16:28,670 brīvprātīgie. 1690 01:16:28,670 --> 01:16:32,240 Un tikai tāpēc, ka viņi jau ir sakārtojuši sevi, tātad no 0 līdz 7. 1691 01:16:32,240 --> 01:16:34,490 Pieņemsim, ka viņi vienkārši bija tādā stāvoklī. 1692 01:16:34,490 --> 01:16:38,580 Cik soļus atlases veikals veiktu, lai sakārtotu jau sakārtotu 1693 01:16:38,580 --> 01:16:42,670 brīvprātīgo sarakstu? 1694 01:16:42,670 --> 01:16:43,420 Kāda intuīcija? 1695 01:16:43,420 --> 01:16:44,318 Jā. 1696 01:16:44,318 --> 01:16:47,186 STUDENTS: Vai tas joprojām būtu [dzirdams]? 1697 01:16:47,186 --> 01:16:51,180 STUDENTS: Joprojām esiet 7 [dzirdams]. 1698 01:16:51,180 --> 01:16:53,445 DEIVIDS MALANS: Tātad pirmajā piegājienā tas joprojām būtu 7 par 1699 01:16:53,445 --> 01:16:55,710 pirmo pāreju pāri cilvēkiem. 1700 01:16:55,710 --> 01:16:58,470 Jo, lai gan, jā, es apgalvoju, ka šeit ir 0, es nezinu, ka 0 ir 1701 01:16:58,470 --> 01:17:01,230 mazākais, līdz es nokļūstu līdz galam, veicot visus septiņus 1702 01:17:01,230 --> 01:17:03,990 salīdzinājumus. 1703 01:17:03,990 --> 01:17:06,105 Labi, labi, pirmajā piegājienā bija septiņi vai vairāk vispārīgi n 1704 01:17:06,105 --> 01:17:08,220 mīnus 1 soļi. 1705 01:17:08,220 --> 01:17:11,295 Ko darīt, ja es meklēju nākamo mazāko elementu un cilvēki šajā stāstā 1706 01:17:11,295 --> 01:17:14,370 jau ir sakārtoti no 0 līdz 7? 1707 01:17:14,370 --> 01:17:17,580 Nu jā, šeit ir skaitlis 1, un es tos redzu vispirms. 1708 01:17:17,580 --> 01:17:20,055 Bet es nezinu, ka viņi ir mazākie, kamēr es nesalīdzinu ar visiem 1709 01:17:20,055 --> 01:17:22,530 pārējiem, kas nonāk saraksta beigās. 1710 01:17:22,530 --> 01:17:24,238 Un mēs domājam, ak, tas bija muļķīgi. 1711 01:17:24,238 --> 01:17:26,550 Man jau tad rokā bija mazākais cilvēks. 1712 01:17:26,550 --> 01:17:29,100 Un tāpēc šis pseidokods, šī atlases kārtošanas ieviešana ir fiksēta 1713 01:17:29,100 --> 01:17:31,650 šādi. 1714 01:17:31,650 --> 01:17:33,570 Nav neviena īpaša gadījuma, kurā teikts, ka, ja tas jau ir sakārtots, 1715 01:17:33,570 --> 01:17:35,490 pametiet agri. 1716 01:17:35,490 --> 01:17:37,860 Tas vienmēr prasīs n soļus kvadrātā. 1717 01:17:37,860 --> 01:17:41,841 Un tāpēc šajā gadījumā, ja mēs aizņemamies savu žargonu no 1718 01:17:41,841 --> 01:17:45,823 iepriekšējiem, izmantojot omega apzīmējumu, lai būtu skaidrs, atlases 1719 01:17:45,823 --> 01:17:49,805 kārtošana būs arī šajā iemiesojumā omega no n kvadrātā, jo pat 1720 01:17:49,805 --> 01:17:53,786 labākajā gadījumā, kur saraksts jau ir šķirots, jūs tērēsit milzīgu 1721 01:17:53,786 --> 01:17:57,768 laiku, lai pārbaudītu tikpat daudz vai atklātu tik daudz, lai gan 1722 01:17:57,768 --> 01:18:01,750 mēs, cilvēki, to varētu redzēt uzreiz. 1723 01:18:01,750 --> 01:18:05,087 Tātad atlases kārtošanai, šķiet, ir jāveic gan n kvadrātveida soļi 1724 01:18:05,087 --> 01:18:08,425 sliktākajā gadījumā, gan n soļi kvadrātā labākajā gadījumā. 1725 01:18:08,425 --> 01:18:09,300 Un tad zini ko? 1726 01:18:09,300 --> 01:18:11,280 Šim nolūkam mēs varam izmantot mūsu teta terminoloģiju. 1727 01:18:11,280 --> 01:18:14,070 Šeit būtu algoritms, tāpat kā skaitīšana iepriekš, kas vienmēr aizņem 1728 01:18:14,070 --> 01:18:16,861 n soļus kvadrātā neatkarīgi no tā, vai masīvs ir sakārtots vai nav no 1729 01:18:16,861 --> 01:18:19,652 sākuma. 1730 01:18:19,652 --> 01:18:21,360 Labi, cerams, ka mums izdosies labāk. 1731 01:18:21,360 --> 01:18:23,489 Un kāds iepriekš ierosināja šo burbuļu kārtošanu, šķiet, ka tas 1732 01:18:23,489 --> 01:18:25,618 izmanto mazāk soļu. 1733 01:18:25,618 --> 01:18:26,910 Nu, apsvērsim to tālāk. 1734 01:18:26,910 --> 01:18:30,630 Es apgalvoju, ka ar burbuļu šķirošanu mums bija šis pseidokods. 1735 01:18:30,630 --> 01:18:33,780 Tāpēc vispirms pievērsīsimies koda iekšpusei. 1736 01:18:33,780 --> 01:18:36,120 Šeit lejā, ko es darīju? 1737 01:18:36,120 --> 01:18:39,960 i no 0 līdz n mīnus 2. 1738 01:18:39,960 --> 01:18:40,740 Tas ir ziņkārīgi. 1739 01:18:40,740 --> 01:18:42,360 Mēs nekad iepriekš neesam redzējuši n mīnus 2. 1740 01:18:42,360 --> 01:18:44,040 Bet es uzdevu šo jautājumu. 1741 01:18:44,040 --> 01:18:47,100 Ja skaitļu iekava i un skaitļu iekava i plus 1 nav kārtībā, nomainiet 1742 01:18:47,100 --> 01:18:50,160 tos. 1743 01:18:50,160 --> 01:18:51,885 Tas bija tad, kad es norādīju uz mūsu pirmajiem diviem 1744 01:18:51,885 --> 01:18:53,610 brīvprātīgajiem. 1745 01:18:53,610 --> 01:18:57,090 Es redzēju, ka tie nav kārtībā, tāpēc es tos samainīju. 1746 01:18:57,090 --> 01:19:03,380 Kā gan es to daru atkal un atkal līdz n mīnus 2, nevis n mīnus 1, ko 1747 01:19:03,380 --> 01:19:09,670 līdz šim vienmēr esam izmantojuši kā savu vistālāko labo robežu? 1748 01:19:09,670 --> 01:19:14,170 Vai ir kāda intuīcija, kāpēc es to daru no 0 līdz n mīnus 2? 1749 01:19:14,170 --> 01:19:14,700 Jā. 1750 01:19:14,700 --> 01:19:18,540 STUDENTS: [NEdzirdams] numurs, jūs 1751 01:19:14,700 --> 01:19:18,540 nevar tikt vaļā no itā numura. 1752 01:19:18,540 --> 01:19:21,005 Nav neviena labdabīga personāža, ar kuru jūs varētu apmainīties. 1753 01:19:21,005 --> 01:19:21,880 DEIVIDS MALANS: Tieši tā. 1754 01:19:21,880 --> 01:19:26,715 Tā kā es šeit skatos uz i-to personu šajā pseidokodā un i-to plus 1 1755 01:19:26,715 --> 01:19:31,550 personu, es labāk pārliecinos, ka nepārkāpju sava masīva robežas. 1756 01:19:31,550 --> 01:19:33,010 Tātad, ja jūs domājat par manu kreiso roku. 1757 01:19:33,010 --> 01:19:35,790 Kad es šeit atradu muguru pret tevi, norādot uz pašreizējo cilvēku 1758 01:19:35,790 --> 01:19:38,570 pirmajā pozīcijā, mana labā roka šim, ja kondicionieris būtībā rāda 1759 01:19:38,570 --> 01:19:41,350 uz blakus esošo cilvēku. 1760 01:19:41,350 --> 01:19:44,740 Un jūs vēlaties ar kreiso roku atkārtot visus šos cilvēkus. 1761 01:19:44,740 --> 01:19:47,620 Bet jūs nevēlaties, lai jūsu kreisā roka norādītu uz pēdējo personu. 1762 01:19:47,620 --> 01:19:50,000 Jūs vēlaties, lai tas norādītu uz otro līdz pēdējo personu. 1763 01:19:50,000 --> 01:19:54,220 Bet mēs zinām, ka pēdējā persona vienmēr ir pie n mīnus 1. 1764 01:19:54,220 --> 01:19:57,820 Tātad matemātiski no otrā līdz pēdējā persona ir pie n mīnus 2. 1765 01:19:57,820 --> 01:19:58,780 Tātad tas ir smalkums. 1766 01:19:58,780 --> 01:20:00,880 Bet šī ir seģ vaina, kas gaida savu notikumu. 1767 01:20:00,880 --> 01:20:04,525 Ja jūs ieviestu burbuļu kārtošanu, izmantojot n mīnus 1, mana labā 1768 01:20:04,525 --> 01:20:08,170 roka izietu ārpus masīva robežām, tāpēc vienkārši slikti. 1769 01:20:08,170 --> 01:20:10,490 Labi, kāpēc es to saku n-tās reizes? 1770 01:20:10,490 --> 01:20:13,070 Mēs to darījām ļoti organiski ar cilvēkiem. 1771 01:20:13,070 --> 01:20:16,455 Bet katru reizi, kad kāds — katrā piegājienā, ko es izdarīju cauri 1772 01:20:16,455 --> 01:20:19,840 masīvam, kāds uzburbuļoja līdz galam. 1773 01:20:19,840 --> 01:20:22,870 Skaitlis 7, tad numurs 6, tad numurs 5. 1774 01:20:22,870 --> 01:20:26,387 Tātad, ja katrā izejā cauri brīvprātīgo grupai es atrisināju vismaz 1775 01:20:26,387 --> 01:20:29,905 vienu problēmu, šķiet, ka burbuļu kārtošana var vienkārši palaist 1776 01:20:29,905 --> 01:20:33,422 n reizes, lai atrisinātu visas n problēmas, jo pirmajā piegājienā 1777 01:20:33,422 --> 01:20:36,940 tiks ievietots vismaz viens skaitlis. 1778 01:20:36,940 --> 01:20:38,470 Otrā caurlaide, otrais numurs vietā. 1779 01:20:38,470 --> 01:20:39,970 Jums varētu paveicies, un tas darītu vairāk. 1780 01:20:39,970 --> 01:20:41,740 Bet sliktākajā gadījumā šķiet, ka ar to pietiek. 1781 01:20:41,740 --> 01:20:46,240 Vienkārši dariet to akli n reizes, un viņi visi nostāsies rindā. 1782 01:20:46,240 --> 01:20:49,780 Nu, tehniski... labi, tagad mēs ķeramies pie nezālēm. 1783 01:20:49,780 --> 01:20:52,820 Tehniski jūs varat to vienkārši atkārtot mīnus 1 reizēs, jo, ja jūs 1784 01:20:52,820 --> 01:20:55,860 atrisināsit visas n mīnus 1 citas problēmas, un jums paliek 1, 1785 01:20:55,860 --> 01:20:58,900 burtiski šī persona ir tur, kur tai jābūt, tikai loģiski. 1786 01:20:58,900 --> 01:21:00,720 Ja esat jau sakārtojis visu pārējo un jums ir palicis tikai 1, tas 1787 01:21:00,720 --> 01:21:02,540 jau ir uzpūsts. 1788 01:21:02,540 --> 01:21:03,980 Tātad, kā mēs to analizējam? 1789 01:21:03,980 --> 01:21:06,670 Burbuļu veidā mēs varētu darīt kaut ko līdzīgu šim. 1790 01:21:06,670 --> 01:21:11,015 Es būtībā daru n mīnus 1 lietas n mīnus 1 reizes. 1791 01:21:11,015 --> 01:21:12,997 Tagad ļaujiet man atgriezties pie pseidokoda, jo tas ir nedaudz mazāk 1792 01:21:12,997 --> 01:21:14,980 acīmredzams. 1793 01:21:14,980 --> 01:21:18,045 Šeit jūs faktiski varat matemātiski secināt no savas cilpas, cik 1794 01:21:18,045 --> 01:21:21,110 soļus veicat. 1795 01:21:21,110 --> 01:21:22,847 Tātad šī pirmā rinda burtiski saka: atkārtojiet nākamo n mīnus 1 1796 01:21:22,847 --> 01:21:24,585 reizes. 1797 01:21:24,585 --> 01:21:28,240 Tātad mūsu matemātiskā formula ir ļoti vienkārša. 1798 01:21:28,240 --> 01:21:30,190 Dariet kaut ko n mīnus 1 reizi. 1799 01:21:30,190 --> 01:21:33,015 Šī cilpa, tikai tāpēc, ka es izmantoju cilpas terminoloģiju, ir 1800 01:21:33,015 --> 01:21:35,840 ierāmēta nedaudz savādāk. 1801 01:21:35,840 --> 01:21:39,549 Bet, ja jūs atkārtojat no 0 līdz n mīnus 2, jūs atkārtojat kopā n 1802 01:21:39,549 --> 01:21:43,258 mīnus 1 reizes. 1803 01:21:43,258 --> 01:21:45,550 Un atkal aritmētika kļūst mazliet kaitinoša. 1804 01:21:45,550 --> 01:21:48,470 Bet tas tikai nozīmē, ka jāveic šādas darbības n mīnus 1 reizes. 1805 01:21:48,470 --> 01:21:51,670 Tātad izdariet n mīnus 1 lietas n mīnus 1 reizi. 1806 01:21:51,670 --> 01:21:54,440 Tagad mēs varam izpildīt matemātiku šādi. 1807 01:21:54,440 --> 01:21:57,940 Mums ir formula n mīnus 1 reiz n mīnus 1. 1808 01:21:57,940 --> 01:22:00,520 Šeit mēs izmantojam mazo FOIL metodi, n kvadrātā mīnus 1 reizi n, 1809 01:22:00,520 --> 01:22:03,100 mīnus 1 reizi n, plus 1. 1810 01:22:03,100 --> 01:22:06,550 Mēs varam apvienot līdzīgus terminus. 1811 01:22:03,100 --> 01:22:06,550 n kvadrātā mīnus 2n plus 1. 1812 01:22:06,550 --> 01:22:08,725 Bet šajā brīdī, kad n kļūst ļoti liels, par kuru terminu mēs patiešām 1813 01:22:08,725 --> 01:22:10,900 rūpējamies? 1814 01:22:10,900 --> 01:22:13,390 Tas ir pēc pasūtījuma? 1815 01:22:13,390 --> 01:22:14,870 Jā, n kvadrātā. 1816 01:22:14,870 --> 01:22:16,780 Tātad vismaz asimptomotiski. 1817 01:22:16,780 --> 01:22:20,830 Asimptotiski nozīmē, ka n tuvojoties bezgalībai, kļūst patiešām liels. 1818 01:22:20,830 --> 01:22:23,130 Izrādās, ka augšējā robeža atlases kārtošanai un burbuļu kārtošanai 1819 01:22:23,130 --> 01:22:25,430 būtībā ir vienāda. 1820 01:22:25,430 --> 01:22:27,555 Tagad, ja mēs patiešām izvēlētos un salīdzinātu kopējo salīdzinājumu 1821 01:22:27,555 --> 01:22:29,680 skaitu, tie varētu nedaudz atšķirties. 1822 01:22:29,680 --> 01:22:33,015 Taču, godīgi sakot, n kļūst liels, jūs tikko pamanīsit atšķirību 1823 01:22:33,015 --> 01:22:36,350 starp šiem diviem algoritmiem. 1824 01:22:36,350 --> 01:22:39,550 Bet kā ar apakšējo robežu? 1825 01:22:39,550 --> 01:22:42,510 Ja burbuļu kārtošanas augšējā robeža ir arī liela O no n, kā ir ar 1826 01:22:42,510 --> 01:22:45,470 apakšējo robežu? 1827 01:22:45,470 --> 01:22:50,170 Nu, ar šo pseidokodu, kāda būtu burbuļu kārtošanas apakšējā robeža? 1828 01:22:50,170 --> 01:22:53,890 Pat labākajā gadījumā, kad visi brīvprātīgie ir sakārtoti. 1829 01:22:53,890 --> 01:22:56,830 Kāda intuīcija? 1830 01:22:56,830 --> 01:22:57,670 Šajā pseidokodā. 1831 01:22:57,670 --> 01:22:58,538 Jā, pa vidu. 1832 01:22:58,538 --> 01:22:59,830 STUDENTS: Atvainojiet, ātrs jautājums. 1833 01:22:59,830 --> 01:23:02,892 Vai burbuļu kārtošana nav strukturēta tā, lai nebūtu jāsalīdzina 1834 01:23:02,892 --> 01:23:05,955 skaitļi, kas jau ir izveidojušies burbuļos? 1835 01:23:05,955 --> 01:23:07,080 DEIVIDS MALANS: Labs jautājums. 1836 01:23:07,080 --> 01:23:09,970 Vai burbuļu kārtošana nav veidota tā, lai jums nebūtu jāsalīdzina 1837 01:23:09,970 --> 01:23:12,860 skaitļi, kas jau ir uzpeldējuši? 1838 01:23:12,860 --> 01:23:17,000 Tas ir tas, kas notiek šeit pa vidu, netieši. 1839 01:23:17,000 --> 01:23:19,220 Es vienmēr eju no kreisās uz labo pusi. 1840 01:23:19,220 --> 01:23:22,710 Bet atcerieties, ka pat tad, kad es beigās sabojāju un pēdējie divi 1841 01:23:22,710 --> 01:23:26,200 cilvēki nebija kārtībā, man vienmēr ir nepieciešams restartēt sākumā, 1842 01:23:26,200 --> 01:23:29,691 jo lielie skaitļi iet uz šo pusi, bet mazie - uz šo pusi. 1843 01:23:29,691 --> 01:23:32,892 STUDENTS: [NEdzirdams] 1844 01:23:32,892 --> 01:23:34,100 DEIVIDS MALANS: Tātad tā ir taisnība. 1845 01:23:34,100 --> 01:23:37,460 Ir dažas nelielas optimizācijas, kuras es šeit nedaudz noklusēju. 1846 01:23:37,460 --> 01:23:40,700 Ļaujiet man noteikt, ka tas joprojām būtu n kvadrātā. 1847 01:23:40,700 --> 01:23:43,910 Bet tas noteikti samazinātu faktisko darbības laiku. 1848 01:23:43,910 --> 01:23:46,340 Bet ko darīt, ja saraksts jau ir sakārtots? 1849 01:23:46,340 --> 01:23:48,680 Mūsu pseidokodā pašlaik nav pieļaujama iespēja, ja saraksts jau ir 1850 01:23:48,680 --> 01:23:51,020 sakārtots, agri aiziet. 1851 01:23:51,020 --> 01:23:54,000 Tāpēc mēs akli darīsim n mīnus 1 lietas un mīnus 1 reizi, ja vien mēs 1852 01:23:54,000 --> 01:23:56,980 nepārveidosim savu pseidokodu, kā es to darīju verbāli iepriekš, es 1853 01:23:56,980 --> 01:23:59,960 ierosināju šo. 1854 01:23:59,960 --> 01:24:02,599 Šīs ārējās cilpas ietvaros, ja jūs veicat piespēli pāri visiem 1855 01:24:02,599 --> 01:24:05,239 brīvprātīgajiem un jūsu prāta skaitītājs nav veicis mijmaiņas 1856 01:24:05,239 --> 01:24:07,878 darījumus, jums ir jāseko līdzi, izmantojot kādu mainīgo, tad jūs 1857 01:24:07,878 --> 01:24:10,518 varētu arī apstāties. 1858 01:24:10,518 --> 01:24:14,034 Jo, ja jūs veicat visu piespēli un neveicat mijmaiņas darījumus, 1859 01:24:14,034 --> 01:24:17,550 kāpēc jūs tērētu laiku, to darot vēlreiz, gaidot atšķirīgu uzvedību? 1860 01:24:17,550 --> 01:24:22,095 Tāpēc, lai palīdzētu tos vizualizēt, tagad burbuļu kārtošana var būt 1861 01:24:22,095 --> 01:24:26,640 izdevīga, ja dati jau ir sakārtoti vai lielākoties ir sakārtoti. 1862 01:24:26,640 --> 01:24:27,140 Kāpēc? 1863 01:24:27,140 --> 01:24:29,510 Jo tajā ir šī īssavienojuma detaļa. 1864 01:24:29,510 --> 01:24:32,886 Vismaz, ja mēs to īstenojam šādi, kā mēs varam šīs lietas vizualizēt 1865 01:24:32,886 --> 01:24:36,263 mazliet skaidrāk? 1866 01:24:36,263 --> 01:24:37,680 Nu, ļaujiet man iet uz priekšu un darīt to. 1867 01:24:37,680 --> 01:24:40,736 Ļaujiet man parādīt tieši šo algoritmu vizualizāciju, pateicoties 1868 01:24:40,736 --> 01:24:43,793 šeit esošajam trešās puses rīkam, kas mums palīdzēs vizualizēt šos 1869 01:24:43,793 --> 01:24:46,850 kārtošanas algoritmus šādi. 1870 01:24:46,850 --> 01:24:48,740 Mazie stabiņi apzīmē mazus skaitļus. 1871 01:24:48,740 --> 01:24:50,480 Lielas joslas apzīmē lielus skaitļus. 1872 01:24:50,480 --> 01:24:53,661 Tagad ideja ir tāda, ka es šeit nospiežu pogu, lai visus mazos 1873 01:24:53,661 --> 01:24:56,843 stieņus iegūtu šādā veidā, visus lielos stieņus šādā veidā. 1874 01:24:56,843 --> 01:24:58,010 Tātad, tāpat kā mūsu brīvprātīgie. 1875 01:24:58,010 --> 01:25:00,190 Bet tā vietā, lai turētu apgaismotus skaitļus, tie ir stabiņi, kas 1876 01:25:00,190 --> 01:25:02,370 attēlo to lielumu. 1877 01:25:02,370 --> 01:25:07,190 Tātad, turpināsim un sāksim, piemēram, ar atlases kārtošanu. 1878 01:25:07,190 --> 01:25:11,005 Un jūs redzēsiet rozā krāsā, tiek izcelts pašreizējais numurs, kas 1879 01:25:11,005 --> 01:25:14,820 tiek atlasīts un pēc tam pavilkts līdz galam pa kreisi. 1880 01:25:14,820 --> 01:25:16,220 Tātad šis ir atlases veids. 1881 01:25:16,220 --> 01:25:20,420 Un atkal tā ir nākamā mazākā elementa atlase. 1882 01:25:20,420 --> 01:25:23,935 Bet šeit vēl jo redzamāk var redzēt, ka gluži kā manas cilvēka kājas 1883 01:25:23,935 --> 01:25:27,450 mēs speram daudz soļu. 1884 01:25:27,450 --> 01:25:29,940 Tāpat arī šis algoritms pieskaras šiem elementiem atkal un atkal un 1885 01:25:29,940 --> 01:25:32,430 atkal. 1886 01:25:32,430 --> 01:25:34,970 Un tāpēc n kvadrātā tiešām ir lieta. 1887 01:25:34,970 --> 01:25:37,322 Šeit ir jābūt kādai raksturīgai atlaišanai. 1888 01:25:37,322 --> 01:25:38,801 Piemēram, kāpēc mēs atkal un atkal skatāmies uz tiem pašiem sasodītām 1889 01:25:38,801 --> 01:25:40,280 elementiem? 1890 01:25:40,280 --> 01:25:43,070 Mēs to darām, ņemot vērā mūsu pseidokodu, tas ir jādara. 1891 01:25:43,070 --> 01:25:45,926 Bet tieši šie liekie salīdzinājumi izskaidro, kāpēc n kvadrātā 1892 01:25:45,926 --> 01:25:48,782 patiešām ir. 1893 01:25:48,782 --> 01:25:49,490 Tātad tagad tas ir izdarīts. 1894 01:25:49,490 --> 01:25:50,977 Mazie bāri te, lieli bāri tur. 1895 01:25:50,977 --> 01:25:52,813 Un man bija jāturpina runāt, lai nogalinātu laiku, jo tas notiek 1896 01:25:52,813 --> 01:25:54,650 salīdzinoši lēni. 1897 01:25:54,650 --> 01:25:58,640 Ļaujiet man atkārtoti randomizēt masīvu, lai mēs sāktu ar citu secību. 1898 01:25:58,640 --> 01:26:00,380 Un tagad ļaujiet man noklikšķināt uz burbuļu kārtošanas. 1899 01:26:00,380 --> 01:26:03,240 Un jūs redzēsit līdzīgu ideju, bet atšķirīgu algoritmu. 1900 01:26:03,240 --> 01:26:06,617 Tagad divas rozā joslas ir tās divas, kas tiek salīdzinātas un, 1901 01:26:06,617 --> 01:26:09,995 iespējams, labotas, ja tās nav kārtībā. 1902 01:26:09,995 --> 01:26:14,420 Un jau tagad var redzēt, ka lielākie bāri mutuļo augšup uz augšu. 1903 01:26:14,420 --> 01:26:17,193 Bet tagad jūs varat arī redzēt šo atlaišanu, piemēram, mēs atkal un 1904 01:26:17,193 --> 01:26:19,966 atkal lēkājam cauri sarakstam, tāpat kā es turpināju staigāt uz 1905 01:26:19,966 --> 01:26:22,740 priekšu un atpakaļ. 1906 01:26:22,740 --> 01:26:23,795 Un tas ir n kvadrātā. 1907 01:26:23,795 --> 01:26:24,920 Tas nav tik daudz bāru. 1908 01:26:24,920 --> 01:26:25,420 ko? 1909 01:26:25,420 --> 01:26:27,830 10, 20, tur ir kādi 40 vai kaut kas cits, es domāju. 1910 01:26:27,830 --> 01:26:31,560 Tas jau ir diezgan lēns, lai sakārtotu 40 ciparus. 1911 01:26:31,560 --> 01:26:34,310 Un es domāju, ka tas kļūs garlaicīgi, ja es turpināšu par to runāt. 1912 01:26:34,310 --> 01:26:37,590 Tāpēc pieņemsim, ka arī tas notiek salīdzinoši lēni. 1913 01:26:37,590 --> 01:26:40,450 Ja man būtu paveicies un saraksts jau būtu gandrīz sakārtots, burbuļu 1914 01:26:40,450 --> 01:26:43,310 kārtošana būtu bijusi diezgan ātra. 1915 01:26:43,310 --> 01:26:46,040 Bet tas bija patiesi nejaušs masīvs, tāpēc mums nepaveicās. 1916 01:26:46,040 --> 01:26:50,010 Patiešām, vissliktākais varētu būt tas, kas šeit notiek. 1917 01:26:50,010 --> 01:26:52,995 Tāpēc es jūtu, ka tas būs pretklimatisks, piemēram, šķaudīšana, ja 1918 01:26:52,995 --> 01:26:55,980 neļaušu jums redzēt šīs lietas beigas. 1919 01:26:55,980 --> 01:26:57,890 Tā nu lūk. 1920 01:26:57,890 --> 01:27:00,110 Nekas interesants drīzumā nenotiks. 1921 01:27:00,110 --> 01:27:02,330 Gandrīz pabeigts. 1922 01:27:02,330 --> 01:27:03,080 Labi, darīts. 1923 01:27:03,080 --> 01:27:05,890 Labi, tāpēc paldies. 1924 01:27:05,890 --> 01:27:06,710 [APLAUSI] 1925 01:27:06,710 --> 01:27:09,110 Paldies. 1926 01:27:09,110 --> 01:27:12,500 Tomēr joprojām ir nedaudz lēns. 1927 01:27:12,500 --> 01:27:15,800 Kā gan mēs, iespējams, varam būt nedaudz labāki? 1928 01:27:15,800 --> 01:27:19,070 Tāpēc mēs to varam izdarīt, ja ieviešam vēl vienu tehniku. 1929 01:27:19,070 --> 01:27:22,130 Un šī ir ne tik daudz koda funkcija, bet gan koncepcija. 1930 01:27:22,130 --> 01:27:24,815 Un tas ir kaut kas tāds, ko jūs, iespējams, esat redzējis reālajā 1931 01:27:24,815 --> 01:27:27,500 pasaulē, bet varbūt ne tik acīmredzami. 1932 01:27:27,500 --> 01:27:31,235 Tātad izrādās, ka programmēšanā rekursija attiecas uz funkcijas spēju 1933 01:27:31,235 --> 01:27:34,970 sevi izsaukt. 1934 01:27:34,970 --> 01:27:37,930 Matemātikas pasaulē, ja jums ir funkcija f, ja f parādās gan formulas 1935 01:27:37,930 --> 01:27:40,890 kreisajā, gan labajā pusē, tā būtu rekursīva funkcija arī matemātikas 1936 01:27:40,890 --> 01:27:43,850 pasaulē. 1937 01:27:43,850 --> 01:27:47,120 Ikreiz, kad f tiek definēts pats par sevi vai mūsu gadījumā, 1938 01:27:47,120 --> 01:27:50,390 aprēķinot, programmējot, jebkurā laikā, kad funkcija izsauc sevi, šī 1939 01:27:50,390 --> 01:27:53,660 funkcija tiek uzskatīta par rekursīvu. 1940 01:27:53,660 --> 01:27:55,516 Un tas patiesībā ir kaut kas, ko mēs esam redzējuši jau klasē, lai 1941 01:27:55,516 --> 01:27:57,373 gan mēs to nesaucām tik daudz. 1942 01:27:57,373 --> 01:28:02,566 Tā, piemēram, apsveriet šo agrāko pseidokodu, kur šis bija pseidokods 1943 01:28:02,566 --> 01:28:07,760 meklēšanai, izmantojot bināro meklēšanu, veselu virkni durvju. 1944 01:28:07,760 --> 01:28:10,180 Ja durvis nav atstātas, tika atgrieztas nepatiesas, tas bija papildu 1945 01:28:10,180 --> 01:28:12,600 nosacījums, ko pievienojām. 1946 01:28:12,600 --> 01:28:15,326 Bet tad, ja skaitlis aiz vidējām durvīm atgriezās patiess, un šeit ir 1947 01:28:15,326 --> 01:28:18,053 interesantā daļa, ja skaitlis ir mazāks par vidējām durvīm, meklējiet 1948 01:28:18,053 --> 01:28:20,780 kreiso pusi. 1949 01:28:20,780 --> 01:28:22,400 Citādi, ja skaitlis ir lielāks par vidējām durvīm, meklējiet labo 1950 01:28:22,400 --> 01:28:24,020 pusi. 1951 01:28:24,020 --> 01:28:27,800 Šis pseidokods agrāk pats par sevi bija rekursīvs. 1952 01:28:27,800 --> 01:28:28,340 Kāpēc? 1953 01:28:28,340 --> 01:28:30,590 Jo šeit ir meklēšanas algoritms. 1954 01:28:30,590 --> 01:28:32,650 Bet ko mums stāsta algoritms? 1955 01:28:32,650 --> 01:28:37,280 Nu, šajā un šajā rindiņā tas liek mums meklēt kaut ko citu. 1956 01:28:37,280 --> 01:28:40,736 Tātad, lai gan kodā tas nav skaidri definēts kā nosaukums, ja tas ir 1957 01:28:40,736 --> 01:28:44,193 meklēšanas algoritms un tomēr meklēšanas algoritms izmanto meklēšanas 1958 01:28:44,193 --> 01:28:47,650 algoritmu, šis pseidokods ir rekursīvs. 1959 01:28:47,650 --> 01:28:50,530 Tagad tas var ātri ievest jūs nepatikšanās, ja funkcija atkal un 1960 01:28:50,530 --> 01:28:53,410 atkal un atkal izsauc sevi. 1961 01:28:53,410 --> 01:28:57,625 Bet kāpēc intuitīvi nav problemātiski, ka šis kods, šis pseidokods 1962 01:28:57,625 --> 01:29:01,840 sevi sauc? 1963 01:29:01,840 --> 01:29:03,460 Kāpēc algoritms joprojām apstāsies? 1964 01:29:03,460 --> 01:29:03,970 Jā. 1965 01:29:03,970 --> 01:29:07,525 ja nav palikušas durvis, [DZUSMAMS].. 1966 01:29:07,525 --> 01:29:08,400 DEIVIDS MALANS: Tieši tā. 1967 01:29:08,400 --> 01:29:10,860 Tam ir daži izejas nosacījumi, piemēram, ja nav atstātas durvis. 1968 01:29:10,860 --> 01:29:13,990 Un vēl svarīgāk, ikreiz, kad meklējat kreiso pusi, jūs meklējat 1969 01:29:13,990 --> 01:29:17,120 mazāku problēmas versiju. 1970 01:29:17,120 --> 01:29:19,725 Ikreiz, kad meklējat pareizo pusi, jūs meklējat mazāku problēmas 1971 01:29:19,725 --> 01:29:22,330 versiju, burtiski uz pusi mazāku. 1972 01:29:22,330 --> 01:29:24,740 Tāpēc tālruņu katalogā es acīmredzami nevarēju bezgalīgi daudzas 1973 01:29:24,740 --> 01:29:27,150 reizes pārraut tālruņu grāmatu uz pusēm, jo tā burtiski ar katru 1974 01:29:27,150 --> 01:29:29,560 reizi kļuva mazāka. 1975 01:29:29,560 --> 01:29:33,580 Tātad rekursija ir šī spēja saukt sevi, ja vēlaties. 1976 01:29:33,580 --> 01:29:36,390 Bet svarīgi ir tas, ka jūs to darāt ar mazāku, mazāku problēmu, lai 1977 01:29:36,390 --> 01:29:39,200 galu galā jums vairs nebūtu risināmu problēmu vai vairs nebūtu datu, 1978 01:29:39,200 --> 01:29:42,010 vairs nebūtu durvju. 1979 01:29:42,010 --> 01:29:46,210 Tātad šīs divas rindas šeit būtu rekursīvie elementi. 1980 01:29:46,210 --> 01:29:47,950 Bet, ja mēs atgrieztos 0 nedēļā, mēs būtu varējuši izmantot rekursiju 1981 01:29:47,950 --> 01:29:49,690 citā veidā. 1982 01:29:49,690 --> 01:29:53,040 Tātad šis bija mūsu pseidokods tālruņu katalogam 0. nedēļā. 1983 01:29:53,040 --> 01:29:56,045 Un atcerieties, ka mēs šīs dzeltenās līnijas aprakstījām kā cilpu, 1984 01:29:56,045 --> 01:29:59,050 sava veida ciklu atkal un atkal. 1985 01:29:59,050 --> 01:30:01,080 Bet šeit bija palaist garām iespēja. 1986 01:30:01,080 --> 01:30:05,670 Kā būtu, ja es būtu atkārtoti ieviesis šo kodu, lai to izdarītu? 1987 01:30:05,670 --> 01:30:09,282 Tā vietā, lai teiktu atvērt līdz grāmatas kreisās puses vidum un pēc 1988 01:30:09,282 --> 01:30:12,894 tam atgriezties pie 3. rindiņas, piemēram, burtiski izraisīt cilpu, 1989 01:30:12,894 --> 01:30:16,506 vai atvērt grāmatas labās puses vidū un atgriezties 3. rindiņā, 1990 01:30:16,506 --> 01:30:20,118 ierosinot citu cilpu. Vai atpazīstu, ka tas, uz ko es tagad skatos, 1991 01:30:20,118 --> 01:30:23,730 ir algoritms meklēšanai tālruņu grāmatā? 1992 01:30:23,730 --> 01:30:27,240 Un, ja vēlaties meklēt mazākā tālruņu katalogā, piemēram, no A līdz M 1993 01:30:27,240 --> 01:30:30,750 vai N līdz Z, mēs izmantosim to pašu algoritmu. 1994 01:30:30,750 --> 01:30:32,925 Tāpēc es varu šīs dzeltenās līnijas aizstāt tikai ar šo, nejauši 1995 01:30:32,925 --> 01:30:35,100 runājot. 1996 01:30:35,100 --> 01:30:37,282 Meklēt grāmatas kreisajā pusē, meklēt grāmatas labajā pusē. 1997 01:30:37,282 --> 01:30:40,457 Tas būtu netieši, un tagad es varu saīsināt visu, rekursīvu tālruņu 1998 01:30:40,457 --> 01:30:43,633 grāmatas pseidokoda ieviešanu no 0. nedēļas. 1999 01:30:43,633 --> 01:30:46,266 Un tas ir rekursīvs, jo, ja tas ir meklēšanas algoritms un jūs sakāt, 2000 01:30:46,266 --> 01:30:48,900 meklējiet kaut ko citu, tas ir labi. 2001 01:30:48,900 --> 01:30:49,890 Tas ir rekursīvi. 2002 01:30:49,890 --> 01:30:52,800 Bet, tā kā jūs meklējat pusi tālruņu kataloga, tā patiešām kļūs 2003 01:30:52,800 --> 01:30:55,710 mazāka un mazāka. 2004 01:30:55,710 --> 01:30:58,413 Pat reālajā pasaulē vai reālajā virtuālajā pasaulē jūs varat redzēt 2005 01:30:58,413 --> 01:31:01,116 rekursīvas datu struktūras savvaļā vai vismaz Super Mario Brothers kā 2006 01:31:01,116 --> 01:31:03,820 šis. 2007 01:31:03,820 --> 01:31:06,166 Ļaujiet man atbrīvoties no visiem traucējošajiem faktoriem un 2008 01:31:06,166 --> 01:31:08,513 koncentrēties uz šo piramīdu, kur jums ir viens bloks, tad divi, tad 2009 01:31:08,513 --> 01:31:10,860 trīs, tad četri. 2010 01:31:10,860 --> 01:31:13,725 Nu, tas pats par sevi ir tehniski rekursīvi definēts tādā nozīmē, ka, 2011 01:31:13,725 --> 01:31:16,590 nu, kam paredzēta augstuma piramīda? 2012 01:31:16,590 --> 01:31:18,420 Nu, tas tiešām ir, ko? 2013 01:31:18,420 --> 01:31:23,310 Kā jūs raksturotu 4. augstuma piramīdu, kas patiesībā ir tas pats, 2014 01:31:23,310 --> 01:31:28,200 kas piramīda: STUDENTS: 3. augstums. 2015 01:31:28,200 --> 01:31:30,750 DAVID MALAN: --no 3 augstuma, plus 1 papildu slānis. 2016 01:31:30,750 --> 01:31:32,370 Nu, kas ir 3. augstuma piramīda? 2017 01:31:32,370 --> 01:31:36,250 Nu, tehniski tā ir piramīda ar augstumu 2 plus 1 papildu slānis. 2018 01:31:36,250 --> 01:31:38,440 Un tāpēc pat fiziskas struktūras var būt rekursīvas, ja varat tās 2019 01:31:38,440 --> 01:31:40,630 definēt pašas par sevi. 2020 01:31:40,630 --> 01:31:43,360 Tagad kādā brīdī jums jāsaka, ka, ja piramīdas augstums ir 1, tur ir 2021 01:31:43,360 --> 01:31:46,090 tikai viens bloks. 2022 01:31:46,090 --> 01:31:48,265 Jūs nevarat mūžīgi teikt, ka tas ir definēts kā augstums negatīvs 1, 2023 01:31:48,265 --> 01:31:50,440 negatīvs 2, jūs nekad neapstātos. 2024 01:31:50,440 --> 01:31:52,752 Tātad jums ir jābūt īpašam gadījumam. 2025 01:31:52,752 --> 01:31:54,231 Bet ejam uz priekšu un tulkosim kaut ko līdzīgu šim, patiesībā, lai 2026 01:31:54,231 --> 01:31:55,710 kodētu. 2027 01:31:55,710 --> 01:31:59,400 Ļaujiet man atgriezties pie VS koda šeit un ļaujiet man ieviest 2028 01:31:59,400 --> 01:32:03,090 programmu, ko sauc par iterāciju, kas attiecas uz cilpas iterāciju. 2029 01:32:03,090 --> 01:32:05,620 Un ļaujiet man īstenot šādu ļoti vienkāršu piramīdu. 2030 01:32:05,620 --> 01:32:08,370 Tāpēc ļaujiet man iet uz priekšu un iekļaut CS50 bibliotēku. 2031 01:32:08,370 --> 01:32:11,644 Šodien iekļaušu mūsu standarta io.h int main void, bez komandrindas 2032 01:32:11,644 --> 01:32:14,918 argumentiem. 2033 01:32:14,918 --> 01:32:16,210 Un ejam uz priekšu un darīsim to. 2034 01:32:16,210 --> 01:32:18,680 Deklarēsim mainīgo, ko sauc par augstumu, pajautāsim cilvēkam šīs 2035 01:32:18,680 --> 01:32:21,150 piramīdas augstumu. 2036 01:32:21,150 --> 01:32:25,300 Un tad iesim uz priekšu un uzzīmēsim tāda augstuma piramīdu. 2037 01:32:25,300 --> 01:32:27,580 Tagad, protams, izdarīt vēl neeksistē. 2038 01:32:27,580 --> 01:32:30,090 Tāpēc man vajadzēs izgudrot vilkšanas funkciju. 2039 01:32:30,090 --> 01:32:31,635 Ļaujiet man iet uz priekšu un definēt funkciju, kurai nav atgriešanas 2040 01:32:31,635 --> 01:32:33,180 vērtības. 2041 01:32:33,180 --> 01:32:34,722 Tam būs tikai blakusparādības. 2042 01:32:34,722 --> 01:32:37,230 Tas vienkārši drukā ķieģeļus uz ekrāna, ko sauc par zīmēšanu. 2043 01:32:37,230 --> 01:32:40,240 Un tā ievade izmanto veselu skaitli n. 2044 01:32:40,240 --> 01:32:41,950 Un kā es to īstenošu? 2045 01:32:41,950 --> 01:32:44,240 Nu atkal es gribu izdrukāt vienu bloku, tad divus, tad trīs, tad 2046 01:32:44,240 --> 01:32:46,530 četrus. 2047 01:32:46,530 --> 01:32:49,680 Tas ir diezgan vienkārši, vismaz tad, kad esat apmierināts ar cilpām. 2048 01:32:49,680 --> 01:32:51,370 Ļaujiet man atgriezties pie koda šeit. 2049 01:32:51,370 --> 01:32:55,170 Ļaujiet man iet uz priekšu un pateikt 4, int i, get 0. 2050 01:32:55,170 --> 01:32:56,880 i ir mazāks par n. 2051 01:32:56,880 --> 01:32:58,260 es plus plus. 2052 01:32:58,260 --> 01:33:01,170 Un tas atkārtosies, būtībā rindu pēc rindas. 2053 01:33:01,170 --> 01:33:03,615 Un katrā rindā es gribu izdrukāt vienu, tad divus, tad trīs, tad 2054 01:33:03,615 --> 01:33:06,060 četrus ķieģeļus. 2055 01:33:06,060 --> 01:33:08,815 Bet es atkārtoju no 0 līdz 1 līdz 2 līdz 3. 2056 01:33:08,815 --> 01:33:09,690 Tāpēc es domāju, ka tas ir labi. 2057 01:33:09,690 --> 01:33:13,020 Es varu pateikt kaut ko līdzīgu: 4 int j get 0. 2058 01:33:13,020 --> 01:33:17,160 j, būsim gudri šajā jautājumā, ir mazāks par i. 2059 01:33:17,160 --> 01:33:19,380 j++. 2060 01:33:19,380 --> 01:33:23,255 Un tagad ļaujiet man turpināt, un šajā cilpā es domāju, ka varu 2061 01:33:23,255 --> 01:33:27,130 iztikt, izdrukājot tikai vienu jaucējzīmi. 2062 01:33:27,130 --> 01:33:30,025 Bet tad ārpus šīs cilpas, līdzīgi kā pagājušajā nedēļā, es izdrukāšu 2063 01:33:30,025 --> 01:33:32,920 savu jauno rindiņu atsevišķi. 2064 01:33:32,920 --> 01:33:34,470 Tātad sākumā tas ir nedaudz acīmredzams. 2065 01:33:34,470 --> 01:33:36,630 Bet šī ārējā cilpa atkārtojas rindu pēc rindas, rindu pēc rindiņas, 2066 01:33:36,630 --> 01:33:38,790 ja vēlaties. 2067 01:33:38,790 --> 01:33:42,840 Un tad iekšējā cilpa tikai nodrošina, ka tad, kad i ir vienāds ar 2068 01:33:42,840 --> 01:33:46,890 nulli, redzēsim. 2069 01:33:46,890 --> 01:33:48,960 Ak, nē, tur ir kļūda. 2070 01:33:48,960 --> 01:33:52,170 Man ir jāpārliecinās, ka j ir mazāks par i plus 1. 2071 01:33:52,170 --> 01:33:54,885 Tātad, kad manā pirmajā izvades rindā ir 0, es izdrukāšu vienu 2072 01:33:54,885 --> 01:33:57,600 ķieģeli. 2073 01:33:57,600 --> 01:34:02,350 Kad man būs 1, es izdrukāšu divus ķieģeļus un tā tālāk. 2074 01:34:02,350 --> 01:34:05,460 Tāpēc ļaujiet man iet uz priekšu un veikt atkārtojumu. 2075 01:34:05,460 --> 01:34:09,090 Labi, un tagad, šķiet, apkopo. 2076 01:34:09,090 --> 01:34:10,770 Ak, ak. 2077 01:34:10,770 --> 01:34:12,900 Netieša funkcijas zīmēšanas deklarācija. 2078 01:34:12,900 --> 01:34:16,100 Tāpēc es atkal pieļauju pirmajā nedēļā kļūdas. 2079 01:34:16,100 --> 01:34:16,660 ko? 2080 01:34:16,660 --> 01:34:17,570 Saki vēlreiz. 2081 01:34:17,570 --> 01:34:18,450 STUDENTS: [NEdzirdams] 2082 01:34:18,450 --> 01:34:19,200 DEIVIDS MALANS: Jā. 2083 01:34:19,200 --> 01:34:20,320 Trūkst prototipa. 2084 01:34:20,320 --> 01:34:21,300 Es to nedeklarēju augšpusē. 2085 01:34:21,300 --> 01:34:23,415 Tas ir viegli labojams, un vienīgo reizi ir pareizi un nepieciešams 2086 01:34:23,415 --> 01:34:25,530 kopēt ielīmēt. 2087 01:34:25,530 --> 01:34:29,050 Ļaujiet man tur nokopēt funkciju deklarāciju un to ar semikolu. 2088 01:34:29,050 --> 01:34:32,370 Tā ka zvana tagad zina, ka izloze pastāvēs. 2089 01:34:32,370 --> 01:34:33,240 Veiciet iterāciju. 2090 01:34:33,240 --> 01:34:33,930 Tagad tas darbojas. 2091 01:34:33,930 --> 01:34:36,090 Paldies. 2092 01:34:33,930 --> 01:34:37,830 dot slash iterationMēs ierakstīsim kaut ko līdzīgu 4. 2093 01:34:37,830 --> 01:34:40,585 Un tā ir mūsu viena, divu, trīs, četru augstuma piramīda, kas 2094 01:34:40,585 --> 01:34:43,340 izskatās diezgan līdzīga šai, lai gan izmantojot jaucējzīmes. 2095 01:34:43,340 --> 01:34:45,263 Tātad mēs to būtu ieviesuši šādi, piemēram, pirms divām nedēļām 2096 01:34:45,263 --> 01:34:47,186 pirmajā nedēļā, varbūt pagājušajā nedēļā, bet tikai izmantojot 2097 01:34:47,186 --> 01:34:49,110 masīvus. 2098 01:34:49,110 --> 01:34:51,375 Bet ļaujiet man ierosināt, ka tā vietā mēs varētu kaut ko darīt 2099 01:34:51,375 --> 01:34:53,640 rekursīvi. 2100 01:34:53,640 --> 01:34:55,480 Ļaujiet man aizvērt šo koda versiju. 2101 01:34:55,480 --> 01:34:58,640 Un ļaujiet man atgriezties pie VS Code un atvērt recursion.c, lai 2102 01:34:58,640 --> 01:35:01,800 kaut ko rekursīvi parādītu. 2103 01:35:01,800 --> 01:35:04,420 Un es to darīšu nepareizi apzināti pirmajā reizē. 2104 01:35:04,420 --> 01:35:06,630 Tāpēc ļaujiet man iekļaut cs50.h. 2105 01:35:06,630 --> 01:35:08,850 Ļaujiet man iekļaut standarta io.h. 2106 01:35:08,850 --> 01:35:12,000 Ļaujiet man izdarīt galveno tukšumu. 2107 01:35:12,000 --> 01:35:17,910 Un ļaujiet man vienkārši akli uzzīmēt piramīdu, kuras augstums ir 1. 2108 01:35:17,910 --> 01:35:19,910 Bet tagad manā zīmēšanas funkcijā ļaujiet man to ieviest mazliet 2109 01:35:19,910 --> 01:35:21,910 savādāk. 2110 01:35:21,910 --> 01:35:24,840 Tātad mana izlozes funkcija šoreiz joprojām aizņem skaitli n. 2111 01:35:24,840 --> 01:35:26,860 Bet tieši tik daudz jaucēju tas tiks izdrukāts. 2112 01:35:26,860 --> 01:35:30,030 Tātad izdarīsim 4, un es saņemu 0. 2113 01:35:30,030 --> 01:35:32,220 i ir mazāks par n. 2114 01:35:32,220 --> 01:35:34,050 i++. 2115 01:35:34,050 --> 01:35:38,440 Tad ejam uz priekšu un izdrukāsim vienu jaucējzīmi šeit. 2116 01:35:38,440 --> 01:35:44,290 Un tad pēc tam izdrukāsim rindas beigas, tāpat kā iepriekš. 2117 01:35:44,290 --> 01:35:49,770 Bet tagad tas, protams, veidos tikai vienu rindu. 2118 01:35:49,770 --> 01:35:52,260 Tiks izdrukāta viena vai divas jaucējzīmes vai trīs jaucējzīmes, bet 2119 01:35:52,260 --> 01:35:54,750 tikai vienā rindā. 2120 01:35:54,750 --> 01:35:58,560 Ļaujiet man tagad, nepareizi, bet ziņkārīgi pateikt: labi. 2121 01:35:58,560 --> 01:36:01,710 Nu, ja tas uzzīmē piramīdu ar augstumu 1, izmantosim sevi, lai 2122 01:36:01,710 --> 01:36:04,860 uzzīmētu piramīdu ar augstumu n plus 1. 2123 01:36:04,860 --> 01:36:06,615 Tāpēc pirmo reizi, kad es piezvanīšu uz izlozi, tiks izdrukāts viens 2124 01:36:06,615 --> 01:36:08,370 hash. 2125 01:36:08,370 --> 01:36:11,070 Tad otrreiz, kad izsaukšu vilkšanu, tiks izdrukātas divas 2126 01:36:11,070 --> 01:36:13,770 jaucējzīmes, pēc tam trīs, tad četras. 2127 01:36:13,770 --> 01:36:18,000 Tāpēc mēs liekam šos ķieģeļus no augšas uz leju. 2128 01:36:18,000 --> 01:36:20,670 Veiciet rekursiju. 2129 01:36:20,670 --> 01:36:22,420 Oi, es atkal sapucējos. 2130 01:36:22,420 --> 01:36:24,630 Tātad, kopēsim prototipu šeit. 2131 01:36:24,630 --> 01:36:27,260 Noliksim to šeit, semikolu. 2132 01:36:27,260 --> 01:36:28,600 Darīsim to vēlreiz. 2133 01:36:28,600 --> 01:36:30,010 Veiciet rekursiju. 2134 01:36:30,010 --> 01:36:32,410 Labi, labi, punktveida slīpsvītras rekursija. 2135 01:36:32,410 --> 01:36:34,860 Un tagad ļaujiet man palielināt savu termināļa logu, lai jūs varētu 2136 01:36:34,860 --> 01:36:37,310 redzēt vairāk izvades. 2137 01:36:37,310 --> 01:36:39,490 Un šeit mēs esam. 2138 01:36:39,490 --> 01:36:41,480 Labi, slikti, bet paldies. 2139 01:36:41,480 --> 01:36:43,525 Tātad mums ir bezgala augsta piramīda. 2140 01:36:43,525 --> 01:36:47,020 Un tas vienkārši lido pāri ekrānam, tāpēc tas izskatās kā haoss. 2141 01:36:47,020 --> 01:36:51,670 Bet es izdrukāju piramīdu ar augstumu 1, tad 2, un tad 3 un tad 4. 2142 01:36:51,670 --> 01:36:54,231 Un diemžēl, kā man trūkst jebkāda veida ātrā stāvokļa, jebkāda veida 2143 01:36:54,231 --> 01:36:56,792 nosacījuma, kas saka: pagaidi minūti, kad tas ir pārāk garš, 2144 01:36:56,792 --> 01:36:59,353 pārtrauciet pavisam. 2145 01:36:59,353 --> 01:37:00,520 Tātad šī ir bezgalīga cilpa. 2146 01:37:00,520 --> 01:37:01,570 Bet tā nav cilpa. 2147 01:37:01,570 --> 01:37:03,250 Tas ir rekursīvs zvans. 2148 01:37:03,250 --> 01:37:05,780 Un patiesībā to darīt vispār ir ļoti slikti. 2149 01:37:05,780 --> 01:37:08,536 Nākamnedēļ mēs redzēsim, ka, izsaucot funkciju pārāk daudz reižu, jūs 2150 01:37:08,536 --> 01:37:11,293 faktiski var izraisīt vēl vienu no šiem segmentācijas traucējumiem, 2151 01:37:11,293 --> 01:37:14,050 jo būtībā izmantojat pārāk daudz atmiņas. 2152 01:37:14,050 --> 01:37:16,300 Bet pagaidām es to vēl neesmu aktivizējis. 2153 01:37:16,300 --> 01:37:17,927 Control C ir jūsu draugs, kuru atcelt. 2154 01:37:17,927 --> 01:37:20,338 Turklāt, ja jūs spēlējat kopā mājās vai spēlējat ar šo kodu vēlāk, es 2155 01:37:20,338 --> 01:37:22,750 šeit krāpjos. 2156 01:37:22,750 --> 01:37:26,050 Mums ir īpaša zvana konfigurācijas funkcija, kas neļauj jums izsaukt 2157 01:37:26,050 --> 01:37:29,350 šādu funkciju un radīt problēmu. 2158 01:37:29,350 --> 01:37:31,598 Es to pārkāpu tikai demonstrācijas dēļ. 2159 01:37:31,598 --> 01:37:34,640 Bet izredzes ir mājās, jūs pats nevarētu sastādīt šo kodu. 2160 01:37:34,640 --> 01:37:39,050 Bet ļaujiet man veikt pareizu šī koda versiju rekursīvi šādi. 2161 01:37:39,050 --> 01:37:41,870 Ļaujiet man atgriezties pie koda šeit. 2162 01:37:41,870 --> 01:37:44,205 Ļaujiet man iet uz priekšu un ne tikai akli sākt zīmēt vienu, tad 2163 01:37:44,205 --> 01:37:46,540 divus, tad trīs ķieģeļu slāņus. 2164 01:37:46,540 --> 01:37:49,945 Ļaujiet man, tāpat kā iepriekš, norādīt piramīdas augstumu, kādu viņi 2165 01:37:49,945 --> 01:37:53,350 vēlas, izmantojot mūsu get int funkciju. 2166 01:37:53,350 --> 01:37:55,670 Un tagad ļaujiet man atkal izsaukt augstuma vilkšanu. 2167 01:37:55,670 --> 01:37:58,330 Tāpēc tagad es atgriezīšos pie cilpas veida versijas. 2168 01:37:58,330 --> 01:38:01,225 Bet tā vietā, lai tagad izmantotu cilpu, šeit rekursija kļūst diezgan 2169 01:38:01,225 --> 01:38:04,120 eleganta, ja vēlaties. 2170 01:38:04,120 --> 01:38:10,690 Ļaujiet man turpināt un izpildīt un kodēt izlozes funkciju šādi. 2171 01:38:10,690 --> 01:38:14,605 Pēc jūsu definīcijas, ja 4. augstuma piramīda patiešām ir tikai 2172 01:38:14,605 --> 01:38:18,520 3. augstuma piramīda plus vēl viena rinda, tad pieņemsim to burtiski. 2173 01:38:18,520 --> 01:38:19,990 Ļaujiet man atgriezties pie sava koda. 2174 01:38:19,990 --> 01:38:23,120 Un, ja vēlaties uzzīmēt 4. augstuma piramīdu, ejiet tieši uz priekšu 2175 01:38:23,120 --> 01:38:26,250 un vispirms uzzīmējiet piramīdu ar augstumu 3 vai vispārīgāk no n 2176 01:38:26,250 --> 01:38:29,380 mīnus 1. 2177 01:38:29,380 --> 01:38:30,640 Bet kāds ir otrais solis? 2178 01:38:30,640 --> 01:38:34,510 Kad esat uzzīmējis 3. augstuma piramīdu, uzzīmējiet papildu rindu. 2179 01:38:34,510 --> 01:38:37,190 Tāpēc man vismaz šī problēmas daļa ir jāatrisina pašam. 2180 01:38:37,190 --> 01:38:39,310 Tāpēc ļaujiet man darīt, lai es saņemu 0. 2181 01:38:39,310 --> 01:38:41,530 i ir mazāks par n i++. 2182 01:38:41,530 --> 01:38:46,010 Un ļaujiet man, šīs funkcijas programmētājam, izdrukāt jaucējvērtības. 2183 01:38:46,010 --> 01:38:48,180 Un tad pašā apakšā izdrukājiet jaunu rindiņu, lai kursors pārvietotos 2184 01:38:48,180 --> 01:38:50,350 uz nākamo rindiņu. 2185 01:38:50,350 --> 01:38:53,275 Bet tas tagad ir elegants, es uzdrošinos teikt, ka izloze ir 2186 01:38:53,275 --> 01:38:56,200 rekursīva, jo es burtiski tulkoju no angļu valodas uz C kodu, šī 2187 01:38:56,200 --> 01:38:59,125 ideja, ka 4. augstuma piramīda patiesībā ir tikai 3. augstuma 2188 01:38:59,125 --> 01:39:02,050 piramīda. 2189 01:39:02,050 --> 01:39:03,640 Tāpēc es to daru vispirms. 2190 01:39:03,640 --> 01:39:06,560 Un es ticu, ka tas darbosies. 2191 01:39:06,560 --> 01:39:09,800 Tad man tikai jāuzliek vēl viena ķieģeļu kārta, četras no tām. 2192 01:39:09,800 --> 01:39:12,660 Tātad, ja n ir 4, šī ir tikai vienkārša cilpa, a la nedēļa 1, kas 2193 01:39:12,660 --> 01:39:15,520 izdrukās papildu slāni. 2194 01:39:15,520 --> 01:39:18,610 Bet tas, protams, galu galā būs problemātiski. 2195 01:39:18,610 --> 01:39:20,030 Kāpēc? 2196 01:39:20,030 --> 01:39:22,670 Tas vēl nav izdarīts, šī programma. 2197 01:39:22,670 --> 01:39:27,644 Cik reižu šajā modelī sevi piezvanīs zīmēšana? 2198 01:39:27,644 --> 01:39:28,640 STUDENTS: Tas ir bezgalīgi. 2199 01:39:28,640 --> 01:39:30,098 DEIVIDS MALANS: Bezgala daudz reižu. 2200 01:39:30,098 --> 01:39:30,814 Kāpēc? 2201 01:39:30,814 --> 01:39:34,170 STUDENTS: Jo nav atmest funkcijas. 2202 01:39:34,170 --> 01:39:36,450 DEIVIDS MALANS: Jā, nav līdzvērtīga atmešanai. 2203 01:39:36,450 --> 01:39:38,750 Piemēram, ja esat jau pietiekami drukājis, tad pametiet, kā mēs to 2204 01:39:38,750 --> 01:39:41,050 tveram? 2205 01:39:41,050 --> 01:39:43,320 Nu, es nedomāju, ka mēs vēlamies, lai tas būtu negatīvs. 2206 01:39:43,320 --> 01:39:46,570 Nebūtu jēgas zīmēt negatīvu augstuma piramīdu. 2207 01:39:46,570 --> 01:39:50,110 Tāpēc es domāju, ka mēs kā programmētājs varam vienkārši izvilkt 2208 01:39:50,110 --> 01:39:53,650 vienkāršu gadījumu, vieglu atbildi, tā saukto pamata gadījumu. 2209 01:39:53,650 --> 01:39:54,900 Un es tikai to darīšu. 2210 01:39:54,900 --> 01:39:58,865 Manas zīmēšanas funkcijas augšdaļā ļaujiet man vienkārši pateikt: ja 2211 01:39:58,865 --> 01:40:02,830 n ir mazāks par vai, velns, mazāks vai vienāds ar 0, tas arī viss. 2212 01:40:02,830 --> 01:40:04,530 Iet uz priekšu un vienkārši atgriezieties. 2213 01:40:04,530 --> 01:40:06,030 Vairs nav ko darīt. 2214 01:40:06,030 --> 01:40:09,660 Un šis vienkāršais nosacījums, kas tehniski pazīstams kā bāzes 2215 01:40:09,660 --> 01:40:13,290 gadījums, nodrošinās, ka kods nedarbosies mūžīgi. 2216 01:40:13,290 --> 01:40:13,860 Kāpēc? 2217 01:40:13,860 --> 01:40:17,730 Pieņemsim, ka izloze tiek izsaukta ar argumentu 4. 2218 01:40:17,730 --> 01:40:20,580 4, protams, nav mazāks par 0, tāpēc mēs neatgriežamies. 2219 01:40:20,580 --> 01:40:22,590 Bet mēs zīmējam piramīdu ar augstumu 3. 2220 01:40:22,590 --> 01:40:24,870 Un šeit lietas kļūst nedaudz garīgi sarežģītas. 2221 01:40:24,870 --> 01:40:28,320 Jūs nepāriet uz 20. rindu, kamēr nav izsaukta izloze. 2222 01:40:28,320 --> 01:40:31,275 Tātad, kad draw tiek izsaukts ar argumentu 3, tas ir tā, it kā jūs 2223 01:40:31,275 --> 01:40:34,230 atkal izpildītu no šīs funkcijas augšdaļas. 2224 01:40:34,230 --> 01:40:35,520 3 nav mazāks par 0. 2225 01:40:35,520 --> 01:40:36,330 Tātad, ko jūs darāt? 2226 01:40:36,330 --> 01:40:38,490 Jūs uzzīmējat 2. 2227 01:40:38,490 --> 01:40:39,540 Kā jūs uzzīmējat 2? 2228 01:40:39,540 --> 01:40:41,950 Nu, 2 nav mazāks par 0, tāpēc jūs neatgriežaties. 2229 01:40:41,950 --> 01:40:43,050 Tātad jūs uzzīmējat 1. 2230 01:40:43,050 --> 01:40:44,370 Šeit jābūt uzmanīgiem. 2231 01:40:44,370 --> 01:40:45,240 Izloze 1. 2232 01:40:45,240 --> 01:40:47,340 Un tagad mēs atgriežamies pie sākuma. 2233 01:40:47,340 --> 01:40:48,090 Kā jūs uzzīmējat 1? 2234 01:40:48,090 --> 01:40:50,430 Nu, 1 nav mazāks par 0, tāpēc jūs neatgriežaties. 2235 01:40:50,430 --> 01:40:53,400 Jūs uzzīmējat augstumu 0. 2236 01:40:53,400 --> 01:40:54,510 Kā jūs uzzīmējat 0 augstumu? 2237 01:40:54,510 --> 01:40:55,110 Pagaidiet minūti. 2238 01:40:55,110 --> 01:40:57,660 0 ir mazāks vai vienāds ar 0. 2239 01:40:57,660 --> 01:40:58,980 Un tu atgriezies. 2240 01:40:58,980 --> 01:41:02,100 Un tāpēc tas ir kā šis garīgais kaudze, šis darāmo darbu saraksts. 2241 01:41:02,100 --> 01:41:04,957 Jūs turpināt atlikt, izpildīt šīs apakšējās koda rindas, jo jūs 2242 01:41:04,957 --> 01:41:07,815 pastāvīgi restartējat, restartējat, restartējat zīmēšanas funkciju, 2243 01:41:07,815 --> 01:41:10,672 līdz beidzot kāds no šiem funkciju izsaukumiem saka, ka nav ko darīt, 2244 01:41:10,672 --> 01:41:13,530 atgriezieties. 2245 01:41:13,530 --> 01:41:16,530 Un tagad visa lieta sāk atšķetināt, ja vēlaties. 2246 01:41:16,530 --> 01:41:18,330 Un jūs atsākat no vietas, kur pārtraucāt. 2247 01:41:18,330 --> 01:41:20,300 Un tas, iespējams, ir labākais scenārijs. 2248 01:41:20,300 --> 01:41:21,300 Mēs to nedarīsim klasē. 2249 01:41:21,300 --> 01:41:24,693 Bet, ja vēlaties to atrisināt pats, izmantojot debug50, lai turpinātu 2250 01:41:24,693 --> 01:41:28,086 ieiet, ieiet, ieiet katrā no šīm līnijām, loģiski, jūs redzēsit, kas 2251 01:41:28,086 --> 01:41:31,480 patiesībā notiek. 2252 01:41:31,480 --> 01:41:34,610 Tāpēc ļaujiet man doties uz savu termināli un veikt rekursiju, kas 2253 01:41:34,610 --> 01:41:37,740 tagad ir šī pareizā koda versija, punktveida slīpsvītras rekursija. 2254 01:41:37,740 --> 01:41:39,240 Ievadīsim augstumu 4. 2255 01:41:39,240 --> 01:41:42,130 Un voila, tagad mums ir tā pati piramīda, neizmantojot iterāciju per 2256 01:41:42,130 --> 01:41:45,020 se, lai gan, protams, mēs izmantojam iterāciju, lai drukātu papildu 2257 01:41:45,020 --> 01:41:47,910 slāni. 2258 01:41:47,910 --> 01:41:51,515 Tagad mēs rekursīvi izmantojam zīmēšanu, lai drukātu visas mazākās 2259 01:41:51,515 --> 01:41:55,120 piramīdas, kurām jābūt pirms tās. 2260 01:41:55,120 --> 01:41:57,370 STUDENTS: Vai jūs varat izmantot rekursiju tikai tukšuma funkcijai? 2261 01:41:57,370 --> 01:41:58,123 [NEdzirdams] 2262 01:41:58,123 --> 01:41:58,790 DEIVIDS MALANS: Nē. 2263 01:41:58,790 --> 01:42:01,070 Jautājums ir, vai rekursiju var izmantot tikai ar tukšuma funkciju? 2264 01:42:01,070 --> 01:42:01,920 Nē, nemaz. 2265 01:42:01,920 --> 01:42:05,066 Faktiski ļoti bieži tiek izmantota atgriešanas vērtība, piemēram, 2266 01:42:05,066 --> 01:42:08,213 vesels skaitlis vai kaut kas cits, lai jūs varētu kaut ko 2267 01:42:08,213 --> 01:42:11,360 konstruktīvi paveikt ar šo faktisko vērtību. 2268 01:42:11,360 --> 01:42:13,190 Citi jautājumi par šo. 2269 01:42:13,190 --> 01:42:15,290 STUDENTS: Kad tiek izpildīta 21. rinda? 2270 01:42:15,290 --> 01:42:16,790 DEIVIDS MALANS: Sakiet to nedaudz skaļāk. 2271 01:42:16,790 --> 01:42:18,770 STUDENTS: Kad tiek izpildīta 21. rinda? 2272 01:42:18,770 --> 01:42:20,850 DEIVIDS Malans: Kad tiek izpildīta 21. rindiņa? 2273 01:42:20,850 --> 01:42:23,725 Tātad, ja turpināsiet, ļaujiet man ritināt vēl mazliet uz leju, lai 2274 01:42:23,725 --> 01:42:26,600 jūs varētu redzēt koda augšdaļu. 2275 01:42:26,600 --> 01:42:35,310 Tātad 21. rinda tiks izpildīta, tiklīdz 19. rinda tiks izpildīta pati. 2276 01:42:35,310 --> 01:42:38,050 Tagad stāstā, ko es stāstīju, mēs turpinājām saukt vēlreiz, vēlreiz, 2277 01:42:38,050 --> 01:42:40,790 vēlreiz. 2278 01:42:40,790 --> 01:42:44,650 Bet, tiklīdz nekavējoties atgriežas kāds no funkciju izsaukumiem, kur 2279 01:42:44,650 --> 01:42:48,510 n ir 0, mēs neturpinām zīmēt atkal un atkal. 2280 01:42:48,510 --> 01:42:52,107 Tātad, ja jūs domājat par procesu kā atpakaļgaitu, tad turpiniet 21. 2281 01:42:52,107 --> 01:42:55,705 rindu, pēc tam vēlreiz 21. rindu, tad atkal 21. rindu un kā loģikas 2282 01:42:55,705 --> 01:42:59,303 atšķetināšana. 2283 01:42:59,303 --> 01:43:01,416 Un nākamnedēļ mēs patiesībā uzzīmēsim priekšstatu par to, kas 2284 01:43:01,416 --> 01:43:03,530 patiesībā notiek datora atmiņā. 2285 01:43:03,530 --> 01:43:07,950 Bet pagaidām tas ir tikai ļoti līdzīgs tālruņu kataloga pseidokodam. 2286 01:43:07,950 --> 01:43:09,680 Jūs tikai meklējat atkal un atkal. 2287 01:43:09,680 --> 01:43:14,408 Bet jūs gaidāt līdz pašām beigām, lai atgūtu gala rezultātu. 2288 01:43:14,408 --> 01:43:16,619 Google tagad, ko es šodien nejaušības dēļ pieminu, protams, ir pilns 2289 01:43:16,619 --> 01:43:18,830 ar programmētājiem. 2290 01:43:18,830 --> 01:43:20,600 Šeit ir jautrs vingrinājums. 2291 01:43:20,600 --> 01:43:23,432 Ļaujiet man atgriezties pārlūkprogrammā. 2292 01:43:23,432 --> 01:43:25,706 Es iešu uz priekšu un meklēju rekursiju, jo vēlos kaut ko uzzināt par 2293 01:43:25,706 --> 01:43:27,980 rekursiju. 2294 01:43:27,980 --> 01:43:30,230 Šeit ir sava veida interneta mēms vai joks. 2295 01:43:30,230 --> 01:43:35,360 Ja es šeit pietuvinu, Google inženieri ir smieklīgi. 2296 01:43:35,360 --> 01:43:37,902 Redzi, kāpēc? 2297 01:43:37,902 --> 01:43:38,798 STUDENTS: Ak. 2298 01:43:38,798 --> 01:43:40,540 DEIVIDS MALANS: Ak, lūk. 2299 01:43:40,540 --> 01:43:41,740 Jā. 2300 01:43:41,740 --> 01:43:43,030 Jā, tā ir rekursija. 2301 01:43:43,030 --> 01:43:46,240 Un tagad būs tik daudz mēmu, ar kurām jūs saskarsities, piemēram, ja 2302 01:43:46,240 --> 01:43:49,450 kādreiz esat pavērsis kameru pret televizoru, kas rāda kameru, un 2303 01:43:49,450 --> 01:43:52,660 atkal un atkal redzat sevi vai attēlu, tas tiešām ir. rekursija. 2304 01:43:52,660 --> 01:43:54,490 Un tādā gadījumā tas apstājas tikai tad, kad nokļūstat viena pikseļa 2305 01:43:54,490 --> 01:43:56,320 pamata korpusā. 2306 01:43:56,320 --> 01:43:59,100 Bet tas ir ļoti smieklīgs joks dažās aprindās, kad runa ir par 2307 01:43:59,100 --> 01:44:01,880 rekursiju un Google. 2308 01:44:01,880 --> 01:44:04,965 Tātad, kā mēs varam faktiski izmantot Google vai, pareizāk sakot, kā 2309 01:44:04,965 --> 01:44:08,050 mēs varam faktiski izmantot rekursiju konstruktīvi? 2310 01:44:08,050 --> 01:44:12,460 Ļaujiet man ierosināt, ka mēs faktiski ieviesām trešo un pēdējo 2311 01:44:12,460 --> 01:44:16,870 šķirošanas algoritmu, kas, cerams, darbojas labāk nekā divi līdz šim. 2312 01:44:16,870 --> 01:44:19,480 Mēs esam veikuši atlases kārtošanu un burbuļu kārtošanu. 2313 01:44:19,480 --> 01:44:21,850 Bubble sort, mums patika nedaudz labāk, vismaz tiktāl, cik labākajā 2314 01:44:21,850 --> 01:44:24,220 gadījumā saraksts jau ir sakārtots. 2315 01:44:24,220 --> 01:44:27,355 Bubble sort ir vismaz gudrāks, un tas faktiski beigsies agri, 2316 01:44:27,355 --> 01:44:30,490 sniedzot mums labāku apakšējo robežu mūsu omega apzīmējuma ziņā. 2317 01:44:30,490 --> 01:44:33,370 Bet izrādās, ka rekursija, un tā ne vienmēr ir rekursijas iezīme, bet 2318 01:44:33,370 --> 01:44:36,250 gan kaut kas, ko mēs tagad varam izmantot. 2319 01:44:36,250 --> 01:44:39,440 Izrādās, izmantojot rekursiju, mēs varam izmantot principiāli 2320 01:44:39,440 --> 01:44:42,630 atšķirīgu pieeju, lai sakārtotu veselu skaitļu gūzmu tā, lai mēs 2321 01:44:42,630 --> 01:44:45,820 varētu veikt daudz mazāk salīdzinājumu un ideālā gadījumā paātrināt 2322 01:44:45,820 --> 01:44:49,010 gala rezultātus. 2323 01:44:49,010 --> 01:44:51,510 Tātad šeit ir pseidokods tam, ko mēs gatavojamies redzēt kaut kam, ko 2324 01:44:51,510 --> 01:44:54,010 sauc par sapludināšanas kārtošanu. 2325 01:44:54,010 --> 01:44:56,230 Un tas tiešām ir tik īss. 2326 01:44:56,230 --> 01:44:58,330 Kārtojiet skaitļu kreiso pusi. 2327 01:44:58,330 --> 01:45:00,550 Kārtojiet skaitļu labo pusi. 2328 01:45:00,550 --> 01:45:02,950 Apvienojiet sakārtotās pusītes. 2329 01:45:02,950 --> 01:45:05,620 Tas ir gandrīz muļķīgi, jo, ja jums tiek prasīts kārtošanas 2330 01:45:05,620 --> 01:45:08,290 algoritms, un jūs atbildat ar, labi, kārtojiet kreiso pusi, kārtojiet 2331 01:45:08,290 --> 01:45:10,960 labo pusi. 2332 01:45:10,960 --> 01:45:14,230 Tas ir grūti, jo es prasu šķirošanas algoritmu. 2333 01:45:14,230 --> 01:45:16,897 Jūs man tikai sakāt, lai sakārtoju kreiso pusi un labo pusi. 2334 01:45:16,897 --> 01:45:19,328 Taču šajā pēdējā rindā sapludināšana ir diezgan spēcīga šāda veida 2335 01:45:19,328 --> 01:45:21,760 iezīme. 2336 01:45:21,760 --> 01:45:23,908 Tagad mums ir nepieciešams vēl viens bāzes gadījums augšpusē. 2337 01:45:23,908 --> 01:45:24,700 Tāpēc ļaujiet man pievienot šo. 2338 01:45:24,700 --> 01:45:27,253 Ja mēs atrodam sev sarakstu, masīvu, kura izmērs ir 1, tad šis masīvs 2339 01:45:27,253 --> 01:45:29,807 acīmredzami ir sakārtots. 2340 01:45:29,807 --> 01:45:32,390 Ja tajā ir tikai viens elements, nekas nav jādara. 2341 01:45:32,390 --> 01:45:33,890 Tātad tas būs mūsu bāzes gadījums. 2342 01:45:33,890 --> 01:45:37,395 Bet tagad ļaujot mums tikai šajās, četrās, sešās pseidokoda rindās 2343 01:45:37,395 --> 01:45:40,900 faktiski sakārtot dažus elementus. 2344 01:45:40,900 --> 01:45:43,652 Bet vispirms pievērsīsimies tikai šī apakškopai. 2345 01:45:43,652 --> 01:45:46,360 Uz brīdi padomāsim, ko nozīmē sašķirotu pusīšu sapludināšana. 2346 01:45:46,360 --> 01:45:48,265 Tāpēc Kārters ir brīnišķīgi nācis pie brīvprātīgā darba, lai 2347 01:45:48,265 --> 01:45:50,170 palīdzētu mums atiestatīt šos skaitļus. 2348 01:45:50,170 --> 01:45:53,095 Pieņemsim, ka stāsta vidū, ko mēs gatavojamies stāstīt, mums ir divas 2349 01:45:53,095 --> 01:45:56,020 sakārtotas puses. 2350 01:45:56,020 --> 01:45:58,825 Es jau esmu sakārtojis šo skaitļu kreiso pusi, un tiešām, 2, 4, 5, 7 2351 01:45:58,825 --> 01:46:01,630 ir sakārtoti no mazākā uz lielāko. 2352 01:46:01,630 --> 01:46:06,100 Un labā puse, šķiet, jau ir sakārtota, 0, 1, 3, 6, jau sakārtota. 2353 01:46:06,100 --> 01:46:08,365 Tātad manā pseidokodā mēs jau esam pabeiguši šķirot kreiso pusi un 2354 01:46:08,365 --> 01:46:10,630 labo pusi. 2355 01:46:10,630 --> 01:46:12,160 Bet pēc brīža redzēsim, kā būs. 2356 01:46:12,160 --> 01:46:14,980 Nu, kā es varu apvienot šīs divas puses? 2357 01:46:14,980 --> 01:46:17,545 Tā kā tie jau ir sakārtoti un jūs vēlaties tos apvienot secībā, es 2358 01:46:17,545 --> 01:46:20,110 domāju, ka mēs varam apgriezties uz leju. 2359 01:46:20,110 --> 01:46:22,570 Mēs varam paslēpt visus skaitļus, izņemot pirmos, katrā no šiem 2360 01:46:22,570 --> 01:46:25,030 apakšsarakstiem. 2361 01:46:25,030 --> 01:46:28,125 Šeit mums ir puse, kas sākas ar 2. 2362 01:46:28,125 --> 01:46:30,092 Un man ir vienalga, kādi ir citi skaitļi, jo tie nepārprotami ir 2363 01:46:30,092 --> 01:46:32,060 lielāki par 2. 2364 01:46:32,060 --> 01:46:35,043 Es varu koncentrēties tikai uz 2 un arī 0, arī 0. 2365 01:46:35,043 --> 01:46:37,168 Mēs zinām, ka 0 ir mazākais, tāpēc ignorēsim skaitļus, kurus Kārters 2366 01:46:37,168 --> 01:46:39,293 laipni pagrieza uz leju. 2367 01:46:39,293 --> 01:46:41,826 Tātad, kā apvienot šos divus sarakstus jaunā sakārtotā lielākā 2368 01:46:41,826 --> 01:46:44,360 sarakstā? 2369 01:46:44,360 --> 01:46:47,415 Es salīdzinu divus kreisajā pusē esošus ar 0 labajā pusē, protams, 2370 01:46:47,415 --> 01:46:50,470 kas ir pirmais, 0. 2371 01:46:50,470 --> 01:46:51,963 Tāpēc ļaujiet man to nolikt šeit. 2372 01:46:51,963 --> 01:46:54,130 Un Kārter, ja vēlaties dot mums nākamo elementu. 2373 01:46:54,130 --> 01:46:55,960 Tagad man ir divas sakārtotas pusītes. 2374 01:46:55,960 --> 01:46:57,650 Bet vienu jau esmu noplūkusi. 2375 01:46:57,650 --> 01:47:00,010 Tāpēc tagad es salīdzinu abus ar 1. 2376 01:47:00,010 --> 01:47:01,580 1 acīmredzot nāk nākamais. 2377 01:47:01,580 --> 01:47:04,843 Tāpēc es izņemšu 1 un ievietošu to šeit. 2378 01:47:04,843 --> 01:47:06,760 Tagad es atkal salīdzināšu abas puses. 2379 01:47:06,760 --> 01:47:08,830 2 un 3, kuru apvienot vispirms? 2380 01:47:08,830 --> 01:47:10,660 Acīmredzot nākamais nāk 2. 2381 01:47:10,660 --> 01:47:12,940 Un tagad ievērojiet, ka katru reizi, kad es to daru, manas rokas 2382 01:47:12,940 --> 01:47:15,220 teorētiski virzās uz priekšu. 2383 01:47:15,220 --> 01:47:17,755 Es nedublēju atpakaļ, kā turpināju darīt ar atlases kārtošanu vai 2384 01:47:17,755 --> 01:47:20,290 burbuļu kārtošanu, uz priekšu un atpakaļ, uz priekšu un atpakaļ. 2385 01:47:20,290 --> 01:47:24,310 Mani pirksti pastāvīgi virzās uz priekšu, un tā būs galvenā detaļa. 2386 01:47:24,310 --> 01:47:27,340 Tāpēc es acīmredzami salīdzinu 4 un 3, 3. 2387 01:47:27,340 --> 01:47:32,560 Es acīmredzami salīdzinu 4 un 6, 4. 2388 01:47:32,560 --> 01:47:36,520 Es acīmredzami salīdzinu 5 un 6, 5. 2389 01:47:36,520 --> 01:47:40,810 Un tad es salīdzinu 7 un 6, protams. 2390 01:47:40,810 --> 01:47:43,000 Un, visbeidzot, mums ir palicis tikai viens elements. 2391 01:47:43,000 --> 01:47:45,580 Un, lai gan es kā cilvēks pārvietojos neveikli, manas rokas tehniski 2392 01:47:45,580 --> 01:47:48,160 virzījās tikai pa labi. 2393 01:47:48,160 --> 01:47:51,130 Es nekad neatgriezos kaut ko darot atkal un atkal. 2394 01:47:51,130 --> 01:47:54,430 Un tā, iespējams, ir intuīcija, un tikai pietiekami daudz vietas 7. 2395 01:47:54,430 --> 01:47:58,210 Tādā veidā jūs apvienotu divas sakārtotas daļas. 2396 01:47:58,210 --> 01:48:00,610 Mēs sākām ar kreiso pusi sakārtotu, labo pusi sakārtotu. 2397 01:48:00,610 --> 01:48:02,860 Un saplūšana ir tāpat kā tas, ko jūs darītu kā cilvēks. 2398 01:48:02,860 --> 01:48:05,740 Un Kārters vienkārši pagrieza skaitļus uz leju, tāpēc mēs 2399 01:48:05,740 --> 01:48:08,620 koncentrējāmies tikai uz mazākajiem elementiem katrā. 2400 01:48:08,620 --> 01:48:12,870 Vai jums ir kādi jautājumi, pirms mēs turpinām runāt par to, ko tad 2401 01:48:12,870 --> 01:48:17,120 nozīmē apvienoties šādā veidā? 2402 01:48:17,120 --> 01:48:18,777 Tātad tagad šeit ir oriģināls saraksts. 2403 01:48:18,777 --> 01:48:20,628 Mēs apzināti to ievietojām augšpusē, jo ir viena sapludināšanas 2404 01:48:20,628 --> 01:48:22,480 detaļa, kas ir galvenā. 2405 01:48:22,480 --> 01:48:25,490 Sapludināšanas kārtošana tehniski aizņems nedaudz vairāk vietas. 2406 01:48:25,490 --> 01:48:27,696 Un tā, lai gan iepriekš mēs vienkārši pārvietojām savus cilvēkus un 2407 01:48:27,696 --> 01:48:29,903 mainījām cilvēkus un pārliecinājāmies, ka viņi galu galā paliek 2408 01:48:29,903 --> 01:48:32,110 sākotnējā pozīcijā. 2409 01:48:32,110 --> 01:48:34,405 Izmantojot sapludināšanas kārtošanu, izliekas, ka šeit ir mūsu 2410 01:48:34,405 --> 01:48:36,700 sākotnējais atmiņas masīvs. 2411 01:48:36,700 --> 01:48:38,970 Man būs nepieciešams vismaz viens cits atmiņas masīvs. 2412 01:48:38,970 --> 01:48:41,160 Un es krāpšos, un es izmantošu vēl vairāk atmiņas. 2413 01:48:41,160 --> 01:48:43,350 Bet tehniski es faktiski varētu iet uz priekšu un atpakaļ starp 1 2414 01:48:43,350 --> 01:48:45,540 masīvu un sekundāro masīvu. 2415 01:48:45,540 --> 01:48:48,370 Bet tas man aizņems vairāk vietas. 2416 01:48:48,370 --> 01:48:53,130 Tātad, kā šajā kodā ieviest sapludināšanas kārtošanu? 2417 01:48:53,130 --> 01:48:54,930 Nu, ņemsim vērā šo. 2418 01:48:54,930 --> 01:48:57,060 Šeit ir 8 izmēra masīvs. 2419 01:48:57,060 --> 01:48:59,590 Ja izstājas tikai viens numurs, tas acīmredzami nav piemērojams. 2420 01:48:59,590 --> 01:49:01,230 Tāpēc koncentrēsimies uz sulīgo daļu. 2421 01:49:01,230 --> 01:49:02,880 Kārtojiet skaitļu kreiso pusi. 2422 01:49:02,880 --> 01:49:05,130 Labi, kā sakārtot skaitļu kreiso pusi? 2423 01:49:05,130 --> 01:49:09,240 Es vienkārši pagrūdīšu tos, lai būtu skaidrs, kas ir kreisā puse. 2424 01:49:09,240 --> 01:49:11,850 Šeit tagad ir 4. izmēra apakšsaraksts. 2425 01:49:11,850 --> 01:49:14,860 Kā kārtot kreiso pusi? 2426 01:49:14,860 --> 01:49:17,380 Nu, vai man ir algoritms šķirošanai? 2427 01:49:17,380 --> 01:49:18,430 Jā, ko man darīt? 2428 01:49:18,430 --> 01:49:19,492 Šeit ir 4. izmēra saraksts. 2429 01:49:19,492 --> 01:49:20,200 Kā to kārtot? 2430 01:49:20,200 --> 01:49:22,000 Kas ir pirmais solis? 2431 01:49:22,000 --> 01:49:23,330 Kārtojiet kreiso pusi. 2432 01:49:23,330 --> 01:49:25,695 Tāpēc es tagad savā prātā konceptuāli izmantoju šo 4. izmēra 2433 01:49:25,695 --> 01:49:28,060 apakšsarakstu. 2434 01:49:28,060 --> 01:49:30,400 Un es to sakārtoju, vispirms šķirojot kreiso pusi, tagad 2435 01:49:30,400 --> 01:49:32,740 koncentrējoties uz 7. un 2. 2436 01:49:32,740 --> 01:49:34,330 Labi, šeit ir 2. izmēra saraksts. 2437 01:49:34,330 --> 01:49:37,060 Kā kārtot 2. izmēra sarakstu? 2438 01:49:37,060 --> 01:49:38,740 STUDENTS: [NEdzirdams] 2439 01:49:38,740 --> 01:49:40,170 DEIVIDS MALANS: Atvainojiet? 2440 01:49:40,170 --> 01:49:42,360 Es domāju, ka mēs vienkārši turpinām sekot mūsu norādījumiem. 2441 01:49:42,360 --> 01:49:43,650 Kārtojiet kreiso pusi. 2442 01:49:43,650 --> 01:49:45,630 Labi, šeit ir 1. izmēra saraksts. 2443 01:49:45,630 --> 01:49:48,417 Kā kārtot 1. izmēra sarakstu? 2444 01:49:48,417 --> 01:49:49,803 STUDENTS: [NEdzirdams] 2445 01:49:49,803 --> 01:49:50,720 DEIVIDS MALANS: Esmu pabeidzis. 2446 01:49:50,720 --> 01:49:51,360 Tas ir izdarīts. 2447 01:49:51,360 --> 01:49:52,740 Tāpēc es atstāju šo mierā. 2448 01:49:52,740 --> 01:49:54,740 Kāds bija stāsta nākamais solis? 2449 01:49:54,740 --> 01:49:58,160 Es tikko sakārtoju kreiso pusi no kreisās puses. 2450 01:49:58,160 --> 01:49:59,580 Kas būs tālāk? 2451 01:49:59,580 --> 01:50:02,920 Es šķiroju labo pusi no kreisās puses kreisās puses, un esmu 2452 01:50:02,920 --> 01:50:06,260 pabeidzis, jo tas ir tikai 1. izmēra saraksts. 2453 01:50:06,260 --> 01:50:09,280 Kas nāk pēc šī? 2454 01:50:09,280 --> 01:50:09,972 Apvienot. 2455 01:50:09,972 --> 01:50:13,079 Šeit tas kļūst nedaudz trausls, jo jums ir jāatceras, kur mēs 2456 01:50:13,079 --> 01:50:16,187 pārtraucam stāstu, lai darītu lietas rekursīvi atkal un atkal. 2457 01:50:16,187 --> 01:50:18,538 Bet, ja es tikko sakārtoju kreiso pusi un tikko sakārtoju labo pusi, 2458 01:50:18,538 --> 01:50:20,890 tagad es tās apvienoju. 2459 01:50:20,890 --> 01:50:22,965 Šis ir ļoti īss saraksts, tāpēc mums nav vajadzīga Kārtera palīdzība 2460 01:50:22,965 --> 01:50:25,040 kā iepriekš. 2461 01:50:25,040 --> 01:50:27,640 Bet es domāju, ka pirmais skaitlis, ko es šeit paņemu, ir 2. 2462 01:50:27,640 --> 01:50:31,660 Un tad otrais skaitlis, ko es paņemu, jo tā ir vienīgā iespēja, ir 7. 2463 01:50:31,660 --> 01:50:35,965 Bet tagad patīkami ir tas, ka, ievērojiet, kreisā puse patiešām ir 2464 01:50:35,965 --> 01:50:40,270 sakārtota, jo es triviāli sakārtoju tās kreiso pusi un labo pusi. 2465 01:50:40,270 --> 01:50:42,760 Bet tad saplūšana patiešām ir vieta, kur notiek burvība. 2466 01:50:42,760 --> 01:50:47,030 Labi, vēlreiz, ja jūs domājat attīt atpakaļ, ja es tikko sakārtoju 2467 01:50:47,030 --> 01:50:51,300 kreiso pusi no kreisās puses, kas notiks tālāk? 2468 01:50:51,300 --> 01:50:55,000 Kārtojiet labo pusi no kreisās puses. 2469 01:50:55,000 --> 01:50:56,980 Tātad atkal jūs kaut kā attāties laikā. 2470 01:50:56,980 --> 01:50:58,290 Tātad, kā to izdarīt? 2471 01:50:58,290 --> 01:50:59,520 Man ir 2. izmēra saraksts. 2472 01:50:59,520 --> 01:51:01,920 Es šķiroju kreiso pusi, tikai 5, pabeigta. 2473 01:51:01,920 --> 01:51:04,200 Kārtot labo pusi, 4, gatavs. 2474 01:51:04,200 --> 01:51:07,790 Tagad interesantā daļa, es sapludinu kreiso pusi un labo pusi no 2475 01:51:07,790 --> 01:51:11,380 kreisās puses labās puses. 2476 01:51:11,380 --> 01:51:12,450 Tātad, ko man darīt? 2477 01:51:12,450 --> 01:51:14,280 4 nāk šeit. 2478 01:51:14,280 --> 01:51:16,260 5 nāk šeit. 2479 01:51:16,260 --> 01:51:19,860 Un tagad ievērojiet, kas man ir. 2480 01:51:19,860 --> 01:51:21,600 Kreisā puse ir sakārtota. 2481 01:51:21,600 --> 01:51:23,130 Labā puse ir sakārtota. 2482 01:51:23,130 --> 01:51:26,610 Ja attīt laiku atpakaļ, kur ir mans nākamais solis, 3? 2483 01:51:26,610 --> 01:51:27,742 Apvienojiet abas puses. 2484 01:51:27,742 --> 01:51:29,700 Un tas ir tas, ko Kārters man palīdzēja darīt iepriekš. 2485 01:51:29,700 --> 01:51:31,182 Koncentrēsimies tikai uz mazākajiem elementiem, lai būtu mazāka 2486 01:51:31,182 --> 01:51:32,665 uzmanības novēršana. 2487 01:51:32,665 --> 01:51:34,020 Es salīdzinu 2 un 4. 2488 01:51:34,020 --> 01:51:36,520 2 ir pirmajā vietā, tāpēc, protams, liksim to šeit. 2489 01:51:36,520 --> 01:51:38,900 Tagad es salīdzinu šī saraksta jauno sākumu un šī saraksta veco 2490 01:51:38,900 --> 01:51:41,280 sākumu. 2491 01:51:41,280 --> 01:51:43,050 4 acīmredzot nāk nākamais. 2492 01:51:43,050 --> 01:51:45,940 Un tagad es salīdzinu 7 ar 5. 2493 01:51:45,940 --> 01:51:47,430 5 acīmredzot nāk nākamais. 2494 01:51:47,430 --> 01:51:49,240 Un tagad, visbeidzot, man ir palicis viens numurs. 2495 01:51:49,240 --> 01:51:50,970 Tāpēc tagad esmu nokļuvis 7. 2496 01:51:50,970 --> 01:51:53,400 Tātad, pat ja jūs esat pazaudējis dažas no niansēm šeit, ja jūs 2497 01:51:53,400 --> 01:51:55,830 vienkārši sperat soli atpakaļ, sākotnējā labā puse joprojām ir 2498 01:51:55,830 --> 01:51:58,260 neskarta. 2499 01:51:58,260 --> 01:52:01,820 Bet sākotnējās ievades kreisā puse tagad patiešām ir sakārtota, 2500 01:52:01,820 --> 01:52:05,380 kārtojot kreiso pusi, labo pusi, kreiso pusi, labo pusi, bet ar šiem 2501 01:52:05,380 --> 01:52:08,940 sapludinājumiem starp tiem. 2502 01:52:08,940 --> 01:52:11,265 Labi, tādēļ, ja esam tikko sakārtojuši kreiso pusi, mēs attīsim 2503 01:52:11,265 --> 01:52:13,590 atpakaļ līdz sākumam. 2504 01:52:13,590 --> 01:52:15,590 Ko man tagad darīt? 2505 01:52:15,590 --> 01:52:17,120 Labi, kārtojiet labo pusi. 2506 01:52:17,120 --> 01:52:18,410 Tātad kārtojiet labo pusi. 2507 01:52:18,410 --> 01:52:20,180 Kā kārtot 4. izmēra sarakstu? 2508 01:52:20,180 --> 01:52:22,550 Vispirms es šķiroju kreiso pusi, 1. un 6. 2509 01:52:22,550 --> 01:52:24,560 Kā kārtot 2. izmēra sarakstu? 2510 01:52:24,560 --> 01:52:26,757 Jūs kārtojat kreiso pusi, tikai numuru 1. 2511 01:52:26,757 --> 01:52:28,340 Acīmredzot nav ko darīt. 2512 01:52:28,340 --> 01:52:30,620 Gatavs, sakārtojot kreiso pusi. 2513 01:52:30,620 --> 01:52:33,080 6, darīts, šķirojot labo pusi. 2514 01:52:33,080 --> 01:52:34,280 Ko man darīt? 2515 01:52:34,280 --> 01:52:40,610 Es sapludinu kreiso pusi šeit ar labo pusi šeit. 2516 01:52:40,610 --> 01:52:42,240 Un tas ir diezgan vienkārši. 2517 01:52:42,240 --> 01:52:43,050 Ko man darīt? 2518 01:52:43,050 --> 01:52:43,910 Es tikko apvienojos. 2519 01:52:43,910 --> 01:52:45,048 Tāpēc tagad es to šķiroju. 2520 01:52:45,048 --> 01:52:47,090 Es tikko sakārtoju kreiso pusi no labās puses. 2521 01:52:47,090 --> 01:52:49,550 Tāpēc tagad es šķiroju labās puses labo pusi. 2522 01:52:49,550 --> 01:52:51,590 Tāpēc es uzskatu, ka 0 ir gatavs. 2523 01:52:51,590 --> 01:52:53,270 Es uzskatu, ka 3 ir pabeigts. 2524 01:52:53,270 --> 01:52:55,040 Tagad es apvienoju šos divus kopā. 2525 01:52:55,040 --> 01:52:56,640 0, protams, ir pirmajā vietā. 2526 01:52:56,640 --> 01:52:58,100 Tad nāk 3. 2527 01:52:58,100 --> 01:53:01,505 Un tagad es esmu tajā stāsta punktā, kur esmu sakārtojis labās puses 2528 01:53:01,505 --> 01:53:04,910 kreiso pusi un labās puses labo pusi. 2529 01:53:04,910 --> 01:53:07,535 Tātad 3. darbība ir sapludināšana. 2530 01:53:07,535 --> 01:53:09,410 Un es darīšu to vēlreiz, kā mēs to darījām ar Kārteru. 2531 01:53:09,410 --> 01:53:12,320 Labi, 1 un 0, protams, 0 ir pirmais. 2532 01:53:12,320 --> 01:53:14,390 Tagad salīdziniet 1. un 3. 2533 01:53:14,390 --> 01:53:16,130 Acīmredzot pirmais ir pirmais. 2534 01:53:16,130 --> 01:53:18,590 Salīdziniet 6 un 3, protams, 3. 2535 01:53:18,590 --> 01:53:20,300 Un tad visbeidzot, 6. 2536 01:53:20,300 --> 01:53:21,890 Tātad, kur mēs esam tagad? 2537 01:53:21,890 --> 01:53:26,840 Mēs esam paņēmuši visas lietas kreiso pusi un sakārtojuši to. 2538 01:53:26,840 --> 01:53:29,990 Pēc tam mēs paņēmām visas lietas labo pusi un sakārtojām to. 2539 01:53:29,990 --> 01:53:33,560 Tātad tagad mēs pēdējo reizi esam pie 3. darbības. 2540 01:53:33,560 --> 01:53:35,120 Ko mēs darām? 2541 01:53:35,120 --> 01:53:35,780 Apvienot. 2542 01:53:35,780 --> 01:53:38,000 Un tāpēc, lai būtu konsekvence, ļaujiet man tos pazemināt un 2543 01:53:38,000 --> 01:53:40,220 salīdzināt. 2544 01:53:40,220 --> 01:53:42,725 Kreisā vai labā roka, pamanot, ka viņi tikai progresē uz priekšu, 2545 01:53:42,725 --> 01:53:45,230 neviens no šiem turp un atpakaļ salīdzinājumiem. 2546 01:53:45,230 --> 01:53:47,270 2 un 0, protams, 0. 2547 01:53:47,270 --> 01:53:48,860 Tāpēc mēs to noliksim vietā. 2548 01:53:48,860 --> 01:53:51,140 2 un 1, protams, 1. 2549 01:53:51,140 --> 01:53:52,880 Tāpēc mēs to ievietojām vietā. 2550 01:53:52,880 --> 01:53:56,930 2 un 3, mēs, protams, šajā gadījumā apvienojam 2. 2551 01:53:56,930 --> 01:54:00,770 4 un 3, šajā gadījumā mēs tagad apvienojam 3. 2552 01:54:00,770 --> 01:54:05,630 4 un 6, mēs tagad, protams, apvienojam 4 vietā. 2553 01:54:05,630 --> 01:54:07,760 Un tagad mēs salīdzinām 5. un 6. 2554 01:54:07,760 --> 01:54:08,615 Mēs paturam 5. 2555 01:54:12,590 --> 01:54:15,226 Kļūda. 2556 01:54:15,226 --> 01:54:17,295 Labi, izliecieties, ka 5 ir ieslēgts. 2557 01:54:20,040 --> 01:54:21,450 Ak, tāpēc. 2558 01:54:21,450 --> 01:54:24,240 Labi, tāpēc tagad mēs salīdzinām 7 un 6. 2559 01:54:24,240 --> 01:54:26,430 6. ir pazudis. 2560 01:54:26,430 --> 01:54:29,520 Un visbeidzot, 7 ir pēdējais vietā. 2561 01:54:29,520 --> 01:54:32,865 Un, lai gan es to pieļauju no visiem algoritmiem, tas, iespējams, ir 2562 01:54:32,865 --> 01:54:36,210 visgrūtāk sekot līdzi, it īpaši, ja es to daru kā balsi. 2563 01:54:36,210 --> 01:54:38,610 Saprotiet, ka tas, ko mēs tikko esam paveikuši, ir tikai šie trīs 2564 01:54:38,610 --> 01:54:41,010 soļi, rekursīvi. 2565 01:54:41,010 --> 01:54:42,510 Mēs sākām ar 8. izmēra sarakstu. 2566 01:54:42,510 --> 01:54:43,650 Mēs sakārtojām kreiso pusi. 2567 01:54:43,650 --> 01:54:44,790 Mēs sakārtojām labo pusi. 2568 01:54:44,790 --> 01:54:46,450 Un tad mēs apvienojam abus kopā. 2569 01:54:46,450 --> 01:54:49,290 Bet, ja jūs ejat uz leju katrā no šīm trušu bedrēm, tā sakot, kreisās 2570 01:54:49,290 --> 01:54:52,130 puses šķirošana ietver kreisās puses kreisās puses šķirošanu un 2571 01:54:52,130 --> 01:54:54,970 kreisās puses labās puses šķirošanu, un tā tālāk. 2572 01:54:54,970 --> 01:54:57,486 Bet šis idejas dīglis par patiesu problēmas sadalīšanu un 2573 01:54:57,486 --> 01:55:00,003 pārvarēšanu, nevis tā, ka jums ir problēma un jātiek galā tikai ar 2574 01:55:00,003 --> 01:55:02,520 vienu pusi. 2575 01:55:02,520 --> 01:55:05,150 Skaidrs, ka mēs šķirojam vienu pusi un otru pusi un galu galā tās 2576 01:55:05,150 --> 01:55:07,780 apvienojam. 2577 01:55:07,780 --> 01:55:10,810 Tas joprojām mūs noved pie tā paša risinājuma. 2578 01:55:10,810 --> 01:55:13,976 Un, ja mēs tagad vizualizējam šīs paliekas, ja es to attēloju šādi, 2579 01:55:13,976 --> 01:55:17,143 kur šeit ekrānā jūs redzat, kur skaitļi sākotnēji sākās augšējā rindā 2580 01:55:17,143 --> 01:55:20,310 no kreisās uz labo. 2581 01:55:20,310 --> 01:55:24,509 Būtībā, lai gan tas ir citā secībā, es galu galā sadalīju šo 2582 01:55:24,509 --> 01:55:28,708 8. izmēra sarakstu astoņos 1. izmēra sarakstos. 2583 01:55:28,708 --> 01:55:30,644 Un šeit sākās pamatgadījums un vienkārši teica: Labi, mēs esam 2584 01:55:30,644 --> 01:55:32,580 pabeiguši šķirošanu. 2585 01:55:32,580 --> 01:55:37,080 Un pēc tam, loģiski, es apvienoju divus 1. izmēra sarakstus daudzos 2586 01:55:37,080 --> 01:55:41,580 2. izmēra sarakstos un 2. izmēra sarakstus 4. izmēra sarakstos. 2587 01:55:41,580 --> 01:55:44,415 Un tad visbeidzot 4. izmēra saraksts vienā lielā sarakstā, kas 2588 01:55:44,415 --> 01:55:47,250 sakārtots pēc 8. izmēra. 2589 01:55:47,250 --> 01:55:51,435 Un tāpēc es izliku šo attēlu ar mazajiem līniju indikatoriem, jo cik 2590 01:55:51,435 --> 01:55:55,620 reizes es dalīju, dalīju, dalīju uz pusēm? 2591 01:55:55,620 --> 01:55:57,360 Vai tiešām dubultā, dubultā, dubultā. 2592 01:55:57,360 --> 01:56:00,600 Tātad eksponents ir pretējs - spoileris. 2593 01:56:00,600 --> 01:56:02,610 Cik reizes es sadalīju? 2594 01:56:02,610 --> 01:56:04,320 Tātad trīs, konkrēti. 2595 01:56:04,320 --> 01:56:08,310 Bet, ja kopā ir astoņi elementi un vispārīgāk ir n, tas tiešām ir 2596 01:56:08,310 --> 01:56:12,300 jautājums par log n reižu sadalīšanu un iekarošanu. 2597 01:56:12,300 --> 01:56:13,830 Jūs sākat to un varat dalīt vienu, divas, trīs reizes, reģistrēties n 2598 01:56:13,830 --> 01:56:15,360 reizes. 2599 01:56:15,360 --> 01:56:18,210 Vai otrādi, jūs varat sākt šeit un eksponenciāli dubultot, dubultot, 2600 01:56:18,210 --> 01:56:21,060 dubultot trīs reizes, kas ir log n. 2601 01:56:21,060 --> 01:56:24,420 Bet katrā rindā, katrā plauktā, burtiski, es sacēlu traci par to, ka 2602 01:56:24,420 --> 01:56:27,780 rādīju rokas tikai no kreisās uz labo pusi, nepārtraukti virzot tās 2603 01:56:27,780 --> 01:56:31,140 uz priekšu, tā ka katru reizi, kad veicu šos sapludināšanu, es 2604 01:56:31,140 --> 01:56:34,500 pieskāros katram elementam vienreiz un tikai vienu reizi. 2605 01:56:34,500 --> 01:56:37,470 Uz skatuves nebija nekā tāda turp un atpakaļ, šurpu turpu. 2606 01:56:37,470 --> 01:56:43,440 Tātad, ja es kaut ko daru log n reizes vai, ja es daru, n lietas log 2607 01:56:43,440 --> 01:56:49,410 n reizes, kāda būtu mūsu lielā O formula, iespējams? 2608 01:56:49,410 --> 01:56:51,057 n lietas reģistrētas n reizes? 2609 01:56:51,057 --> 01:56:52,140 STUDENTS: Ak, tas ir n log n. 2610 01:56:52,140 --> 01:56:53,490 DEIVIDS MALANS: Jā, tātad n log n. 2611 01:56:53,490 --> 01:56:56,025 Faktiski n log n secība ir tāda, kā mēs aprakstītu sapludināšanas 2612 01:56:56,025 --> 01:56:58,560 kārtošanas darbības laiku. 2613 01:56:58,560 --> 01:57:01,582 Un tā no visiem līdzšinējiem veidiem, mēs esam redzējuši, ka 2614 01:57:01,582 --> 01:57:04,605 sapludināšanas kārtošana šeit faktiski ir n log n, kas ir noteikti 2615 01:57:04,605 --> 01:57:07,627 labāka nekā n kvadrātā, kur ir gan atlases kārtošana, gan burbuļu 2616 01:57:07,627 --> 01:57:10,650 kārtošana. 2617 01:57:10,650 --> 01:57:14,015 Bet tas ir arī lēnāks nekā, piemēram, lineārā meklēšana. 2618 01:57:14,015 --> 01:57:15,390 Bet jūs drīzāk to sagaidīsit. 2619 01:57:15,390 --> 01:57:18,530 Ja jums ir daudz jāstrādā, lai sakārtotu dažus elementus, nevis tikai 2620 01:57:18,530 --> 01:57:21,670 tos meklētu, jums būs jāpieliek lielākas pūles. 2621 01:57:21,670 --> 01:57:24,555 Un tāpēc jautājums par to, vai jums vajadzētu kaut ko akli meklēt, 2622 01:57:24,555 --> 01:57:27,441 izmantojot lineāro meklēšanu, un netraucēt to šķirot, patiešām ir 2623 01:57:27,441 --> 01:57:30,327 saistīts ar to, vai jūs varat atļauties tērēt tik daudz laika? 2624 01:57:30,327 --> 01:57:32,748 Un, ja esat pasaules Google, pastāv iespēja, ka nevēlaties katru 2625 01:57:32,748 --> 01:57:35,170 reizi veikt meklēšanu viņu datubāzē lineāri. 2626 01:57:35,170 --> 01:57:35,670 Kāpēc? 2627 01:57:35,670 --> 01:57:38,363 Jo jūs varat to kārtot vienreiz un pēc tam gūt labumu miljoniem, 2628 01:57:38,363 --> 01:57:41,056 miljardiem cilvēku, pēc tam izmantojot kaut ko līdzīgu binārajai 2629 01:57:41,056 --> 01:57:43,749 meklēšanai vai, atklāti sakot, praksē kaut ko vēl skaistāku un ātrāku 2630 01:57:43,749 --> 01:57:46,443 par bināro meklēšanu. 2631 01:57:46,443 --> 01:57:48,360 Bet vienmēr būs šis kompromiss. 2632 01:57:48,360 --> 01:57:52,140 Bināro meklēšanu var veikt tikai tad, ja elementi ir sakārtoti. 2633 01:57:52,140 --> 01:57:53,940 Cik tev izmaksā to šķirošana? 2634 01:57:53,940 --> 01:57:56,940 Varbūt n kvadrātā, ja izmantojāt kādu no iepriekšējiem algoritmiem. 2635 01:57:56,940 --> 01:58:00,850 Bet izrādās, arī pieteikšanās ir diezgan ātra. 2636 01:58:00,850 --> 01:58:06,180 Tātad dienas beigās šie darbības laiki ietver kompromisus. 2637 01:58:06,180 --> 01:58:09,135 Un patiešām, 2. sapludināšanas kārtojumā, man jāatzīmē, ka 2638 01:58:09,135 --> 01:58:12,090 sapludināšanas kārtošanas apakšējā robeža arī būs n log n omega. 2639 01:58:12,090 --> 01:58:15,060 Tādējādi mēs to varam aprakstīt ar mūsu teta apzīmējumu, sakot, ka 2640 01:58:15,060 --> 01:58:18,030 sapludināšanas kārtošana patiešām ir n log n teta. 2641 01:58:18,030 --> 01:58:21,030 Tātad vispārīgi runājot, iespējams, labāk ir izmantot kaut ko līdzīgu 2642 01:58:21,030 --> 01:58:24,030 sapludināšanas kārtošanai vai kādu citu algoritmu, kas ir n log n. 2643 01:58:24,030 --> 01:58:26,115 Praksē lielākā daļa programmētāju paši neievieš šos šķirošanas 2644 01:58:26,115 --> 01:58:28,200 algoritmus. 2645 01:58:28,200 --> 01:58:31,200 Iespējams, viņi izmanto bibliotēku no plaukta, kas paši ir pieņēmuši 2646 01:58:31,200 --> 01:58:34,200 lēmumu par to, kuru no šiem algoritmiem darīt. 2647 01:58:34,200 --> 01:58:37,050 Bet vispārīgi runājot, un tagad mēs to redzam pirmo reizi, ja 2648 01:58:37,050 --> 01:58:39,900 vēlaties uzlabot laiku, piemēram, izmantot mazāk laika, rakstīt 2649 01:58:39,900 --> 01:58:42,750 ātrāku kodu, jums ir jāmaksā cena. 2650 01:58:42,750 --> 01:58:45,915 Un tas varētu būt jūsu cilvēciskais laiks, taču jums ir nepieciešams 2651 01:58:45,915 --> 01:58:49,080 vairāk laika, lai iekodētu kaut ko sarežģītāku, grūtāk īstenojamu. 2652 01:58:49,080 --> 01:58:51,840 Vai arī jums ir jāpavada kaut kas līdzīgs telpai. 2653 01:58:51,840 --> 01:58:53,790 Kā liecina šie plaukti, arī tā ir viena no galvenajām sapludināšanas 2654 01:58:53,790 --> 01:58:55,740 detaļām. 2655 01:58:55,740 --> 01:58:58,500 Jūs nevarat vienkārši nomainīt elementus savās vietās. 2656 01:58:58,500 --> 01:59:01,230 Vajag vismaz palīgmasīvu, lai, veicot sapludināšanu, būtu kur tos 2657 01:59:01,230 --> 01:59:03,960 likt. 2658 01:59:03,960 --> 01:59:05,988 Un tas ir pārmērīgi liels atmiņas apjoms. 2659 01:59:05,988 --> 01:59:07,509 Es būtu varējis iet uz priekšu un atpakaļ starp augšējo plauktu un 2660 01:59:07,509 --> 01:59:09,030 apakšējo plauktu. 2661 01:59:09,030 --> 01:59:11,113 Bet ir nedaudz interesantāk iet no augšas uz leju. 2662 01:59:11,113 --> 01:59:12,870 Bet jums ir nepieciešams vairāk vietas. 2663 01:59:12,870 --> 01:59:15,605 Toreiz, pirms gadu desmitiem, telpa bija patiešām dārga. 2664 01:59:15,605 --> 01:59:16,480 Un tad zini ko? 2665 01:59:16,480 --> 01:59:19,855 Iespējams, būtu bijis labāk neizmantot sapludināšanas kārtošanu, 2666 01:59:19,855 --> 01:59:23,230 burbuļu kārtošanu vai atlases kārtošanu vai kādu citu algoritmu. 2667 01:59:23,230 --> 01:59:25,300 Mūsdienās telpa ir salīdzinoši lēta. 2668 01:59:25,300 --> 01:59:27,160 Un tāpēc tie ir pieņemamāki kompromisi. 2669 01:59:27,160 --> 01:59:29,650 Bet tas ir pilnībā atkarīgs no lietojumprogrammas. 2670 01:59:29,650 --> 01:59:32,050 Pēdējā lieta, ko mēs domājām darīt, ir parādīt dažu šo šķirošanas 2671 01:59:32,050 --> 01:59:34,450 algoritmu faktisku salīdzinājumu. 2672 01:59:34,450 --> 01:59:35,800 Tas ir apmēram 60 sekundes garš. 2673 01:59:35,800 --> 01:59:40,037 Un tas salīdzinās jums, atlases kārtošanu, burbuļu kārtošanu un 2674 01:59:40,037 --> 01:59:44,275 sapludināšanu, vienlaikus ar kādu jautru šķirošanas mūziku, parādot, 2675 01:59:44,275 --> 01:59:48,512 ko patiesībā nozīmē būt O no n kvadrātā vai vēl labāk lielam O no n 2676 01:59:48,512 --> 01:59:52,750 log n. . 2677 01:59:52,750 --> 01:59:54,850 Augšpusē atlase. 2678 01:59:54,850 --> 01:59:58,050 Burbulis apakšā. 2679 01:59:58,050 --> 01:59:59,400 Apvienojiet vidū. 2680 01:59:59,400 --> 02:00:01,885 [MŪZIKA ATSKAŅOTĀS] 2681 02:00:53,660 --> 02:00:55,700 Labi, tas ir paredzēts CS50. 2682 02:00:55,700 --> 02:00:57,910 Tiksimies nākamreiz.