1 00:00:00,000 --> 00:00:02,000 [Powered by Google Translate] [Тыдзень 6] 2 00:00:02,000 --> 00:00:04,000 [David J. малая] [Harvard University] 3 00:00:04,000 --> 00:00:08,000 [Гэта CS50.] [CS50.TV] 4 00:00:08,000 --> 00:00:12,000 >> Гэта CS50, і гэта пачатак тыдня 6, 5 00:00:12,000 --> 00:00:16,000 так што пару новых інструментаў цяпер даступныя для вас, каб скарыстацца перавагамі, 6 00:00:16,000 --> 00:00:19,000 першая з якіх называецца CS50 стылю. 7 00:00:19,000 --> 00:00:22,000 Хутчэй за ўсё, калі вы падобныя на мяне ці любога вучэнні хлопцы, 8 00:00:22,000 --> 00:00:26,000 Вы, напэўна, бачылі праграму, чый стыль выглядае крыху нешта накшталт гэтага. 9 00:00:26,000 --> 00:00:30,000 Можа быць, вы пачнеце рэзкі некаторыя вуглы позна ўначы, ці вы будзеце мець справу з ім пазней, 10 00:00:30,000 --> 00:00:32,000 , А затым TF або CA прыходзіць ў працоўны час. 11 00:00:32,000 --> 00:00:34,000 Тады гэта цяжка для нас, каб чытаць. 12 00:00:34,000 --> 00:00:38,000 Ну, гэты код сінтаксічна правільныя, і ён будзе кампіляваць, і яна будзе рэальна працаваць. 13 00:00:38,000 --> 00:00:40,000 Але гэта вызначана не 5 за стыль. 14 00:00:40,000 --> 00:00:45,000 >> Але цяпер, калі мы пойдзем у гэты каталог тут- 15 00:00:45,000 --> 00:00:48,000 і заўважыў, што ў мяне ёсць conditions2.c- 16 00:00:48,000 --> 00:00:55,000 і я бягу гэтую новую каманду, style50, на гэты файл conditions2.c, Enter 17 00:00:55,000 --> 00:00:57,000 заўважыце, што ён паведаміў мне, што ён быў стылізаваны. 18 00:00:57,000 --> 00:01:00,000 Gedit заўважыў, што файл быў зменены на дыску, 19 00:01:00,000 --> 00:01:08,000 і калі я націскаю кнопку перазагрузкі, усе вашы праблемы ў цяперашні час аўтаматызаваныя. 20 00:01:08,000 --> 00:01:15,000 [Апладысменты] 21 00:01:15,000 --> 00:01:17,000 Гэта адна з рэчаў, якія мы зрабілі ў гэтыя выходныя. 22 00:01:17,000 --> 00:01:20,000 Зразумейце, што яна недасканалая, таму што ёсць некаторы код 23 00:01:20,000 --> 00:01:23,000 што ён проста не зможа стылізаваць выдатна, 24 00:01:23,000 --> 00:01:26,000 але разумею, што гэта цяпер інструмента вы можаце скарыстацца 25 00:01:26,000 --> 00:01:33,000 калі толькі прывесці ў парадак некаторыя з больш errantly размешчаны фігурныя дужкі і таму падобнае. 26 00:01:33,000 --> 00:01:36,000 >> Але больш пераканаўчым зараз CS50 праверкі. 27 00:01:36,000 --> 00:01:39,000 З CS50 праверкі, вы можаце выконваць тыя ж выпрабаванні карэктнасці 28 00:01:39,000 --> 00:01:42,000 на свой уласны код, што вучэнне хлопцы здольныя. 29 00:01:42,000 --> 00:01:44,000 Гэта ўтыліта каманднага радка, якая ідзе цяпер у прыбор 30 00:01:44,000 --> 00:01:46,000 Як толькі вы update50 ў адпаведнасці з 31 00:01:46,000 --> 00:01:49,000 PSET 4 спецыфікацый, а таксама выкарыстоўваць яго па сутнасьці, як гэта. 32 00:01:49,000 --> 00:01:51,000 Вы выканаеце каманду check50. 33 00:01:51,000 --> 00:01:56,000 Затым вы перадаеце ў якасці аргументу каманднага радка, або больш вядомы як камутатар або сцяг. 34 00:01:56,000 --> 00:01:58,000 Як правіла, рэчы, якія маюць злучок завецца перамыкачом 35 00:01:58,000 --> 00:02:02,000 на праграму каманднага радка, так з якое паказвае 36 00:02:02,000 --> 00:02:04,000 правярае, што вы хочаце запусціць. 37 00:02:04,000 --> 00:02:07,000 >> Тэсты, якія вы хочаце запусціць вызначаны адназначна гэты радок, 38 00:02:07,000 --> 00:02:10,000 2012/pset4/resize. 39 00:02:10,000 --> 00:02:13,000 Іншымі словамі, гэта проста адвольнае, але унікальная радок 40 00:02:13,000 --> 00:02:18,000 , Якія мы выкарыстоўваем, каб адназначна ідэнтыфікаваць правільнасці PSET 4 у тэстах. 41 00:02:18,000 --> 00:02:21,000 А потым вы задаеце прабел спіс файлаў, якія вы хочаце загрузіць 42 00:02:21,000 --> 00:02:24,000 Праверыць, каб CS50 для аналізу. 43 00:02:24,000 --> 00:02:29,000 Напрыклад, калі я іду на маё рашэнне тут Змена памеру- 44 00:02:29,000 --> 00:02:31,000 Дазвольце мне адкрыць вялікія вокны тэрмінала- 45 00:02:31,000 --> 00:02:42,000 і я іду наперад і запусціць скажам check50-с 2012/pset4/resize, 46 00:02:42,000 --> 00:02:46,000 а потым ісці наперад і паказаць імёны файлаў, 47 00:02:46,000 --> 00:02:49,000 Змена памеру, а затым націсніце Enter, ён сціскае, 48 00:02:49,000 --> 00:02:53,000 Ён загружае, ён правярае, і я проста не змог цэлую кучу тэстаў. 49 00:02:53,000 --> 00:02:59,000 Той у чырвоным у левым верхнім куце кажа, што Змяненне памеру і BMP існуе. 50 00:02:59,000 --> 00:03:01,000 Гэта быў тэст. Такое пытанне мы задалі. 51 00:03:01,000 --> 00:03:04,000 І гэта няшчасныя, таму што адказ быў ілжывым. 52 00:03:04,000 --> 00:03:08,000 Белы тэкст ніжэй ён кажа чакаецца bmp.h існаваць, і гэта проста мая віна. 53 00:03:08,000 --> 00:03:11,000 Я забыўся, каб загрузіць яго, так што мне трэба загружаць як файлы, 54 00:03:11,000 --> 00:03:14,000 Змяненне памеру і bmp.h. 55 00:03:14,000 --> 00:03:17,000 Але цяпер заўважаю ўсе іншыя тэсты ў жоўты, таму што яны не працуюць, 56 00:03:17,000 --> 00:03:21,000 і так смайлік вертыкальна, таму што ён не з'яўляецца ні шчаслівым, ні сумна, 57 00:03:21,000 --> 00:03:25,000 але ў нас ёсць для ліквідацыі гэтага пытання ў чырвоным перад тымі, іншых праверак будзе працаваць. 58 00:03:25,000 --> 00:03:27,000 >> Дазвольце мне выправіць гэта. 59 00:03:27,000 --> 00:03:30,000 Дазвольце мне маштаб і паўторыце гэта, на гэты раз з bmp.h таксама 60 00:03:30,000 --> 00:03:34,000 у камандным радку, Enter, і зараз, калі ўсё пойдзе добра, 61 00:03:34,000 --> 00:03:38,000 ён збіраецца праверыць, а затым вяртаюць вынік, затрымаеце дыханне- 62 00:03:38,000 --> 00:03:42,000 Усе зялёнае, а гэта значыць, што я раблю вельмі добра на PSET 4 да гэтага часу. 63 00:03:42,000 --> 00:03:44,000 Вы можаце бачыць і вывесці з апісальных тэксту тут 64 00:03:44,000 --> 00:03:47,000 дакладна, што гэта мы праверылі. 65 00:03:47,000 --> 00:03:49,000 Мы пратэставалі першы ж файлы існуюць? 66 00:03:49,000 --> 00:03:51,000 Мы тады пратэставаны робіць Змена памеру кампіляцыі? 67 00:03:51,000 --> 00:03:58,000 Затым мы праверылі гэта не памер 1x1 піксель BMP, калі п, змяненне памеру фактар, 1. 68 00:03:58,000 --> 00:04:01,000 Зараз, калі вы не ведаеце, што п, вы будзеце толькі вы пагрузіцца ў PSET 4, 69 00:04:01,000 --> 00:04:04,000 але гэта проста здаровае праверыць, каб пераканацца, што вы не змена памеру 70 00:04:04,000 --> 00:04:08,000 Малюнак наогул, калі змяненне памеру каэфіцыент роўны 1. 71 00:04:08,000 --> 00:04:14,000 Калі ж, наадварот, ён змяняе 1x1 піксель у піксель 1x1 2x2 BMP, каб правільна 72 00:04:14,000 --> 00:04:19,000 пры п = 2, то аналагічна, мой фармуе адпаведна. 73 00:04:19,000 --> 00:04:22,000 >> Карацей кажучы, гэта азначала, адзін, прымаць перасячэння пальцаў 74 00:04:22,000 --> 00:04:25,000 з раўнання права, перш чым падаць PSET. 75 00:04:25,000 --> 00:04:28,000 Вы будзеце дакладна ведаць, што ваш TF хутка даведаемся 76 00:04:28,000 --> 00:04:30,000 калі вы ідзяце аб адпраўцы некаторых з гэтых набораў праблемы, 77 00:04:30,000 --> 00:04:34,000 а таксама педагагічныя матывацыя сапраўды паставіць 78 00:04:34,000 --> 00:04:37,000 магчымасць перад вамі, так што, калі вы ведаеце, апрыёрна 79 00:04:37,000 --> 00:04:39,000 што ёсць памылкі ў кодзе і тэстах, якія не прайшлі, 80 00:04:39,000 --> 00:04:43,000 Вы можаце змясціць у больш эфектыўныя часу наперадзе, каб вырашыць гэтыя праблемы 81 00:04:43,000 --> 00:04:45,000 , А не губляць ачкі, атрымаць зваротную сувязь ад вашых TF, 82 00:04:45,000 --> 00:04:48,000 , А затым ісці, "Ах", як я зразумеў гэта. 83 00:04:48,000 --> 00:04:50,000 Зараз па крайняй меры ёсць інструмент, каб дапамагчы вам знайсці гэта. 84 00:04:50,000 --> 00:04:52,000 Гэта не збіраецца паказаць, дзе памылка, але яна скажа вам, 85 00:04:52,000 --> 00:04:54,000 , Што з'яўляецца сімптомам яго. 86 00:04:54,000 --> 00:04:57,000 >> Цяпер разумею, тэсты не з'яўляецца вычарпальным. 87 00:04:57,000 --> 00:04:59,000 Проста таму, што вы атрымліваеце экран, поўны зялёных смайлікаў 88 00:04:59,000 --> 00:05:02,000 не азначае, што ваш код з'яўляецца дасканалай, але гэта не азначае, 89 00:05:02,000 --> 00:05:06,000 што яна прайшла пэўныя выпрабаванні, прадугледжаныя ў спецыфікацыі. 90 00:05:06,000 --> 00:05:08,000 Часам мы не выпусцім праверак. 91 00:05:08,000 --> 00:05:10,000 Напрыклад, дэтэктыўны раман, адным з аспектаў PSET 4, 92 00:05:10,000 --> 00:05:15,000 гэта свайго роду расчараванне, калі мы даем вам 93 00:05:15,000 --> 00:05:18,000 адказ на пытанне, што гэта такое, і ёсць некалькі спосабаў, каб паказаць 94 00:05:18,000 --> 00:05:21,000 хто гэты чалавек у тым, што чырвоныя шуму. 95 00:05:21,000 --> 00:05:24,000 У спецыфікацыі будуць заўсёды паказваць у будучыні для PSET 5 наперад 96 00:05:24,000 --> 00:05:26,000 Якія віды кантролю існуюць для вас. 97 00:05:26,000 --> 00:05:28,000 Вы заўважыце, што гэта за белыя URL у ніжняй часткі. 98 00:05:28,000 --> 00:05:30,000 На дадзены момант гэта ўсяго толькі дыягнастычны выхад. 99 00:05:30,000 --> 00:05:33,000 Калі вы наведаеце гэты адрас, вы атрымаеце цэлую кучу вар'ятаў, загадкавыя паведамленні 100 00:05:33,000 --> 00:05:36,000 што вы можаце праглядаць, але гэта ў асноўным для супрацоўнікаў 101 00:05:36,000 --> 00:05:41,000 так што мы можам дыягнаставаць і адладжваць памылкі ў check50 сябе. 102 00:05:41,000 --> 00:05:46,000 >> Без цырымоній, давайце пяройдзем туды, дзе мы спыніліся. 103 00:05:46,000 --> 00:05:48,000 CS50 бібліятэцы мы лічылі само сабой якія разумеюцца на працягу некалькіх тыдняў, 104 00:05:48,000 --> 00:05:52,000 але затым на мінулым тыдні, мы пачалі пілінг таму адзін з пластоў яго. 105 00:05:52,000 --> 00:05:55,000 Мы пачалі адклаўшы радок у карысць таго, што замест гэтага? 106 00:05:55,000 --> 00:05:57,000 [Студэнты] Char. 107 00:05:57,000 --> 00:05:59,000 Char *, які быў сімвал * ўвесь гэты час, 108 00:05:59,000 --> 00:06:03,000 але цяпер мы не павінны рабіць выгляд, што гэта фактычны тып дадзеных радок. 109 00:06:03,000 --> 00:06:06,000 Хутчэй, гэта быў сінонім роду для знакаў *, 110 00:06:06,000 --> 00:06:09,000 і радок ўяўляе сабой паслядоўнасць знакаў, 111 00:06:09,000 --> 00:06:14,000 Так чаму гэта мае сэнс прадстаўляць радкі як сімвал * з? 112 00:06:14,000 --> 00:06:20,000 Што азначае сімвал * прадстаўляе ў кантэксце гэтай канцэпцыі радкі? 113 00:06:20,000 --> 00:06:23,000 Так. >> [Студэнт] першы знак. 114 00:06:23,000 --> 00:06:25,000 Добра, першы знак, але не зусім першы знак. 115 00:06:25,000 --> 00:06:27,000 Гэта-[Студэнты] адрас. 116 00:06:27,000 --> 00:06:29,000 Добра, адрас першага знака. 117 00:06:29,000 --> 00:06:33,000 Усё, што неабходна для прадстаўлення радкоў у памяці кампутара 118 00:06:33,000 --> 00:06:36,000 гэта проста унікальны адрас самага першага байта. 119 00:06:36,000 --> 00:06:38,000 Вам нават не трэба ведаць, як доўга гэта 120 00:06:38,000 --> 00:06:42,000 таму што, як вы можаце зразумець, што з дынамічна? 121 00:06:42,000 --> 00:06:44,000 [Студэнт] даўжыня радка. 122 00:06:44,000 --> 00:06:48,000 Вы можаце патэлефанаваць даўжыня радка, выдатна, але як праца даўжыню радка? 123 00:06:48,000 --> 00:06:50,000 Што ён робіць? Так. 124 00:06:50,000 --> 00:06:52,000 [Студэнт] Працягвайце, пакуль не атрымаеце нулявой сімвал. 125 00:06:52,000 --> 00:06:54,000 Так, сапраўды, ён проста выконвае ітэрацыі з цыклу, у той час як цыкл, 126 00:06:54,000 --> 00:06:57,000 незалежна ад * да канца, і ў канцы прадстаўлена 127 00:06:57,000 --> 00:07:01,000 на \ 0, так званай нулявой сімвал, н, 128 00:07:01,000 --> 00:07:05,000 Не блытаць з нулявым, які з'яўляецца паказальнікам, 129 00:07:05,000 --> 00:07:07,000 які ўступіць у размове зноў сёння. 130 00:07:07,000 --> 00:07:11,000 >> Мы вычышчаныя назад пластом GetInt, і тады мы зірнулі на GetString, 131 00:07:11,000 --> 00:07:14,000 і нагадаем, што абедзве гэтыя функцыі, ці сапраўды, 132 00:07:14,000 --> 00:07:18,000 GetString, было выкарыстанне пэўных функцый 133 00:07:18,000 --> 00:07:21,000 на самай справе разабраць, гэта значыць, чытаць і аналізаваць, уведзеных карыстальнікам. 134 00:07:21,000 --> 00:07:25,000 І што гэта за новая функцыя? 135 00:07:25,000 --> 00:07:27,000 Scanf або Sscanf. Гэта на самай справе адбываецца ў некалькі розных водараў. 136 00:07:27,000 --> 00:07:31,000 Там у SCANF, ёсць Sscanf, ёсць fscanf. 137 00:07:31,000 --> 00:07:35,000 Цяпер, аднак, давайце засяродзімся на адно найбольш лёгка праілюстраваць, 138 00:07:35,000 --> 00:07:38,000 і дазвольце мне ісці наперад і адкрыць у прыборы 139 00:07:38,000 --> 00:07:41,000 Файл, як гэта, scanf1.c. 140 00:07:41,000 --> 00:07:43,000 Гэта супер простая праграма, 141 00:07:43,000 --> 00:07:46,000 але што робіць нешта, што мы ніколі не рабілі 142 00:07:46,000 --> 00:07:48,000 без дапамогі CS50 бібліятэкі. 143 00:07:48,000 --> 00:07:51,000 Гэта становіцца Int ад карыстальніка. Як гэта працуе? 144 00:07:51,000 --> 00:07:53,000 Ну, а ў радку 16 маецца, 145 00:07:53,000 --> 00:07:56,000 заўважыце, што мы заяўляем Int называецца х, і ў гэты момант у гісторыі, 146 00:07:56,000 --> 00:07:58,000 што такое значэнне х? 147 00:07:58,000 --> 00:08:00,000 [Неразборліва адказ студэнта] 148 00:08:00,000 --> 00:08:02,000 [David M.] Права, хто ведае, смецце значэння патэнцыйна, так і ў 17, мы проста паведаміць карыстачу 149 00:08:02,000 --> 00:08:06,000 дайце мне нумар, калі ласка, і крок 18, дзе гэта становіцца цікавым. 150 00:08:06,000 --> 00:08:11,000 Scanf здаецца запазычаць ідэі з Printf у тым, што ён выкарыстоўвае фармат кодаў у двукоссі. 151 00:08:11,000 --> 00:08:13,000 % D, вядома, дзесятковы лік. 152 00:08:13,000 --> 00:08:21,000 Але чаму я якая праходзіць у & х, а не проста х? 153 00:08:21,000 --> 00:08:24,000 Былы правільна. Так. 154 00:08:24,000 --> 00:08:26,000 [Неразборліва адказ студэнта] 155 00:08:26,000 --> 00:08:31,000 Менавіта, калі мэта гэтай праграмы, як і функцыя GetInt сябе, 156 00:08:31,000 --> 00:08:34,000 , Каб атрымаць цэлы лік ад карыстальнікаў я магу перадаць функцыі 157 00:08:34,000 --> 00:08:38,000 ўсе зменныя, я хачу, але калі я не перадаваць іх па спасылцы 158 00:08:38,000 --> 00:08:41,000 або па адрасе або па паказальніку, усё сінонімам для мэт сённяшняй, 159 00:08:41,000 --> 00:08:46,000 то гэтая функцыя не мае магчымасці змяняць змесціва гэтай зменнай. 160 00:08:46,000 --> 00:08:49,000 Гэта павінна перадаць у копіі, як багі версіі своп 161 00:08:49,000 --> 00:08:51,000 што мы казалі пра некалькі разоў цяпер. 162 00:08:51,000 --> 00:08:54,000 >> Але замест гэтага, робячы & х, я літаральна які праходзіць у чым? 163 00:08:54,000 --> 00:08:57,000 [Студэнт] адрас. >> Адрасамі х. 164 00:08:57,000 --> 00:09:01,000 Гэта падобна на маляванне карты для функцыі называецца SCANF і кажуць тут, 165 00:09:01,000 --> 00:09:04,000 гэтыя напрамкі кавалак памяці ў кампутары 166 00:09:04,000 --> 00:09:07,000 што вы можаце пайсці захоўваць некаторы цэлае цалі 167 00:09:07,000 --> 00:09:10,000 Для таго, каб Sscanf гэтага часу зрабіць гэта 168 00:09:10,000 --> 00:09:13,000 які аператар, што частка сінтаксісу гэтага прыйдзецца выкарыстоўваць 169 00:09:13,000 --> 00:09:19,000 нават калі мы не можам бачыць, таму што хтосьці іншы напісаў гэтую функцыю? 170 00:09:19,000 --> 00:09:21,000 Іншымі словамі - што гэта такое? 171 00:09:21,000 --> 00:09:23,000 [Студэнт] X чытаць. 172 00:09:23,000 --> 00:09:27,000 Там збіраецца быць некаторы чытанне, але толькі ў дачыненні да х тут. 173 00:09:27,000 --> 00:09:30,000 Калі SCANF ў цяперашні час перадаецца адрас х, 174 00:09:30,000 --> 00:09:35,000 Сінтаксічна, што аператар абавязаны існаваць дзесьці 175 00:09:35,000 --> 00:09:38,000 Усярэдзіне рэалізацыі SCANF так, што SCANF 176 00:09:38,000 --> 00:09:42,000 сапраўды можа напісаць нумар 2 па гэтым адрасе? 177 00:09:42,000 --> 00:09:44,000 Так, так *. 178 00:09:44,000 --> 00:09:47,000 Нагадаем, што * гэта наш аператар разнаймення, якая па сутнасці азначае пайсці туды. 179 00:09:47,000 --> 00:09:50,000 >> Пасля таго як вы перадалі адрасы, як у дадзеным выпадку, 180 00:09:50,000 --> 00:09:53,000 SCANF, верагодна, калі мы на самай справе агледзеў яго зыходны код- 181 00:09:53,000 --> 00:09:59,000 робіць * х ці эквівалент на самай справе пайсці па гэтым адрасе і пакласці некаторы значэнне там. 182 00:09:59,000 --> 00:10:02,000 Цяпер, як і пра тое, як SCANF атрымлівае увод з клавіятуры, 183 00:10:02,000 --> 00:10:04,000 мы махаем рукамі за сёння. 184 00:10:04,000 --> 00:10:07,000 Проста выкажам здагадку, што аперацыйная сістэма дазваляе Sscanf казаць 185 00:10:07,000 --> 00:10:11,000 з клавіятуры карыстальнікам, але на дадзены момант цяпер у радку 19, 186 00:10:11,000 --> 00:10:14,000 Калі мы проста раздрукаваць х, гэта, здаецца, выпадак 187 00:10:14,000 --> 00:10:17,000 што SCANF паставіў Int х. 188 00:10:17,000 --> 00:10:19,000 Гэта сапраўды, як SCANF працуе, і ўспомніць апошні тыдзень 189 00:10:19,000 --> 00:10:25,000 гэта дакладна, як GetString і GetInt і іншых яго сямейства функцый 190 00:10:25,000 --> 00:10:28,000 у канчатковым выніку працуе, хоць і з невялікім дысперсіі, як Sscanf, 191 00:10:28,000 --> 00:10:31,000 што азначае сканаванне радкоў замест клавіятуры. 192 00:10:31,000 --> 00:10:33,000 Але давайце зірнем на невялікай розніцы ў гэтым. 193 00:10:33,000 --> 00:10:37,000 У scanf2, я сапраўды аблажаўся. 194 00:10:37,000 --> 00:10:42,000 Што не так, і я схаваю каментар, які тлумачыць, як шмат- 195 00:10:42,000 --> 00:10:47,000 што не так з гэтай праграмай, версія 2? 196 00:10:47,000 --> 00:10:55,000 Будзьце як тэхнічныя магчымасці на гэты раз. 197 00:10:55,000 --> 00:10:57,000 Гэта выглядае даволі добра. 198 00:10:57,000 --> 00:11:03,000 Гэта прыемна водступу, але- 199 00:11:03,000 --> 00:11:07,000 Добра, а як наконт давайце скарачаць яго да кароткіх пытанняў? 200 00:11:07,000 --> 00:11:17,000 Лінія 16. Што рабіць лініі 16 ст дакладнай, але тэхнічны ангельскую мову? 201 00:11:17,000 --> 00:11:20,000 Атрыманне крыху няёмка. Так, Майкл. 202 00:11:20,000 --> 00:11:25,000 [Студэнт] Гэта паказвае на першыя літары радкоў. 203 00:11:25,000 --> 00:11:27,000 >> Добра, блізка. Дазвольце мне наладзіць, што няшмат. 204 00:11:27,000 --> 00:11:33,000 Паказваючы на ​​першую літару радкі, вы аб'яўляеце зменную буфера 205 00:11:33,000 --> 00:11:36,000 , Што будзе ўказваць на першы адрас радкі, 206 00:11:36,000 --> 00:11:39,000 ці, хутчэй, будзе паказваць больш канкрэтна знак. 207 00:11:39,000 --> 00:11:42,000 Звярніце ўвагу, што гэта на самай справе не паказваючы дзе заўгодна, таму што няма аператара прысвойвання. 208 00:11:42,000 --> 00:11:46,000 Там няма знака роўнасці, таму ўсё, што мы робім, вылучэнне зменнай званага буфера. 209 00:11:46,000 --> 00:11:49,000 Гэта здараецца, 32 біт, таму што гэта паказальнік, 210 00:11:49,000 --> 00:11:52,000 і змесціва буфера як мяркуецца, у рэшце рэшт 211 00:11:52,000 --> 00:11:57,000 будзе ўтрымліваць адрас сімвал, але цяпер, што ж буферы ўтрымліваць? 212 00:11:57,000 --> 00:11:59,000 Проста некаторыя фіктыўныя, хто ведае, смецце значэнне, 213 00:11:59,000 --> 00:12:03,000 таму, што мы відавочна не ініцыялізаваны, так што мы не павінны меркаваць, што заўгодна. 214 00:12:03,000 --> 00:12:06,000 Такім чынам, цяпер лінія 17,-што ж лініі 17 рабіць? 215 00:12:06,000 --> 00:12:08,000 Можа быць, сагрэе гэта. 216 00:12:08,000 --> 00:12:10,000 Яна выводзіць радок, ці не так? 217 00:12:10,000 --> 00:12:12,000 Ён друкуе струннага калі ласка. 218 00:12:12,000 --> 00:12:15,000 >> Радок 18 з'яўляецца своеасаблівай знаёмы цяпер у тым, што мы толькі што бачылі дысперсія гэтага 219 00:12:15,000 --> 00:12:18,000 але з іншым кодам фармату, так і ў радку 18, 220 00:12:18,000 --> 00:12:23,000 мы кажам SCANF тут з'яўляецца адрасам блока памяці. 221 00:12:23,000 --> 00:12:27,000 Я хачу, каб ты тэлефанаваў у радок, як гэта маецца на ўвазе% З, 222 00:12:27,000 --> 00:12:32,000 але праблема ў тым, што мы не зрабілі пару рэчаў. 223 00:12:32,000 --> 00:12:35,000 Што адна з праблем? 224 00:12:35,000 --> 00:12:38,000 [Студэнт] Гэта спроба разнаймення нулявога паказальніка. 225 00:12:38,000 --> 00:12:41,000 Добра, нулявыя ці проста ў адваротным выпадку невядомыя паказальнікаў. 226 00:12:41,000 --> 00:12:45,000 Вы ўручэння SCANF адрас, але вы толькі што сказалі хвіліну назад 227 00:12:45,000 --> 00:12:49,000 , Што адрас смецце значэнне, таму што мы на самай справе не прысвоіць яму ні да чаго, 228 00:12:49,000 --> 00:12:53,000 і таму вы кажаце SCANF эфектыўна ісці пакласці радкі тут, 229 00:12:53,000 --> 00:12:56,000 але мы не ведаем, дзе тут яшчэ ёсць, 230 00:12:56,000 --> 00:12:59,000 так што мы, уласна, не выдзеленай памяці для буфера. 231 00:12:59,000 --> 00:13:03,000 Акрамя таго, што вы таксама нават не кажу SCANF? 232 00:13:03,000 --> 00:13:06,000 Выкажам здагадку, што гэта быў кавалак памяці, і гэта не было смецця значэнне, 233 00:13:06,000 --> 00:13:09,000 але вы ўсё яшчэ не казаў SCANF нешта важнае. 234 00:13:09,000 --> 00:13:12,000 [Студэнт] Дзе на самой справе, амперсанда. 235 00:13:12,000 --> 00:13:15,000 Амперсанда, таму ў дадзеным выпадку, гэта нармальна. 236 00:13:15,000 --> 00:13:18,000 Таму што буфер ўжо абвешчаны як паказальнік 237 00:13:18,000 --> 00:13:22,000 з * частку сінтаксісу, мы не павінны выкарыстоўваць амперсанда 238 00:13:22,000 --> 00:13:25,000 таму што гэта ўжо адрас, але я думаю, што я чуў, гэта тут. 239 00:13:25,000 --> 00:13:27,000 [Студэнт] Як ён вялікі? 240 00:13:27,000 --> 00:13:29,000 Добра, што мы не гаворым SCANF, наколькі вялікі гэты буфер, 241 00:13:29,000 --> 00:13:32,000 які азначае, што нават калі буфер быў паказальнік, 242 00:13:32,000 --> 00:13:35,000 Мы кажам SCANF, пакласці тут радок, 243 00:13:35,000 --> 00:13:38,000 Але тут можа быць 2 байта, гэта можа быць 10 байт, ён можа быць мегабайт. 244 00:13:38,000 --> 00:13:41,000 Scanf паняцця не мае, а таму, што гэта кавалак памяці 245 00:13:41,000 --> 00:13:43,000 Як мяркуецца, гэта не радок, пакуль няма. 246 00:13:43,000 --> 00:13:48,000 Гэта ўсяго толькі радок, як толькі вы пісаць сімвалы і \ 0 да гэтага кавалак памяці. 247 00:13:48,000 --> 00:13:51,000 Цяпер гэта толькі некаторыя кавалак памяці. 248 00:13:51,000 --> 00:13:55,000 Scanf не будзе ведаць, калі перастаць пісаць па гэтым адрасе. 249 00:13:55,000 --> 00:13:59,000 >> Калі ўзгадаць некаторыя прыклады ў мінулым, калі я выпадкова набраў на клавіятуры 250 00:13:59,000 --> 00:14:03,000 спрабуе перапаўненне буфера, і мы казалі ў пятніцу аб менавіта гэта. 251 00:14:03,000 --> 00:14:07,000 Калі праціўнік нейкім чынам ўводзіць у свой праграме значна больш слоў 252 00:14:07,000 --> 00:14:10,000 або прапанова або фразу, то вы чакалі, вы можаце перарасходу 253 00:14:10,000 --> 00:14:13,000 частка памяці, якая можа мець дрэнныя наступствы, 254 00:14:13,000 --> 00:14:15,000 як прымаць па ўсёй праграме. 255 00:14:15,000 --> 00:14:17,000 Мы павінны выправіць гэта неяк. 256 00:14:17,000 --> 00:14:20,000 Дазвольце мне маштаб і ідзіце ў 3-й версіі гэтай праграмы. 257 00:14:20,000 --> 00:14:22,000 Гэта крыху лепш. 258 00:14:22,000 --> 00:14:24,000 У гэтай версіі, заўважыце розніцу. 259 00:14:24,000 --> 00:14:27,000 У радку 16, я яшчэ раз абвясціць зменную буфера, 260 00:14:27,000 --> 00:14:29,000 але тое, што яна зараз? 261 00:14:29,000 --> 00:14:33,000 Гэта масіў з 16 знакаў. 262 00:14:33,000 --> 00:14:36,000 Гэта добра, таму што гэта азначае, я магу зараз сказаць SCANF 263 00:14:36,000 --> 00:14:39,000 Тут фактычна кавалак памяці. 264 00:14:39,000 --> 00:14:42,000 Вы можаце падумаць, масівы паказальнікаў як цяпер, 265 00:14:42,000 --> 00:14:44,000 нават калі яны на самой справе не эквівалентныя. 266 00:14:44,000 --> 00:14:47,000 Яны паводзяць сябе па-рознаму ў розных кантэкстах. 267 00:14:47,000 --> 00:14:50,000 Але гэта, вядома, справа, што буфер спасылкі 268 00:14:50,000 --> 00:14:53,000 16 паслядоўных знакаў, таму што гэта тое, што масіў 269 00:14:53,000 --> 00:14:55,000 і быў на працягу некалькіх тыдняў. 270 00:14:55,000 --> 00:14:59,000 >> Вось, я кажу SCANF вось кавалак памяці. 271 00:14:59,000 --> 00:15:01,000 На гэты раз, гэта на самай справе частка памяці, 272 00:15:01,000 --> 00:15:07,000 Але чаму гэтай праграмы да гэтага часу ўразлівасцям? 273 00:15:07,000 --> 00:15:11,000 Што здарылася яшчэ? 274 00:15:11,000 --> 00:15:14,000 Я ўжо казаў, дайце мне 16 байт, але- 275 00:15:14,000 --> 00:15:16,000 [Студэнт] Што рабіць, калі яны друкуюць больш чым у 16? 276 00:15:16,000 --> 00:15:20,000 Вось менавіта, што калі карыстальнік ўводзіць 17 сімвалаў або 1700 знакаў? 277 00:15:20,000 --> 00:15:23,000 На самай справе, давайце паглядзім, калі мы не можам спатыкнуцца гэтую памылку цяпер. 278 00:15:23,000 --> 00:15:25,000 Гэта лепш, але не ідэальна. 279 00:15:25,000 --> 00:15:28,000 Дазвольце мне ісці наперад і працаваць scanf3 зрабіць для кампіляцыі гэтай праграмы. 280 00:15:28,000 --> 00:15:34,000 Дазвольце мне выканаць scanf3, String калі ласка: прывітанне, і мы, здаецца, у парадку. 281 00:15:34,000 --> 00:15:37,000 Дазвольце мне паспрабаваць крыху больш аднаго, прывітанне. 282 00:15:37,000 --> 00:15:42,000 Добра, давайце зробім прывітанне, як справы, Enter. 283 00:15:42,000 --> 00:15:54,000 Атрыманне віду пашанцавала тут, скажам, прывітанне як справы. 284 00:15:54,000 --> 00:15:56,000 Чорт вазьмі. 285 00:15:56,000 --> 00:16:03,000 Такім чынам, нам пашанцавала. Давайце паглядзім, калі мы не можам гэта выправіць. 286 00:16:03,000 --> 00:16:06,000 Не, яна не збіраецца дазволіць мне скапіяваць. 287 00:16:06,000 --> 00:16:09,000 Давайце паспрабуем гэта зноў. 288 00:16:09,000 --> 00:16:12,000 Добра, стаяць у баку. 289 00:16:12,000 --> 00:16:20,000 Мы ўбачым, як доўга я магу прыкідвацца, каб засяродзіцца ў той жа час зрабіць гэта. 290 00:16:20,000 --> 00:16:23,000 Чорт вазьмі. Гэта даволі неабходнасці, на самай справе. 291 00:16:23,000 --> 00:16:26,000 Там мы ідзем. 292 00:16:26,000 --> 00:16:30,000 Кропка зрабіў. 293 00:16:30,000 --> 00:16:34,000 >> Гэта, няёмка, хоць яно і ёсць, ён таксама з'яўляецца адным з крыніц вялікую блытаніну 294 00:16:34,000 --> 00:16:38,000 Пры напісанні праграм, якія маюць памылкі, таму што яны выяўляюцца 295 00:16:38,000 --> 00:16:40,000 Толькі раз у той час часам. 296 00:16:40,000 --> 00:16:43,000 Рэальнасць такая, што нават калі ваш код цалкам зламаная, 297 00:16:43,000 --> 00:16:46,000 гэта можа быць цалкам разбурана раз у той час 298 00:16:46,000 --> 00:16:49,000 таму што часам, па сутнасці, адбываецца тое, вылучае аперацыйнай сістэмы 299 00:16:49,000 --> 00:16:52,000 трохі больш памяці, чым вам сапраўды трэба па любой прычыне, 300 00:16:52,000 --> 00:16:57,000 і так ніхто не выкарыстоўвае памяць адразу пасля кавалак з 16 сімвалаў, 301 00:16:57,000 --> 00:17:01,000 так што калі вы ідзяце ў 17, 18, 19, незалежна, гэта не такая вялікая праблема. 302 00:17:01,000 --> 00:17:04,000 Цяпер, кампутар, нават калі яна не абрынецца ў той момант, 303 00:17:04,000 --> 00:17:09,000 у канчатковым выніку можа выкарыстоўваць Байт нумар 17 ці 18, ці 19 на нешта іншае, 304 00:17:09,000 --> 00:17:14,000 У гэты момант вашы дадзеныя, якія вы стварылі, хоць і празмерна доўгімі, 305 00:17:14,000 --> 00:17:18,000 будзе страчаны патэнцыйна некаторыя іншыя функцыі. 306 00:17:18,000 --> 00:17:21,000 Гэта не абавязкова застанецца некранутым, 307 00:17:21,000 --> 00:17:23,000 але гэта не абавязкова выклікаць сегменце віна. 308 00:17:23,000 --> 00:17:26,000 Але ў дадзеным выпадку, я, нарэшце, далі досыць сімвалаў 309 00:17:26,000 --> 00:17:29,000 што я істотна перавысіў мае сегмент памяці, і бац, 310 00:17:29,000 --> 00:17:33,000 Аперацыйная сістэма сказала: "Выбачай, гэта не добра, памылкі сегментацыі." 311 00:17:33,000 --> 00:17:38,000 >> І давайце паглядзім цяпер, калі тое, што застаецца тут, у маім каталога 312 00:17:38,000 --> 00:17:40,000 заўважыў, што ў мяне ёсць гэты файл тут, ядро. 313 00:17:40,000 --> 00:17:42,000 Звярніце ўвагу, што гэта зноў заклікаў дамп памяці. 314 00:17:42,000 --> 00:17:46,000 Па сутнасці, гэта файл, які змяшчае змесціва памяці праграмы 315 00:17:46,000 --> 00:17:48,000 ў кропцы, у якой ён разбіўся, 316 00:17:48,000 --> 00:17:51,000 і проста паспрабаваць маленькі прыклад тут адпусціць мяне тут 317 00:17:51,000 --> 00:17:57,000 і запусціць GDB на scanf3 а затым паказаць Трэці аргумент завецца ядром, 318 00:17:57,000 --> 00:18:01,000 і заўважыць тут, што калі я пералічваю код, 319 00:18:01,000 --> 00:18:06,000 мы зможам, як звычайна, з GDB, каб пачаць хадзіць праз гэтую праграму, 320 00:18:06,000 --> 00:18:10,000 і я магу запусціць яго, і як толькі я патрапіў-як з крокам каманды ў GDB- 321 00:18:10,000 --> 00:18:13,000 Як толькі я трапіў у патэнцыйна багі лініі пасля ўводу ў велізарнай радку, 322 00:18:13,000 --> 00:18:16,000 Я змагу на самай справе вызначыць яго тут. 323 00:18:16,000 --> 00:18:19,000 Больш падрабязна аб гэтым, хоць, у раздзеле з пункту гледжання дампы 324 00:18:19,000 --> 00:18:22,000 і да т.п., так што вы можаце капацца ўнутры дампа 325 00:18:22,000 --> 00:18:27,000 і паглядзець, на якой радку праграмы не вы. 326 00:18:27,000 --> 00:18:32,000 Любыя пытанні, то на паказальнікі і на адрасы? 327 00:18:32,000 --> 00:18:36,000 Таму што сёння, мы збіраемся пачаць прымаць як належнае, што гэтыя рэчы існуюць 328 00:18:36,000 --> 00:18:40,000 і мы дакладна ведаем, што яны ёсць. 329 00:18:40,000 --> 00:18:42,000 Так. 330 00:18:42,000 --> 00:18:46,000 >> [Студэнт] Чаму вы не павінны паставіць амперсанда побач з часткі- 331 00:18:46,000 --> 00:18:48,000 Добры пытанне. 332 00:18:48,000 --> 00:18:51,000 Чаму ў мяне не было паставіць амперсанда побач з масіў сімвалаў, як я зрабіў раней 333 00:18:51,000 --> 00:18:53,000 з большасцю нашых прыкладах? 334 00:18:53,000 --> 00:18:55,000 Кароткі адказ складаецца ў масівах трохі асаблівым. 335 00:18:55,000 --> 00:18:59,000 Вы можаце падумаць, буфер, на самай справе з'яўляецца адрасам, 336 00:18:59,000 --> 00:19:03,000 і так ужо здарылася, каб быць так, што плошча пазначэнне кранштэйна 337 00:19:03,000 --> 00:19:06,000 з'яўляецца зручным, так што мы можам пайсці ў кранштэйны 0, кранштэйны 1, 338 00:19:06,000 --> 00:19:10,000 Кранштэйны 2, не звяртаючыся да выкарыстання * наймення. 339 00:19:10,000 --> 00:19:13,000 Гэта трохі белага хлусня, таму што масівы і паказальнікі 340 00:19:13,000 --> 00:19:17,000 , На самай справе, крыху па-іншаму, але яны могуць часта, але не заўсёды выкарыстоўваюцца як узаемазаменныя. 341 00:19:17,000 --> 00:19:21,000 Карацей кажучы, калі функцыя чакае паказальнік на ўчастак памяці, 342 00:19:21,000 --> 00:19:24,000 Вы можаце альбо перадаць яго адрас, які быў вернуты таНос, 343 00:19:24,000 --> 00:19:29,000 і мы ўбачым, таНос зноў у хуткім часе, ці вы можаце перадаць яго імя масіва. 344 00:19:29,000 --> 00:19:32,000 Вы не павінны рабіць амперсанда з масівамі, таму што яны ўжо 345 00:19:32,000 --> 00:19:34,000 істотна хацеў адрасоў. 346 00:19:34,000 --> 00:19:36,000 Гэта адно выключэнне. 347 00:19:36,000 --> 00:19:39,000 У квадратных дужках зрабіць іх асаблівымі. 348 00:19:39,000 --> 00:19:41,000 >> Не маглі б вы пакласці амперсанда побач з буферам? 349 00:19:41,000 --> 00:19:43,000 Не ў гэтым справа. 350 00:19:43,000 --> 00:19:46,000 Гэта не будзе працаваць, таму што, зноў жа, гэтага кутка выпадку 351 00:19:46,000 --> 00:19:49,000 дзе масівы на самай справе не зусім адрасу. 352 00:19:49,000 --> 00:19:54,000 Але мы, магчыма, вернемся да гэтага ў хуткім часе з іншымі прыкладамі. 353 00:19:54,000 --> 00:19:56,000 Давайце паспрабуем вырашыць праблему тут. 354 00:19:56,000 --> 00:20:00,000 У нас ёсць структуры дадзеных, якія мы выкарыстоўвалі на працягу некаторага часу вядома як масіў. 355 00:20:00,000 --> 00:20:02,000 Справа ў кропку, гэта тое, што мы проста не было. 356 00:20:02,000 --> 00:20:04,000 Але масівы маюць некаторыя плюсы і мінусы. 357 00:20:04,000 --> 00:20:06,000 Масівы з'яўляюцца добрым чаму? 358 00:20:06,000 --> 00:20:11,000 Што адна рэч, якая вам падабаецца, у той меры, вам падабаецца масівы пра масівах? 359 00:20:11,000 --> 00:20:13,000 Што зручна пра іх? Што пераканаўчым? 360 00:20:13,000 --> 00:20:18,000 Чаму мы ўвядзем іх у першую чаргу? 361 00:20:18,000 --> 00:20:20,000 Так. 362 00:20:20,000 --> 00:20:27,000 [Студэнт] Яны могуць захоўваць вялікі аб'ём дадзеных, і вам не прыйдзецца выкарыстаць усю рэч. 363 00:20:27,000 --> 00:20:29,000 Вы можаце выкарыстоўваць падзел. 364 00:20:29,000 --> 00:20:32,000 Добра, з масівам можна захоўваць вялікая колькасць дадзеных, 365 00:20:32,000 --> 00:20:35,000 і вам не абавязкова выкарыстоўваць усё гэта, так што вы можаце overallocate, 366 00:20:35,000 --> 00:20:39,000 што можа быць зручна, калі вы не ведаеце загадзя, колькі чагосьці чакаць. 367 00:20:39,000 --> 00:20:41,000 >> GetString з'яўляецца выдатным прыкладам. 368 00:20:41,000 --> 00:20:44,000 GetString, напісаныя намі, паняцця не мае, колькі знакаў чакаць, 369 00:20:44,000 --> 00:20:48,000 Таму той факт, што мы можам вылучыць куски бесперапыннай памяці гэта добра. 370 00:20:48,000 --> 00:20:51,000 Масівы таксама вырашыць праблему, мы ўбачылі пару тыдняў назад, цяпер 371 00:20:51,000 --> 00:20:54,000 , Дзе ваш код пачынае ператворыцца ў нешта вельмі дрэнна распрацавана. 372 00:20:54,000 --> 00:20:57,000 Нагадаем, што Я стварыў студэнт па імі Дэвід структуры, 373 00:20:57,000 --> 00:21:00,000 а затым, што было на самай справе альтэрнатыва, хоць, 374 00:21:00,000 --> 00:21:04,000 да наяўнасці зменнай імя і іншую зменную, я думаю, дома, 375 00:21:04,000 --> 00:21:08,000 і іншая пераменная ID, таму што ў гэтай гісторыі я тады хацеў прадставіць нешта іншае 376 00:21:08,000 --> 00:21:11,000 Роб падабаецца ў праграме, так што потым я вырашыў пачакаць хвіліну, 377 00:21:11,000 --> 00:21:13,000 Мне трэба перайменаваць гэтыя зменныя. 378 00:21:13,000 --> 00:21:16,000 Давайце называць маё name1, ID1, House1. 379 00:21:16,000 --> 00:21:20,000 Давайце назавем Адзежа name2, house2, ID2. 380 00:21:20,000 --> 00:21:22,000 Але пачакайце хвілінку, што пра Томі? 381 00:21:22,000 --> 00:21:24,000 Тады ў нас было яшчэ тры зменныя. 382 00:21:24,000 --> 00:21:27,000 Мы ўвялі кагосьці іншага, чатыры набору зменных. 383 00:21:27,000 --> 00:21:30,000 Свет пачаў заблытацца вельмі хутка, 384 00:21:30,000 --> 00:21:33,000 такім чынам, мы ўвялі структуры, і тое, што пераканаўчых аб структуры? 385 00:21:33,000 --> 00:21:39,000 Што структуру C дазволіць вам зрабіць? 386 00:21:39,000 --> 00:21:42,000 Гэта вельмі нязручна сёння. 387 00:21:42,000 --> 00:21:44,000 Што? >> [Неразборліва адказ студэнта] 388 00:21:44,000 --> 00:21:47,000 Так, у прыватнасці, ЬурейеЕ дазваляе стварыць новы тып дадзеных, 389 00:21:47,000 --> 00:21:51,000 і структуры, структуры ключавых слоў, дазваляе інкапсуляваць 390 00:21:51,000 --> 00:21:54,000 канцэптуальна звязаныя элементы дадзеных разам 391 00:21:54,000 --> 00:21:56,000 і пасля гэтага называць іх чымсьці накшталт студэнта. 392 00:21:56,000 --> 00:21:58,000 >> Гэта было добра, таму што цяпер мы можам змадэляваць 393 00:21:58,000 --> 00:22:03,000 значна больш рода канцэптуальна адпавядае паняццю студэнта ў зменную 394 00:22:03,000 --> 00:22:07,000 , А не адвольна якія маюць адзін для радкі, па адным для ID, і гэтак далей. 395 00:22:07,000 --> 00:22:10,000 Масівы прыемна, таму што яны дазваляюць пачаць уборку нашага кода. 396 00:22:10,000 --> 00:22:13,000 Але тое, што ёсць і зваротная бок цяпер масіва? 397 00:22:13,000 --> 00:22:15,000 Што вы можаце не рабіць? Так. 398 00:22:15,000 --> 00:22:17,000 [Студэнт] Вы павінны ведаць, наколькі яна вялікая. 399 00:22:17,000 --> 00:22:19,000 Вы павінны ведаць, наколькі ён вялікі, так што гэта выгляд болю. 400 00:22:19,000 --> 00:22:21,000 Тыя з вас, з вопытам праграмавання ведаем, што ў шматлікіх мовах, 401 00:22:21,000 --> 00:22:24,000 як Java, вы можаце папрасіць кавалак памяці, у прыватнасці масіва, 402 00:22:24,000 --> 00:22:28,000 наколькі вялікі ты, з даўжынёй, ўласнасць, так бы мовіць, і гэта сапраўды зручна. 403 00:22:28,000 --> 00:22:32,000 У C, вы не можаце нават назваць StrLen на агульным масіве 404 00:22:32,000 --> 00:22:35,000 таму што StrLen, як слова мае на ўвазе, толькі для радкоў, 405 00:22:35,000 --> 00:22:39,000 і вы можаце высветліць даўжыню радка, таму што гэтага чалавека канвенцыі 406 00:22:39,000 --> 00:22:43,000 наяўнасці \ 0, але масіве, у больш агульным, гэта проста кавалак памяці. 407 00:22:43,000 --> 00:22:46,000 Калі гэта масіў цэлых лікаў, там не будзе нейкі асаблівы характар 408 00:22:46,000 --> 00:22:48,000 У канцы вас чакае. 409 00:22:48,000 --> 00:22:50,000 Вы павінны памятаць, даўжыня масіва. 410 00:22:50,000 --> 00:22:54,000 Яшчэ адным недахопам масіва падняў сваю галаву ў GetString сябе. 411 00:22:54,000 --> 00:22:59,000 Што яшчэ адным недахопам масіва? 412 00:22:59,000 --> 00:23:01,000 Сэр, толькі ты і я сёння. 413 00:23:01,000 --> 00:23:04,000 [Неразборліва адказ студэнта] >> Гэта што? 414 00:23:04,000 --> 00:23:06,000 Ён абвешчаны ў стэку. 415 00:23:06,000 --> 00:23:09,000 Добра, заявіў у стэку. Чаму б вам не падабаецца? 416 00:23:09,000 --> 00:23:13,000 [Студэнт] Таму што ён будзе выкарыстоўваць паўторна. 417 00:23:13,000 --> 00:23:15,000 Ён атрымлівае паўторна. 418 00:23:15,000 --> 00:23:18,000 Добра, калі вы выкарыстоўваеце масіў для выдзялення памяці, 419 00:23:18,000 --> 00:23:21,000 Вы не можаце, напрыклад, вярнуцца, таму што гэта ў стэку. 420 00:23:21,000 --> 00:23:23,000 Добра, што гэта недахоп. 421 00:23:23,000 --> 00:23:25,000 А як наконт яшчэ аднаго з масівам? 422 00:23:25,000 --> 00:23:28,000 Пасля таго як вы вылучыце яе, ты накшталт п'яны, калі вам трэба больш месца 423 00:23:28,000 --> 00:23:30,000 , Чым у масіва. 424 00:23:30,000 --> 00:23:34,000 >> Тады мы ўвялі, нагадаем, таНос, які даў нам магчымасць дынамічнага выдзялення памяці. 425 00:23:34,000 --> 00:23:37,000 Але што, калі мы паспрабавалі іншы свет? 426 00:23:37,000 --> 00:23:40,000 Што калі мы хочам, каб вырашыць пару з тых праблем, 427 00:23:40,000 --> 00:23:45,000 так што мы замест-маё пяро заснуў тут- 428 00:23:45,000 --> 00:23:51,000 Што рабіць, калі мы замест гэтага хацелі сутнасці стварыць свет, які ўжо не так? 429 00:23:51,000 --> 00:23:56,000 Гэта масіў, і, вядома ж, гэты від пагаршаецца, як толькі мы патрапілі ў канец масіва, 430 00:23:56,000 --> 00:24:00,000 і я ўжо не хапае месца для іншага цэлага або іншага персанажа. 431 00:24:00,000 --> 00:24:03,000 Што рабіць, калі мы накшталт прэвентыўна кажаце, чаму б нам не адпачыць 432 00:24:03,000 --> 00:24:07,000 гэтае патрабаванне, што ўсе гэтыя ўчасткі памяці павінны быць сумежнымі спіна да спіны, 433 00:24:07,000 --> 00:24:10,000 і чаму гэтага не зрабіць, калі мне трэба Int або сімвал, 434 00:24:10,000 --> 00:24:12,000 проста дайце мне прастору для аднаго з іх? 435 00:24:12,000 --> 00:24:14,000 І калі мне трэба яшчэ, дай мне другога прасторы, 436 00:24:14,000 --> 00:24:16,000 і калі мне трэба яшчэ, дай мне другога прасторы. 437 00:24:16,000 --> 00:24:19,000 Перавага які ў цяперашні час з'яўляецца тое, што, калі хто-то яшчэ 438 00:24:19,000 --> 00:24:21,000 займае памяць тут, няма нічога складанага. 439 00:24:21,000 --> 00:24:25,000 Я вазьму гэты дадатковы блок памяці тут і то гэта адно. 440 00:24:25,000 --> 00:24:28,000 >> Зараз, толькі загваздка ў тым, што гэта амаль адчувае, як у мяне 441 00:24:28,000 --> 00:24:30,000 цэлы букет розных зменных. 442 00:24:30,000 --> 00:24:33,000 Гэта адчувае сябе пяць розных зменных патэнцыйна. 443 00:24:33,000 --> 00:24:36,000 Але што, калі мы выкрасці ідэю з радкоў 444 00:24:36,000 --> 00:24:41,000 якім мы неяк звязаць гэтыя рэчы разам канцэптуальна, а што, калі я гэта зрабіў? 445 00:24:41,000 --> 00:24:44,000 Гэта мой вельмі дрэнна звяртаецца стрэлкі. 446 00:24:44,000 --> 00:24:46,000 Але выкажам здагадку, што кожны з гэтых участкаў памяці 447 00:24:46,000 --> 00:24:52,000 паказаў на аднаго, і гэты хлопец, у якога няма брата, каб яго правы, 448 00:24:52,000 --> 00:24:54,000 не мае такога стрэлка. 449 00:24:54,000 --> 00:24:56,000 Гэта на самай справе тое, што называецца звязанага спісу. 450 00:24:56,000 --> 00:25:00,000 Гэта новая структура дадзеных, якая дазваляе вылучыць кавалак памяці, 451 00:25:00,000 --> 00:25:03,000 потым другая, потым яшчэ, потым яшчэ, у любы час мы хочам 452 00:25:03,000 --> 00:25:07,000 падчас выканання праграмы, і мы памятаем, што ўсе яны так ці інакш звязаных 453 00:25:07,000 --> 00:25:11,000 літаральна ланцужок іх разам, і мы зрабілі гэта наглядна тут са стрэлкай. 454 00:25:11,000 --> 00:25:15,000 Але ў кодзе, які будзе механізм, праз які вы маглі б нейкім чынам падключыць, 455 00:25:15,000 --> 00:25:20,000 амаль як Scratch, адзін кавалак на іншы кавалак? 456 00:25:20,000 --> 00:25:22,000 Мы маглі б выкарыстоўваць паказальнік, ці не так? 457 00:25:22,000 --> 00:25:25,000 Таму што на самой справе стрэлка, якая адбываецца з верхняга левага квадрата, 458 00:25:25,000 --> 00:25:31,000 гэты хлопец тут, каб гэтую, можа ўтрымлівацца ўнутры гэтага квадрата 459 00:25:31,000 --> 00:25:34,000 Не толькі некаторыя цэлыя, а не толькі некаторых знакаў, але што, калі я на самай справе вылучыў 460 00:25:34,000 --> 00:25:37,000 трохі дадатковага прасторы, так што цяпер, 461 00:25:37,000 --> 00:25:41,000 Кожны з маіх участкаў памяці, нават калі гэта будзе каштаваць мне, 462 00:25:41,000 --> 00:25:45,000 зараз выглядае крыху больш прастакутнай, дзе адзін з участкаў памяці 463 00:25:45,000 --> 00:25:47,000 Выкарыстоўваецца для нумар, як нумар 1, 464 00:25:47,000 --> 00:25:50,000 а затым, калі гэты хлопец захоўвае нумар 2, 465 00:25:50,000 --> 00:25:52,000 гэтая іншая частка памяці выкарыстоўваецца для стрэлка, 466 00:25:52,000 --> 00:25:54,000 або больш канкрэтна, паказальнік. 467 00:25:54,000 --> 00:25:59,000 І няхай я захоўваю № 3 тут у той час як я выкарыстоўваю гэта, каб паказаць на таго хлопца, 468 00:25:59,000 --> 00:26:02,000 і зараз гэты хлопец, выкажам здагадку, я хачу толькі тры такіх участкаў памяці. 469 00:26:02,000 --> 00:26:05,000 Я намалюю лінію праз якія, з указаннем нулявы. 470 00:26:05,000 --> 00:26:07,000 Існуе ніякага дадатковага характару. 471 00:26:07,000 --> 00:26:10,000 >> Сапраўды, гэта, як мы можам ісці аб рэалізацыі 472 00:26:10,000 --> 00:26:12,000 тое, што называецца складны спіс. 473 00:26:12,000 --> 00:26:18,000 Звязаны спіс новую структуру дадзеных, і гэта прыступка да 474 00:26:18,000 --> 00:26:21,000 шмат аматараў структур дадзеных, якія пачынаюць вырашаць праблемы 475 00:26:21,000 --> 00:26:23,000 ўздоўж лініі Facebook тып праблемы і Google тып праблемы 476 00:26:23,000 --> 00:26:26,000 дзе ў вас ёсць вялізныя наборы дадзеных, і ён больш не рэжа 477 00:26:26,000 --> 00:26:29,000 захоўваць усе бесперапынна і выкарыстоўваць нешта накшталт лінейны пошук 478 00:26:29,000 --> 00:26:31,000 або нават нешта накшталт бінарнага пошуку. 479 00:26:31,000 --> 00:26:33,000 Вы хочаце яшчэ лепш працуе разы. 480 00:26:33,000 --> 00:26:37,000 На самай справе, адна са Святой Grails мы пагаворым пазней на гэтым тыдні або ў наступным 481 00:26:37,000 --> 00:26:41,000 алгарытм, час выканання якой пастаянна. 482 00:26:41,000 --> 00:26:44,000 Іншымі словамі, яна заўсёды прымае столькі ж часу, незалежна ад таго, 483 00:26:44,000 --> 00:26:47,000 наколькі вялікі ўваход, і сапраўды было б пераканаўчым, 484 00:26:47,000 --> 00:26:49,000 нават больш, чым тое, лагарыфмічная. 485 00:26:49,000 --> 00:26:51,000 Што гэта на экране тут? 486 00:26:51,000 --> 00:26:55,000 Кожны з прастакутнікаў менавіта тое, што я толькі што намалявалі ад рукі. 487 00:26:55,000 --> 00:26:59,000 Але справа ўсё шляху злева спецыяльнай зменнай. 488 00:26:59,000 --> 00:27:02,000 Гэта збіраецца быць адным паказальнікам, таму што той Гоча 489 00:27:02,000 --> 00:27:04,000 з звязанага спісу, так як гэтыя рэчы называюцца, 490 00:27:04,000 --> 00:27:09,000 з'яўляецца тое, што ў вас ёсць, каб павесіць на адзін канец звязанага спісу. 491 00:27:09,000 --> 00:27:13,000 >> Гэтак жа, як з радком, вы павінны ведаць адрас першага знака. 492 00:27:13,000 --> 00:27:15,000 Тое ж здзелка для звязаных спісаў. 493 00:27:15,000 --> 00:27:19,000 Вы павінны ведаць адрас першага блока памяці 494 00:27:19,000 --> 00:27:25,000 таму што адтуль можна дабрацца да любога іншага. 495 00:27:25,000 --> 00:27:27,000 Даунсайд. 496 00:27:27,000 --> 00:27:30,000 Якую цану мы плацім за гэтую універсальнасць якія маюць дынамічнае 497 00:27:30,000 --> 00:27:34,000 значную структуру дадзеных, што калі мы калі-небудзь спатрэбіцца больш памяці, штраф, 498 00:27:34,000 --> 00:27:37,000 проста выдзеліць яшчэ адзін кавалак і намалюйце стрэлкі ад 499 00:27:37,000 --> 00:27:39,000 старога да новага хвасце спісу? 500 00:27:39,000 --> 00:27:41,000 Так. 501 00:27:41,000 --> 00:27:43,000 [Студэнт] Гэта займае прыкладна ўдвая больш прасторы. 502 00:27:43,000 --> 00:27:45,000 Яна займае ўдвая больш месца, так што гэта вызначана недахоп, і мы бачылі гэта 503 00:27:45,000 --> 00:27:48,000 Кампраміс, перш чым паміж часам і прасторай і гнуткасць 504 00:27:48,000 --> 00:27:51,000 дзе ў цяперашні час, нам не трэба 32 біт для кожнага з гэтых лікаў. 505 00:27:51,000 --> 00:27:57,000 Нам сапраўды трэба 64, 32 чысла і 32 для паказальніка. 506 00:27:57,000 --> 00:27:59,000 Але пачакайце, у мяне ёсць 2 гігабайта аператыўнай памяці. 507 00:27:59,000 --> 00:28:02,000 Даданне яшчэ 32 біта тут і тут не здаецца, што вялікія здзелкі. 508 00:28:02,000 --> 00:28:05,000 Але для вялікіх набораў дадзеных, гэта вызначана дадае літаральна ў два разы больш. 509 00:28:05,000 --> 00:28:09,000 Што яшчэ адным недахопам зараз, або тое, што функцыі мы здавацца, 510 00:28:09,000 --> 00:28:12,000 калі мы прадставім спісы рэчаў з звязанага спісу, а не масіў? 511 00:28:12,000 --> 00:28:14,000 [Студэнт] Вы не можаце прайсці ў зваротным кірунку. 512 00:28:14,000 --> 00:28:16,000 Вы не можаце прайсці ў зваротным кірунку, так што вы выгляд разьбовых калі вы ідзяце 513 00:28:16,000 --> 00:28:19,000 злева на права выкарыстання цыкла або час цыклу 514 00:28:19,000 --> 00:28:21,000 а потым разумееш: «О, я хачу вярнуцца ў пачатак спісу". 515 00:28:21,000 --> 00:28:26,000 Вы не можаце, таму што гэтыя паказальнікі ісці толькі злева направа, як стрэлкі паказваюць. 516 00:28:26,000 --> 00:28:29,000 >> Зараз, вы маглі ўспомніць пачатак спісу з іншай зменнай, 517 00:28:29,000 --> 00:28:31,000 але гэта складанасць мець на ўвазе. 518 00:28:31,000 --> 00:28:35,000 Масіваў, незалежна ад таго, як далёка вы пойдзеце, вы заўсёды можаце зрабіць мінус, мінус, мінус, мінус 519 00:28:35,000 --> 00:28:37,000 і вярнуцца, адкуль вы прыйшлі. 520 00:28:37,000 --> 00:28:40,000 Што яшчэ адным недахопам тут? Так. 521 00:28:40,000 --> 00:28:43,000 [Неразборліва пытанне студэнта] 522 00:28:43,000 --> 00:28:47,000 Можна, такім чынам, вы сапраўды толькі што прапанаваў структуру дадзеных, званую двойчы звязаны спіс, 523 00:28:47,000 --> 00:28:50,000 І сапраўды, можна дадаць яшчэ адзін паказальнік на кожны з гэтых прастакутнікаў 524 00:28:50,000 --> 00:28:53,000 , Які ідзе ў іншым накірунку, патэнцыял росту якіх 525 00:28:53,000 --> 00:28:55,000 Цяпер вы можаце прайсці туды і назад, 526 00:28:55,000 --> 00:28:59,000 Недахопам які ў цяперашні час вы выкарыстоўваеце ў тры разы больш памяці, чым мы прывыклі 527 00:28:59,000 --> 00:29:04,000 а таксама ўскладнення з пункту гледжання кода, вы павінны напісаць, каб атрымаць гэта права. 528 00:29:04,000 --> 00:29:08,000 Але ўсё гэта, магчыма, вельмі разумныя кампрамісы, калі зварот з'яўляецца больш важным. 529 00:29:08,000 --> 00:29:10,000 Так. 530 00:29:10,000 --> 00:29:12,000 [Студэнт] Вы таксама не можаце мець 2D звязанага спісу. 531 00:29:12,000 --> 00:29:16,000 Добра, вы не можаце сапраўды ёсць 2D звязаны спіс. 532 00:29:16,000 --> 00:29:18,000 Вы маглі б. Гэта не так проста, як масіў. 533 00:29:18,000 --> 00:29:21,000 Як і масіў, вы адкрывае дужкі, закрытая дужкі, якая адкрывае дужкі, закрытая дужкі, 534 00:29:21,000 --> 00:29:23,000 , І вы атрымаеце некаторы 2-мерных структуру. 535 00:29:23,000 --> 00:29:26,000 Вы можаце рэалізаваць 2-мерных звязаны спіс 536 00:29:26,000 --> 00:29:29,000 калі вы робіце дапаўненні, як вы прапанавалі, 1/3 паказальніка на кожную з гэтых рэчаў, 537 00:29:29,000 --> 00:29:34,000 і калі вы думаеце пра іншае спісе прыходзіць на вас 3D стыль 538 00:29:34,000 --> 00:29:40,000 з экрана ўсім нам, што гэта проста яшчэ адна ланцужок нейкі. 539 00:29:40,000 --> 00:29:45,000 Мы маглі б гэта зрабіць, але гэта не так проста, як друкаваць адкрытай дужкі, квадратныя дужкі. Так. 540 00:29:45,000 --> 00:29:48,000 [Неразборліва пытанне студэнта] 541 00:29:48,000 --> 00:29:50,000 Добра, так што гэта рэальны футбаліст. 542 00:29:50,000 --> 00:29:54,000 >> Гэтыя алгарытмы, якія мы тужылі па, як аб, бінарны пошук, 543 00:29:54,000 --> 00:29:57,000 Вы можаце шукаць масіў лікаў на дошцы 544 00:29:57,000 --> 00:30:01,000 або тэлефонную кнігу так значна хутчэй, калі вы выкарыстоўваеце падзяляй і ўладар 545 00:30:01,000 --> 00:30:05,000 і алгарытм двайковага пошуку, але бінарны пошук неабходных два здагадкі. 546 00:30:05,000 --> 00:30:09,000 Адзін з іх, што дадзеныя былі адсартаваныя. 547 00:30:09,000 --> 00:30:11,000 Цяпер мы можам па-відаць трымаць гэтую сартуюцца, 548 00:30:11,000 --> 00:30:14,000 так што, магчыма, гэта не мае значэння, але бінарны пошук Мяркуецца таксама, 549 00:30:14,000 --> 00:30:18,000 што вы мелі выпадковы доступ да спісу лікаў, 550 00:30:18,000 --> 00:30:21,000 і масіў дазваляе мець адвольны доступ, і выпадковага доступу, 551 00:30:21,000 --> 00:30:24,000 Я маю на ўвазе, калі вы гэтага масіва, колькі часу гэта зойме ў вас 552 00:30:24,000 --> 00:30:26,000 каб дабрацца да кранштэйна 0? 553 00:30:26,000 --> 00:30:29,000 Адна аперацыя, вы проста карыстаецеся [0], і вы тут жа. 554 00:30:29,000 --> 00:30:33,000 Колькі крокаў трэба для таго, каб дабрацца да размяшчэння 10? 555 00:30:33,000 --> 00:30:36,000 Адзін крок, вы проста ідзяце ў [10], і вы там. 556 00:30:36,000 --> 00:30:40,000 У адрозненне ад гэтага, як вы атрымліваеце па 10 лік у звязаным спісе? 557 00:30:40,000 --> 00:30:42,000 Вы павінны пачаць з самага пачатку, таму што вы толькі памятаючы 558 00:30:42,000 --> 00:30:45,000 пачатак звязанага спісу, як і радок у цяперашні час памятала 559 00:30:45,000 --> 00:30:48,000 па адрасе яе першы знак, і выявілі, што дзесятая Int 560 00:30:48,000 --> 00:30:53,000 або што дзесятая знакаў у радку, вы павінны шукаць ўсю гэтую чортаву рэч. 561 00:30:53,000 --> 00:30:55,000 >> Зноў жа, мы не рашэнне ўсіх нашых праблем. 562 00:30:55,000 --> 00:31:00,000 Мы ўяўляем новыя, але гэта залежыць ад таго, што вы спрабуеце праектаваць для. 563 00:31:00,000 --> 00:31:04,000 У плане рэалізацыі гэтага, мы можам запазычаць ідэі з гэтага студэнта структуры. 564 00:31:04,000 --> 00:31:07,000 Сінтаксіс вельмі падобны, толькі цяпер, ідэя трохі больш абстрактных 565 00:31:07,000 --> 00:31:09,000 чым дома, назву і ID. 566 00:31:09,000 --> 00:31:13,000 Але я прапаную, каб мы маглі мець структуру дадзеных у C 567 00:31:13,000 --> 00:31:17,000 што называецца вузлом, так як апошняе слова на слайд прапановы, 568 00:31:17,000 --> 00:31:21,000 Усярэдзіне вузла і вузел проста агульны кантэйнер ў кампутарнай навуцы. 569 00:31:21,000 --> 00:31:25,000 Гэта звычайна малюецца ў выглядзе круга або квадрата альбо прастакутніка, як мы зрабілі. 570 00:31:25,000 --> 00:31:27,000 І ў гэтай структуры дадзеных, у нас ёсць цэлы лік, N, 571 00:31:27,000 --> 00:31:29,000 так што гэта лік я хачу захаваць. 572 00:31:29,000 --> 00:31:36,000 Але што гэта другая лінія, структура вузла * далей? 573 00:31:36,000 --> 00:31:40,000 Чаму гэта правільна, альбо якую ролю гэтая рэч гульні, 574 00:31:40,000 --> 00:31:42,000 хоць гэта крыху загадкавае на першы погляд? 575 00:31:42,000 --> 00:31:44,000 Так. 576 00:31:44,000 --> 00:31:46,000 [Неразборліва адказ студэнта] 577 00:31:46,000 --> 00:31:50,000 Менавіта, таму * роду трафеі, што гэта паказальнік нейкі. 578 00:31:50,000 --> 00:31:53,000 Назва гэтага паказальніка калі заўгодна іншы, 579 00:31:53,000 --> 00:32:00,000 але мы маглі б назваў гэта ўсё, што мы хочам, але тое, што робіць гэты паказальнік паказвае на? 580 00:32:00,000 --> 00:32:03,000 [Студэнт] Іншы вузел. >> Сапраўды, ён паказвае на іншай такой вузел. 581 00:32:03,000 --> 00:32:05,000 >> Цяпер, гэта свайго роду цікаўнасць C. 582 00:32:05,000 --> 00:32:09,000 Нагадаем, што C чытаецца кампілятарам зверху ўніз, злева направа, 583 00:32:09,000 --> 00:32:13,000 што азначае, калі-гэта трохі адрозніваецца ад таго, што мы рабілі з вучнем. 584 00:32:13,000 --> 00:32:16,000 Калі мы вызначылі студэнт, мы на самай справе не ставіў слова там. 585 00:32:16,000 --> 00:32:18,000 Ён проста сказаў ЬурейеЕ. 586 00:32:18,000 --> 00:32:20,000 Тады ў нас была Int Ідэнтыфікатар, імя радкі, радкі дом, 587 00:32:20,000 --> 00:32:23,000 , А затым студэнтам у ніжняй частцы структуры. 588 00:32:23,000 --> 00:32:26,000 Гэта заяву трохі адрозніваецца, таму што, 589 00:32:26,000 --> 00:32:28,000 зноў жа, кампілятар гэта трохі дурное. 590 00:32:28,000 --> 00:32:30,000 Гэта толькі збіраецца чытаць зверху ўніз, 591 00:32:30,000 --> 00:32:33,000 Такім чынам, калі яно дасягае 2-й лініі тут 592 00:32:33,000 --> 00:32:37,000 дзе побач абвешчаны, і ён бачыць, ой, вось пераменная наступным. 593 00:32:37,000 --> 00:32:39,000 Гэта паказальнік на структуру вузла. 594 00:32:39,000 --> 00:32:42,000 Кампілятар будзе разумець, што гэта структура вузла? 595 00:32:42,000 --> 00:32:44,000 Я ніколі не чуў аб гэтай рэчы раней, 596 00:32:44,000 --> 00:32:47,000 таму што слова вузел не маглі б з'явіцца 597 00:32:47,000 --> 00:32:49,000 да дна, так што гэтая надмернасць. 598 00:32:49,000 --> 00:32:53,000 Вы павінны сказаць структуры вузлоў тут, якія затым можна скараціць у далейшым 599 00:32:53,000 --> 00:32:56,000 Дзякуючы ЬурейеЕ тут, але гэта таму, што 600 00:32:56,000 --> 00:33:02,000 Мы спасылкай на саму структуру ўнутры структуры. 601 00:33:02,000 --> 00:33:05,000 Гэта той, Гоча там. 602 00:33:05,000 --> 00:33:07,000 >> Некаторыя цікавыя праблемы будуць узнікаць. 603 00:33:07,000 --> 00:33:09,000 У нас ёсць спіс нумароў. Як мы устаўляемы ў яго? 604 00:33:09,000 --> 00:33:11,000 Як мы можам шукаць яго? Як мы можам выдаліць з яго? 605 00:33:11,000 --> 00:33:13,000 Асабліва цяпер, калі мы павінны кіраваць усімі гэтымі паказальнікамі. 606 00:33:13,000 --> 00:33:15,000 Вы думалі, паказальнікі былі свайго роду галюцынагенныя 607 00:33:15,000 --> 00:33:17,000 калі вы былі адным з іх проста спрабую чытаць Int да яго. 608 00:33:17,000 --> 00:33:20,000 Цяпер мы павінны маніпуляваць коштам усяго спісу. 609 00:33:20,000 --> 00:33:22,000 Чаму б нам не ўзяць нашу 5-хвілінны перапынак тут, а потым мы прынясем 610 00:33:22,000 --> 00:33:34,000 некаторыя людзі на сцэну, каб зрабіць менавіта гэта. 611 00:33:34,000 --> 00:33:36,000 >> З значна больш задавальнення, калі яна разыгрываецца. 612 00:33:36,000 --> 00:33:39,000 Хто б літаральна хацеў быць першым? 613 00:33:39,000 --> 00:33:41,000 Добра, давай ўверх. Вы знаходзіцеся ў першую чаргу. 614 00:33:41,000 --> 00:33:44,000 Хто хацеў бы быць 9? Добра, 9. 615 00:33:44,000 --> 00:33:46,000 Як наконт 9? 17? 616 00:33:46,000 --> 00:33:51,000 Трохі кліку тут. 22 і 26 у гэтым шэрагу. 617 00:33:51,000 --> 00:33:53,000 І потым, як аб кім-то там, на якую спасылаюцца. 618 00:33:53,000 --> 00:33:57,000 Вы 34. Добра, 34, давай ўверх. 619 00:33:57,000 --> 00:33:59,000 Па-першае, гэта там. Добра, усе чатыры з вас, хлопцы. 620 00:33:59,000 --> 00:34:01,000 А хто ж мы гаворым на 9? 621 00:34:01,000 --> 00:34:04,000 Хто наш 9? 622 00:34:04,000 --> 00:34:07,000 Хто сапраўды хоча быць 9? Добра, давай, быць 9. 623 00:34:07,000 --> 00:34:10,000 Тут мы ідзем. 624 00:34:10,000 --> 00:34:13,000 34, мы сустрэнемся з вамі там. 625 00:34:13,000 --> 00:34:17,000 Першая частка ўяўляе сабой зрабіць сабе выглядаць. 626 00:34:17,000 --> 00:34:21,000 26, 22, 17, добра. 627 00:34:21,000 --> 00:34:25,000 Калі вы можаце стаяць у баку, таму што мы збіраемся Malloc вас у дадзены момант. 628 00:34:25,000 --> 00:34:29,000 >> Добра, добра. 629 00:34:29,000 --> 00:34:32,000 Добра, выдатна, так што давайце задаць пару пытанняў тут. 630 00:34:32,000 --> 00:34:34,000 А на самай справе, як цябе завуць? >> Аніта. 631 00:34:34,000 --> 00:34:37,000 Аніта, добра, ідзі сюды. 632 00:34:37,000 --> 00:34:41,000 Аніта збіраецца дапамагчы нам накшталт вырашыць адзін досыць простае пытанне ў першым, 633 00:34:41,000 --> 00:34:44,000 які, як вы лічыце, ці з'яўляецца значэнне знаходзіцца ў спісе? 634 00:34:44,000 --> 00:34:48,000 Зараз звернеце ўвагу, што, па-першае, прадстаўленыя тут Лукас, 635 00:34:48,000 --> 00:34:52,000 трохі адрозніваецца, і таму яго паперку ​​свядома бокам 636 00:34:52,000 --> 00:34:55,000 таму што гэта не так высокі і не займае столькі бітаў, 637 00:34:55,000 --> 00:34:58,000 хоць тэхнічна ён мае такі ж памер паперы, проста паварочваецца. 638 00:34:58,000 --> 00:35:01,000 Але ён крыху адрозніваецца тым, што ён усяго толькі 32 біт для паказальніка, 639 00:35:01,000 --> 00:35:05,000 і ўсе гэтыя хлопцы з'яўляюцца 64-бітнымі, палова з якіх гэты лік, палова з якіх з'яўляецца паказальнікам. 640 00:35:05,000 --> 00:35:08,000 Але паказальнік ня намалявана, так што калі вы, хлопцы, маглі б некалькі нязграбна 641 00:35:08,000 --> 00:35:12,000 выкарыстоўваць левую руку, каб паказаць на чалавека побач з вамі. 642 00:35:12,000 --> 00:35:14,000 І ты нумар 34. Як цябе клічуць? 643 00:35:14,000 --> 00:35:16,000 Ары. 644 00:35:16,000 --> 00:35:19,000 Ары, так што на самай справе, трымаць паперу ў правую руку, а левая рука ідзе ўніз. 645 00:35:19,000 --> 00:35:21,000 Вы ўяўляеце нулявы злева. 646 00:35:21,000 --> 00:35:24,000 >> Цяпер наша чалавечая карціна вельмі паслядоўныя. 647 00:35:24,000 --> 00:35:26,000 На самай справе гэта як паказальнікі працуюць. 648 00:35:26,000 --> 00:35:29,000 І калі вы паспрабуеце можа трохі Такім чынам, так што я не на вашым шляху. 649 00:35:29,000 --> 00:35:34,000 Аніта тут, знайсці мне нумар 22, 650 00:35:34,000 --> 00:35:40,000 але выказаць здагадку, абмежаванне не людзі, падняўшы паперкі, 651 00:35:40,000 --> 00:35:43,000 Але гэта спіс, і ў вас ёсць толькі Лукас з самага пачатку 652 00:35:43,000 --> 00:35:46,000 таму што ён літаральна першы паказальнік. 653 00:35:46,000 --> 00:35:51,000 Выкажам здагадку, што вы самі паказальнік, так што вы таксама маеце магчымасць паказаць на нешта. 654 00:35:51,000 --> 00:35:56,000 Чаму б вам не пачаць, паказваючы на ​​тое, што Лукас паказвае на? 655 00:35:56,000 --> 00:35:58,000 Добра, і дазвольце мне прыняць на гэта тут. 656 00:35:58,000 --> 00:36:04,000 Толькі дзеля абмеркавання, дазвольце мне падцягнуць пустую старонку тут. 657 00:36:04,000 --> 00:36:06,000 Як пішацца ваша імя? >> Аніта. 658 00:36:06,000 --> 00:36:08,000 Добра, Аніта. 659 00:36:08,000 --> 00:36:18,000 Дапусцім, вузел * Аніта = Лукас. 660 00:36:18,000 --> 00:36:22,000 Ну, мы не павінны называць вас Лукас. Мы павінны патэлефанаваць вам у першую чаргу. 661 00:36:22,000 --> 00:36:25,000 Чаму гэта на самай справе адпавядае рэчаіснасці тут? 662 00:36:25,000 --> 00:36:27,000 Адзін, першы ўжо існуе. 663 00:36:27,000 --> 00:36:30,000 Першае было выдзелена як мяркуецца, недзе тут. 664 00:36:30,000 --> 00:36:35,000 Node * Па-першае, і гэта было выдзелена спісу как-то. 665 00:36:35,000 --> 00:36:37,000 Я не ведаю, як гэта адбылося. Гэта адбылося да пачатку класа. 666 00:36:37,000 --> 00:36:40,000 Гэта звязана спіс людзей была створана. 667 00:36:40,000 --> 00:36:44,000 А зараз у гэты момант у гісторыі-гэта ўсё адбываецца на Facebook мабыць пазней 668 00:36:44,000 --> 00:36:49,000 на дадзены момант у гэтай гісторыі, Аніта была ініцыялізаваць роўнай першай, 669 00:36:49,000 --> 00:36:51,000 але гэта не значыць, што Аніта паказвае на Лукаса. 670 00:36:51,000 --> 00:36:53,000 Хутчэй за ўсё, яна паказвае на тое, што ён паказвае на 671 00:36:53,000 --> 00:36:57,000 таму што той жа адрас, што знаходзіцца ўнутры 32 біт Лукас - 1, 2, 3 - 672 00:36:57,000 --> 00:37:01,000 Цяпер і ўнутры 32 біт Аніта - 1, 2, 3. 673 00:37:01,000 --> 00:37:05,000 >> Цяпер знайдзіце 22. Як бы вы пра гэта? 674 00:37:05,000 --> 00:37:07,000 Што гэта? >> Кропка заўгодна. 675 00:37:07,000 --> 00:37:11,000 Каб навесьці курсор на любы іншы, так што ісці наперад і дзейнічаць яго як лепшае, што вы можаце тут. 676 00:37:11,000 --> 00:37:15,000 Добра, добра, і цяпер вы, паказваючы на ​​тое, што, як цябе клічуць з 22? 677 00:37:15,000 --> 00:37:18,000 Рамон. >> Рамон, так Рамон трымаецца 22. 678 00:37:18,000 --> 00:37:20,000 Вы ўжо зрабілі чэк. 679 00:37:20,000 --> 00:37:24,000 Хіба Рамон == 22, і калі так, напрыклад, мы можам вярнуцца дакладна. 680 00:37:24,000 --> 00:37:26,000 Дазвольце мне, у той час як гэтыя хлопцы стаяць тут некалькі нязграбна- 681 00:37:26,000 --> 00:37:32,000 Дазвольце мне зрабіць нешта хутка, як BOOL знайсці. 682 00:37:32,000 --> 00:37:37,000 Я збіраюся ісці наперад і казаць (спіс вузлоў *, Int N). 683 00:37:37,000 --> 00:37:39,000 Я хутка вярнуся з вамі, хлопцы. Мне проста трэба напісаць код. 684 00:37:39,000 --> 00:37:45,000 А цяпер я збіраюся ісці наперад і рабіць гэта, вузел * Аніта = спісе. 685 00:37:45,000 --> 00:37:51,000 І я буду ісці наперад і казаць у той час як (Анита! = NULL). 686 00:37:51,000 --> 00:37:57,000 >> Метафара тут становіцца трохі расцягнута, але ў той час (Анита! = NULL), што я хачу рабіць? 687 00:37:57,000 --> 00:38:03,000 Мне трэба нейкім чынам спасылкі 688 00:38:03,000 --> 00:38:05,000 цэлы лік, Аніта паказвае на. 689 00:38:05,000 --> 00:38:08,000 У мінулым, калі мы мелі структур, якія вузла, 690 00:38:08,000 --> 00:38:11,000 Мы выкарыстоўвалі пазначэнне кропкі, і мы хацелі б сказаць нешта накшталт: 691 00:38:11,000 --> 00:38:15,000 anita.n, але праблема ў тым, што Аніта не з'яўляецца структурай як такой. 692 00:38:15,000 --> 00:38:17,000 Што яна? 693 00:38:17,000 --> 00:38:21,000 Яна паказальнік, так што сапраўды, калі мы хочам выкарыстоўваць гэтую кропкавую натацыю- 694 00:38:21,000 --> 00:38:23,000 і гэта будзе выглядаць знарочыста трохі загадкава- 695 00:38:23,000 --> 00:38:28,000 Мы павінны зрабіць нешта накшталт пераходу на левай руцэ усё, што Аніта паказвае на 696 00:38:28,000 --> 00:38:31,000 , А затым атрымаць полі называецца п. 697 00:38:31,000 --> 00:38:35,000 Аніта з'яўляецца паказальнікам, але тое, што * Аніта? 698 00:38:35,000 --> 00:38:38,000 Што вы знаходзіце, калі вы ідзяце да таго, што Аніта паказвае на? 699 00:38:38,000 --> 00:38:42,000 Структуры, вузлоў і вузлоў, нагадаем, мае поле з назвай п 700 00:38:42,000 --> 00:38:47,000 таму што яна, нагадаем, гэтыя 2 поля, у наступным і п, 701 00:38:47,000 --> 00:38:50,000 , Які мы бачылі некалькі хвілін назад прама тут. 702 00:38:50,000 --> 00:38:53,000 >> Каб на самай справе імітаваць гэта ў кодзе, 703 00:38:53,000 --> 00:39:02,000 мы маглі б зрабіць гэта і кажуць, што калі ((* Anita). == п п), п, што я шукаў. 704 00:39:02,000 --> 00:39:04,000 Звярніце ўвагу, што функцыя была перададзена ў колькасці я клапачуся. 705 00:39:04,000 --> 00:39:10,000 Тады я магу ісці наперад і рабіць нешта накшталт вяртання праўда. 706 00:39:10,000 --> 00:39:12,000 У адваротным выпадку, калі гэта не так, што я хачу рабіць? 707 00:39:12,000 --> 00:39:19,000 Як перавесці ў код, што Аніта зрабіла гэта інтуітыўна, ідучы па спісе? 708 00:39:19,000 --> 00:39:26,000 Што я павінен рабіць тут, каб імітаваць Аніта гэтага кроку налева, што крок налева? 709 00:39:26,000 --> 00:39:28,000 [Неразборліва адказ студэнта] >> Што гэта такое? 710 00:39:28,000 --> 00:39:30,000 [Неразборліва адказ студэнта] 711 00:39:30,000 --> 00:39:34,000 Добра, не дрэнная ідэя, але ў мінулым, калі мы зрабілі гэта, мы зрабілі Аніта + + 712 00:39:34,000 --> 00:39:37,000 таму што гэта было дадаць лік ад 1 да Аніты, 713 00:39:37,000 --> 00:39:40,000 якія, як правіла, паказваюць на наступны чалавек, як Рамон, 714 00:39:40,000 --> 00:39:44,000 або асобай, побач з ім ці побач з ім тварам уніз лінію. 715 00:39:44,000 --> 00:39:49,000 Але гэта не зусім добра тут, таму што гэта рэч выглядаць у памяці? 716 00:39:49,000 --> 00:39:54,000 Не тое, каб. Мы павінны адключыць гэта. 717 00:39:54,000 --> 00:40:00,000 Падобна на тое, што гэта ў памяці, і, хоць я намаляваў 1 і 2 і 3 блізкія адзін да аднаго, 718 00:40:00,000 --> 00:40:03,000 калі мы сапраўды імітацыі гэтага, вы, хлопцы, у той жа час паказваючы на ​​тыя ж людзі, 719 00:40:03,000 --> 00:40:07,000 можа, некаторыя з вас прымаюць выпадковыя крок назад, некаторыя з вас выпадковы крок наперад? 720 00:40:07,000 --> 00:40:10,000 >> Гэтая чахарда па-ранейшаму звязанага спісу, 721 00:40:10,000 --> 00:40:13,000 але гэтыя хлопцы могуць быць дзе заўгодна ў памяці, 722 00:40:13,000 --> 00:40:15,000 так што Аніта + + не будзе працаваць, чаму? 723 00:40:15,000 --> 00:40:19,000 Што на месцы Аніта + +? 724 00:40:19,000 --> 00:40:21,000 Хто яго ведае. 725 00:40:21,000 --> 00:40:24,000 Гэта некаторыя іншыя значэнні, проста так здараецца быць устаўлены 726 00:40:24,000 --> 00:40:28,000 сярод усіх гэтых вузлоў выпадкова, таму што мы не выкарыстоўваем масіў. 727 00:40:28,000 --> 00:40:30,000 Мы вылучылі кожнаму з гэтых вузлоў па асобнасці. 728 00:40:30,000 --> 00:40:32,000 Добра, калі вы, хлопцы, можаце ачысціць сябе назад. 729 00:40:32,000 --> 00:40:37,000 Дазвольце мне прапанаваць, што замест Аніты + +, мы замест гэтага атрымлівае Аніта- 730 00:40:37,000 --> 00:40:42,000 Ну, чаму б нам не пайсці на любыя Аніта паказвае на тое і робім. Наступны? 731 00:40:42,000 --> 00:40:45,000 Іншымі словамі, мы ідзем да Рамон, які трымае нумар 22, 732 00:40:45,000 --> 00:40:51,000 і потым. наступная як быццам Аніта будзе капіяваць яго левы паказальнік руку. 733 00:40:51,000 --> 00:40:54,000 Але яна не хацела ісці далей, чым Ramon таму што мы знайшлі 22. 734 00:40:54,000 --> 00:40:56,000 Але гэта была б ідэя. Цяпер, гэта бог-жудасны беспарадак. 735 00:40:56,000 --> 00:40:59,000 Шчыра кажучы, ніхто ніколі не будзе памятаць гэты сінтаксіс, і таму, на шчасце, 736 00:40:59,000 --> 00:41:04,000 гэта на самай справе трохі наўмысным-ой, вы на самой справе не разумееце, што я напісаў. 737 00:41:04,000 --> 00:41:08,000 Гэта было б больш пераканаўчым, калі б маглі. Voila! 738 00:41:08,000 --> 00:41:10,000 >> За кулісамі, я быў вырашыць праблему такім чынам. 739 00:41:10,000 --> 00:41:14,000 Аніта, пайсці на гэты крок налева, 740 00:41:14,000 --> 00:41:18,000 Па-першае, мы сапраўды ідуць на адрас, які Аніта паказвае на 741 00:41:18,000 --> 00:41:23,000 і дзе яна знойдзе не толькі рускіх, якія мы толькі што праверыў для параўнання, 742 00:41:23,000 --> 00:41:25,000 але вы таксама знойдзеце наступную - у гэтым выпадку, 743 00:41:25,000 --> 00:41:28,000 Левай рукой Рамона, паказваючы на ​​наступны вузел у спісе. 744 00:41:28,000 --> 00:41:32,000 Але гэта бог-жудасны беспарадак пра якія я казаў раней, 745 00:41:32,000 --> 00:41:34,000 але аказваецца, C дазваляе нам спрасціць гэта. 746 00:41:34,000 --> 00:41:40,000 Замест лісты (* Anita), мы можам замест гэтага проста напісаць Аніта-> п, 747 00:41:40,000 --> 00:41:45,000 і гэта адно і тое ж функцыянальна, але гэта нашмат больш зразумелым, 748 00:41:45,000 --> 00:41:48,000 і гэта нашмат больш адпавядае з карцінай, якую мы прыцягвалі 749 00:41:48,000 --> 00:41:50,000 Увесь гэты час з дапамогай стрэлак. 750 00:41:50,000 --> 00:41:57,000 >> Нарэшце, што мы павінны зрабіць у канцы гэтай праграме? 751 00:41:57,000 --> 00:42:00,000 Там у адным радку кода засталося. 752 00:42:00,000 --> 00:42:02,000 Вяртанне што? 753 00:42:02,000 --> 00:42:05,000 Хлусня, таму што калі мы атрымаем праз увесь час цыклу 754 00:42:05,000 --> 00:42:10,000 і Аніта з'яўляецца, па сутнасці, нулявы, значыць, яна прайшла шлях да канца спісу 755 00:42:10,000 --> 00:42:12,000 дзе яна, паказваючы на ​​тое, што, цябе завуць? 756 00:42:12,000 --> 00:42:15,000 Левая Ары. >> Ары боку, якая з'яўляецца несапраўдным. 757 00:42:15,000 --> 00:42:18,000 Аніта зараз нулявы, і я разумею, вы проста стаіце тут няёмка ў падвешаным стане 758 00:42:18,000 --> 00:42:21,000 таму што я збіраюся адправіцца ў маналогу тут, 759 00:42:21,000 --> 00:42:23,000 але мы будзем прыцягваць вас зноў праз хвіліну. 760 00:42:23,000 --> 00:42:27,000 Аніта з'яўляецца несапраўдным у той момант у гісторыі, так што ў той час як цыкл завяршаецца, 761 00:42:27,000 --> 00:42:30,000 і мы павінны вярнуцца ілжывым, таму што калі яна атрымала ўсю дарогу да нулявога паказальніка Ары 762 00:42:30,000 --> 00:42:34,000 тады не было ліку, што яна шукала ў спісе. 763 00:42:34,000 --> 00:42:39,000 Мы можам ачысціць гэта занадта, але гэта даволі добрая рэалізацыя, то 764 00:42:39,000 --> 00:42:43,000 функцыі абыходу, знайсці функцыі для звязанага спісу. 765 00:42:43,000 --> 00:42:48,000 Ён па-ранейшаму лінейны пошук, але гэта не так проста, як + + паказальнік 766 00:42:48,000 --> 00:42:52,000 або + + пераменная я, таму што зараз мы не можам адгадаць 767 00:42:52,000 --> 00:42:54,000 дзе кожны з гэтых вузлоў у памяці. 768 00:42:54,000 --> 00:42:57,000 Мы павінны літаральна рухацца па слядах сухарамі або, больш канкрэтна, 769 00:42:57,000 --> 00:43:00,000 паказальнікаў, каб дабрацца ад аднаго вузла да іншага. 770 00:43:00,000 --> 00:43:02,000 >> Зараз давайце паспрабуем яшчэ адзін. Аніта, вы хочаце, каб вярнуцца сюды? 771 00:43:02,000 --> 00:43:06,000 Чаму б нам не пайсці далей і вылучыць аднаго чалавека з аўдыторыі? 772 00:43:06,000 --> 00:43:08,000 Malloc-як цябе клічуць? >> Рэбека. 773 00:43:08,000 --> 00:43:10,000 Рэбека. Рэбека была malloced ад аўдыторыі, 774 00:43:10,000 --> 00:43:13,000 і зараз яна захоўваецца нумар 55. 775 00:43:13,000 --> 00:43:17,000 І мэта пад рукой цяпер для Аніты, каб ўставіць 776 00:43:17,000 --> 00:43:22,000 Рэбека ў звязаны спіс тут у адпаведным месцы. 777 00:43:22,000 --> 00:43:24,000 Давай сюды на хвілінку. 778 00:43:24,000 --> 00:43:28,000 Я зрабіў нешта накшталт гэтага. 779 00:43:28,000 --> 00:43:32,000 Я зрабіў вузел *. А што цябе клічуць? 780 00:43:32,000 --> 00:43:34,000 Рэбека. >> Рэбека, усё ў парадку. 781 00:43:34,000 --> 00:43:41,000 Рэбека атрымлівае таНос (SizeOf (вузла)). 782 00:43:41,000 --> 00:43:44,000 Гэтак жа, як мы выдзелілі такія рэчы, як студэнты і яшчэ шмат чаго ў мінулым, 783 00:43:44,000 --> 00:43:46,000 Мы маем патрэбу ў памеры вузла, так што зараз Рэбека 784 00:43:46,000 --> 00:43:49,000 паказвае на тое, што? 785 00:43:49,000 --> 00:43:52,000 Рэбека мае два поля ўнутры яе, адным з якіх з'яўляецца 55. 786 00:43:52,000 --> 00:43:55,000 Давайце рабіць тое, што, Рэбека-> = 55. 787 00:43:55,000 --> 00:44:00,000 Але тады Рэбека-> наступная павінна быць, як цяпер, яе рука гэта свайго роду хто ведае? 788 00:44:00,000 --> 00:44:03,000 Гэта паказвае на некаторы смецце значэнне, дык чаму б не для добрай мерай 789 00:44:03,000 --> 00:44:07,000 Мы па крайняй меры, зрабіць так, каб левая рука цяпер на яго баку. 790 00:44:07,000 --> 00:44:09,000 Цяпер Аніта, вазьмі яго адсюль. 791 00:44:09,000 --> 00:44:11,000 Вы павінны Рэбека таго, былі вылучаныя. 792 00:44:11,000 --> 00:44:20,000 Ідзем далей і знайсці, дзе мы павінны паставіць Рэбека. 793 00:44:20,000 --> 00:44:25,000 Добра, вельмі добра. 794 00:44:25,000 --> 00:44:28,000 Добра, добра, і зараз мы маем патрэбу ў вас, каб забяспечыць трохі кірунак, 795 00:44:28,000 --> 00:44:30,000 так што вы дасягнулі Ары. 796 00:44:30,000 --> 00:44:33,000 Яго левая рука з'яўляецца сапраўдным, але Рэбека, відавочна, належыць права, 797 00:44:33,000 --> 00:44:36,000 Так як жа мы павінны змяніць гэта звязаны спіс 798 00:44:36,000 --> 00:44:38,000 для таго, каб ўставіць Рэбека ў адпаведным месцы? 799 00:44:38,000 --> 00:44:42,000 Калі б вы маглі літаральна рухаць левай рукі людзей па ўсім меры неабходнасці, 800 00:44:42,000 --> 00:44:48,000 мы вырашыць гэтую праблему такім чынам. 801 00:44:48,000 --> 00:44:52,000 Добра, добра, а тым часам левая рука Рэбека цяпер на яго баку. 802 00:44:52,000 --> 00:44:54,000 >> Гэта было занадта проста. 803 00:44:54,000 --> 00:44:57,000 Давайце паспрабуем вылучэнне-Мы амаль скончылі, 20. 804 00:44:57,000 --> 00:44:59,000 Добра, давай ўверх. 805 00:44:59,000 --> 00:45:04,000 20 былі вылучаныя, так што дазвольце мне ісці наперад і сказаць зноў тут 806 00:45:04,000 --> 00:45:07,000 мы толькі што зрабілі Саад вузел *. 807 00:45:07,000 --> 00:45:11,000 У нас ёсць таНос (SizeOf (вузла)). 808 00:45:11,000 --> 00:45:16,000 Затым мы робім дакладна такі ж сінтаксіс, як мы рабілі раней на 20, 809 00:45:16,000 --> 00:45:20,000 і я буду рабіць далей = NULL, і цяпер справа за Анітай 810 00:45:20,000 --> 00:45:23,000 ўставіць вас у звязаным спісе, калі б вы маглі гуляць, што дакладна такую ​​ж ролю. 811 00:45:23,000 --> 00:45:30,000 Выканаць. 812 00:45:30,000 --> 00:45:32,000 Добра, добра. 813 00:45:32,000 --> 00:45:38,000 Цяпер падумайце, перш чым пачаць рух левай рукі вакол. 814 00:45:38,000 --> 00:45:46,000 Вы на сённяшні дзень атрымалі самы нязручны ролю сёння. 815 00:45:46,000 --> 00:45:59,000 Чыя рука павінна быць перанесена ў першую чаргу? 816 00:45:59,000 --> 00:46:02,000 Добра, пачакай, я чую некаторых няма ў. 817 00:46:02,000 --> 00:46:07,000 Калі некаторыя людзі хацелі б ветліва, каб дапамагчы вырашыць няёмкую сітуацыю тут. 818 00:46:07,000 --> 00:46:11,000 Чыя левай рукой неабходна спачатку абнавіць магчыма? Так. 819 00:46:11,000 --> 00:46:13,000 [Студэнт] Саад аўтара. 820 00:46:13,000 --> 00:46:15,000 Добра, Саад, чаму, праўда? 821 00:46:15,000 --> 00:46:17,000 [Неразборліва адказ студэнта] 822 00:46:17,000 --> 00:46:19,000 Добра, таму што калі мы будзем рухацца, як цябе завуць? >> Маршал. 823 00:46:19,000 --> 00:46:22,000 Marshall, калі мы будзем рухацца руку спачатку ўніз да нуля, 824 00:46:22,000 --> 00:46:25,000 Цяпер мы ў літаральным сэнсе сіротамі чатырох чалавек у гэтым спісе 825 00:46:25,000 --> 00:46:29,000 таму што ён быў адзіным, паказваючы на ​​Рамона, і ўсе налева, 826 00:46:29,000 --> 00:46:31,000 так што абнаўленне паказальнікаў першы быў дрэнны. 827 00:46:31,000 --> 00:46:33,000 Давайце адмяніць гэта. 828 00:46:33,000 --> 00:46:37,000 Добра, а цяпер ідзіце наперад і перамясціць адпаведныя левай рукой, паказваючы на ​​Рамона. 829 00:46:37,000 --> 00:46:39,000 Гэта адчувае сябе крыху залішнім. 830 00:46:39,000 --> 00:46:41,000 Зараз ёсць два чалавекі, паказваючы на ​​Рамона, але гэта нармальна 831 00:46:41,000 --> 00:46:43,000 таму што цяпер, як яшчэ мы можам атрымаць спіс? 832 00:46:43,000 --> 00:46:48,000 Што з іншага боку павінен рухацца? 833 00:46:48,000 --> 00:46:53,000 Выдатна, зараз мы страцілі памяць? 834 00:46:53,000 --> 00:46:57,000 Не, так добра, давайце паглядзім, калі мы не можам разарваць гэты раз. 835 00:46:57,000 --> 00:47:00,000 >> Mallocing ў апошні раз, нумар 5. 836 00:47:00,000 --> 00:47:04,000 Усю дарогу ў спіну, давай ўніз. 837 00:47:04,000 --> 00:47:08,000 Гэта вельмі цікава. 838 00:47:08,000 --> 00:47:15,000 [Апладысменты] 839 00:47:15,000 --> 00:47:17,000 Як цябе клічуць? >> Рон. 840 00:47:17,000 --> 00:47:19,000 Рон, добра, вы malloced як нумар 5. 841 00:47:19,000 --> 00:47:23,000 Мы толькі выкананы код, які амаль ідэнтычныя гэтыя 842 00:47:23,000 --> 00:47:26,000 толькі з іншай назвай. 843 00:47:26,000 --> 00:47:28,000 Выдатна. 844 00:47:28,000 --> 00:47:38,000 Цяпер, Аніта, поспеху ўстаўкі № 5 у спісе цяпер. 845 00:47:38,000 --> 00:47:43,000 Добра, а? 846 00:47:43,000 --> 00:47:47,000 Выдатна, так што гэта сапраўды трэці з трох агульнага ліку выпадкаў. 847 00:47:47,000 --> 00:47:49,000 Спачатку быў хтосьці, у рэшце рэшт, Рэбека. 848 00:47:49,000 --> 00:47:51,000 У нас тады быў нехта ў сярэдзіне. 849 00:47:51,000 --> 00:47:53,000 Цяпер у нас ёсць хтосьці ў самым пачатку, і ў гэтым прыкладзе, 850 00:47:53,000 --> 00:47:56,000 у нас цяпер абнавіць Лукас ўпершыню 851 00:47:56,000 --> 00:48:00,000 таму што першы элемент у спісе зараз павінен паказваць на новы вузел, 852 00:48:00,000 --> 00:48:03,000 якія, у сваю чаргу, паказвае на нумар вузла 9. 853 00:48:03,000 --> 00:48:06,000 >> Гэта было вельмі няёмка дэманстрацыі, я ўпэўнены, 854 00:48:06,000 --> 00:48:08,000 такім чынам, вялікая апладысменты для гэтых хлопцаў, калі б маглі. 855 00:48:08,000 --> 00:48:11,000 Прыгожа зроблена. 856 00:48:11,000 --> 00:48:17,000 Вось і ўсё. Вы можаце захаваць вашы паперкі, як мала памяці. 857 00:48:17,000 --> 00:48:22,000 Аказваецца, што робіць гэта ў кодзе 858 00:48:22,000 --> 00:48:26,000 гэта не так проста, як проста рух рукамі 859 00:48:26,000 --> 00:48:28,000 і, паказваючы паказальнікі на розныя рэчы. 860 00:48:28,000 --> 00:48:31,000 Але разумею, што, калі прыходзіць час, каб рэалізаваць нешта накшталт 861 00:48:31,000 --> 00:48:34,000 звязаны спіс ці варыянт, калі вы засяродзіўся на самай справе 862 00:48:34,000 --> 00:48:38,000 гэтыя базавыя асновы, маленечкія праблем у мяне няма, каб высветліць, 863 00:48:38,000 --> 00:48:43,000 ён гэтую руку ці гэтага боку, разумею, што тое, што ў адваротным выпадку даволі складаная праграма 864 00:48:43,000 --> 00:48:47,000 можа, па сутнасці, зводзіцца да даволі простым будаўнічых блокаў, як гэта. 865 00:48:47,000 --> 00:48:51,000 >> Давайце рэчы ў больш складаных кірунку да гэтага часу. 866 00:48:51,000 --> 00:48:53,000 Цяпер у нас ёсць паняцце звязанага спісу. 867 00:48:53,000 --> 00:48:57,000 У нас таксама ёсць, дзякуючы прапанове туды-двусвязный спіс, 868 00:48:57,000 --> 00:49:01,000 , Які выглядае амаль гэтак жа, але цяпер у нас ёсць два паказальніка ўнутры структуры 869 00:49:01,000 --> 00:49:05,000 замест аднаго, і мы маглі б, верагодна, назваць гэтыя паказальнікі папярэдняй і наступнай 870 00:49:05,000 --> 00:49:08,000 або налева або направа, але мы, на самай справе, патрэбныя два з іх. 871 00:49:08,000 --> 00:49:10,000 Код будзе крыху больш складана. 872 00:49:10,000 --> 00:49:12,000 Аніце прыйшлося б рабіць больш працы тут, на сцэне. 873 00:49:12,000 --> 00:49:15,000 Але мы, безумоўна, можа ажыццяўляць такую ​​структуру. 874 00:49:15,000 --> 00:49:19,000 З пункту гледжання часу працы, аднак, што было б час працы 875 00:49:19,000 --> 00:49:24,000 Аніта для знаходжання колькасці п ў звязаным спісе цяпер? 876 00:49:24,000 --> 00:49:27,000 Тым не менш вялікая O п, так што гэта не лепш, чым лінейны пошук. 877 00:49:27,000 --> 00:49:29,000 Мы не можам зрабіць бінарны пошук, хоць, зноў жа. 878 00:49:29,000 --> 00:49:34,000 Чаму гэта было так? Вы не можаце скакаць. 879 00:49:34,000 --> 00:49:36,000 Хоць мы, відавочна, усе людзі на сцэне, 880 00:49:36,000 --> 00:49:39,000 і Аніта магла б eyeballed яго і сказаў: "Вось сярэдзіне спісу" 881 00:49:39,000 --> 00:49:42,000 яна не будзе ведаць, што калі яна кампутарнай праграмы 882 00:49:42,000 --> 00:49:47,000 паколькі адзінае, што ёй давялося замкнуцца на ў пачатку сцэнара 883 00:49:47,000 --> 00:49:50,000 быў Лукас, які быў першым паказальнікам. 884 00:49:50,000 --> 00:49:53,000 Яна абавязкова павінна ісці за тымі спасылкамі, 885 00:49:53,000 --> 00:49:56,000 лічачы яе шляху, пакуль не знайшла прыкладна пасярэдзіне, 886 00:49:56,000 --> 00:49:58,000 і нават тады, яна не будзе ведаць, калі яна дасягнула сярэдзіны 887 00:49:58,000 --> 00:50:01,000 калі яна праходзіць ўвесь шлях да канца, каб высветліць, колькі ёсць, 888 00:50:01,000 --> 00:50:05,000 затым адступае, і, што таксама было б цяжка, калі вы не былі 889 00:50:05,000 --> 00:50:07,000 двусвязный спіс нейкі. 890 00:50:07,000 --> 00:50:10,000 >> Рашэнне некаторых праблем сёння, але ўвядзенне іншых. 891 00:50:10,000 --> 00:50:12,000 А як наконт розных структур дадзеных у цэлым? 892 00:50:12,000 --> 00:50:15,000 Гэта фотаздымак з латкоў у Mather House, 893 00:50:15,000 --> 00:50:19,000 і ў гэтым выпадку, у нас ёсць структура дадзеных, мы таксама выгляд ужо казалі. 894 00:50:19,000 --> 00:50:22,000 Мы гаварылі пра стэку ў кантэксце памяці, 895 00:50:22,000 --> 00:50:26,000 і гэта як бы наўмысна назвалі таму, што стэк ў тэрмінах памяці 896 00:50:26,000 --> 00:50:31,000 фактычна з'яўляецца структурай дадзеных, якая ўсё больш і больш рэчаў пласт па-над ёй. 897 00:50:31,000 --> 00:50:35,000 Але самае цікавае пра стэку, як гэта мае месца ў рэчаіснасці, 898 00:50:35,000 --> 00:50:38,000 тое, што гэта адмысловы выгляд структуры дадзеных. 899 00:50:38,000 --> 00:50:42,000 Гэта структура дадзеных, прычым першы элемент 900 00:50:42,000 --> 00:50:46,000 гэта апошні элемент з. 901 00:50:46,000 --> 00:50:50,000 Калі вы першы латок ставіць у стэк, 902 00:50:50,000 --> 00:50:53,000 Вы збіраецеся быць, на жаль, апошні латка павінны быць прыняты стэка, 903 00:50:53,000 --> 00:50:55,000 і гэта не заўсёды добра. 904 00:50:55,000 --> 00:50:58,000 І наадварот, вы можаце думаць пра яго наадварот, 905 00:50:58,000 --> 00:51:02,000 У апошні з'яўляецца першым з. 906 00:51:02,000 --> 00:51:05,000 >> Цяпер, любыя сцэнары прыходзяць на розум, дзе, маючы стэк 907 00:51:05,000 --> 00:51:08,000 структура дадзеных, дзе ў вас ёсць, што ўласнасць 908 00:51:08,000 --> 00:51:13,000 апошнія увайшоў, першым выйшаў, на самай справе пераканаўчым? 909 00:51:13,000 --> 00:51:16,000 Хіба гэта добра? Хіба гэта дрэнна? 910 00:51:16,000 --> 00:51:19,000 Гэта, безумоўна, дрэнна, калі латкоў не былі ўсе аднолькавыя 911 00:51:19,000 --> 00:51:21,000 і ўсе яны былі адмысловым розных колераў і яшчэ шмат чаго, 912 00:51:21,000 --> 00:51:24,000 і колер вы хочаце, усю дарогу ўнізе. 913 00:51:24,000 --> 00:51:26,000 Вядома, вы не можаце атрымаць, што без вялікіх высілкаў. 914 00:51:26,000 --> 00:51:28,000 Вы павінны пачаць з верхняй і працаваць ваш шлях ўніз. 915 00:51:28,000 --> 00:51:31,000 Сапраўды гэтак жа, як калі б вы былі адным з гэтых вентылятараў хлопчыкаў 916 00:51:31,000 --> 00:51:34,000 хто чакае ўсю ноч, спрабуючы атрымаць iPhone і ліній да 917 00:51:34,000 --> 00:51:36,000 у такім месцы, як гэта? 918 00:51:36,000 --> 00:51:40,000 Хіба не было б выдатна, калі б у Apple Store 919 00:51:40,000 --> 00:51:42,000 былі структуру стэка дадзеных? 920 00:51:42,000 --> 00:51:44,000 Ура? Мала таго? 921 00:51:44,000 --> 00:51:47,000 Гэта толькі для людзей, якія з'яўляюцца ў апошняй хвіліны 922 00:51:47,000 --> 00:51:50,000 , А затым атрымаць сарваў чарзе. 923 00:51:50,000 --> 00:51:52,000 І на самай справе, той факт, што я быў так схільны казаць чаргу 924 00:51:52,000 --> 00:51:56,000 на самай справе адпавядае таму, што мы б назвалі такую ​​структуру дадзеных, 925 00:51:56,000 --> 00:51:59,000 адзін у рэальнасці, дзе парадак мае значэнне, 926 00:51:59,000 --> 00:52:02,000 і вы хочаце першы, каб быць першай з 927 00:52:02,000 --> 00:52:04,000 калі толькі дзеля чалавечай справядлівасці. 928 00:52:04,000 --> 00:52:07,000 Мы звычайна называем гэта структура дадзеных чарзе. 929 00:52:07,000 --> 00:52:11,000 >> Аказваецца, акрамя звязаных спісаў, мы можам пачаць выкарыстоўваць гэтыя ж асноўныя ідэі 930 00:52:11,000 --> 00:52:15,000 і пачаць ствараць новае і розныя тыпы рашэнняў праблем. 931 00:52:15,000 --> 00:52:19,000 Напрыклад, у выпадку стэка, мы маглі б прадстаўляць сабой стэк 932 00:52:19,000 --> 00:52:22,000 , Выкарыстоўваючы структуру дадзеных, як гэта, я хацеў бы прапанаваць. 933 00:52:22,000 --> 00:52:26,000 У гэтым выпадку, я абвясціў структуры, і я ўжо казаў ўнутры гэтай структуры 934 00:52:26,000 --> 00:52:30,000 ўяўляе сабой масіў лікаў, а затым пераменная памеры, 935 00:52:30,000 --> 00:52:33,000 і Я буду называць гэтую рэч стэка. 936 00:52:33,000 --> 00:52:35,000 Цяпер, чаму гэта сапраўды працуе? 937 00:52:35,000 --> 00:52:43,000 У выпадку стэк, я мог бы зрабіць гэта эфектыўна на экране ў выглядзе масіва. 938 00:52:43,000 --> 00:52:47,000 Вось мой стэк. Такія мае нумары. 939 00:52:47,000 --> 00:52:50,000 І мы будзем маляваць іх, як гэта, гэта, гэта, гэта, гэта. 940 00:52:50,000 --> 00:52:53,000 А то ў мяне некаторыя іншыя члены дадзеных тут, 941 00:52:53,000 --> 00:52:58,000 якая называецца памер, так гэта памер, і гэта лікі, 942 00:52:58,000 --> 00:53:02,000 і калектыўна, усёй Ipad тут прадстаўляе сабой адзін стэк структуры. 943 00:53:02,000 --> 00:53:07,000 Цяпер, па змаўчанні, памер як мяркуецца, павінен быць ініцыялізаваны да 0, 944 00:53:07,000 --> 00:53:11,000 і тое, што ўнутры масіва лікаў першапачаткова 945 00:53:11,000 --> 00:53:14,000 Калі я ўпершыню вылучыць масіў? 946 00:53:14,000 --> 00:53:16,000 Garbage. Хто ведае? І гэта на самай справе не мае значэння. 947 00:53:16,000 --> 00:53:20,000 Гэта не мае значэння, калі гэта 1, 2, 3, 4, 5, цалкам выпадкова 948 00:53:20,000 --> 00:53:25,000 на нешанцаванне, якія захоўваюцца ў маёй структуры, таму што пакуль я ведаю, што памер стэка 949 00:53:25,000 --> 00:53:29,000 роўны 0, то я ведаю, праграмным, не глядзі на любы з элементаў у масіве. 950 00:53:29,000 --> 00:53:31,000 Гэта не мае значэння, што там. 951 00:53:31,000 --> 00:53:34,000 Не глядзі на іх, як бы следства памеры 0. 952 00:53:34,000 --> 00:53:38,000 >> Але выкажам здагадку, што цяпер я іду наперад і ўставіць нешта ў стэк. 953 00:53:38,000 --> 00:53:42,000 Я хачу, каб ўставіць нумар 5, так што я паклаў № 5 тут, 954 00:53:42,000 --> 00:53:45,000 і тое што я магу паставіць сюды? 955 00:53:45,000 --> 00:53:48,000 Зараз я бы на самай справе паклаў 1 для памеру, 956 00:53:48,000 --> 00:53:50,000 і ў цяперашні час стэк мае памер 1. 957 00:53:50,000 --> 00:53:53,000 Што рабіць, калі я іду наперад і ўставіць лік, скажам, 7 след? 958 00:53:53,000 --> 00:53:57,000 Гэта тое абнаўляецца да 2, а затым мы будзем рабіць 9, 959 00:53:57,000 --> 00:54:02,000 а затым гэтая абнаўляецца да 3. 960 00:54:02,000 --> 00:54:05,000 Але цікавая асаблівасць зараз гэты стэк з'яўляецца тое, што 961 00:54:05,000 --> 00:54:09,000 Я павінен выдаліць элемент якога, калі я хачу ўсплываў 962 00:54:09,000 --> 00:54:12,000 нешта з стэка, так бы мовіць? 963 00:54:12,000 --> 00:54:14,000 9 была б першае, што трэба ісці. 964 00:54:14,000 --> 00:54:18,000 Як вынікае карціна зменіцца, калі я хачу поп элемент з стэка, 965 00:54:18,000 --> 00:54:20,000 хацелася латок Mather? 966 00:54:20,000 --> 00:54:22,000 Так. >> [Студэнт] Устанавіць памер да 2. 967 00:54:22,000 --> 00:54:27,000 Сапраўды, усё, што я зрабіць, гэта ўсталяваць памер 2, і што мне рабіць з масівам? 968 00:54:27,000 --> 00:54:29,000 Я не маю нічога рабіць. 969 00:54:29,000 --> 00:54:32,000 Я мог бы, проста каб быць анальны, пакласці 0 існуе, або -1 ці нешта азначаюць, 970 00:54:32,000 --> 00:54:34,000 што гэта не законна значэнне, але гэта не мае значэння, таму што 971 00:54:34,000 --> 00:54:37,000 Я магу запісваць за межамі самога масіва, як доўга гэта 972 00:54:37,000 --> 00:54:41,000 так што я ведаю толькі паглядзіце на першыя два элемента ў гэтым масіве. 973 00:54:41,000 --> 00:54:47,000 Цяпер, калі я пайду і дадайце нумар 8 да гэтага масіва, якім чынам карціна зменіцца наступным? 974 00:54:47,000 --> 00:54:50,000 Гэта становіцца 8, і гэта становіцца 3. 975 00:54:50,000 --> 00:54:52,000 Я рэзкі некалькі кутоў тут. 976 00:54:52,000 --> 00:54:56,000 Цяпер у нас ёсць 5, 7, 8, і мы вярнуліся да памеру 3. 977 00:54:56,000 --> 00:54:58,000 Гэта даволі просты ў рэалізацыі, 978 00:54:58,000 --> 00:55:06,000 Але калі мы будзем шкадаваць пра гэта дызайнерскае рашэнне? 979 00:55:06,000 --> 00:55:09,000 Калі рэчы пачынаюць ісці вельмі, вельмі няправільна? Так. 980 00:55:09,000 --> 00:55:11,000 [Неразборліва адказ студэнта] 981 00:55:11,000 --> 00:55:13,000 Калі вы хочаце, каб вярнуцца і атрымаць першы элемент, які уставіў 982 00:55:13,000 --> 00:55:18,000 >> Пры гэтым аказваецца, нават калі стэк ўяўляе сабой масіў пад капотам, 983 00:55:18,000 --> 00:55:21,000 гэтыя структуры дадзеных, мы пачалі казаць пра таксама вядомы як 984 00:55:21,000 --> 00:55:25,000 абстрактных структур дадзеных, якім, як яны рэалізуюцца 985 00:55:25,000 --> 00:55:27,000 цалкам, акрамя кропкі. 986 00:55:27,000 --> 00:55:31,000 Структура дадзеных, як стэк мяркуецца дадаць падтрымку 987 00:55:31,000 --> 00:55:35,000 аперацый, такіх як штуршок, які штурхае латок ў стэк, 988 00:55:35,000 --> 00:55:39,000 і поп-музыкі, якая выдаляе элемент з стэка, і гэта ўсё. 989 00:55:39,000 --> 00:55:43,000 Калі б вы загрузіце чужой код, які ўжо рэалізаваны 990 00:55:43,000 --> 00:55:46,000 тое, што называецца стэкам, што чалавек напісаў бы 991 00:55:46,000 --> 00:55:49,000 толькі дзве функцыі для вас, штурхаць і поп-музыкі, чыя адзіная мэта ў жыцці 992 00:55:49,000 --> 00:55:51,000 было б зрабіць менавіта гэта. 993 00:55:51,000 --> 00:55:54,000 Вы ці яго ці яе, хто ажыццяўляў гэтую праграму 994 00:55:54,000 --> 00:55:58,000 быў бы зусім адзін, каб вырашыць, як рэалізаваць 995 00:55:58,000 --> 00:56:00,000 Семантыка націску і з'яўляюцца пад капотам 996 00:56:00,000 --> 00:56:03,000 або функцыянальнасць націску і з'яўляюцца. 997 00:56:03,000 --> 00:56:07,000 І я зрабіў некалькі блізарукім рашэннем тут 998 00:56:07,000 --> 00:56:10,000 шляхам рэалізацыі свайго стэка з гэтай простай структурай дадзеных, то чаму? 999 00:56:10,000 --> 00:56:12,000 Калі ж гэты разрыў структуры дадзеных? 1000 00:56:12,000 --> 00:56:18,000 У які момант я павінен вяртаць памылку, калі карыстач выклікае штуршок, напрыклад? 1001 00:56:18,000 --> 00:56:20,000 [Студэнт] Калі няма больш месца. 1002 00:56:20,000 --> 00:56:23,000 Менавіта, калі няма больш месца, калі я перавысіў ёмістасць, 1003 00:56:23,000 --> 00:56:27,000 які ўсё загалоўныя літары, паколькі яна мяркуе, што гэта свайго роду глабальная канстанта. 1004 00:56:27,000 --> 00:56:30,000 Ну, тады я проста хачу, каб сказаць: «Прабачце, я не магу вылучыць яшчэ адно значэнне 1005 00:56:30,000 --> 00:56:32,000 ў стэк ", як у Mather. 1006 00:56:32,000 --> 00:56:36,000 >> У нейкі момант яны збіраюцца патрапіць у верхнюю частку гэтага маленькага кабінета. 1007 00:56:36,000 --> 00:56:39,000 Там няма больш месца або магутнасці ў стэку, і ў гэты момант там нейкая памылка. 1008 00:56:39,000 --> 00:56:42,000 Яны павінны паставіць элемент дзесьці ў іншым месцы, латок дзесьці ў іншым месцы, 1009 00:56:42,000 --> 00:56:44,000 ці ўвогуле нікуды. 1010 00:56:44,000 --> 00:56:47,000 Цяпер, з чаргой, мы маглі б рэалізаваць гэта крыху па-іншаму. 1011 00:56:47,000 --> 00:56:50,000 Чарга трохі адрозніваецца тым, што пад капотам, ён можа быць рэалізаваны 1012 00:56:50,000 --> 00:56:54,000 як масіў, але чаму, у такім выпадку, я прапаную 1013 00:56:54,000 --> 00:56:59,000 таксама ёсць галава элемент, які ўяўляе кіраўніка спісу, 1014 00:56:59,000 --> 00:57:06,000 Перад спісу, першы чалавек у чарзе ў краму Apple, у дадатак да памеру? 1015 00:57:06,000 --> 00:57:14,000 Навошта патрэбна дадатковая порцыя дадзеных тут? 1016 00:57:14,000 --> 00:57:16,000 Успомніце, якія нумары ёсць 1017 00:57:16,000 --> 00:57:18,000 калі я намаляваў яго наступным чынам. 1018 00:57:18,000 --> 00:57:21,000 Хай гэта цяпер чэргі замест таго, каб стэк, 1019 00:57:21,000 --> 00:57:24,000 розніца ў тым, як Apple Store ў чарзе справядліва. 1020 00:57:24,000 --> 00:57:27,000 Першы чалавек у чарзе ў пачатак спісу, нумар 5 у гэтым выпадку, 1021 00:57:27,000 --> 00:57:30,000 ён ці яна будзе даваць у краме ў першую чаргу. 1022 00:57:30,000 --> 00:57:32,000 Давайце зробім гэта. 1023 00:57:32,000 --> 00:57:35,000 Выкажам здагадку, што гэта стан маёй чэргі ў дадзены момант часу, і цяпер у Apple Store 1024 00:57:35,000 --> 00:57:39,000 адкрываецца, і першая асоба, нумар 5, накіроўваецца ў краму. 1025 00:57:39,000 --> 00:57:43,000 Як я магу змяніць карціну цяпер, калі я дэ-чарзе першай асобы 1026 00:57:43,000 --> 00:57:47,000 на пярэдняй лініі? 1027 00:57:47,000 --> 00:57:50,000 Што гэта? >> [Студэнт] Змены ў чарзе. 1028 00:57:50,000 --> 00:57:52,000 Змена галавой, так што 5 знікае. 1029 00:57:52,000 --> 00:57:56,000 На самай справе, гэта, як быццам, як лепш гэта зрабіць? 1030 00:57:56,000 --> 00:58:00,000 На самай справе, гэта як быццам гэты хлопец знікае. 1031 00:58:00,000 --> 00:58:03,000 Што б нумар 7 робім у рэальнай краме? 1032 00:58:03,000 --> 00:58:05,000 Яны б зрабіць вялікі крок наперад. 1033 00:58:05,000 --> 00:58:08,000 >> Але што мы прыйшлі да разумення, калі гаворка ідзе пра масівах 1034 00:58:08,000 --> 00:58:10,000 і перамяшчэння рэчаў вакол? 1035 00:58:10,000 --> 00:58:12,000 Гэта свайго роду пустая трата часу, так? 1036 00:58:12,000 --> 00:58:16,000 Чаму вы павінны быць настолькі анальны, каб мець першай асобы 1037 00:58:16,000 --> 00:58:21,000 У пачатку лініі на фізічным пачатак блока памяці? 1038 00:58:21,000 --> 00:58:23,000 Гэта зусім не трэба. Чаму? 1039 00:58:23,000 --> 00:58:26,000 Што можа я проста памятаю, а? >> [Неразборліва адказ студэнта] 1040 00:58:26,000 --> 00:58:30,000 Сапраўды, я мог бы проста памятаю, з гэтай дадатковай галоўкай члена дадзеных 1041 00:58:30,000 --> 00:58:34,000 што цяпер кіраўнік спіс не 0, што гэта было хвіліну таму. 1042 00:58:34,000 --> 00:58:39,000 Цяпер гэта на самай справе нумар 1. Такім чынам, я атрымліваю невялікую аптымізацыю. 1043 00:58:39,000 --> 00:58:44,000 Проста таму, што я дэ-чарзе хтосьці з лініі ў пачатку лініі ў Apple Store 1044 00:58:44,000 --> 00:58:47,000 не азначае, што кожны павінен перамяшчацца, што нагадаем, з'яўляецца лінейнай аперацыяй. 1045 00:58:47,000 --> 00:58:50,000 Я магу замест гэтага праводзіць пастаянную часу толькі 1046 00:58:50,000 --> 00:58:53,000 і дасягненні, то значна хутчэй адказ. 1047 00:58:53,000 --> 00:58:56,000 Але цана, якую я плачу гэта тое, што каб атрымаць, што дадатковая прадукцыйнасць 1048 00:58:56,000 --> 00:58:58,000 і не маюць перакласці ўсё? 1049 00:58:58,000 --> 00:59:01,000 Так. >> [Неразборліва адказ студэнта] 1050 00:59:01,000 --> 00:59:04,000 Можна дадаць больш людзей, добра, што праблема артаганальнай 1051 00:59:04,000 --> 00:59:07,000 з тым, што мы не перакладаючы людзей вакол. 1052 00:59:07,000 --> 00:59:11,000 Ён па-ранейшаму масіва, ці так мы перакласці ўсё або не- 1053 00:59:11,000 --> 00:59:13,000 О, я бачу, што вы маеце на ўвазе, добра. 1054 00:59:13,000 --> 00:59:16,000 На самай справе, я згодны з тым, што вы кажаце, што ён амаль як калі б 1055 00:59:16,000 --> 00:59:19,000 Мы зараз ніколі не будзе выкарыстоўваць пачатку гэтага масіва больш 1056 00:59:19,000 --> 00:59:22,000 таму што, калі я выдалю 5, то я магу выдаліць 7. 1057 00:59:22,000 --> 00:59:24,000 Але я толькі паставіць людзей з правага боку. 1058 00:59:24,000 --> 00:59:28,000 >> Ён адчувае, як я марнаваць прастору, і ў выніку мая чарга распадаецца наогул нічога, 1059 00:59:28,000 --> 00:59:31,000 такім чынам, мы маглі б проста ёсць людзі, пахам, 1060 00:59:31,000 --> 00:59:35,000 і мы маглі думаць пра гэта масіў сапраўды як свайго роду кругавая структура, 1061 00:59:35,000 --> 00:59:38,000 але мы выкарыстоўваем тое, што аператар C, каб рабіць такога роду пахам? 1062 00:59:38,000 --> 00:59:40,000 [Неразборліва адказ студэнта] >> аператара па модулю. 1063 00:59:40,000 --> 00:59:43,000 Было б крыху раздражняе прадумаць, як вы будзеце рабіць з пахам, 1064 00:59:43,000 --> 00:59:46,000 але мы маглі б гэта зрабіць, і мы маглі пачаць збіраць людзей на тое, што раней пярэдняй лініі, 1065 00:59:46,000 --> 00:59:52,000 але мы проста памятаем з гэтай галавой пераменная якія фактычнага кіраўніка лінія на самай справе. 1066 00:59:52,000 --> 00:59:57,000 Што, калі, замест гэтага, наша мэта ў канчатковым выніку, аднак, 1067 00:59:57,000 --> 01:00:00,000 было шукаць ліку, як мы зрабілі тут, на сцэне з Анітай, 1068 01:00:00,000 --> 01:00:02,000 але мы сапраўды хочам лепшай з усіх гэтых мірах? 1069 01:00:02,000 --> 01:00:05,000 Мы хочам больш складанасці, чым масіў дазваляе 1070 01:00:05,000 --> 01:00:09,000 таму што мы хочам магчымасць дынамічна расці структуры дадзеных. 1071 01:00:09,000 --> 01:00:12,000 Але мы не хочам звяртацца да таго, што мы паказалі, 1072 01:00:12,000 --> 01:00:15,000 У першай лекцыі не быў аптымальным алгарытмам, 1073 01:00:15,000 --> 01:00:17,000 , Што лінейнага пошуку. 1074 01:00:17,000 --> 01:00:21,000 Аказваецца, што можна, на самай справе, дасягненні 1075 01:00:21,000 --> 01:00:24,000 або па крайняй меры блізка да сталай часу, у выніку чаго хтосьці, як Аніта, 1076 01:00:24,000 --> 01:00:27,000 калі яна настройвае яе структуру дадзеных, каб не быць звязаным спісам, 1077 01:00:27,000 --> 01:00:30,000 каб не быць стэк, каб не быць чэргаў, можа, на самай справе, 1078 01:00:30,000 --> 01:00:33,000 прыдумаць структуру дадзеных, якая дазваляе ёй шукаць рэчы, 1079 01:00:33,000 --> 01:00:37,000 нават словы, а не проста лічбы, у тым, што мы будзем называць сталай часу. 1080 01:00:37,000 --> 01:00:40,000 >> І на самай справе, забягаючы наперад, адна з psets ў гэтым класе амаль заўсёды 1081 01:00:40,000 --> 01:00:43,000 ажыццяўленне праверкі правапісу, у выніку чаго 1082 01:00:43,000 --> 01:00:46,000 мы даем вам зноў каля 150000 ангельскіх слоў і мэта 1083 01:00:46,000 --> 01:00:51,000 загрузіць у памяць тых, і хутка зможа адказаць на пытанні аб форме 1084 01:00:51,000 --> 01:00:54,000 гэтае слова напісана правільна? 1085 01:00:54,000 --> 01:00:58,000 І гэта было б сапраўды смактаць, калі вам давялося перабрацца ўсе 150000 слоў, каб адказаць на гэтае пытанне. 1086 01:00:58,000 --> 01:01:02,000 Але, на самой справе, мы ўбачым, што мы можам зрабіць гэта ў вельмі, вельмі хуткае час. 1087 01:01:02,000 --> 01:01:06,000 І гэта будзе ўключаць ажыццяўленне так званых Хэш-табліцы, 1088 01:01:06,000 --> 01:01:09,000 І хоць на першы погляд гэта тое, што называецца хэш-табліцы будзе 1089 01:01:09,000 --> 01:01:12,000 Давайце дасягнення гэтых супер хуткага рэагавання, 1090 01:01:12,000 --> 01:01:18,000 Аказваецца, што ёсць на самой справе праблема. 1091 01:01:18,000 --> 01:01:23,000 Калі прыходзіць час для ажыццяўлення гэтага, што называецца, зноў жа, я раблю гэта зноў. 1092 01:01:23,000 --> 01:01:25,000 Я толькі тут. 1093 01:01:25,000 --> 01:01:28,000 Калі прыходзіць час для ажыццяўлення гэтай рэчы, званай хэш-табліцы, 1094 01:01:28,000 --> 01:01:30,000 мы будзем мець, каб прыняць рашэнне. 1095 01:01:30,000 --> 01:01:32,000 Якім павінен гэтую рэч на самай справе быць? 1096 01:01:32,000 --> 01:01:36,000 І калі мы пачынаем ўстаўкі лічбаў у гэтай хэш-табліцы, 1097 01:01:36,000 --> 01:01:38,000 як мы будзем захоўваць іх такім чынам, 1098 01:01:38,000 --> 01:01:42,000 што мы можам атрымаць іх назад так хутка, як мы атрымалі іх? 1099 01:01:42,000 --> 01:01:45,000 Але мы ўбачым неўзабаве, што гэтае пытанне 1100 01:01:45,000 --> 01:01:48,000 калі дзень нараджэння кожнага чалавека ў класе будзе цалкам дарэчным. 1101 01:01:48,000 --> 01:01:51,000 Аказваецца, што ў гэтым пакоі, у нас ёсць некалькі сотняў чалавек, 1102 01:01:51,000 --> 01:01:56,000 так што верагоднасць таго, што два з нас ёсць той жа дзень нараджэння, верагодна, даволі высокая. 1103 01:01:56,000 --> 01:01:58,000 Што, калі там былі толькі 40 з нас у гэтай пакоі? 1104 01:01:58,000 --> 01:02:02,000 Якія шанцы двух людзей, якія маюць той жа дзень нараджэння? 1105 01:02:02,000 --> 01:02:04,000 [Студэнты] Звыш 50%. 1106 01:02:04,000 --> 01:02:06,000 Так, больш чым на 50%. На самай справе, я нават прынёс графік. 1107 01:02:06,000 --> 01:02:08,000 Аказваецца, і гэта на самай справе проста папярэдні прагляд- 1108 01:02:08,000 --> 01:02:12,000 калі ёсць толькі 58 з нас у гэтай зале, верагоднасць таго, 2 з нас 1109 01:02:12,000 --> 01:02:16,000 які мае той жа дзень нараджэння з'яўляецца надзвычай высокім, амаль 100%, 1110 01:02:16,000 --> 01:02:20,000 і што збіраецца выклікаць цэлы букет балюча для нас у сераду. 1111 01:02:20,000 --> 01:02:24,000 >> З улікам сказанага, давайце адкладзем тут. Мы будзем бачыць Вас у сераду. 1112 01:02:24,000 --> 01:02:28,000 [Апладысменты] 1113 01:02:28,000 --> 01:02:30,000 [CS50.TV]