[Powered by Google Translate] [Недела 6]
[Дејвид Џ Malan] [Универзитетот Харвард]
[Ова е CS50.] [CS50.TV]
>> Ова е CS50, а тоа е почеток на недела 6,
па неколку нови алатки сега се достапни за вас да ги искористат предностите на,
од кои првата се нарекува CS50 стил.
Шансите се ако сте како мене или некој од наставата соработници,
Веројатно сте виделе програма чиј стил изгледа малку нешто како ова.
Можеби ќе почнете сечење некои ќошиња доцна во ноќта, или ќе се справи со неа подоцна,
а потоа ТФ или CA доаѓа повеќе во текот на работното време.
Тогаш тоа е тешко за нас да се прочита.
Па, овој код се синтаксички исправни, а тоа ќе ги собере, и тоа, всушност, ќе се кандидира.
Но тоа не е дефинитивно 5 за стил.
>> Но, сега, ако ние одиме во овој директориум тука-
и ќе забележите дека имам conditions2.c-
и јас ја извршите оваа нова команда, style50, на оваа датотека conditions2.c, Enter,
забележите дека тоа е ме информираа дека тоа е стилизирана.
Gedit забележав дека датотеката е променета на дискот,
и ако јас кликнете ја превчитате, сите ваши проблеми сега се автоматизирани.
[Аплауз]
Тоа е една од работите што го правевме овој викенд.
Сфатат дека тоа е несовршен, бидејќи постојат некои код
дека тоа едноставно нема да биде во можност да стилизирам совршено,
но сфати дека ова е сега алатка можете да ги искористат предностите на
ако само за да среди некои од errantly поставени кадрави загради и слично.
>> Но, повеќе релевантни сега е CS50 Провери.
Со CS50 Проверете, вие всушност може да го изврши истиот точноста тестови
на свој код, кој наставата соработници се во можност да.
Ова е командната линија алатка која доаѓа сега во апаратот
штом ќе се направи една update50, како на
pset 4 спецификации, и го користат во суштина се допаѓа ова.
Можете да ја извршите командата check50.
Тогаш ќе помине во командната линија аргумент, или поопшто познат како еден гајтан или знаме.
Општо земено, работи кои немаат цртички се нарекува прекинувач
на командната линија програма, па-в одредува
проверките што сакате да се кандидира.
>> Тестовите што сакате да се кандидира се идентификувани уникатно од оваа низа,
2012/pset4/resize.
Со други зборови, тоа е само произволни, но уникатен стринг
дека ние ги користиме за да се идентификуваат уникатно точноста тестови pset 4 на.
А потоа ќе се определи простор одделени листа на датотеки кои сакате да испратите
да CS50 Провери за анализа.
На пример, ако одам во мојата решение овде за resize.c-
дозволете ми да се отвори поголема терминален прозорец-
и јас се оди напред и да ја стартувате да речеме check50-в 2012/pset4/resize,
а потоа се оди напред и да го одредите имињата на датотеките,
resize.c, а потоа притиснете Enter, тоа облоги,
тоа Поставени, се проверува, а јас само не на целиот куп на тестови.
Оној во црвено во горниот лев вели дека resize.c и BMP постои.
Тоа беше тест. Тоа беше прашањето што праша.
И тоа е несреќна, бидејќи одговорот е лажен.
Белите текстот се вели очекува bmp.h да постои, и дека е едноставно моја вина.
Јас заборавив да го испратите, па затоа треба да испратите двете датотеки,
resize.c и bmp.h.
Но сега забележите сите други тестови се во жолта боја, бидејќи тие не се кандидира,
и така лицето смешковци е вертикална, бидејќи тој е ниту среќни, ниту тажно,
но мораме да поправи ова прашање во црвено пред оние други прегледи ќе се кандидира.
>> Дозволете ми да го надминете овој.
Дозволете ми да одзумирате и повторување ова, овој пат со bmp.h, исто така,
на командната линија, внесете, и сега, ако се оди добро,
тоа се случува да се провери и потоа се врати резултат на-држете твојот здив-
сите зелени, што значи јас сум прави навистина добро на pset 4 досега.
Можете да видите и да заклучиме од описен текст тука
точно што е тоа што ги тестираат.
Ние тестирани првите прават датотеки постојат?
Тогаш ние тестирани не resize.c компајлирање?
Тогаш ние тестирани не ја промени големината на 1x1-пиксели BMP кога n, големината фактор, е 1.
Сега, ако немаат идеја што n е, ќе откако ќе се нурне во pset 4,
но тоа едноставно е разумност провери да бидете сигурни дека не сте промена на големината
слика на сите, ако на големината фактор е 1.
Ако, пак, го променува големината на 1x1 пиксели на 1x1 пиксели BMP да 2x2 правилно
кога n е 2, тогаш слично на тоа, рудникот формира соодветно.
>> На кратко, ова е замислена да, еден, земи премин прстите
од равенката право, пред да ја поднесете вашата pset.
Ќе знаеш точно што вашиот ТФ наскоро ќе се знае
кога ќе се обратите за поднесување на некои од овие проблеми сетови,
а исто така и педагошки мотивација е навистина да се стави
можност пред вас, така што кога знаеш а приори
дека има грешки во вашиот код и тестовите што не се донесени,
може да се стави во повеќе ефективна време до пред да ги реши тие проблеми
наместо изгуби поени, да добијат повратни информации од вашите ТФ,
и потоа оди ", Ahh," како да сум треба да имаат сфатиле тоа.
Сега барем постои алатка да ви помогне да најдете тоа.
Тоа нема да се истакне каде на бубачки е, но ќе ви кажам
она што е симптоматично тоа.
>> Сега сфаќаат тестови не се нужно сеопфатен.
Само затоа што сте се екран полн со зелени смешковци лица
не значи кодот е совршен, но тоа не значи
тоа помина одредени тестови пропишани од страна на спец.
Понекогаш ние не ќе го објави проверки.
На пример, whodunit, еден од аспектите на pset 4,
е вид на разочарување ако ние ви даде
одговорот за тоа што е, и има голем број на начини да се открие
кој лицето е во таа црвена бучава.
Спецификации секогаш ќе се определи во иднина за pset 5 наваму
што проверува постои за вас.
Ќе забележите дека е ова бела рачно на дното.
За сега, ова е само дијагностички излез.
Ако ја посетите оваа адреса, ќе добиете еден куп луди, криптичната пораки
дека сте добредојдени да се погледне преку, но тоа е главно за вработените
така што ние може да се дијагностицира и debug грешки во check50 себе.
>> Без одложување, ајде да се движат за да таму каде што застанавте.
CS50 библиотека ние зеде здраво за готово за неколку недели,
но потоа минатата недела, почнавме пилинг назад еден од слоеви од неа.
Почнавме ставање настрана стринг во прилог на она што наместо неа?
[Студентите] знак.
Char *, кој е char * сето ова време,
но сега ние не треба да се преправаат дека тоа е вистински тип на податоци стринг.
Напротив, тоа е синоним на сорти за char *,
и низа е низа од карактери,
па зошто да не има смисла да претставуваат стрингови како char * а?
Што значи char * претставуваат во контекст на овој концепт на серијата?
Да. >> [Студентски] Првиот карактер.
Добро, првиот карактер, но не сосема првиот карактер.
Тоа е-[Студентите] адреса.
Добро, на адресата на првиот карактер.
Сите што е потребно да претставува стринг во меморијата на компјутерот
е само уникатната адреса на првиот бајт.
Вие дури и не мора да знае колку долго е
затоа што како може да дознаам дека надвор динамички?
[Студентски] Стринг должина.
Можете да се јавите стринг должина, одлична, но како не стринг должина работа?
Што значи тоа? Да.
[Студентски] Продолжувам да одам додека не добие нула карактер.
Да, точно, тоа само iterates со за телефонска линија, додека јамка,
што од * до крај, а крајот е претставен
со \ 0, т.н. НУБ карактер, НУБ,
не треба да се меша со нула, што е покажувач,
кој ќе излезе во разговорот повторно денес.
>> Ние излупени назад слој од GetInt, а потоа ние ја погледнете GetString,
и се потсетиме дека и двете од овие функции, или, навистина,
GetString, беше користење на одредена функција
всушност да го анализирам, што е, да се прочита или анализира, влез на корисникот.
И што е тоа нова функција?
Scanf или sscanf. Тоа всушност доаѓа во неколку различни вкусови.
Има Scanf, има sscanf, има fscanf.
За сега, сепак, да се фокусира на една најлесно илустрирани,
и дозволете ми да оди напред и да се отвори во апаратот
датотека како оваа, scanf1.c.
Ова е супер едноставна програма,
но тоа не нешто што никогаш не сме го направиле
без помош на CS50 библиотека.
Оваа добива int од корисникот. Како тоа функционира?
Па, во линија 16 таму,
забележите дека ние прогласи int наречен X, и во овој момент во приказната,
она што е вредноста на x?
[Нечујни студент одговор]
[Дејвид М] Десен, кој знае, некои ѓубре вредност потенцијално, така што во 17, само кажете на корисникот
ми даде голем број, ве молам, и чекор 18 е местото каде што станува интересно.
Scanf чини да позајми идеја од printf по тоа што користи овие формат кодови во наводници.
% D е, се разбира децимален број.
Но, зошто сум јас поминува во и x, наместо само x?
Првото е точно. Да.
[Нечујни студент одговор]
Точно, ако целта на оваа програма, како и функцијата GetInt себе,
е да се добие int од страна на корисникот може да помине функции
сите променливи сакам, но ако јас не ги помине со упатување
или адреса или со покажувач, сите синоним за цели денес,
тогаш таа функција нема способност да ја смени содржината на таа променлива.
Ова ќе помине во еден примерок исто како и кабриолет верзија на swap
дека ние сме зборуваше за неколку пати сега.
>> Но, наместо тоа, со тоа и Х, јас сум буквално поминува во што?
[Студентски] На адреса. >> На адресата на x.
Тоа е како цртеж на сајтот за функција наречена Scanf и велејќи тука,
овие се насоки за дел од меморијата во компјутерот
дека можете да одите складирање на некои број внатре
Во цел за sscanf до сега го направите тоа
она оператор, она парче на синтаксата е тоа ќе мора да ја користи
иако не можеме да го видиме бидејќи некој друг го напишал оваа функција?
Со други зборови - што е тоа?
[Студентски] X прочита.
Таму ќе биде некои читање, но само во однос на x тука.
Ако Scanf се донесе адреса на x,
синтаксички, што операторот е обврзан да постојат некаде
внатрешноста на имплементација Scanf, така што Scanf
всушност може да напише број 2 на таа адреса?
Да, па *.
Потсетиме дека * е нашата Dereference оператор, што во суштина значи одиме таму.
>> Откако сте биле предадени на адреса, како што е случајот овде,
Scanf е веројатно-ако ние всушност погледна наоколу својот код-
прави * x или еквивалент всушност да одат на таа адреса и стави некои вредност таму.
Сега, како и за тоа како Scanf добива влез од тастатура,
ние ќе бран нашите раце за денес.
Само да се претпостави дека оперативниот систем им овозможува sscanf да се зборува
на тастатура на корисникот, но во овој момент сега во линија 19,
кога ние едноставно печатење на x, се чини да биде случај
дека Scanf го стави int во х.
Тоа е точно како Scanf работи, и се сеќавам минатата недела
тоа е токму онака како GetString и GetInt и други семејството на функции
во крајна линија работи, иако со мало отстапување како sscanf,
што значи скенира низа наместо на тастатура.
Но, ајде да ги разгледаме во малку варијансата на ова.
Во scanf2, јас всушност измамен.
Што не е во ред и јас ќе се скрие коментар кој објаснува колку-
она што е во ред со оваа програма, верзија 2?
Се како технички можно тоа време.
Тоа изгледа прилично добро.
Тоа е убаво вовлечен, но-
добро, како за нека си го режеш до пократки прашања?
Линија 16. Што е линија 16 прават во прецизна, но технички англиски?
Добивање малку непријатно. Да, Мајкл.
[Студентски] Тоа укажува на првата буква на стрингот.
>> Океј, блиску. Дозволете ми да tweak дека малку.
Укажува на првата буква од низа, вие сте за прогласување на променлива наречена тампон
кои ќе укажуваат на прво обраќање на стринг,
или подобро кажано, кои ќе укажуваат поконкретно во знак.
Забележите тоа не е всушност укажува насекаде бидејќи нема задача оператор.
Нема знак за еднаквост, па сите ние сме прави е доделување на променлива наречена тампон.
Се случува да биде 32 бита, бидејќи тоа е покажувач,
и содржината на тампон веројатно на крајот
ќе содржи адреса на знак, но сега за сега, она што не тампон содржи?
Само некои лажни, кој знае, некои ѓубре вредност,
бидејќи не сме експлицитно го иницијализира, па ние не треба да преземе ништо.
Океј, па сега линија 17 е-она што го прави линија 17 направам?
Можеби тоа ќе загрее ова.
Тоа отпечатоци низа, нели?
Тоа отпечатоци Стринг молам.
>> Линија 18 е вид на познатите сега дека ние само видов една варијансата на овој
но со различен формат кодот, па во согласност 18,
ние сме кажувам Scanf тука е адресата на парче меморија.
Сакам да ѕвони во низа, како што имплицираше од% s,
но проблемот е во тоа што не сме го направиле неколку работи тука.
Што е еден од проблемите?
[Студентски] Таа се обидува да Dereference на нула покажувачот.
Добро, нула или само инаку непозната совети.
Ти си предавање Scanf на адреса, но само рече пред еден момент
дека таа адреса е некои ѓубре вредност, бидејќи ние всушност не го назначи за ништо,
и така си кажува Scanf ефикасно одат стави стринг тука,
но не знаете од каде тука се уште е,
па ние не се всушност распределени меморија за тампон.
Покрај тоа, што си ти, исто така, нема ни кажува Scanf?
Да претпоставиме дека ова е дел од меморијата, и тоа не е ѓубре вредност,
но ти си уште не кажувам Scanf нешто важно.
[Студентски] Каде што всушност е, симболот.
Симболот, па во овој случај, тоа е во ред.
Бидејќи тампон е веќе декларирана како покажувач
со * парче синтакса, ние не треба да се користи симболот
затоа што тоа е веќе на адреса, но мислам дека јас го слушнав тука.
[Студентски] Колкава е тоа?
Добро, ние не сме кажувам Scanf колку е голема оваа тампон е,
што значи дури и ако тампон беа покажувач,
ние велиме Scanf, стави стринг тука,
но тука може да биде 2 бајти, тоа би можело да биде 10 бајти, тоа би можело да биде мегабајти.
Scanf нема идеја, и бидејќи ова е дел од меморијата
веројатно, тоа не е стринг уште.
Тоа е само низа откако ќе пишувате знаци и \ 0 до тоа парче на меморија.
Сега тоа е само некои парче на меморија.
Scanf не ќе знае кога да престане пишување на таа адреса.
>> Ако се потсетиме на некои примери од минатото, каде што случајно напишан на тастатурата
се обидува да претекување тампон, и ние разговаравме во петокот околу токму тоа.
Ако противник некако injects во вашата програма е многу поголем збор
или реченица или фраза, тогаш се очекува можете да лизгањето
парче меморија, која може да има лоши последици,
како преземање на целата програма себе.
Ние треба да го надминете овој некако.
Дозволете ми да одзумирате и одат во верзијата 3 на оваа програма.
Тоа е малку подобро.
Во оваа верзија, ја забележат разликата.
Во линија 16, јас сум повторно прогласување на променлива наречена тампон,
но она што е сега?
Тоа е низа од 16 знаци.
Ова е добро бидејќи тоа значи сега можам да кажам Scanf
тука е вистински парче на меморија.
Речиси може да се мисли на низи како покажувачи сега,
иако тие не се всушност еквивалентни.
Тие ќе се однесуваат различно во различни контексти.
Но, тоа е сигурно случај дека тампон е референцирање
16 соседни карактери, бидејќи тоа е она што низа е
и е за неколку недели сега.
>> Еве, јас ти го кажувам Scanf тука е дел од меморијата.
Овој пат, тоа е всушност дел од меморијата,
но зошто е оваа програма е уште експлоатирачки?
Што не е во ред уште?
Сум рече дај ми 16 бајти но-
[Студентски] Што ако тие тип во повеќе од 16?
Точно, што ако на корисникот видови во 17 карактери или 1700 карактери?
Всушност, ајде да видиме ако не можеме патување околу оваа грешка сега.
Тоа е подобро, но не е совршен.
Дозволете ми да оди напред и да ја стартувате направи scanf3 да ги собере на оваа програма.
Дозволете ми да се кандидира scanf3, Стринг молам: здраво, и ние се чини дека се во ред.
Дозволете ми да се обиде малку повеќе еден, здраво таму.
Океј, ајде да го Здраво како сте денес, Enter.
Прв вид на среќа тука, да речеме здраво таму како си.
По ѓаволите.
Океј, па имаме среќа. Ајде да видиме ако не можеме да го надминете овој.
Не, тоа не се случува да ми дозволи да го ископирате.
Да се ​​обидеме тоа повторно.
Добро, стојат од страна.
Ќе видиме колку долго ќе може да претендираат да се фокусираат, додека сеуште го прават тоа.
По ѓаволите. Тоа е прилично соодветно, всушност.
Таму ќе одиме.
Точка направени.
>> Ова, срамно и покрај тоа што, исто така, е, тоа е исто така еден од изворите на голема конфузија
кога пишувате програми кои имаат багови, бидејќи тие се манифестираат
само еднаш во некое време понекогаш.
Реалноста е дека дури и ако вашиот код е целосно скршен,
тоа само може да биде целосно прекината еднаш во некое време
затоа што понекогаш, во суштина она што се случува е оперативен систем издвојува
малку повеќе меморија отколку што навистина е потребно за било која причина,
и така никој друг не е со користење на меморија веднаш по вашиот парче на 16 карактери,
па ако одите во 17, 18, 19, она, тоа не е толку голем договор.
Сега, компјутер, дури и ако тоа не несреќата во тој момент,
на крајот може да се користи бајт број 17 или 18 или 19 за нешто друго,
на која точка вашите податоци што ќе се стави таму, иако претерано долго,
се случува да се препишани потенцијално од страна на некои други функција.
Тоа не е нужно ќе останат непроменети,
но тоа не значи дека ќе предизвика сегмент вина.
Но, во овој случај, јас конечно се предвидени доволно карактери
што во суштина надмина моите сегмент на меморијата, и бам
оперативниот систем рече: "За жал, тоа не е добро, сегментација на вина."
>> И ајде да видиме сега дали она што останува тука во мојот именик-
забележите дека имам оваа датотека тука, јадро.
Забележете дека ова е повторно повика јадро депонија.
Тоа е во суштина датотека што содржи содржината на меморијата на вашиот програмата
на точката во која се урна,
и само за да се обиде малку пример тука дозволете ми да одат во тука
и да ја стартувате gdb на scanf3 а потоа наведете трет аргумент наречен јадро,
и ќе забележите дека овде ако јас на листата на кодот,
ќе можеме како и обично со gdb да започнете одење преку оваа програма,
и јас да ја стартувате и штом јас хит-како со чекор команда во gdb-
штом ќе ја погоди потенцијално кабриолет линија по пишување во огромна низа,
Јас ќе бидам во можност да всушност го идентификуваат тука.
Повеќе за ова, иако, во делот во однос на основни депонии
и слично, така што навистина може да ѕиркаат наоколу во внатрешноста на јадрото депонија
и да видиме за тоа што линијата на програмата не успеа.
Било какви прашања, тогаш на совети и адреси?
Бидејќи денес, ние ќе треба да започнете преземањето здраво за готово дека овие нешта постојат
и знаеме што точно се тие.
Да.
>> [Студентски] Како дојде ти не треба да се стави симболот до скратено работно
Добро прашање.
Како дојде јас не треба да се стави симболот до карактер низа како што го направив претходно
со повеќето од нашите примери?
На кратко одговорот е низи се малку посебно.
Речиси може да се размислува тампон како всушност да се адреса,
и тоа само така се случува да биде случај дека квадратни загради нотација
е погодност, така што можеме да одиме во 0 држач, заградата 1,
заградата 2, без да користите * нотација.
Тоа е малку бела лага, бидејќи низи и совети
се, всушност, малку различни, но тие можат да често, но не секогаш се користат наизменично.
На кратко, кога функцијата се очекува покажувач на парче меморија,
можете или да го положат адреса, кој беше вратен од Примерок,
и ќе видиме Примерок повторно пред долго, или можете да го помине на името на низата.
Вие не треба да направите симболот со низи, бидејќи тие се веќе
суштина се допаѓа адреси.
Тоа е еден исклучок.
На квадратни загради ги направи посебен.
>> Може да се стави на симболот до тампон?
Не во овој случај.
Тоа не би сакал да работиш, бидејќи, пак, на овој агол случај
каде низи не се сосема всушност адреси.
Но, ние можеби ќе се вратам на тоа пред долго со други примери.
Да се ​​обидеме да реши еден проблем тука.
Имаме податочна структура која ние сме биле користите за некое време познат како низа.
Случај во точка, тоа е она што ние само имаше.
Но низи имаат некои квит сум и downsides.
Низи се убаво зошто?
Што е едно нешто што ви се допаѓа, до степен што сакате низи-за низи?
Што е погодно за нив? Што е привлечна?
Зошто ние ги воведе на прво место?
Да.
[Студентски] Тие може да се сместат голем број на податоци, а вие не мора да користите целата работа.
Можете да ги користите секција.
Добро, со низа може да се сместат голем број на податоци,
а вие не мора нужно да го користите сето тоа, па можете да overallocate,
која може да биде удобен, ако не се знае однапред колку нешто да се очекува.
>> GetString е совршен пример.
GetString, напишана од нас, нема идеја како многу карактери да се очекува,
па фактот дека ние може да одвои делови од соседни меморија е добра.
Низи, исто така, го реши проблемот видовме неколку недели сега
каде што е вашиот код ќе почне да се префрлат во нешто многу лошо дизајниран.
Потсетиме дека јас создаде студент структура наречена Давид,
и тогаш тоа е всушност алтернатива, иако,
да има променлива наречена име, и друга променлива наречена, мислам, куќа,
и друг променлива наречена проект, бидејќи во таа приказна Јас тогаш сакаа да се воведе нешто друго
како Роб во програмата, па потоа решив чекајте,
Јас треба да се преименува овие променливи.
Ајде да ги наречеме рудникот name1, id1, house1.
Ајде да ги наречеме на Rob name2, house2, ID2.
Но, тогаш почекајте една минута, што за Томи?
Потоа имавме уште три променливи.
Воведовме некој друг, четири групи на варијабли.
Светот почна да се неуредна многу брзо,
па ние воведе structs, и она што е интересно во врска со структурата?
Што значи struct Ц ви направам?
Тоа е навистина непријатно денес.
Што? >> [Нечујни студент одговор]
Да, конкретно, typedef ви овозможува да креирате нов тип на податоци,
и struct, на struct клучни зборови, ви овозможува да капсулирало
концептуално поврзани делови на податоци заедно
а потоа ги нарекуваат нешто како студент.
>> Тоа беше добро, бидејќи сега можеме да се моделира
многу повеќе вид на концепциски доследен на идејата на еден студент во променлива
наместо произволно имаат еден за стринг, еден за лична карта, и така натаму.
Низи се убаво, бидејќи тие ни овозможуваат да почнете чистење нашиот код.
Но, она што е лоша работа сега на низа?
Што може да не го правите? Да.
[Студентски] Вие треба да знаете колку е голема тоа е.
Треба да знаете колку е голема тоа е, па тоа е вид на болка.
Оние од вас со претходно програмирање искуство знаеме дека во многу јазици,
како Java, можете да побарате парче на меморијата, посебно низа,
колку е голема си, со должина, имот, така да се каже, и тоа е навистина лесен.
Во C, можете дури и не може да се јавите strlen на генерички низа
бидејќи strlen, како зборот значи, е само за жици,
и можете да дознаам должина на стринг, бидејќи на овој човечки конвенција
се има \ 0, но низа, повеќе генерички, е само дел од меморијата.
Ако тоа е низа од ints, таму нема да има некои посебни карактер
на крајот на чекање за вас.
Мора да се запамети должината на низата.
Друга лоша работа на низа одгледуваат својата глава во GetString себе.
Што е уште една надолна линија на низа?
Господине, само јас и ти денес.
[Нечујни студент одговор] >> Тоа е она?
Тоа е прогласена на магацинот.
Океј, прогласена на магацинот. Зошто не ви се допаѓа тоа?
[Студентски] Бидејќи станува пренаменети.
Станува пренаменети.
Океј, ако користите низа за алоцирање на меморија,
не можете да, на пример, се врати, бидејќи тоа е на магацинот.
Океј, тоа е недостаток.
И како за еден друг со низа?
Откако ќе го одвои, ти си вид на зезнав ако ви треба повеќе простор
од таа низа има.
>> Тогаш ние воведе потсетиме, Примерок, кој ни даде можност да се динамички алоцира меморија.
Но што ако ние се обиделе со поинаков свет заедно?
Што ако сакавме да го реши неколку од тие проблеми
па ние наместо-ми пенкало има заспана тука-
Што ако наместо сакаше да суштина се создаде еден свет кој веќе не е вака?
Ова е низа, и, се разбира, овој вид на влошува штом ќе удри на крајот на низата,
и јас сега веќе немате простор за уште еден цел број или друг карактер.
Што ако ние вид на превентивно каже добро, зошто да не се релаксираат
овој услов дека сите овие делови од меморијата се соседни да се врати назад,
и зошто не, кога ми треба int или знак,
само ми даде простор за еден од нив?
И кога ми треба уште еден, дај ми еден друг простор,
и кога ми треба уште еден, дај ми еден друг простор.
Предноста на која сега е во тоа што ако некој друг
зема меморија овде, не е голема работа.
Ќе го земам овој дополнителен дел од меморијата тука, а потоа оваа.
>> Сега, само фати тука е дека оваа речиси чувствувам дека имам
еден куп на различни променливи.
Ова се чувствува како пет различни променливи потенцијално.
Но што ако ние украде идеја од жици
при што можеме некако да ги поврзат овие работи заедно концептуално, и што ако сум го правела тоа?
Ова е мојот многу слабо подготвени стрелка.
Но, претпоставувам дека секој од овие делови од меморијата
укажа на друг, а овој човек, кој нема брат на десната,
нема таква стрела.
Ова е всушност она што се нарекува поврзани листа.
Ова е нова податочна структура која ни овозможува да се додели дел од меморијата,
па уште еден, па уште еден, па уште еден, во секое време сакаме
време на програмата, а ние се сеќавам дека сите тие се некако поврзани со
од буквално врзувањето нив заедно, и ние го сторивме тоа сликовито тука со стрела.
Но во кодот, што ќе биде механизам преку кој може некако да се поврзете,
речиси како нула, еден дел во друг дел?
Ние може да се користи покажувачот, нели?
Бидејќи навистина на стрелката што се случува од горниот лев квадрат,
овој човек овде со нив, би можеле да содржат внатрешноста на овој плоштад
не само некои ints, а не само некои знак, но што ако јас всушност распределени
малку повеќе простор, така што сега,
секој од моите делови од меморијата, иако ова ќе ме чини,
сега изгледа малку повеќе правоаголни каде еден од делови од меморијата
се користи за голем број, како број 1,
а потоа ако овој човек продавници број 2,
овој друг дел од меморијата се користи за стрела,
или поконкретно, покажувач.
И претпоставувам дека ја запази број 3 во текот тука, додека јас го користам ова да се укаже на тоа момче,
и сега овој човек, да претпоставиме Јас само сакам три такви делови од меморијата.
Јас ќе се повлече линија преку која, укажувајќи нула.
Нема дополнителни карактер.
>> Всушност, ова е како можеме да одиме за спроведување
нешто што се нарекува поврзани листа.
А поврзани листа е нова податочна структура, а тоа е отскочна штица кон
многу познавач структури на податоци, кои започнуваат да ги реши проблемите
должината на линиите на Фејсбук тип проблеми и Google тип проблеми
каде што имаат огромни збирки на податоци, и тоа веќе не го сече
за да ја запази сето contiguously и користи нешто како линеарно пребарување
или дури и нешто како бинарна пребарување.
Сакате уште подобро водење пати.
Всушност, еден од Светиот Grails ние ќе зборуваме за крајот на оваа недела или следната
е алгоритам чие времетраење е константна.
Со други зборови, таа секогаш зема иста количина на време, без разлика
колку е голема влезот е, а тоа навистина ќе биде огромна,
дури и повеќе отколку нешто логаритамска.
Што е ова на екранот овде?
Секоја од правоаголници е токму она што јас само го привлече со рака.
Но, нешто по целиот пат од левата страна е специјална променлива.
Тоа се случува да биде еден покажувач бидејќи еден gotcha
со поврзани листа, како овие работи се нарекува,
е дека треба да висат врз едниот крај на поврзани листа.
>> Исто како и со еден конец, треба да знаете адресата на првиот знак.
Истиот договор за поврзани листи.
Мора да се знае адресата на првиот дел од меморијата
затоа што од таму, можете да стигнат до секој друг.
Недостатоци.
Што цена сме ние плаќаат за оваа сестраност се има динамички
бројното податочна структура која, ако некогаш треба повеќе меморија, парична казна,
само доделат уште еден дел и да подготви покажувачот од
на стариот во новиот опашката на листа?
Да.
[Студентски] Тоа трае околу два пати повеќе простор.
Таа ги зема двојно повеќе простор, па тоа е дефинитивно лоша работа, и видовме оваа
Губитокот пред помеѓу времето и просторот и флексибилност
каде до сега, ние не треба 32 бита за секој од овие броеви.
Ние навистина им е потребна 64, 32 за бројот и 32 за покажувач.
Но еј, јас имам 2 гигабајти RAM меморија.
Додавање на уште 32 бита тука и тука не изгледа толку голем договор.
Но, за големи збирки на податоци, тоа е дефинитивно додава до буквално двојно повеќе.
Што е уште една лоша сега, или она што функција не се откажуваме,
ако ние ги претставуваме листа на работи со поврзани листа и не е низа?
[Студентски] Вие не може да напречни наназад.
Вие не може да напречни наназад, па ти си вид на зезнав ако сте одење
од лево кон десно со помош на за јамка или додека јамка
а потоа сфаќаш, "О, јас сакам да се вратам на почетокот на листата."
Вие не може, бидејќи овие совети само оди од лево кон десно како Стрелките покажуваат.
>> Сега, може да се сеќавам на почетокот на листата со друга променлива,
но тоа е комплексноста да се задржи во умот.
Низа, без разлика колку далеку ќе одите, секогаш можете да направите минус, минус, минус, минус
и се врати од каде што дојде.
Што е уште една лоша работа овде? Да.
[Нечујни студент прашање]
Вие би можеле, па сте всушност само предложи на податоци структура наречена двојно поврзана листа,
и навистина, ќе додадете уште еден покажувач на секој од овие правоаголници
што оди во друга насока, на главата од кои
сега можете да напречни напред и назад,
недостатоци на кои се сега сте користење на три пати повеќе меморија, како што се користи за
и додавање на сложеност во однос на кодот ќе мора да пишувам да го добие право.
Но, овие се сите можеби многу разумна рамнотежа, ако пресврт е повеќе важно.
Да.
[Студентски] Исто така, не може да има 2D поврзани листа.
Добро, ти навистина не може да има 2D поврзани листа.
Вие би можеле да. Тоа не е скоро толку лесно како низа.
Како низа, правиш отворен заградата, затворена заграда, отворен заградата, затворена заграда,
и ќе добиете некои 2-димензионална структура.
Вие би можеле да се имплементира 2-димензионални поврзани листа
ако не додаток како што предложи-трета покажувачот на секоја од овие работи,
и ако мислите дека за друга листа доаѓаат во вас 3D стил
од екранот на сите нас, што е само уште еден синџир на некој вид.
Ние би можеле да го направи тоа, но тоа не е толку едноставно како што пишувате отворен заградата, квадратни загради. Да.
[Нечујни студент прашање]
Добро, па ова е вистински критикар.
>> Овие алгоритми дека ние сме сакала повеќе, како ох, бинарна пребарување,
можете да пребарувате низа на броеви на табла
или на телефон книга толку многу побрзо ако користите подели па владеј
и бинарни пребарување алгоритам, но бинарни пребарување потребно две претпоставки.
Еден, дека податоците се подредени.
Сега, ние веројатно може да се задржи оваа решат,
па можеби тоа не е загриженост, но бинарни пребарување, исто така, претпоставува
дека сте имале случаен пристап до листата на броеви,
и низа ви овозможува да имате случаен пристап, и со случаен пристап,
Мислам ако си даде низа, колку време е да се земе
да се дојде до заградата 0?
Една работа, ти само го користите [0] и во право си таму.
Колку чекори што е потребно за да се дојде до место 10?
Еден чекор, вие само одете на [10] а ти си таму.
Спротивно на тоа, како да се стигне до 10-ти број на поврзани листа?
Ќе мора да почнат во почетокот, бидејќи сте само сеќавањето
почетокот на поврзани листа, исто како и низа се памети
од страна на адреса на својот прв знак, и да се најде дека 10 int
или дека 10 карактери во стринг, мора да се бара целата проклето нешто.
>> Повторно, ние не сме решавање на сите наши проблеми.
Ние сме за воведување на нови, но тоа навистина зависи од она што се обидуваш да се дизајнира за.
Во однос на спроведувањето на ова, можеме да позајми идеја од тоа студент структура.
Синтакса е многу слична, освен сега, идејата е малку повеќе апстрактно
од куќата и име и број.
Но, јас предложи дека би можеле да имаат податочна структура во C
што се нарекува јазол, како последен збор на слајд покажува,
внатрешноста на еден јазол, и еден јазол е само генерички сад во компјутерската наука.
Тоа е обично подготвени како круг или квадрат или правоаголник што ние го направивме.
И во оваа податочна структура, имаме int, n,
па тоа е бројот Јас сакате да го зачувате.
Но што е ова втора линија, struct јазол * следно?
Зошто е ова точно, или каква улога прави ова нешто игра,
иако тоа е малку криптичната на прв поглед?
Да.
[Нечујни студент одговор]
Точно, па * вид на пленот дека тоа е покажувачот на некој вид.
Името на овој покажувачот е произволно следната,
но ние би можеле да го повика нешто што сакате, но она што го прави ова покажувачот точка за?
[Студентски] Друга јазол. >> Точно, тоа укажува на еден таков јазол.
>> Сега, ова е вид на љубопитноста на В
Потсетиме дека C е прочитана од страна на компајлерот врвот до дното, лево кон десно,
што значи дека ако-ова е малку различен од она што го правевме со ученикот.
Кога ќе се дефинира студент, ние всушност не стави зборот таму.
Таа само рече typedef.
Потоа имавме int id, стринг име, стринг куќа,
а потоа студент на дното на структурата.
Оваа изјава е малку различен, бидејќи,
повторно, C компајлер е малку глупава.
Тоа само ќе прочитате врвот до дното,
па ако не стигне на 2 линија тука
каде следната е прогласена и го гледа, ох, тука е променлива наречена следната.
Тоа е покажувач кон struct јазол.
Компајлерот ќе се реализира она што е struct јазол?
Јас никогаш не сум слушнал за тоа нешто пред тоа,
бидејќи зборот јазол не е поинаку може да се појави
додека на дното, така што постои овој вишок.
Мора да се каже struct јазол тука, кои потоа може да го скрати подоцна
благодарение на typedef долу тука, но тоа е затоа што
ние сме референцирање самата структура во внатрешноста на објектот.
Тоа е една gotcha таму.
>> Некои интересни проблеми ќе се појават.
Имаме листа на броеви. Како да ја вметнете во тоа?
Како да го пребарувам? Како да ја избришете од тоа?
Особено сега дека ние треба да управуваат со сите овие совети.
Си мислел совети беа вид на ум-свиткување
кога сте имале еден од нив само се обидува да го прочитате int на него.
Сега ние треба да се манипулира вреди цела листа е.
Зошто не ги земаме 5-минутна пауза тука, и потоа ќе донесе
некои луѓе на сцената да го стори токму тоа.
>> Ц е многу повеќе да се забавуваат кога е дејствувал надвор.
Кој буквално би сакал да биде прв?
Добро, ајде до. Вие сте во прв план.
Кој би сакал да биде 9? Океј, 9.
Како за 9? 17?
А малку клика тука. 22 и 26 во кои предниот ред.
А потоа како за некој таму се вперени во.
Вие сте 34. Океј, 34, ајде до.
Првиот е таму. Океј, сите четири од вас момци.
И кој не го тврдиме 9?
Кој е наш 9?
Кој навистина сака да биде 9? Добро, ајде, да биде 9.
Еве ќе одиме.
34, ние ќе ви ги задоволи таму.
Првиот дел е да се направи себе си изгледа тоа.
26, 22, 17, добра.
Ако може да издржи исклучување на страна, затоа што ние ќе ви Примерок во еден момент.
>> Добро, добро.
Океј, одлична, па ајде да побара неколку прашања тука.
И всушност, она што е вашето име? >> Анита.
Анита, добро, ајде овде.
Анита ќе ни помогне вид на еден реши прилично едноставно прашање во прво,
кој е како да го пронајдете тоа дали или не вредност е во листата?
Сега, забележите дека прво претставен тука од Лукас,
е малку различен, така и неговиот парче хартија е намерно накосо
бидејќи тоа не е толку висок и не заземаат колку битови,
Иако технички тој има иста големина на хартија само ротира.
Но, тој е малку поинаков во тоа што тој е само 32 бита за покажувач,
и сите овие момци се 64 парчиња, од кои половина е бројот, од кои половина е покажувач.
Но на покажувачот не е прикажан, па ако вие момци може нешто чудно
го користите вашиот левата рака за да укаже на лицето до вас.
А ти си број 34. Што е вашето име?
Ari.
Ари, па всушност, држете го хартија во својата десна рака и левата рака директно оди надолу.
Ви го претставуваме нула лево.
>> Сега нашата човечка сликата е многу конзистентни.
Ова е всушност како покажувачи работа.
И ако може да scrunch малку на овој начин, па не сум во вашиот начин.
Анита тука, најдете ме на број 22,
но се претпостави ограничување на не луѓето држи до парчиња хартија,
но ова е листа, и имате само Лукас да започне со
бидејќи тој е буквално прв покажувач.
Да претпоставиме дека си се покажувач, и така можете исто така имаат можност да се укаже на нешто.
Зошто не почнете со внесување на точно она што Лукас е да се покажува во?
Добро, и дозволете ми донесе ова овде.
Само заради дискусија, дозволете ми да се повлече до празна страница тука.
Како се пишува вашето име? >> Анита.
Океј, Анита.
Да речеме јазол * anita = Лукас.
Па, ние не треба да ти се јавам Лукас. Ние треба да се јавам во прв план.
Зошто е ова всушност согласност со реалноста тука?
Еден, првиот веќе постои.
Првиот е наменет веројатно некаде тука.
Јазол * прво, и тоа е се доделени листа некако.
Не знам како тоа се случило. Тоа се случи пред класа започна.
Ова поврзани листа на човекот е создаден.
И сега во овој момент во приказната-ова е сите се случува Фејсбук очигледно подоцна-
во овој момент во приказната, Анита е иницијализиран да биде еднаков на прво,
што не значи дека Анита поени на Лукас.
Наместо тоа, таа укажува на она што тој укажува на
бидејќи истата адреса што е внатре на Лукас е 32 бита - 1, 2, 3 -
е сега, исто така во внатрешноста на на Anita 32 битови - 1, 2, 3.
>> Сега се најде 22. Како ќе одат за тоа?
Што е тоа? >> Точка до сеедно.
Укажуваат на она што, па оди напред и да дејствува тоа надвор како најдобро можете да тука.
Добро, добро, а сега сте покажувајќи кон-Што е вашето име со 22?
Рамон. >> Рамон, па Рамон се држи до 22.
Вие сте сега се направи проверка.
Дали Рамон == 22, и ако е така, на пример, ние може да се врати вистина.
Дозволете ми-додека овие момци стојат тука малку чудно-
дозволете ми да направам нешто брзо како bool најдете.
Одам да се оди напред и да каже (јазол * листа, int n).
Јас ќе се вратам со вас момци. Јас само треба да пишувам некои код.
И сега ќе одам да оди напред и да го направите ова, јазол * anita = листата.
И јас ќе одам да продолжиме и да речеме додека (anita! = NULL).
>> Метафората тука е добивање малку се протегала, но додека (anita! = NULL), што сакам да направам?
Ми треба некој начин на упатување
на цел број кој Анита е да се покажува кон.
Во минатото, кога имавме структури, кои еден јазол е,
ние се користи нотација точка, а ние би рекол нешто како
anita.n, но проблемот тука е дека Анита не е struct сама за себе.
Што е таа?
Таа е покажувач, па, навистина, ако сакаме да ја користите оваа точка нотација-
и ова се случува да се погледне намерно малку криптичната-
ние треба да направите нешто како одат на левата рака она што на Anita се укажува на
и потоа да добијат областа наречена Н.
Анита е покажувач, но она што е * anita?
Што ви се најде кога одите на она што Анита е да се покажува во?
А struct, еден јазол, и еден јазол, се потсетиме, има областа наречена n
затоа што, да се потсетиме, овие 2 полиња, веднаш и n,
што сме го виделе пред еден момент овде.
>> Всушност да го имитираат тоа во кодот,
ние би можеле да го направи ова и велат дека ако ((* anita). n == n), n дека Јас сум во потрага за.
Забележете дека функцијата беше донесен во бројот Јас се грижат за.
Тогаш може да оди напред и да се направи нешто како враќање вистина.
Друго, ако тоа не е случај, она што сакам да направам?
Како можам да се претвори во кодот што Анита сторија тоа интуитивно одење низ листата?
Што треба да направам се тука за да се симулира Анита земајќи тој чекор кон лево, тој чекор кон лево?
[Нечујни студент одговор] >> Што е тоа?
[Нечујни студент одговор]
Добро, не е лоша идеја, но во минатото, кога ние го направивме ова, ние го направивме anita + +
бидејќи тоа би го додадете бројот 1 до Анита,
кои обично укажуваат на следната лице, како Рамон,
или лицето до него или до него лице во воспоставувањето на линија.
Но, тоа не е сосема добро тука, бидејќи она што го прави тоа нешто изгледа во меморија?
Не тоа. Ние мора да се оневозможи тоа.
Тоа изгледа вака во меморијата, и иако сум подготвен 1 и 2 и 3 блиску еден до друг,
ако ние навистина симулираат ова-може да ви момци, додека се уште посочувајќи на истите луѓе,
може некои од вас се случаен чекор назад, некои од вас случаен чекор напред?
>> Овој хаос се уште е поврзана листа,
но овие момци може да биде било каде во меморија,
па anita + + нема да работат зошто?
Што е на локација anita + +?
Кој знае.
Тоа е некоја друга вредност што само така се случува да се interposed
меѓу сите овие јазли случајно, бидејќи ние не сме користење низа.
Ние доделени на секоја од овие јазли поединечно.
Океј, ако вие момци можат сами исчисти назад.
Дозволете ми предложи дека наместо anita + +, ние наместо да направите Анита добива-
Па, зошто да не одат на она што Анита е да се покажува кон, а потоа направи. следно?
Со други зборови, ние одиме на Рамон, кој држи број 22,
и тогаш. следната е како да Анита ќе биде копирање левата рака покажувач.
Но, таа не би отишле подалеку од Рамон бидејќи ние откривме 22.
Но, тоа ќе биде идеја. Сега, ова е бог-страшно хаос.
Искрено, никој нема да се сеќава на ова синтаксата, и така за среќа,
тоа е всушност малку намерно-Ох, ти всушност не се види она што јас го напишав.
Ова ќе биде поатрактивна ако може. Voila!
>> Зад сцената, јас бев решавање на проблемот на овој начин.
Анита, да преземе тој чекор кон лево,
Прво, ние одат на адреса која Анита е да се покажува на
и каде таа ќе се најде не само n, кои ние едноставно се проверуваат заради споредба на,
но вие исто така ќе најдете следната - во овој случај,
Левата рака на Ramon укажува на следниот јазол во листата.
Но, ова е бог-страшно хаос на кој јас од порано,
но излегува C ни овозможува да се поедностави ова.
Наместо на пишување (* anita), можеме да наместо само напиши anita-> n,
и тоа е иста работа функционално, но тоа е многу повеќе интуитивна,
и тоа е многу повеќе во согласност со слика дека ние сме биле цртање
сето ова време со користење стрели.
>> И на крај, она што ние треба да направите на крајот од оваа програма?
Има една линија код останатите.
Врати она?
Лажни, бидејќи ако ние се добие преку целата додека јамка
и Анита е, всушност, нула, тоа значи дека таа го помина патот на крајот на листата
каде што таа беше покажувајќи кон-Што е вашето име повторно?
Левата ari. >> На Ari страна, која е нула.
Анита сега е нула, и сфаќам ти си само стоеше тука чудно во неизвесност
бидејќи јас одам надвор на монолог тука,
но ние ќе ви вклучи повторно во само еден миг.
Анита е нула во тој момент во приказната, па додека јамка прекинува,
и ние треба да се врати лажни, бидејќи ако таа доби целиот пат до нула покажувачот на Ari
тогаш немаше број кој таа бара во листата.
Можеме да ја исчистиме оваа до премногу, но тоа е прилично добра имплементација потоа
на функција traversal, на најдете функција за поврзани листа.
Тоа е уште линеарно пребарување, но тоа не е толку едноставно како + + покажувачот
или + + една променлива i затоа што сега не можеме да се погоди
каде што секој од овие јазли се во меморијата.
Ние треба да буквално го следат патеката на breadcrumbs или, поконкретно,
совети, за да се добие од еден јазол до друг.
>> Сега ајде да се обиде уште еден. Анита, дали сакате да се вратам тука?
Зошто не одиме напред и да се распределат еден друг човек од публиката?
Примерок-Што е вашето име? >> Ребека.
Ребека. Ребека е malloced од публиката,
и таа е сега чување на бројот 55.
И целта на дофат на раката сега е Анита да вметнете
Ребека во поврзани листа тука во соодветно место.
Дојди тука за момент.
Јас имам направено нешто како ова.
Имам направено јазол *. И она што е вашето име повторно?
Ребека. >> Ребека, во ред.
Ребека добива Примерок (sizeof (јазол)).
Како само ние имаме распределени работи како студенти и какво ли не во минатото,
ние треба големината на јазол, па сега Rebecca
е да се покажува во што?
Ребека има две полиња внатрешноста на неа, од кои едната е 55.
Ајде да го направи она, Ребека-> = 55.
Но, тогаш Ребека-> следната треба да се-како сега, кога нејзината дланка е вид на кој знае?
Тоа укажува на некои ѓубре вредност, па зошто да не се направи за добра мерка
ние барем направите ова, така што левата рака е сега во неа.
Сега Анита, однесете го од тука.
Имате Ребека биле распределени.
Оди напред и да се најде таму каде што треба да се стави Ребека.
Добар, многу добар.
Океј, добро, и сега ние треба да се обезбеди малку насока,
толку сте достигна Ари.
Левата рака е нула, но Ребека јасно припаѓа на правото,
па како не треба да се смени ова поврзани листа
Со цел да вметнете Ребека во соодветно место?
Ако вие буквално може да се движи лево рацете на луѓето околу колку што е потребно,
ние ќе го поправат проблемот на тој начин.
Океј, добро, а во меѓувреме, левата рака Ребека е сега со неа.
>> Тоа беше премногу лесно.
Да се ​​обидеме распределба-we're речиси направено, 20.
Добро, ајде до.
20 е наменет, па дозволете ми да оди напред и да кажам повторно тука
ние сме само направено јазол * saad.
Имаме Примерок (sizeof (јазол)).
Ние тогаш го стори истото точната синтакса како што беше порано за 20,
и јас ќе направам следно = NULL, а сега тоа е до Анита
за да вметнете сте во поврзани листа, ако може да се игра таа иста улога.
Изврши.
Океј, добро.
Сега мислам внимателно пред да почне да се врти лево раце околу.
Можете далеку доби најмногу непријатна улога денес.
Чија рака треба да бидат преместени првиот?
Океј, чекај, слушам некои не е.
Ако некои луѓе учтиво би сакале да помогне во решавањето непријатна ситуација тука.
Чија левата рака треба да се ажурираат првиот можеби? Да.
[Студентски] на Saad.
Океј, Саад, зошто, иако?
[Нечујни студент одговор]
Добро, бидејќи ако се движиме-Што е вашето име? >> Маршал.
Маршал, ако тргнеме раката прво до нула,
сега имаме буквално сираче четири лица во оваа листа
бидејќи тој беше единственото нешто што укажува на Рамон и секој од левата страна,
па ажурирање на покажувачот прво беше лошо.
Ајде да го вратите тоа.
Добро, и сега одиме напред и да се движат на соодветни левата рака покажува кон Рамон.
Ова се чувствува малку излишни.
Сега има две лица покажувајќи кон Рамон, но тоа е во ред
бидејќи сега како уште ни ја ажурираат листата?
Што друга страна има да се преселат?
Одлично, сега не сме изгубиле било меморија?
Не, толку добро, ајде да видиме ако не можеме да се скрши оваа уште еднаш.
>> Mallocing последен пат, бројот 5.
Сите начинот на назад, ајде надолу.
Тоа е многу возбудливо.
[Аплауз]
Што е вашето име? >> Рон.
Рон, во ред, вие сте malloced како број 5.
Ние само извршува кодот кој е речиси идентична со овие
само со друго име.
Одличен.
Сега, Анита, со среќа вметнување број 5 во листата сега.
Добро, а?
Одлично, така што ова е навистина третина од три вкупниот случаи.
Ние прво имаше некој на крајот, Ребека.
Ние тогаш имаше некој во средината.
Сега имаме некој на почетокот, и во овој пример,
ние сега мораше да се ажурира Лукас за прв пат
затоа што првиот елемент во листата сега има да се укаже на нов јазол,
кои, пак, се укажува во јазол број 9.
>> Ова беше многу непријатно демонстрација, јас сум сигурен,
па голем аплауз за овие момци ако може.
Убаво направено.
Тоа е сè. Може да ги задржи вашите парчиња хартија како малку меморија.
Излезе дека тоа е во кодот
не е толку едноставно како што само се движат рацете околу
и покажувајќи совети на различни нешта.
Но, сфаќаат дека кога станува збор време да се спроведе вакво нешто
на поврзани листа или варијанта на тоа дали ќе се фокусира на навистина
овие основни основи, на залак големина проблеми Морам да дознаам,
е тоа што оваа рака или оваа страна, сфаќаат дека она што е инаку прилично комплексна програма
може, всушност, да се намали на прилично едноставни градежни блокови се допаѓа ова.
>> Да се ​​работи на многу пософистициран насока уште.
Сега имаме поим на поврзани листа.
Ние, исто така имаат и благодарение на предлог таму-двојно поврзана листа,
која изгледа речиси иста, но сега имаме два покажувачи внатрешноста на struct
наместо на еден, а ние веројатно може да се јавите на оние совети претходната и следната
или лево или десно, но ние, всушност, треба два од нив.
Кодот ќе биде малку повеќе вклучени.
Анита би морале да ја завршат повеќе работа тука на сцена.
Но, ние сигурно би можеле да спроведат таков вид на структура.
Во однос на водење на време, сепак, она што ќе биде трчање време
за Анита за наоѓање на број n во поврзани листа сега?
Сепак голема О од n, па затоа не е подобар од линеарно пребарување.
Ние не можеме да направиме бинарни пребарување, сепак, повторно.
Зошто е тоа така? Вие не може да скокаат наоколу.
Иако ние очигледно ги видите сите луѓе на сцената,
и Анита би можеле да го eyeballed и рече: "Еве средината на листа"
таа не ќе знае дека ако таа се компјутерска програма
затоа што единственото нешто што мораше да бравата за да на почетокот на сценариото
беше Лукас, кој беше првиот покажувач.
Таа значи дека ќе мора да го следат тие врски,
броење нејзиниот начин се додека не се најде околу средината,
па дури и тогаш, таа нема да знаеш кога таа достигна средината
освен ако таа оди нагоре сè до крајот да дознаам колку има,
тогаш backtracks, и дека премногу ќе биде тешко, освен ако сте имале
двојно поврзани листа на некој вид.
>> Решавање на некои проблеми денес, но воведување на другите.
Што за различни податоци структура заедно?
Ова е фотографија од коцки во Mather куќа,
и во овој случај, имаме податоци структура ние сме исто така еден вид на веќе зборува.
Зборувавме за оџак во контекст на меморија,
и тоа е вид на намерно наречен поради магацинот во однос на меморијата
е ефикасно податочна структура која има се повеќе и повеќе нешта слоевит на врвот на неа.
Но интересна работа во врска оџак, како што е случај во реалноста,
е дека тоа е посебен вид на податоци структура.
Тоа е податочна структура која првиот елемент во
е последниот елемент надвор.
Ако сте прв лента за да се стави врз оџакот,
сте ќе биде за жал последните лента треба да се преземат надвор од магацинот,
И тоа не е секогаш добра работа.
Спротивно на тоа, може да се мисли за тоа е обратно,
последниот во е првиот од.
>> Сега, не било сценарија доаѓаат на ум каде има оџак
податочна структура каде што треба тој имот
на последниот во, прв надвор, е всушност огромна?
Дали е тоа добро? Дали е тоа лошо?
Тоа е дефинитивно лоша работа ако пепелниците не се сите исти
и тие сите беа специјални различни бои или какво ли не,
и бојата што сакате е целиот пат на дното.
Се разбира, не можете да добиете дека без голем напор.
Мора да се почне од врвот и да работат на вашиот пат надолу.
Слично на тоа, што ако сте биле еден од овие вентилатор момчиња
кој чека цела ноќ се обидува да добие на iPhone и линии
на вакво место?
Зарем не би било убаво ако продавницата на Apple
беа магацинот на податоци структура?
Yay? Nay?
Тоа е само добро за луѓе кои се појавиш во последниот можен момент
а потоа се скинат исклучување на дното.
И всушност, фактот дека сум бил толку наклонети да се каже дното
е, всушност, во согласност со она што ние би го нарекол овој вид на податоци структура,
еден во реалноста каде што цел е важно,
и сакате првата во да биде првиот од
ако само за доброто на човечка праведност.
Ние обично ќе се јавите дека задача податочна структура.
>> Излегува покрај поврзани листи, можеме да започнат со користење на истите основни идеи
и започнете создавање на нови и различни типови на решенија за проблемите.
На пример, во случај на стек, би можеле да претставуваат магацинот
користење на податоци структура вака, јас би им предложил.
Во овој случај, јас сум прогласена за struct, и јас сум изјави во внатрешноста на оваа структура
е низа од броеви и потоа променлива наречена големина,
и јас идам да се јавам ова нешто оџак.
Сега, зошто ова всушност работат?
Во случај на стек, би можел да се подготви овој ефикасно на екранот како низа.
Овде е мојот оџак. Тоа се моите броеви.
И ние ќе ги привлече што е оваа, ова, ова, ова, ова.
И тогаш имам некои други податоци член тука,
кој се нарекува големина, така што ова е големина, и ова е броеви,
и колективно, целата iPad тука претставува еден оџак структура.
Сега, по дифолт, големина се претпоставува дека мора да се иницијализира на 0,
и она што е внатре на низата на броеви првично
кога јас прв пат распредели низа?
Ѓубре. Кој знае? А тоа всушност не е важно.
Тоа не е важно дали тоа е 1, 2, 3, 4, 5, сосема случајно
со лоша среќа чуваат во мојот структура, бидејќи толку долго како што знаете дека големината на магацинот
е 0, тогаш знам програмски, не се погледне во која било од елементи во низа.
Не е важно она што е таму.
Не гледам во нив, како ќе биде импликацијата на големината на 0.
>> Но, претпоставувам сега одам напред и внесете нешто во магацинот.
Сакам да внесете го бројот 5, па да го ставам број 5 тука,
а потоа она што можам да се спушти овде?
Сега јас всушност би се спушти 1 за големината,
и сега на магацинот е на големината 1.
Што ако јас одам напред и внесете го бројот, да речеме, 7 следно?
Ова тогаш добива ажурирани до 2, а потоа ние ќе направиме 9,
и тогаш тоа добива ажурирани на 3.
Но интересна карактеристика сега на оваа оџакот е дека
Јас сум требало да се отстрани кој елемент ако сакам да pop-
нешто надвор од магацинот, така да се каже?
9 ќе биде првото нешто да се оди.
Како на сликата треба да се менува ако сакам да pop елемент надвор од магацинот,
многу како лента во Mather?
Да. >> [Студентски] Постави големина до 2.
Точно, сите јас направите е да поставите големина до 2, а што да правам со низа?
Не треба да правите ништо.
Би можел само да биде анален, ставете 0 таму или -1 или нешто да се означи
дека ова не е legit вредност, но тоа не е важно бидејќи
Јас може да снима надвор од низата себе колку долго е
така што знам само гледаат во првите два елементи во оваа низа.
Сега, ако одам и да го додадете бројот 8 на оваа низа, како не на слика промени следно?
Ова станува 8, и ова станува 3.
Јас сум сечење неколку агли тука.
Сега имаме 5, 7, 8, и ние сме назад со големина од 3.
Ова е прилично едноставно да се имплементира,
но кога ќе се дојде до жалам овој дизајн одлука?
Кога работите почнуваат да одат многу, многу погрешно? Да.
[Нечујни студент одговор]
Кога ќе сакам да се вратам и да добијат првиот елемент да се стави внатре
>> Излегува тука иако оџакот е низа под хауба,
овие структури на податоци ние почнавме да зборуваме за се, исто така, општо позната како
апстрактни податочни структури при што како тие се спроведуваат
е сосема покрај точка.
А податочна структура како оџак би требало да додадете поддршка
операции како притисни, која турка послужавник врз оџакот,
и поп, која ги отстранува елемент од магацинот, и тоа е тоа.
Ако сте биле за да преземете некој друг код кој веќе имплементирани
тоа нешто наречено оџак, тоа лице ќе го имаат напишано
само две функции за вас, притисни и поп, чија единствена цел во животот
ќе биде да се направи токму тоа.
Можете или него или неа кој спроведува таа програма
би биле сосема еден да одлучи како да се имплементира
семантиката на туркање и пукање под хаубата
или функционалноста на туркање и пукање.
И Јас го направив малку избрзан одлука тука
со спроведување на мојата магацинот со овој едноставен податочна структура зошто?
Кога го прави ова податочна структура пауза?
Во кој момент морам да се врати грешка кога корисникот повици притисок, на пример?
[Студентски] Ако нема повеќе простор.
Точно, ако нема повеќе простор, ако сум надмина капацитет,
која е за сите капи, бидејќи тоа покажува дека тоа е некој вид на глобална константа.
Па, тогаш јас сум само ќе мора да се каже, "Жал ми е, не можам да им помогнам на друга вредност
врз оџакот ", слично како во Mather.
>> Во одреден момент, тие се случува да го погоди горниот дел од таа мала кабинет.
Нема повеќе простор или капацитет во магацинот, на која точка има некој вид на грешка.
Тие треба да се стави овој елемент на друго место, на послужавник некаде на друго место,
или никаде на сите.
Сега, со задача, би можеле да ја спроведат малку поинаку.
А задача е малку различен во дека под хаубата, тоа може да се спроведе
како низа, но затоа, во овој случај, јас предлагање
исто така да имаат шефот елемент претставува чело на листата,
предниот дел на листата, првиот човек во линија на продавницата на Apple, во прилог на големината?
Зошто ми е потребен дополнителен дел од податоците тука?
Сетам на она броеви е
ако јас сум подготвен тоа како што следува.
Да претпоставиме дека ова е сега на дното, наместо на магацинот,
разликата е-исто како на Apple продавница задача е фер.
Првиот човек во линија на почетокот на листата, број 5 во овој случај,
тој или таа ќе биде пуштена во продавница во прв план.
Ајде да го направите тоа.
Да претпоставиме дека ова е држава на мојата задача во овој момент во времето, и сега на продавницата на Apple
се отвора и првиот човек, број 5, се води во продавница.
Како да си ги променам слика сега дека сум де-подредени првиот човек
во предниот дел на линија?
Што е тоа? >> [Студентски] Промена на листа на чекање.
Промена на главата, така 5 исчезнува.
Во реалноста, тоа е како да-како најдобро да го направите ова?
Во реалноста, тоа е како да овој човек исчезнува.
Што би број 7 прават во вистински продавница?
Тие ќе земе голем чекор напред.
>> Но, она што доаѓаме до цениме кога станува збор за низи
и се движат работите околу?
Тоа е вид на отпад од вашето време, нели?
Зошто мора да биде толку анален како да имаат првата личност
на почетокот на линијата на физички почетокот на дел од меморијата?
Тоа е сосема непотребно. Зошто?
Што може да јас само се сеќавам наместо неа? >> [Нечујни студент одговор]
Точно, јас само може да се сети со овој дополнителни податоци членка главата
дека сега на чело на листата не е 0, што беше пред еден момент.
Сега тоа е всушност бројот 1. На овој начин, да се добие мала оптимизација.
Само затоа што сум де-подредени некој од линија на почетокот на линијата на Apple продавница
не значи дека секој има да се префрлат, кој се потсетиме е линеарна операција.
Јас наместо да трошат постојана време само
и да се постигне тогаш многу побрзо одговор.
Но цената јас плаќам е што да се добие дека дополнителни перформанси
и не морале да ја префрлат сите?
Да. >> [Нечујни студент одговор]
Да додадете повеќе луѓе, и тоа проблем е ортогонален
на фактот дека ние не сме менувањето на луѓето наоколу.
Тоа е уште една низа, па дали сме или не сме ја префрлат сите или не-
О, гледам она што значи, во ред.
Всушност, јас се согласувам со она што си ти што зборуваш по тоа што е речиси како да
ние никогаш не сега ќе се користи на почетокот од оваа низа повеќе
затоа што ако јас се отстрани 5, тогаш јас отстрани 7.
Но, јас само се стави луѓето на десно.
>> Таа се чувствува како да сум губи простор, и конечно мојата задача распаѓа во ништо,
па ние само би можеле да имаат луѓето wraparound,
и ние да мислам на оваа низа навистина како некој вид на кружни структура,
но ние ги користиме она оператор во C да се направи тој вид на wraparound?
[Нечујни студент одговор] >> Операторот модул.
Тоа ќе биде малку досадно да се мисли преку тоа како да го направите на wraparound,
но можеме да го сториме, а ние може да започне стави луѓето во она што се користи да биде на предната страна од линијата,
но ние само се сеќавам со оваа глава променлива кој актуелниот шеф на линијата навистина е.
Што ако, наместо тоа, нашата цел на крајот, сепак,
беше да се погледне до броеви, како што направивме тука на сцена со Анита,
но ние навистина сакате најдоброто од сите овие светови?
Сакаме повеќе софистицираност од низа овозможува
бидејќи ние сакаме способноста да се динамички растат на податоци структура.
Но, ние не сакаме да мора да прибегне кон нешто што истакна
во првото предавање не е оптимално алгоритам,
дека на линеарно пребарување.
Излезе дека можете, всушност, да се постигне
или барем блиску до постојана време, при што некој како Анита,
ако таа конфигурира нејзините податоци структура да не биде поврзана листа,
да не биде оџакот, да не биде на дното, може, всушност,
излезе со податочна структура која им овозможува на неа да се погледне нагоре работи,
дури и зборови, не само броеви, во она што ќе го наречеме постојана време.
>> И всушност, гледајќи напред, еден од psets во оваа класа е скоро секогаш
имплементација на spellchecker, при што
ние ви даде повторно 150,000 англиски зборови, а целта е да се
оптоварување оние во меморијата и брзо да биде во можност да одговори на прашањата на формата
е овој збор напишани правилно?
И тоа навистина ќе си го цица ако мораше да iterate преку сите 150.000 зборови за да одговори на тоа.
Но, всушност, ќе видиме што можеме да го направиме тоа во многу, многу брзо време.
И тоа се случува да вклучуваат спроведување на нешто што се нарекува хаш табелата,
и иако на прв поглед тоа нешто наречен хаш табелата ќе
нека се постигнат овие супер брз одговор пати,
излегува дека таму е всушност проблем.
Кога станува збор време да се спроведе оваа работа наречена-повторно, јас сум го прави тоа повторно.
Јас сум единствениот тука.
Кога станува збор време за спроведување на оваа работа наречена хаш табелата,
ние ќе мора да донесе одлука.
Колку е голема треба оваа работа, всушност ќе биде?
И кога ќе почнеме вметнување броеви во оваа хаш табелата,
како ќе се дојде до чувајте ги на тој начин
дека можеме да ги добие назад толку брзо како што ги доби во?
Но, ќе видиме пред долго што ова прашање на
кога роденден на сите е во класа ќе бидат доста соодветен.
Излегува дека во оваа соба, имаме неколку стотици луѓе,
па шансите дека две од нас имаат ист роденден е веројатно прилично високи.
Што ако имало само 40 од нас во оваа соба?
Кои се шансите на две лица кои имаат иста роденден?
[Студентите] Над 50%.
Да, повеќе од 50%. Всушност, јас дури и донесе табелата.
Излезе и ова е навистина само еден подлец преглед-
ако има само 58 од нас во оваа соба, веројатноста 2 од нас
имаат ист роденден е многу висока, речиси 100%,
и дека ќе предизвика бројни повреди за нас во средата.
>> Со тоа, вели, ајде да го одложи тука. Ние ќе се видиме во среда.
[Аплауз]
[CS50.TV]