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