1 00:00:00,000 --> 00:00:03,346 >> [Mūzikas atskaņošanai] 2 00:00:03,346 --> 00:00:05,258 3 00:00:05,258 --> 00:00:06,220 >> Doug LLOYD: Nu labi. 4 00:00:06,220 --> 00:00:08,140 Tātad binārā meklēšana ir algoritmu mēs varam izmantot 5 00:00:08,140 --> 00:00:10,530 atrast elementu iekšpusē masīva. 6 00:00:10,530 --> 00:00:14,710 Atšķirībā no lineārās meklēšanu, tas prasa īpašs nosacījums jāizpilda iepriekš, 7 00:00:14,710 --> 00:00:19,020 bet tas ir tik daudz efektīvāka, ja šis nosacījums ir, faktiski, met. 8 00:00:19,020 --> 00:00:20,470 >> Tātad, kāda ir ideja šeit? 9 00:00:20,470 --> 00:00:21,780 tas ir skaldi un valdi. 10 00:00:21,780 --> 00:00:25,100 Mēs vēlamies, lai samazinātu izmēru meklēšanas platība uz pusi katru reizi 11 00:00:25,100 --> 00:00:27,240 , lai atrastu mērķa numuru. 12 00:00:27,240 --> 00:00:29,520 Tas ir, ja šis nosacījums sāk spēlēt, though. 13 00:00:29,520 --> 00:00:32,740 Mēs varam tikai palielinātu jaudu novēršot puse no elementiem 14 00:00:32,740 --> 00:00:36,070 pat apskatot viņiem ja masīvs ir sakārtots. 15 00:00:36,070 --> 00:00:39,200 >> Ja tas ir pilnīgs mix up, mēs varam ne tikai no rokām 16 00:00:39,200 --> 00:00:42,870 atbrīvoties puse no elementiem, jo mēs nezinām, ko mēs izmetot. 17 00:00:42,870 --> 00:00:45,624 Bet, ja masīvs ir sakārtots, mēs varam darīt, jo mēs 18 00:00:45,624 --> 00:00:48,040 zinu, ka viss uz pa kreisi no tā, kur mēs šobrīd esam 19 00:00:48,040 --> 00:00:50,500 nedrīkst būt zemāka par vērtība šobrīd mēs esam. 20 00:00:50,500 --> 00:00:52,300 Un viss uz tiesības, ja mēs esam 21 00:00:52,300 --> 00:00:55,040 ir lielāka nekā vērtība mēs pašlaik meklē. 22 00:00:55,040 --> 00:00:58,710 >> Tātad, kāda ir pseudocode soļi bināro meklēšanu? 23 00:00:58,710 --> 00:01:02,310 Mēs atkārtot šo procesu, līdz masīvs vai, kā mēs turpinātu cauri, 24 00:01:02,310 --> 00:01:07,740 sub bloki, mazāki gabali oriģināls masīvs, ir lielums 0. 25 00:01:07,740 --> 00:01:10,960 Aprēķināt viduspunktu Pašreizējās sub masīvs. 26 00:01:10,960 --> 00:01:14,460 >> Ja vērtība jūs meklējat ir šajā masīva elementa, apstāties. 27 00:01:14,460 --> 00:01:15,030 Jums atrast to. 28 00:01:15,030 --> 00:01:16,550 Tas ir lieliski. 29 00:01:16,550 --> 00:01:19,610 Pretējā gadījumā, ja mērķis ir mazāk nekā to, kas ir pa vidu, 30 00:01:19,610 --> 00:01:23,430 Tātad, ja vērtības mēs meklējam lai ir zemāks nekā tas, ko mēs redzam, 31 00:01:23,430 --> 00:01:26,780 vēlreiz atkārtot šo procesu, bet mainīt beigu punktu, tā vietā 32 00:01:26,780 --> 00:01:29,300 būt oriģināls pabeigtu pilnu klāstu, 33 00:01:29,300 --> 00:01:34,110 , ir tikai pa kreisi par to, kur mēs vienkārši skatījās. 34 00:01:34,110 --> 00:01:38,940 >> Mēs zinājām, ka vidējā bija pārāk augsts, vai mērķis bija mazāks nekā vidū, 35 00:01:38,940 --> 00:01:42,210 Un tā tas ir jāpastāv, ja to pastāv visos masīva, 36 00:01:42,210 --> 00:01:44,660 kaut kur pa kreisi viduspunktā. 37 00:01:44,660 --> 00:01:48,120 Un tāpēc mēs noteikti masīvs vieta tikai pa kreisi 38 00:01:48,120 --> 00:01:51,145 par viduspunktu kā jaunais beigu punktu. 39 00:01:51,145 --> 00:01:53,770 Savukārt, ja mērķis ir lielāks par to, kas ir pa vidu, 40 00:01:53,770 --> 00:01:55,750 mēs tieši tā pati process, bet tā vietā mēs 41 00:01:55,750 --> 00:01:59,520 mainīt sākumpunktu būt tikai uz labi no viduspunktā 42 00:01:59,520 --> 00:02:00,680 mēs vienkārši aprēķināt. 43 00:02:00,680 --> 00:02:03,220 Un tad mēs atkal sāktu procesu. 44 00:02:03,220 --> 00:02:05,220 >> Pieņemsim vizualizēt to, OK? 45 00:02:05,220 --> 00:02:08,620 Tātad tur ir daudz kas notiek, un šeit, bet šeit ir masīvs no 15 elementiem. 46 00:02:08,620 --> 00:02:11,400 Un mēs ejam, lai būtu sekotu no daudz vairāk sīkumi šoreiz. 47 00:02:11,400 --> 00:02:13,870 Tātad lineārā meklēšanā, mēs bijām tikai rūpējas par mērķi. 48 00:02:13,870 --> 00:02:15,869 Bet šoreiz mēs gribam rūp, kur mēs esam 49 00:02:15,869 --> 00:02:18,480 sāk izskatīties, kur mēs meklējam apstāšanās, 50 00:02:18,480 --> 00:02:21,876 un kas ir viduspunktā Pašreizējās masīva. 51 00:02:21,876 --> 00:02:23,250 Tātad, šeit mēs iet ar bināro meklēšanu. 52 00:02:23,250 --> 00:02:25,290 Mēs esam diezgan daudz labi iet, vai ne? 53 00:02:25,290 --> 00:02:28,650 Es esmu tikai gatavojas nolikt Turpmāk šeit kopa indeksu. 54 00:02:28,650 --> 00:02:32,430 Tas ir būtībā tikai tas, ko elements masīva mēs runājam. 55 00:02:32,430 --> 00:02:34,500 Ar lineāro meklēšanu, mēs aprūpi, jo mēs 56 00:02:34,500 --> 00:02:36,800 ir jāzina, cik daudz elementi mēs atkārtojot vairāk, 57 00:02:36,800 --> 00:02:40,010 bet mēs faktiski nav vienalga, ko elements mēs pašlaik meklē. 58 00:02:40,010 --> 00:02:41,014 Binārā meklējumos, mēs darām. 59 00:02:41,014 --> 00:02:42,930 Un tā tie ir tikai tur kā mazs ceļvedis. 60 00:02:42,930 --> 00:02:44,910 >> Tātad, mēs varam sākt, ne? 61 00:02:44,910 --> 00:02:46,240 Nu, ne gluži. 62 00:02:46,240 --> 00:02:48,160 Atceries, ko es teicu par bināro meklēšanu? 63 00:02:48,160 --> 00:02:50,955 Mēs nevaram to darīt, pamatojoties uz nešķiroti masīvs vai kas cits, 64 00:02:50,955 --> 00:02:55,820 mēs neesam garantē, ka daži elementi vai vērtības nav 65 00:02:55,820 --> 00:02:57,650 nejaušas izmet, kad mēs tikko 66 00:02:57,650 --> 00:02:59,920 nolemt ignorēt pusi no masīva. 67 00:02:59,920 --> 00:03:02,574 >> Tātad viens solis ar bināro meklēšanu ir jums ir jābūt sakārtoti masīvs. 68 00:03:02,574 --> 00:03:05,240 Un jūs varat izmantot jebkuru no šķirošanas algoritmi, mēs esam runājuši par 69 00:03:05,240 --> 00:03:06,700 lai saņemtu jums šai pozīcijai. 70 00:03:06,700 --> 00:03:10,370 Tāpēc tagad, mēs esam tādā stāvoklī, kur mēs varam veikt bināro meklēšanu. 71 00:03:10,370 --> 00:03:12,560 >> Tātad, pieņemsim atkārtojiet procesu soli pa solim un saglabāt 72 00:03:12,560 --> 00:03:14,830 dziesmu par to, kas notiek, kā mums iet. 73 00:03:14,830 --> 00:03:17,980 Tātad vispirms mums ir jādara, ir aprēķināt viduspunktā pašreizējā masīva. 74 00:03:17,980 --> 00:03:20,620 Nu, mēs sakām, mēs esam, pirmkārt visi, kas meklē vērtību 19. 75 00:03:20,620 --> 00:03:22,290 Mēs cenšamies, lai atrastu numuru 19. 76 00:03:22,290 --> 00:03:25,380 Ar šo pirmo elements masīvs atrodas pie indeksa nulles, 77 00:03:25,380 --> 00:03:28,880 un pēdējais elements šis masīvs atrodas indeksā 14. 78 00:03:28,880 --> 00:03:31,430 Un tāpēc mēs aicinām šos sākumu un beigas. 79 00:03:31,430 --> 00:03:35,387 >> Tātad mēs aprēķināt viduspunktā ar pievienojot 0 plus 14 dalīts ar 2; 80 00:03:35,387 --> 00:03:36,720 diezgan vienkārši viduspunktā. 81 00:03:36,720 --> 00:03:40,190 Un mēs varam teikt, ka Tagad viduspunktā ir 7. 82 00:03:40,190 --> 00:03:43,370 Tātad ir 15, ko mēs meklējam? 83 00:03:43,370 --> 00:03:43,940 Nē tā nav. 84 00:03:43,940 --> 00:03:45,270 Mēs meklējam 19. 85 00:03:45,270 --> 00:03:49,400 Bet mēs zinām, ka 19 ir lielāks nekā tas, ko mēs atradām vidū. 86 00:03:49,400 --> 00:03:52,470 >> Tātad, ko mēs varam darīt, ir mainīt sākumpunktu 87 00:03:52,470 --> 00:03:57,280 būt tikai pa labi no viduspunktā, un atkal atkārtojiet procesu. 88 00:03:57,280 --> 00:04:01,690 Un, kad mēs to darām, mēs tagad teikt Jauns posms punkts ir masīvs vieta 8. 89 00:04:01,690 --> 00:04:07,220 Ko mēs esam darījuši efektīvi ir ignorēja viss pa kreisi 15. 90 00:04:07,220 --> 00:04:09,570 Mēs esam likvidēta pusi problēmas, un tagad, 91 00:04:09,570 --> 00:04:13,510 tā vietā, lai meklētu vairāk nekā 15 elementi mūsu masīva, 92 00:04:13,510 --> 00:04:15,610 mums ir tikai meklēt vairāk nekā 7. 93 00:04:15,610 --> 00:04:17,706 Tātad 8 ir jauna sākuma punkts. 94 00:04:17,706 --> 00:04:19,600 14. joprojām ir beigu punktu. 95 00:04:19,600 --> 00:04:21,430 >> Un tagad, mēs iet pār to vēlreiz. 96 00:04:21,430 --> 00:04:22,810 Mēs aprēķināt jauno viduspunktā. 97 00:04:22,810 --> 00:04:27,130 8 plus 14 ir 22, dalīts ar 2 ir 11. 98 00:04:27,130 --> 00:04:28,660 Vai tas, ko mēs meklējam? 99 00:04:28,660 --> 00:04:30,110 Nē tā nav. 100 00:04:30,110 --> 00:04:32,930 Mēs meklējam vērtību, kas ir mazāk nekā tas, ko mēs tikko atrasts. 101 00:04:32,930 --> 00:04:34,721 Tātad mēs ejam atkārtot procesu no jauna. 102 00:04:34,721 --> 00:04:38,280 Mēs ejam, lai mainītu beigu punkts būt tikai pa kreisi no viduspunktā. 103 00:04:38,280 --> 00:04:41,800 Tātad jaunais beigu punkts kļūst par 10. 104 00:04:41,800 --> 00:04:44,780 Un tagad, tas ir tikai daļa no masīvs mums kārtot cauri. 105 00:04:44,780 --> 00:04:48,460 Tāpēc mēs esam tagad novērsti 12 no 15 elementiem. 106 00:04:48,460 --> 00:04:51,550 Mēs zinām, ka, ja 19 pastāv masīva, to 107 00:04:51,550 --> 00:04:57,210 ir jāpastāv kaut kur starp elementa skaits 8 un elementu skaits 10. 108 00:04:57,210 --> 00:04:59,400 >> Tātad mēs aprēķināt jauno viduspunktu vēlreiz. 109 00:04:59,400 --> 00:05:02,900 8 plus 10 ir 18, dalīts ar 2 ir 9. 110 00:05:02,900 --> 00:05:05,074 Un, šajā gadījumā, izskatās, tad mērķis ir pa vidu. 111 00:05:05,074 --> 00:05:06,740 Mēs atradām tieši to, ko mēs meklējam. 112 00:05:06,740 --> 00:05:07,780 Mēs varam apturēt. 113 00:05:07,780 --> 00:05:10,561 Mēs veiksmīgi pabeigta bināro meklēšanu. 114 00:05:10,561 --> 00:05:11,060 Viss kārtībā. 115 00:05:11,060 --> 00:05:13,930 Tātad mēs zinām šo algoritmu darbojas, ja mērķis ir 116 00:05:13,930 --> 00:05:16,070 kaut kur iekšpusē masīva. 117 00:05:16,070 --> 00:05:19,060 Vai šo algoritmu darbu, ja mērķis ir ne masīvu? 118 00:05:19,060 --> 00:05:20,810 Nu, sāksim to atkal, un šis laiks, 119 00:05:20,810 --> 00:05:23,380 pieņemsim meklēt elementa 16, kas vizuāli mēs varam redzēt 120 00:05:23,380 --> 00:05:25,620 neeksistē nekur masīvā. 121 00:05:25,620 --> 00:05:27,110 >> Starta punkts ir atkal 0. 122 00:05:27,110 --> 00:05:28,590 Beigu punkts ir atkal 14. 123 00:05:28,590 --> 00:05:32,490 Tie ir rādītāji par pirmo un pēdējie elementi pilnīgu masīva. 124 00:05:32,490 --> 00:05:36,057 Un mēs iet caur procesu mēs vienkārši pārdzīvoja atkal mēģina atrast 16, 125 00:05:36,057 --> 00:05:39,140 kaut gan vizuāli, mēs varam jau pateikt, ka tas nav būs tur. 126 00:05:39,140 --> 00:05:43,450 Mēs vienkārši vēlamies, lai pārliecinātos, ka šo algoritmu būs, patiesībā, joprojām strādā kaut kādā veidā 127 00:05:43,450 --> 00:05:46,310 un ne tikai atstāt mums iestrēdzis bezgalīgu cilpu. 128 00:05:46,310 --> 00:05:48,190 >> Tātad, kas ir solis pirmais? 129 00:05:48,190 --> 00:05:50,230 Aprēķināt viduspunktu Pašreizējās masīva. 130 00:05:50,230 --> 00:05:52,790 Kas ir viduspunktā Pašreizējās masīva? 131 00:05:52,790 --> 00:05:54,410 Nu, tas ir 7, vai ne? 132 00:05:54,410 --> 00:05:57,560 14 plus 0 dalīts ar 2 ir 7. 133 00:05:57,560 --> 00:05:59,280 Ir 15, ko mēs meklējam? 134 00:05:59,280 --> 00:05:59,780 Nē. 135 00:05:59,780 --> 00:06:02,930 Tas ir diezgan tuvu, bet mēs meklējam par kuru vērtība nedaudz lielāks nekā. 136 00:06:02,930 --> 00:06:06,310 >> Tātad mēs zinām, ka tas notiek, lai nekur pa kreisi 15. 137 00:06:06,310 --> 00:06:08,540 Mērķis ir lielāks nekā to, kas ir viduspunktā. 138 00:06:08,540 --> 00:06:12,450 Un tāpēc mēs noteikti jaunu sākumpunktu uz būt tikai pa labi no vidus. 139 00:06:12,450 --> 00:06:16,130 Viduspunktā pašlaik 7, tāpēc teiksim jaunais sākuma punkts ir 8. 140 00:06:16,130 --> 00:06:18,130 Un tas, ko mēs esam efektīvi darīts atkal tiek ignorēts 141 00:06:18,130 --> 00:06:21,150 visa kreisā puse no masīva. 142 00:06:21,150 --> 00:06:23,750 >> Tagad mēs atkārtojiet apstrādāt vēl vienu reizi. 143 00:06:23,750 --> 00:06:24,910 Aprēķināt jauno viduspunktā. 144 00:06:24,910 --> 00:06:29,350 8 plus 14 ir 22, dalīts ar 2 ir 11. 145 00:06:29,350 --> 00:06:31,060 Ir 23, ko mēs meklējam? 146 00:06:31,060 --> 00:06:31,870 Diemžēl, nē. 147 00:06:31,870 --> 00:06:34,930 Mēs meklējam vērtību kas ir mazāk nekā 23. 148 00:06:34,930 --> 00:06:37,850 Un tā šajā gadījumā, mēs ejam lai mainītu beigu punktu, ir tikai 149 00:06:37,850 --> 00:06:40,035 pa kreisi no pašreizējās viduspunktā. 150 00:06:40,035 --> 00:06:43,440 Pašreizējā viduspunktā ir 11, un tāpēc mēs uzstādītu jaunu beigu punktu 151 00:06:43,440 --> 00:06:46,980 par nākamo reizi, kad ejam cauri šim procesam līdz 10. 152 00:06:46,980 --> 00:06:48,660 >> Atkal, mēs iet caur procesu vēlreiz. 153 00:06:48,660 --> 00:06:49,640 Aprēķināt viduspunktā. 154 00:06:49,640 --> 00:06:53,100 8 plus 10 dalīts ar 2 ir 9. 155 00:06:53,100 --> 00:06:54,750 Ir 19, ko mēs meklējam? 156 00:06:54,750 --> 00:06:55,500 Diemžēl, nē. 157 00:06:55,500 --> 00:06:58,050 Mēs joprojām meklējam vairāki mazāks par to. 158 00:06:58,050 --> 00:07:02,060 Tātad mēs mainīt galapunkts šoreiz , ir tikai pa kreisi no viduspunktā. 159 00:07:02,060 --> 00:07:05,532 Viduspunktā pašlaik 9, lai gala punkts būs 8. 160 00:07:05,532 --> 00:07:07,920 Un tagad mēs esam tikai meklējam vienā elementu masīvs. 161 00:07:07,920 --> 00:07:10,250 >> Kas ir viduspunktā šī masīva? 162 00:07:10,250 --> 00:07:13,459 Nu, tas sākas 8, tas beidzas 8, viduspunktā ir 8. 163 00:07:13,459 --> 00:07:14,750 Vai tas, ko mēs meklējam? 164 00:07:14,750 --> 00:07:16,339 Vai mēs meklējam 17? 165 00:07:16,339 --> 00:07:17,380 Nē, mēs meklējam 16. 166 00:07:17,380 --> 00:07:20,160 Tātad, ja tas eksistē masīva, tas ir jāpastāv kaut kur 167 00:07:20,160 --> 00:07:21,935 pa kreisi, kur mēs pašlaik esam. 168 00:07:21,935 --> 00:07:23,060 Tātad, ko mēs gatavojamies darīt? 169 00:07:23,060 --> 00:07:26,610 Nu, mēs iestatītu beigu punktu, ir tikai pa kreisi no pašreizējās viduspunktā. 170 00:07:26,610 --> 00:07:29,055 Tātad mēs mainīt beigu punktu 7. 171 00:07:29,055 --> 00:07:32,120 Vai jūs redzat, ko tikko notika šeit, lai gan? 172 00:07:32,120 --> 00:07:33,370 Paskaties šeit tagad. 173 00:07:33,370 --> 00:07:35,970 >> Sākt tagad ir lielāka nekā gala. 174 00:07:35,970 --> 00:07:39,620 Faktiski abi gali Mūsu masīvs ir šķērsojuši, 175 00:07:39,620 --> 00:07:42,252 un sākuma punkts ir tagad pēc beigu punktu. 176 00:07:42,252 --> 00:07:43,960 Nu, tas nav kāda jēga, vai ne? 177 00:07:43,960 --> 00:07:47,960 Tāpēc tagad, ko mēs varam teikt, ir, mēs ir sub masīvs izmēra 0. 178 00:07:47,960 --> 00:07:50,110 Un, kad mēs esam iepazinuši Šajā brīdī mēs varam tagad 179 00:07:50,110 --> 00:07:53,940 garantēt, ka elements 16 neeksistē masīvā, 180 00:07:53,940 --> 00:07:56,280 jo sākumpunktu un beigu punkts ir šķērsojuši. 181 00:07:56,280 --> 00:07:58,340 Un tāpēc tas nav tur. 182 00:07:58,340 --> 00:08:01,340 Tagad, ievērosiet, ka tas ir nedaudz atšķirīgs nekā sākuma punktu un beigu 183 00:08:01,340 --> 00:08:02,900 punktu ir vienādi. 184 00:08:02,900 --> 00:08:05,030 Ja mēs būtu bijuši meklējam par 17, tas būtu 185 00:08:05,030 --> 00:08:08,870 bijusi masīva, un starta punktu un beigu punkts šo pēdējo atkārtojuma 186 00:08:08,870 --> 00:08:11,820 Pirms šie punkti šķērsoja, mēs būtu atraduši 17 tur. 187 00:08:11,820 --> 00:08:15,510 Tas ir tikai tad, kad viņi šķērso, ka mēs varam garantēt, ka elements nav 188 00:08:15,510 --> 00:08:17,180 pastāv masīva. 189 00:08:17,180 --> 00:08:20,260 >> Tātad pieņemsim daudz mazāk soļi nekā lineāri meklēšanā. 190 00:08:20,260 --> 00:08:23,250 Sliktākajā gadījumā, mums bija sadalīt sarakstu n elementiem 191 00:08:23,250 --> 00:08:27,770 atkārtoti pusē, lai atrastu mērķa, nu tāpēc, ka mērķa elements 192 00:08:27,770 --> 00:08:33,110 būs kaut kur pēdējais nodaļa, vai arī tas neeksistē vispār. 193 00:08:33,110 --> 00:08:37,830 Tātad sliktākajā gadījumā, mums ir sadalīt array-- jūs zināt? 194 00:08:37,830 --> 00:08:40,510 Log n reizes; mēs ir samazināt šo problēmu 195 00:08:40,510 --> 00:08:42,610 pusi noteiktu skaitu reižu. 196 00:08:42,610 --> 00:08:45,160 Tas, cik reižu ir log n. 197 00:08:45,160 --> 00:08:46,510 >> Kāds ir labākais scenārijs? 198 00:08:46,510 --> 00:08:48,899 Nu, pirmā reize, kad mēs aprēķināt viduspunktā, 199 00:08:48,899 --> 00:08:50,190 mēs redzam to, ko mēs meklējam. 200 00:08:50,190 --> 00:08:52,150 Visos iepriekšējos piemēri par bināro meklēšanu 201 00:08:52,150 --> 00:08:55,489 mēs esam tikko aizgājuši vairāk, ja mēs būtu meklējis elementa 15, 202 00:08:55,489 --> 00:08:57,030 mēs esam secinājuši, ka nekavējoties. 203 00:08:57,030 --> 00:08:58,321 Tas bija pašā sākumā. 204 00:08:58,321 --> 00:09:01,200 Tas bija viduspunktā pirmais mēģinājums split 205 00:09:01,200 --> 00:09:03,950 par sadalīšanu, kas bināro meklēšanu. 206 00:09:03,950 --> 00:09:06,350 >> Un tā sliktākā gadījumā, bināro meklēšanu darbojas 207 00:09:06,350 --> 00:09:11,580 log n, kas ir ievērojami labāk kā lineāru meklēšanu, sliktākajā gadījumā. 208 00:09:11,580 --> 00:09:16,210 Labākajā gadījumā, bināro meklēšana trašu omega 1. 209 00:09:16,210 --> 00:09:18,990 Tātad binārā meklēšana ir daudz labāk nekā lineārā meklēšanu, 210 00:09:18,990 --> 00:09:23,270 bet jums ir tikt galā ar procesu šķirošanas savu masīvs pirmais, pirms jūs varat 211 00:09:23,270 --> 00:09:26,140 sviras varu bināro meklēšanu. 212 00:09:26,140 --> 00:09:27,130 >> Es esmu Doug Lloyd. 213 00:09:27,130 --> 00:09:29,470 Tas ir CS 50. 214 00:09:29,470 --> 00:09:31,070