[MUZYKA GRY] DAVID MALAN: To CS50. I to zarówno początek i end-- jak literally-- prawie koniec od sześciu tygodni. Pomyślałem, że podzielę Trochę zabawy rzeczywistości. Mam wyciągnął z tego się zbiór danych minionego semestru. Można przypomnieć, że poprosi o co str forma zestaw jeśli Widziałem w Internecie lub jeśli już udział osobiście. A oto dane. Więc dzisiaj był bardzo przewidywalny. Ale chcieliśmy spędzić trochę czasu z tobą jednak. Czy ktoś chciałby się domyślić, dlaczego Wykres jest tak chropawy, w górę w dół, w górę w dół, tak konsekwentnie? Co każdy z wierzchołków i koryta reprezentacji? PUBLICZNOŚCI: [niesłyszalne] DAVID MALAN: Rzeczywiście. I bardziej zabawnie, nie daj Boże, posiadamy jeden wykład w piątek na początku semestru, że to, co widzimy, dzieje. Więc dzisiaj, uczestniczymy w nieco więcej o strukturach danych. I dać więcej stałe Model mentalny problemów w pięciu, co jest teraz na zewnątrz. Błędy ortograficzne, w którym, będziemy wręczyć ci plik tekstowy 100,000 oraz angielskie słowa i będziesz mieć aby dowiedzieć się, jak sprytnie je załadować do pamięci do pamięci RAM, używając pewnych danych Struktura wyboru. Teraz jedna taka struktura danych może być, ale prawdopodobnie nie powinien być dość uproszczona lista powiązana, które wprowadziliśmy ostatnio. I powiązana lista miał co najmniej jedną przewagę nad tablicą. Co jest jedną z zalet powiązane lista zapewne? Publiczność: Insertion. DAVID MALAN: Insertion. Co masz na myśli? Publiczność: Wszędzie razem Lista [niesłyszalne]. DAVID MALAN: Dobra. Więc można wstawić element w miarę chcesz w środku listy bez shuffle niczego, które zawarliśmy w naszym sortowania dyskusje, nie jest zawsze dobra rzecz, bo na to potrzeba czasu, aby rzeczywiście przenieść wszystkich tych ludzi w lewo lub w prawo. I tak z połączonej listy, można po prostu przeznaczyć z malloc, nowy węzeł, a następnie zaktualizować kilka pointers-- dwa, trzy operacje max-- i jesteśmy w stanie rozciąć kogoś w dowolnym miejscu na liście. Co jeszcze było korzystne o połączonej listy? Tak? PUBLICZNOŚCI: [niesłyszalne] DAVID MALAN: Idealny. Doskonały. To bardzo dynamiczna. I że nie jesteś popełnienia, z góry, do pewnego stałego rozmiaru kawałek pamięci, jak trzeba się z tablicy, w której pozytywnie jest to, że można przeznaczyć tylko na węzłach Popyt ten sposób przy użyciu tylko tyle miejsca jak rzeczywiście trzeba. W przeciwieństwie do tablicy, to polubisz przypadkowo przeznaczyć zbyt mało. A potem to tylko będzie się ból w szyi realokacji nowy większy wachlarz, kopiowanie wszystko skończy, uwolnić starą tablicę, a następnie przenieść na temat swojej działalności. Albo, co gorsza, może przeznaczyć sposób więcej pamięci, niż faktycznie potrzebujemy, i tak będziesz mieć bardzo słabo zaludnionych tablicy, że tak powiem. Tak powiązana lista daje te Korzyści z dynamiką i elastycznością z wstawkami i skreśleń. Ale na pewno nie może być zapłacona cena. W istocie, jednym z motywów zbadane w quizie zera było kilka kompromisy widzieliśmy do tej pory. Więc co jest cena zapłacona lub Minusem połączonej listy? Tak. Publiczność: Nie o dostępie swobodnym. DAVID MALAN: Nie o dostępie swobodnym. Ale kogo to obchodzi? O dostępie swobodnym nie brzmi atrakcyjnie. PUBLICZNOŚCI: [niesłyszalne] DAVID MALAN: Dokładnie. Jeśli chcesz mieć pewne algorithm-- i pozwól mi faktycznie proponują przeszukiwanie binarne w szczególności, co jest jednym używaliśmy dość bit-- jeśli nie ma swobodnego dostępu, nie można zrobić, że prostych działań arytmetycznych znalezienia jak elementu środkowego i skoki do niego prawo. Zamiast tego zacząć w pierwszym elementem i liniowo od lewej wyszukiwania do prawej, jeśli chcesz znaleźć średniej lub jakikolwiek inny element. Publiczność: Prawdopodobnie ma więcej pamięci. DAVID MALAN: zajmuje więcej pamięci. Gdzie jest, że dodatkowe kosztować pochodzących z pamięci? PUBLICZNOŚCI: [niesłyszalne] DAVID MALAN: Dokładnie. W tym przypadku tutaj, mieliśmy powiązane lista dla liczb całkowitych, i jeszcze mamy podwojenie Ilość pamięci musimy również poprzez przechowywanie tych wskazówek. Teraz mniej wielkiego jak Twoje structury się większe a ty przechowywania, ale nie wiele Może student lub inny obiekt. Ale chodzi oczywiście pozostaje. A więc liczba operacji na list nazywano powiązanych były duże O z n-- liniowych. Rzeczy takie jak wkładanie i wyszukiwania lub usunięcie w przypadku elementu stało się na samym końcu lista czy to sortowane, czy nie. Czasami może będziesz miał szczęście i tak dolne granice tych operacji może być również stała czasowa, jeśli jesteś Zawsze patrząc na pierwszy element, na przykład. Ale ostatecznie, obiecaliśmy do osiągnięcia Świętego Graala struktur danych, lub niektóre ich przybliżenie, na zasadzie stałym czasie. Możemy znaleźć elementy lub dodać elementy lub usunąć elementy z listy? Przekonamy się już wkrótce. I okazuje się, że jeden mechanizmów których jesteśmy zamiar zacząć korzystać z dzisiaj, roczne zużycie w punkcie ustawić pięć, jest rzeczywiście bardzo znajomo. Na przykład, jeśli jest to kilka książek egzaminacyjnych, z których każda ma pierwszy studenta Imię i nazwisko na nim, a ja je odebrać ze Na koniec egzaminu, i wszystkie są dość wiele w kolejności losowej i chcemy go o sortowaniu Egzaminy te klasyfikowane tak, że raz to jest po prostu o wiele łatwiej i szybciej oddać je z powrotem studentów alfabetycznie. Co by twoje instynkty się na stos egzaminów takich jak ten? Cóż, jeśli jesteś podobny do mnie, można zobaczyć, że jest to m, więc mam zamiar jakby umieścić to pod, jeśli to jest mój stół lub podłoga, gdzie mój Jestem rozprzestrzeniania rzeczy out-- lub moja tablica really-- Mogę umieścić wszystkie Ms tam. Och. Oto A. Więc mógłbym umieścić jako tutaj. Och. Oto kolejny A. Zamierzam umieścić to tutaj. Oto Z. Oto kolejny M. I tak Mógłbym zacząć pali jak ten. A potem może pójdę na później i rodzaj bardzo nitpicky-ly sortowania poszczególne pale. Ale chodzi o to, będę szukać na wejściu, że jestem ręką i chciałbym, aby niektóre obliczane Decyzja opiera się na tym wejściu. Jeśli zaczyna się, umieścić go tam. Jeżeli zaczyna się na Z, umieścić go na nie, i wszystko pomiędzy. Więc jest to technika, która jest ogólnie znane jako hashing-- H-A-S-H-- co generalnie oznacza, przyjmując jako wejściowy i za pomocą tego wejścia do obliczenia wartości, na ogół ilość, i że liczba to indeks do przechowywania pojemnik, jak tablicy. Więc innymi słowy, może mam funkcja skrótu, tak jak ja w mojej głowie, Widzę, że jeśli ktoś jest Nazwa, która zaczyna się od A, Idę do map, które do zera w mojej głowie. A jeśli widzę kogoś z Z, jestem map, które będą do 25 w mojej głowie a następnie umieścić, że w ostatnia najbardziej stos. Teraz, jeśli myślisz o mój mózg nie ale program C, jakie numery mógł można liczyć na osiągnięcie tego samego rezultatu? Innymi słowy, jeśli miał ASCII charakterem, jak można określić, co wiadro, aby umieścić go w? Prawdopodobnie nie chcesz umieścić go w wiadrze 65, które będzie jak tam bez powodu. Gdzie chcesz umieścić pod względem jego wartości ASCII? W przypadku, gdy chcesz zrobić na jego ASCII Wartość wymyślić sprytniejszy wiadra umieścić go w? Publiczność: Minus A. DAVID MALAN: Tak. Więc minus lub minus szczególnie jeśli jest to 65 A. Kapitał Albo 98, jeśli to małe. I tak, że pozwoli nam, bardzo po prostu i bardzo arytmetycznie, umieścić coś do wiadra takiego. Tak więc okazuje się, że faktycznie to jak dobrze nawet z quizów. Więc może przypomnieć ci okrążył swoje Nazwa ucząc znajduje się na okładce. I nazwy TF zostały zorganizowane w tych kolumnach alfabetycznie dobrze, wierzcie lub nie, kiedy wszystko nas 80 plus zebrali nocy do klasy, ostatni krok w naszym procesie klasyfikacji jest do mieszania quizy na duże przestrzeń na podłodze [niesłyszalne] quizy i położyć się każdego z nas dokładnie w kolejności ich TF tych nazwiska na okładce, ponieważ to jest to o wiele łatwiejsze dla nas przeszukiwać tego przy użyciu liniowych wyszukiwania lub jakiś spryt dla TF znaleźć jego lub quizy jej uczniów. Więc ten pomysł mieszania że zobaczysz to bardzo mocny jest rzeczywiście bardzo powszechne i bardzo intuicyjne, podobnie jak może dzielić i przejęcie było w tygodniu zerowym. I do przodu na hackathon Kilka lat temu. To był Zamyla i kilka Pracownicy z życzeniami innych studentów jak przyszedł. I mieliśmy całą masę składania stoły tam z plakietkami. I mieliśmy organizowane tagów nazw z jak As tam i Zs tam. I tak jeden z TF bardzo sprytnie Napisałem to w instrukcji na dzień. A w 12 tygodniu semestru tego wszystko ma sens i wszyscy wiedział, co robić. Ale w każdej chwili masz kolejkowane w taki sam sposób, ty realizacji samo pojęcie mieszania. Więc sformalizować to trochę. Oto tablica. Jest sporządzony za mało Szeroki tylko dla zobrazowania, wizualnie, że możemy umieścić ciągów w czymś takim. I ta tablica jest wyraźnie od rozmiaru 26 w sumie. A co jest nazywane Tabela arbitralnie. Ale to tylko interpretacja artysty tego, co może być tabeli mieszania. Więc tabeli mieszania będzie teraz być wyższa struktura danych poziom. Na koniec dnia jesteśmy by zobaczyć, że Ciebie można wdrożyć tabeli mieszania, który jest bardzo podobny do check-in online na hackathon dużo jak ten stół używany do sortowania książek egzaminacyjnych. Ale tabeli mieszania jest rodzaj wysokiego poziomu pojęcie, które może wykorzystać tablicę Pod maską do jego realizacji, lub może skorzystać z listy długości, a nawet być może niektóre inne struktury danych. A teraz to theme-- podejmowanie niektóre z tych podstawowych składników jak tablicy i budynku blokować teraz listy długość i zobaczyć, co jeszcze możemy budować na wierzchu tych, jak składniki w recepturze, co coraz interesujące i użyteczne wyniki końcowe. Więc z tabeli mieszania możemy go wdrożyć w pamięci, tak obrazowo, ale jak to może być rzeczywiście zakodowane się? Cóż, może tak po prostu jest to. Jeśli we wszystkich czapki WYDAJNOŚĆ, jest tylko niektóre constant-- na przykład 26, dla 26 liter alphabet-- Mogę zadzwonić do mojego tabeli zmiennych, i mogę twierdzić, że mam zamiar umieścić tam gwiazdy char lub string. Więc to jest tak proste, jak to w przypadku chcą wprowadzić tabeli mieszania. A jednak, jest to naprawdę tylko tablica. Ale znowu, hash Stół jest teraz to, co my będziemy nazywamy abstrakcyjne typu danych, który jest po prostu rodzaj pojęciowej warstw na górze coś bardziej przyziemnego teraz jak tablicę. Teraz, jak mamy iść o rozwiązywaniu problemów? Cóż, wcześniej miałem luksus posiadania wystarczająco dużo miejsca tabeli tutaj tak, że mogę umieścić quizy wszędzie chciałem. Więc jak może przejść tutaj. Zs może przejść tutaj. Pani może przejść tutaj. A potem miałem trochę więcej przestrzeni. Ale to jest trochę oszukiwać prawo teraz, bo tej tabeli, jeśli naprawdę myślałem o tym jako tablica, jest tylko dzieje się z pewnej ustalonej wielkości. Więc technicznie, jeśli ciągnąć się quizie innego studenta i zobaczyć, och, to osoby Nazwa zaczyna się od A także, I niby chcą ją tam umieścić. Ale jak tylko umieścić go tam, jeśli tabela ta rzeczywiście reprezentuje tablicę, Mam zamiar być nadrzędne lub przebijania kto tego quizu studenta jest. Prawda? Jeśli jest to tablica, tylko jedna rzecz może przejść w każdej z tych komórek lub elementów. I tak niby mają wybierać. Teraz wcześniej I rodzaju oszukany i to zrobił lub I tylko rodzaj ułożone ich jeden nad drugim. Ale to nie będzie latać w kodzie. Więc gdzie mogę umieścić Drugi uczeń, którego nazwa jeśli wszystko jest to miałem wolnego miejsca na stół? I użyłem go trzy sloty i Wygląda na to, że tylko kilka innych. Co można zrobić? PUBLICZNOŚCI: [niesłyszalne] DAVID MALAN: Tak. Może niech po prostu keep it simple. Prawda? To nie pasuje gdzie chcę go umieścić. Więc mam zamiar umieścić go technicznie, gdzie B pójdzie. Teraz, oczywiście, zaczynam malować się w kąt. Jeśli dostanę się do studenta którego nazwa jest w rzeczywistości B, teraz B zostanie przeniesiona mało do przodu, a może się zdarzyć, yep, czy to jest B, teraz ma iść tutaj. I tak to się bardzo szybko może stać się problematyczne, ale jest to technika, która rzeczywiście jest określany jako liniowy próbkowania, w którym po prostu rozważyć swoje Tablica będzie wzdłuż linii. I po prostu rodzaj sondy lub zbadać każdy dostępny element, szukam wolnego miejsca. I jak najszybciej znaleźć jeden, można upuścić go tam. Teraz, teraz ceny płacone dla tego rozwiązania jest to, co? Mamy stałą tablicę rozmiar, i podczas wkładania imion do niego, przynajmniej na początku, co jest czas pracy wstawiania za wprowadzenie studentów " quizy w odpowiednich wiadra? Big O co? PUBLICZNOŚCI: brak. DAVID MALAN: Słyszałem Big O n. Nie prawda. Ale my odciąć dlaczego za chwilę. Co jeszcze może być? PUBLICZNOŚCI: [niesłyszalne] DAVID MALAN: I pozwól mi zrobić wizualnie. Więc przypuszczam, że tego jest literą S. Publiczność: To jedna. DAVID MALAN: To jedna. Prawda? Jest to tablica, która oznacza, że ​​mamy swobodny dostęp. A jeśli myślimy o tym jako zero i to jako 25, i zdajemy sobie sprawę, że, oh, tu jest mój wkład S Pewnością mogę przekonwertować S, ASCII, z odpowiednim numerem między zero a 25 a następnie natychmiast umieścić go tam, gdzie należy. Ale oczywiście, jak tylko mogę Druga osoba, która to nazwa jest A lub B lub C w końcu, jeśli użyłem liniowy sondowania jak mój rozwiązania, czas pracy wstawiania w najgorszym przypadku faktycznie się przechodzą do czego? A ja słyszałam go tutaj poprawnie wcześnie. PUBLICZNOŚCI: [niesłyszalne] DAVID MALAN: Tak jest rzeczywiście, gdy n mieć wystarczająco duży zestaw danych. Tak więc z jednej strony, jeśli Twoja tablica jest na tyle duże, i dane są na tyle rzadkie, można stały się ten piękny czas. Ale jak tylko zaczniesz coraz więcej i więcej elementów, i po prostu masz statystycznie więcej osób z literą Jak ich nazwa lub list B, to może potencjalnie przechodzą w coś bardziej liniowy. Więc nie dość doskonałe. Tak więc możemy zrobić lepiej? Cóż, to, co było naszym Przed gdy rozwiązanie chcą mieć więcej dynamiki niż coś w stylu tablicy dozwolone? PUBLICZNOŚCI: [niesłyszalne] DAVID MALAN: Co możemy wprowadzić? Tak. Tak powiązana lista. Cóż, zobaczymy, co związane Lista może zrobić dla nas, a nie. Cóż, pozwól mi zaproponować, że narysować obrazek poniżej. Teraz jest inaczej obraz z przykładu od innego tekstu, właściwie, że w rzeczywistości za pomocą tablicy wielkości 31. A to po prostu autor ciągi postanowiła hash nie na podstawie nazwy danej osoby, lecz na podstawie ich daty urodzin. Niezależnie od miesiąca, ale zorientowali jeśli urodził się po raz pierwszy od miesiąca lub 31 w miesiącu, autor będzie hash na podstawie tej wartości, tak, aby rozprzestrzeniać się nazwiska z odrobiną więcej niż 26 miejsc może pozwolić. I być może jest to trochę bardziej jednolite niż dzieje się z liter alfabetu, bo oczywiście nie ma chyba więcej ludzi na świecie, z nazwami że początek z pewnością nie inne litery alfabetu. Więc może to jest trochę bardziej jednolity, zakładając jednorodny rozkład niemowląt w całym miesiącu. Ale, oczywiście, to jest wciąż niedoskonała. Prawda? Jesteśmy o kolizji. Wiele osób, w tym struktura danych są nadal mające co najmniej taką samą datę urodzenia jesteś, niezależnie od miesiąca. Ale co autor uczynił? Cóż, wygląda na to, że mamy tablicę po lewej stronie sporządzonej pionowo ale to tylko interpretacja artysty. Nie ma znaczenia, jaki kierunek Cię zwrócić tablicę, to jeszcze tablica. Co to jest tablica z pozoru? Publiczność: Związany lista. DAVID MALAN: Tak. Wygląda na to, że to Tablica połączonej listy. Więc jeszcze raz, do tego punktu rodzaju korzystania z tych struktur danych teraz jako składników do więcej ciekawe rozwiązania, można absolutnie brać podstawowym, jak tablica, a następnie podjąć się czegoś więcej ciekawe jak połączonej listy a nawet połączyć je nawet bardziej interesujące struktury danych. I rzeczywiście, to też będzie nazwać tabeli mieszania, przy czym tablica jest naprawdę tabeli mieszania, ale, że tabeli mieszania ma łańcuchy, by tak rzec, które mogą rosnąć lub kurczyć w oparciu o liczba elementów chcesz wstawić. Się, odpowiednio, co czas pracy teraz? Jeśli chcę wstawić kogoś którego urodziny 31 października, gdzie ma on iść? Dobrze. Na samym dole, gdzie jest napisane 31. I to jest doskonały. To był stały czas. Ale co, jeśli znajdziemy kogoś innego którego urodziny, zobaczmy, Październik, listopad, 31 grudnia? W przypadku, gdy jest on pójdzie? Samo. Dwuetapowym chociaż. To jest stała, choć nie jest? Dobrze. W tej chwili jest. Jednak w przypadku ogólnym im więcej ludzi możemy dodać, probabilistycznie, jedziemy aby uzyskać więcej i więcej kolizji. Teraz to jest trochę lepiej, bo technicznie teraz moje łańcuchy może być w w najgorszym przypadku, jak długo? Jeśli wstawić n tym więcej ludzi do wyrafinowane struktury danych, brak ludzi, w najgorszym przypadku to będzie n. Dlaczego? Publiczność: Bo jeśli wszyscy ma urodziny tego samego dnia, że będziemy mieć jedną linię. DAVID MALAN: Idealny. To może być trochę wydumane, ale naprawdę, w najgorszym przypadku, jeśli każdy z nas ma urodziny tego samego dnia, biorąc pod uwagę trzeba wejść, będziesz mieć masowo długi łańcuch. I tak, można to nazwać Tablica mieszająca, ale tak naprawdę to tylko ogromny lista związana z dużo niewykorzystanego miejsca. Ogólnie jednak, jeżeli założymy, że przynajmniej są uniform-- urodzin i to chyba nie jest. Robię to w górę. Ale jeśli założymy, dla sake dyskusji że są one, to w teorii, czy jest pionowa reprezentacja tablicy, a potem mam nadzieję, że jesteś dostanie łańcuchy, które są, wiesz, mniej więcej takiej samej długości, gdzie każdy z nich reprezentuje dzień miesiąca. Teraz, czy jest +31 dni w miesiącu, co oznacza, że ​​tak naprawdę mój czas pracy jest duże O n ponad 31, które czuje się lepiej niż liniowy. Ale to, co było jednym z naszych Zobowiązania kilka tygodni temu, kiedy doszło do wyrażania czas działania algorytmu? Wystarczy spojrzeć tylko na wysokim terminu zamówienia. Prawda? 31 jest na pewno pomocne. Ale to wciąż wielki O n. Ale jeden z tematów zestaw pięciu z problemem będzie do przyznać, że absolutnie, asymptotycznie, teoretycznie to struktura danych nie jest lepsza niż tylko jeden ogromny lista powiązane. I rzeczywiście, w najgorszym przypadku, ten Tablica mieszająca może przechodzą do tego. Ale w realnym świecie, o nas ludzie że własnych komputerach Mac lub PC lub cokolwiek i działa prawdziwy świat Oprogramowanie na danych rzeczywistych światowej, który algorytm idziesz do woli? Który podejmuje kroki końcowych lub który trwa n dzieli się przez 31 kroków znaleźć jakiś kawałek danych lub aby wyszukać informacje? To znaczy, absolutnie 31 marek Różnica w realnym świecie. Jest to 31 razy szybciej. A my, ludzie są z pewnością będzie wdzięczny. Tak sobie dychotomię rzeczywiście istnieje między mówić o rzeczach teoretycznie a co zdecydowanie asymptotycznie ma wartość jak widzieliśmy, ale w realnym świecie, jeśli zależy Ci tylko co ludzka szczęśliwy dla wejść ogólnych, można bardzo dobrze się na przyjęcie Fakt, że tak, to jest liniowy, ale to jest 31 razy szybciej niż liniowy może być. A jeszcze lepiej, że nie wystarczy coś zrobić dowolny jak data urodzenia, mogliśmy spędzić trochę więcej czasu i spryt i zastanowić się, co możemy zrobić, imię, a może czyjeś ich data urodzenia połączyć te składniki, aby dowiedzieć się czegoś że jest naprawdę więcej jednolita i mniej chropawy, że tak powiem, niż tego obrazu Obecnie sugeruje to może być. Jak moglibyśmy wdrożyć to w kodzie? Cóż, pozwól mi zaproponować, że tylko pożyczyć trochę składni mamy używane kilka razy do tej pory. I mam zamiar zdefiniować Węzeł, który ponownie to ogólne określenie dla tylko niektóre Pojemnik na pewnej struktury danych. Mam zamiar zaproponować, Ciąg będzie tam. Ale mamy zamiar rozpocząć przyjmowanie te koła się teraz trenuje. Biblioteka nie więcej CS50 naprawdę, jeśli nie chcesz używać go do finału Projekt, który jest w porządku, ale teraz zamierzamy wycofać kurtyny i powiedzieć, że to po prostu gwiazda char. Tak więc słowa nie będzie nazwisko osoby, o którym mowa. I teraz mam link stąd do następnego węzła tak, że stanowią one każdy z węzłów w łańcuchu potencjalnie z połączonej listy. A teraz jak mam zadeklarować Sam tabeli mieszania? Jak mogę zadeklarować całą tę konstrukcję? Cóż, tak naprawdę, tak jak kiedyś wskaźnik się tylko do pierwszego elementu listy wcześniej, podobnie mogę tylko powiedzieć, Muszę tylko kilka wskazówek do realizacji tego całego tabeli mieszania. Zamierzam tablicę zwany stół do tabeli mieszania. To będzie zdolności wielkości. To, jak wiele elementów można w nim zmieścić. I każdy z tych elementów w tym Tablica będzie gwiazdą węzeł. Dlaczego? Cóż, na tym zdjęciu, co mam wdrażania tabeli mieszania jako skutecznie na początku jest tylko Tablica ta, że ​​mamy wyciągnąć pionowo, każdy z których kwadraty reprezentuje wskaźnik. To te, które mają ukośniki z nich są po prostu puste. I te, które mają strzałkami w prawo są rzeczywistymi wskaźnikami do rzeczywistych węzłów, ergo rozpoczęcia połączonej listy. Więc tutaj, a następnie, w jaki sposób moglibyśmy wdrożyć tabeli mieszania, które realizuje oddzielny łańcuchowym. Teraz możemy zrobić lepiej? Dobrze Obiecałem, że po raz ostatni możemy osiągnąć stały czas. I dał ci trochę Stała czasowa tutaj, ale to naprawdę nie powiedział Stała czasowa, bo to wciąż uzależniona od sumy Liczba elementów jesteś wprowadzania do Struktura danych. Ale załóżmy, że to zrobił. Pozwól mi wrócić do ekranu tutaj. Pozwól, że Projekt ten również się tutaj, jasne ekran, i przypuszczam, że to zrobił. Załóżmy, że chcę, aby wstawić nazwę Daven się do mojego struktury danych. Więc chcę wstawić ciąg Daven do struktury danych. Co zrobić, jeśli nie używam Tablica mieszająca, ale używam coś, co jest bardziej podobny do drzewa jak drzewo genealogiczne, gdzie masz jakieś korzenie w Ulubione, a następnie węzły i liście że go w dół i na zewnątrz. Załóżmy więc, że ja chcesz wstawić Daven na do tego, co jest obecnie pusta lista. Zamierzam wykonać następujące czynności: Jestem W celu utworzenia węzła w tej rodziny jak drzewa, które wygląda struktura danych trochę tak, z których każda prostokątów jest, powiedzmy, na razie 26 elementów w nim. I każda z komórek w tej tablicy będzie reprezentuje literę alfabetu. W szczególności mam zamiar leczyć to jest, to B, a następnie C, następnie D, ten tutaj. Więc to będzie skutecznie reprezentuje literę D. Ale, aby wstawić na wszystkie Daven wymienić muszę zrobić nieco więcej. Więc jestem pierwszy będzie hash, że tak powiem. Zamierzam przyjrzeć się pierwszej litery w Daven, która jest oczywiście D i mam zamiar przeznaczyć Węzeł, który wygląda jak this-- duży prostokąt duży wystarczy, aby zmieścić cały alfabet. Teraz D odbywa. Teraz A. D-V-E-N jest celem. Więc teraz, co mam zamiar zrobić, to ten. Jak tylko zacząłem zawiadomienie D tam nie ma wskaźnika. To wartości śmieci w tej chwili, lub może zainicjować go na null. Ale pozwól mi iść dalej z idea budowania drzewa. Pozwól mi przydzielić inny jeden z nich Węzły, które posiada 26 elementów w nim. I wiesz co? Jeśli jest to tylko w pamięci, że węzeł Stworzyłem z malloc, za pomocą struct jak to już wkrótce, Mam zamiar zrobić this-- Mam zamiar wyciągnąć strzałę z rzeczą, która reprezentowana D w dół do tego nowego węzła. A teraz, po raz pierwszy obok litera w nazwie Daven, w V-- D-V-- mam zamiar iść do przodu i wyciągnąć inny węzeł tak, przy czym elementy, które tutaj V będziemy rysować na instance-- whoops. Nie będziemy tam rysować. To będzie tutaj. Następnie jedziemy do uznają to za V. A potem tu będziemy indeksu dół od V do tego, co będziemy rozważać E. A potem tutaj będziemy go jeden z tych węzłów tutaj. I teraz mamy pytanie. Muszę w jakiś sposób wskazują, że jesteśmy na końcu łańcucha Daven. Więc może po prostu pozostawić puste. Ale co, jeśli mamy Daven na pełna nazwa również, które jest, jak już powiedzieliśmy, Davenport? Więc co, jeśli Daven jest faktycznie podciąg, prefiks znacznie dłuższy ciąg? Nie możemy po prostu stałe powiedzieć nic się nie dzieje tam, bo mogliśmy nigdy wstawić słowo jak Davenport w tej strukturze danych Więc co możemy zrobić, a nie jest traktować każdego z tych elementów a może o dwa elementy wewnątrz nich. Jednym z nich jest wskaźnik, rzeczywiście, jak robiłem. Tak więc każdy z tych pól Nie jest tylko jedna komórka. Ale co, jeśli górna jedno- dolny na będzie pusty, ponieważ nie ma Davenport jeszcze. Co zrobić, jeśli górna jest jakaś specjalna wartość? I to będzie trochę trudno jest to rozmiar rysować. Ale załóżmy, że jest to po prostu znak wyboru. Sprawdź. D-V-E-N jest ciągiem w tej strukturze danych. Tymczasem, gdybym miał więcej miejsca tutaj, mogłem zrobić P-O-R-T, i może umieścić czek w węźle że ma literę T na samym końcu. Jest to więc masowo Kompleks wyglądające struktury danych. A mój charakter pisma na pewno nie pomaga. Ale gdybym chciał włożyć coś jeszcze, za co będziemy robić. Gdybyśmy chcieli umieścić Dawid, że będziemy postępować zgodnie z tą samą logiką, D-A-V, ale teraz chciałbym zwrócić się obok element nie z E, ale od I do D. Więc nie będzie więcej węzłów w tym drzewie. Mamy zamiar mieć połączenia malloc więcej. Ale ja nie chcę, aby kompletny bałagan z tym obrazem. Więc zamiast patrzeć na jednego , co zostało sformułowane wcześniej tak ze nie kropka, kropka, kropki, ale tylko skrócone tablice. A każdy z węzłów w tym drzewa tutaj oznacza to samo thing-- Tablica Ray rozmiaru 26. Lub jeśli chcemy być Teraz naprawdę właściwa, co jeśli czyjeś imię, jak apostrof, niech Zakładamy, że każdy węzeł ma rzeczywiście jak 27 indeksów w nim, a nie tylko 26. Tak to teraz będzie dane struktura nazywana trie-- R-T I-E. Trie, która jest podobno historycznie mądra nazwa drzewa , który jest zoptymalizowany do odzyskiwanie, co oczywiście pisze się z I-E więc trie. Ale to jest historia trie. Więc trie jest to drzewo, jak dane Struktura jak drzewo genealogiczne że ostatecznie zachowuje się tak. I tu jest właśnie kolejny przykład cała masa imion innych ludzi. Ale pytanie teraz pod ręką to, co mają zdobyliśmy wprowadzając zapewne więcej skomplikowana struktura danych oraz jednym, mówiąc, że używa dużo pamięci. Bo chociaż, w tej chwili, jestem tylko za pomocą wskaźnika i D's I V i Es i Ns, Tracę kawał dużo pamięci. Ale gdzie spędzić jednego zasobu, Staram się nie uzyskać z powrotem innego. Więc jeśli mam spędzać więcej miejsca, co prawdopodobnie nadzieja? Że spędzam mniej co? Publiczność: Mniej czasu. DAVID MALAN: Czas. Teraz, dlaczego może to być? Cóż, to, co jest wstawiania Czas, w kategoriach wielkiej O teraz, nazwy jak Daven lub Davenport czy Dawid? Cóż, Daven było pięć kroków. Davenport będzie dziewięć kroków, więc byłoby kilka kroków. David będzie pięć kroków, jak również. To są konkretne numery, ale na pewno nie ma górną granicę długość czyjegoś imienia. I rzeczywiście, w tym problemu zestawy pięciu specyfikacji mamy zamiar zaproponować że to coś to znaki 40-pewne-nieparzyste. Realistycznie, nikt nie ma nieskończenie długa nazwa, to znaczy, że długość nazwisko lub długość łańcucha moglibyśmy mają pewien stan Struktura jest chyba co? Jest to stała. Prawda? To może być wielki jak stały 40 coś, ale stała. I nie ma uzależnienia od ilu inne nazwy są w tej strukturze danych. Innymi słowy, jeśli I chce teraz włożyć Colton lub Gabriel lub Rob lub Zamyla lub Alison i Belinda lub wszelkie inne nazwy z pracowników w tym danych struktura, jest czas pracy wstawiania inne nazwy będzie w wpłynęły od tego, jak wiele innych elementów są w już struktury danych? To nie jest. Prawda? Ponieważ jesteśmy skutecznie za pomocą to wielowarstwowa tabeli mieszania. I czas pracy każda z tych operacji nie jest zależna od liczby Elementy, które mają w strukturze danych lub które są w końcu dzieje się w strukturze danych, lecz na długości co konkretnie? Ciąg jest włożona, co robi Stała to asymptotycznie time-- duże O jednego. I szczerze mówiąc, tylko w prawdziwy świat, to oznacza wstawienie rozgrywa nazwa Daven jak pięć kroków, czy Davenport dziewięć kroki, lub David pięć kroków. To cholernie małe czasy jazdy. I rzeczywiście, to bardzo dobra rzecz, zwłaszcza gdy to nie zależy od łącznej liczba elementów w tam. Więc jak możemy wdrożyć to rodzaju struktury w kodzie? To trochę więcej skomplikowane, ale nadal jest to tylko zastosowanie podstawowe cegiełki. Idę do przedefiniowania węzeł nas w następujący sposób: bool i to nazywa word-- można nazwać niczego. Ale bool reprezentuje co narysowałem jako znak wyboru. Tak. To jest koniec łańcucha w tej strukturze danych. I, oczywiście, gwiazda węzeł nie odnosi się do dzieci. I rzeczywiście, tak jak drzewo genealogiczne, to uznałby węzły które są zawieszony na dnie pewnego nadrzędnego Element się dzieci. I tak będzie do dzieci być tablicą 27, 27 jeden po prostu do apostrofu. Jedziemy do sortowania w szczególnym przypadku tego. Więc można mieć pewność, Nazwy z apostrofami. Może nawet łącznik powinien idź tam, ale będziesz zobacz w zestawie 5 p opieki tylko o listach i apostrofów. A potem jak można reprezentować Struktura danych sama? Jak Pan reprezentuje korzeń tego trie, że tak powiem? Cóż, tak jak z połączonej listy, to potrzebuje wskaźnik do pierwszego elementu. Z trie wystarczy jeden wskaźnik do korzenia tego trie. I stamtąd można hash Twój sposób coraz głębiej w dół każdy inny węzeł w konstrukcji. Tak po prostu z tym puszki Oświadczamy, że struct. Teraz Meanwhile-- Och, pytanie. Publiczność: Co bool słowo? DAVID MALAN: Bool słowo tylko ten C wcielenie z tego, co opisałem w tym oknie tutaj, kiedy Zacząłem podziału każdej z elementy na dwie części Array. Jednym z nich jest wskaźnik do następnego węzła. Druga ma być coś jak pole wyboru powiedzieć tak, nie Słowo Daven, że kończy się tutaj, dlatego, że nie chcemy, w momencie, Dave. Mimo, że Dave będzie uzasadnione słowo, że nie jest w trie jeszcze. I D nie jest słowo. I D-nie jest to słowo lub nazwa. Więc z haczykiem wskazuje tylko raz Ciebie uderzył węzeł jest poprzednia ścieżka znaków rzeczywiście ciąg wstawienie. Więc to wszystko bool nie robi dla nas. Wszelkie inne pytania na próbach? Tak. Publiczność: Co to jest nakładanie? Co zrobić, jeśli masz Dave i Daven? DAVID MALAN: Idealny. Co zrobić, jeśli masz Dave i Daven? Jeśli więc włożyć, powiedzmy pseudonim, dla David-- Dave-- D-A-V-E? To jest rzeczywiście bardzo prosty. Więc jedziemy tylko wziąć cztery kroki. D-A-V-E. I co mam zrobić raz trafiłem że czwarty węzeł? Po prostu się sprawdzić. Jesteśmy już dobrze iść. Gotowe. Cztery kroki. Stała czasowa asymptotycznie. A teraz mamy wykazały, że zarówno Dave i Daven są struny w strukturze. Tak więc nie jest to problem. I zauważyć, jak obecność z Daven nie udało się podjęcia wszelkich mniej lub więcej czasu Czas na Dave'a i odwrotnie. Co jeszcze możemy zrobić? Użyliśmy tej metafory przed tac reprezentujących coś. Ale okazuje się, że stos tac jest rzeczywiście poglądowe innego abstrakcyjnego danych type-- wyższy poziom struktury danych który na koniec dnia jest po prostu jak tablica lub połączonej listy lub coś bardziej przyziemne. Ale to jest bardziej interesujące koncepcyjne koncepcja. Stos, jak te podajników tutaj w Mather, nazywane są ogólnie tylko that-- stos. Oraz w strukturze tego typu danych masz dwa operations-- trzeba dążyć do jednej nazwie dodawania co do stosu jak wprowadzenie innego podajnika tyłu na górze stosu. A następnie pop, co oznacza, że przyjąć najwyższą tacy off. Ale co jest kluczem o to, że stos to musi to ciekawe cechy. Jako pracownicy jadalni są rozmieszczanie tace do następnego posiłku, co będzie prawda o tym, jak studenci interakcji z tej struktury danych? Publiczność: Zamierzają pop jednorazowe. DAVID MALAN: Zamierzają pop-One, mam nadzieję, że szczyt. W przeciwnym razie jest to tylko głupie aby przejść całą drogę w dół. Prawda? Struktura danych naprawdę nie pozwala można chwycić dolną tacę co najmniej łatwo. Więc jest to ciekawy nieruchomości na stosie że ostatni element jest będzie pierwszy na zewnątrz. I informatycy nazywają to LIFO-- trwać, pierwsze wyszło. I to rzeczywiście ma ciekawe aplikacje. To nie koniecznie tak oczywiste, jak niektóre Inne, ale może w istocie być użyteczne i może, w rzeczywistości, być stosowane w kilka różnych sposobów. Tak jeden, i rzeczywiście, niech mnie nie do nurkowania w tym. Zróbmy to zamiast. Spójrzmy na taki, który jest prawie sam pomysł, ale jest to trochę bardziej sprawiedliwy. Prawda? Jeśli jesteś jednym z tych chłopców wentylatorów lub dziewczyny, które naprawdę lubi produktów Apple i obudził się o 3:00 w kolejce w jakimś sklepie aby uzyskać najnowsze iPhone, ty mógł w kolejce tak. Teraz kolejka jest bardzo celowo nazwane. To dlatego, że nie ma linii niektóre sprawiedliwości do niego. Prawda? To będzie rodzaj dupy, jeśli masz tam pierwszy w Apple Store ale są skutecznie najniżej Pracownicy tacy, bo wtedy firmy Apple pop ostatnią osobę, która rzeczywiście dostał w kolejce. Więc stosów i kolejek, nawet jeśli między funkcjonalnie są niby same-- to tylko ta kolekcja zasobów to będzie się rozwijać i shrink-- istnieje ten aspekt jej uczciwość, przynajmniej w świecie rzeczywistym, gdzie można wykonywać operacje różnią się zasadniczo. Stack-- kolejka rather-- mówi się, że dwie operacje: brak kolejek i d kolejce. Czy można je nazwać dowolną ilość rzeczy. Ale po prostu chcesz zrobić Pogląd, że jeden jest dodanie i jeden jest ostatecznie odjęcie. Teraz pod maską, zarówno w stos i kolejki mogą być realizowane w jaki sposób? Nie pójdziemy do kodu dlatego, że wyższy poziom Chodzi o to, jakby bardziej oczywista. Chodzi mi o to, co ludzie robią? Jeśli jestem pierwszą osobą w Apple Przechowywać i to przednie drzwi, wiesz, mam zamiar tu stać. A obok osoby będziemy tu stać. A obok osoby będziemy tu stać. Więc co struktura danych nadaje się do kolejki? Publiczność: kolejka. DAVID MALAN: Cóż, kolejka. Jasne. Co jeszcze? Odbiorcy: związane lista. DAVID MALAN: związane listy można wdrożyć. I związane lista jest dobre, bo to może rosnąć dowolnie długo, w przeciwieństwie się o jakąś stałą liczbę ludzi w sklepie. Ale być może stała liczba miejsc jest zgodny z prawem. Bo jeśli mają tylko jak 20 iPhone w pierwszym dniu, a może muszą tylko tablicę rozmiarów 20 do reprezentowania kolejkę, która tylko powiedzieć, teraz gdy już zacznie mówić o tych problemach na wyższym poziomie, można go wdrożyć w dowolnej liczbie sposobów. I nie ma chyba po prostu będzie być kompromis w czasie i przestrzeni czy tylko w swoim własnym kodzie złożoności. Co stosie? Cóż, stos, widzieliśmy też może być tylko te tace. I można zaimplementować to tablica. Ale w pewnym momencie, jeśli używać tablicy, co się wydarzy do podajników starasz się odłożyć? Dobrze. Będziesz tylko być w stanie iść tak wysoko. I myślę, że oni są w Mather rzeczywiście wpuszczone w tym otwarciu. Tak naprawdę, to prawie jak Mather korzysta Tablica stałej wielkości, bo tylko to możliwe zmieścić tak wiele tac w tym otworze ściana w dół poniżej kolana ludzi. I tak, że może być Mówi się, że tablica, ale możemy z pewnością, że wdrożenie ogólnie z połączonej listy. Cóż, co innego struktury danych? Pozwól mi wyciągnąć jeden inny wizualny tutaj. Coś takiego, jak o tym tutaj? Dlaczego to może być przydatne, aby nie mieć coś tak wyjątkowego jak trie, która widzieliśmy miał te bardzo szerokie węzłów, z których każdy jest w tablicy? Ale co, jeśli robimy coś więcej po prostu, jak stare drzewo genealogiczne w szkole, u których węzły tutaj jest po prostu zapisywania numeru. Zamiast nazwy lub potomka jest po prostu zapisywania numeru takiego. Cóż, w żargonu używamy struktury danych jest zarówno stara i drzewa, gdzie trie, ponownie, jest tylko jeden, którego węzły są tablice, jest jeszcze to, co mogłoby korzystać z podstawówki kiedy się rodzinę tree-- liście i korzeń drzewa i dzieci rodzic i jego rodzeństwo. I moglibyśmy zaimplementować drzewo, Na przykład, jak po prostu, jak to. Drzewa, czy to jako węzła, jeden z te koła, które ma wiele, to nie będzie mieć jeden wskaźnik, ale dwa. I jak tylko dodać Drugi wskaźnik, można rzeczywiście mogą teraz sortowania danych dwuwymiarowych struktury w pamięci. Podobnie jak dwuwymiarowy tablica, można mieć rodzaj z dwuwymiarowym listy, ale te związane że zgodne z wzorcem gdzie nie ma cykli. To naprawdę jeden z drzewa dziadkowie aż tutaj, a następnie niektórzy rodzice i dzieci oraz wnuki i prawnuki. i tak dalej. Ale to, co naprawdę o tym zbyt schludny, tylko dokuczać Ci trochę kodu, wycofanie z rekurencji jakiś czas temu, przy czym można napisać funkcję, która nazywa siebie. To jest piękne okazja zaimplementować coś jak rekursji, ponieważ uważają to. To jest drzewo. I byłem trochę jak z odbytu Włożyłem liczby całkowite na ulicę. Tak bardzo, że ma specjalny name-- poszukiwania binarnego drzewa. Teraz słyszałem o binarny szukać, ale można działa wstecz od nazwy tego stwora? Co to jest wzór jak ja wstawione liczby całkowite do tego drzewa? To nie jest przypadkowe. Jest jakiś wzór. Tak. Publiczność: Mniejsze po lewej stronie. DAVID MALAN: Tak. Mniejsze są po lewej stronie. Większe z nich są po prawej stronie. Takie, że stwierdzenie jest prawdziwe rodzic jest większa niż jego lewej dziecka, ale mniej niż prawo dziecka. I że sam jest jeszcze rekurencyjna definicja słowna dlatego, że można zastosować sama logika dla każdego węzła i to tylko dna się, wariant podstawowy, jeśli Ciebie będzie, po trafieniu jednego z liście, że tak powiem, Urlop gdzie dzieci nie ma dalej. Teraz, jak można znaleźć numer 44? Można by zacząć od korzeni i powiedzieć, hm. 55 nie jest 44 Więc nie chcę iść prawo czy chcę iść w lewo? Cóż, oczywiście chcesz iść w lewo. I tak to jest jak telefon przykład książki w poszukiwaniu binarnym bardziej ogólnie. Ale my jej realizacji teraz trochę bardziej dynamicznie niż tablica może pozwolić. I faktycznie, jeśli chcesz wyglądać w kodzie, na pierwszy rzut oka na pewno. Wygląda na to cała masa linii. Ale to pięknie proste. Jeśli chcesz zaimplementować funkcję Wyszukiwarka nazywany w życiu, którego celem jest poszukiwanie wartości jak n, liczba całkowita, a ty przeszedł w jednej pointer-- wskaźnik do węzła korzeni raczej z tego drzewa, z którego, można uzyskać dostęp do wszystkiego innego, zauważyć, jak w prosty sposób można zaimplementować logikę. Jeśli drzewo jest null, oczywiście, że nie ma. Miejmy tylko return false. Prawda? Jeśli strony to nic, nic tam nie ma. Inaczej, gdy n jest mniejsze niż drzewo strzałka strzałka n-- teraz n Przypomnijmy wprowadziliśmy Super krótko drugi dzień, i że po prostu oznacza de odniesienie do wskaźnik i spojrzeć na polu o nazwie n. Więc oznacza to, że tam i popatrz na pole o nazwie n. Więc jeśli n, wartość dostaniemy, jest mniej od wartości na drzewach całkowitej, gdzie chcesz iść? Proszę skręcić w lewo. Więc zauważyć rekurencji. Jestem returning-- nieprawda. Nie fałszywe. Wracam niezależnie odpowiedź jest z wezwaniem do siebie, przechodząc ponownie n, który jest zbędny, ale to, co teraz jest nieco inaczej? Jak mam co problem mniejsze? Jestem przekazując jako drugi Argument, nie korzeniem drzewa, ale lewa dziecko w tym przypadku. Więc jestem przechodząc w lewym dziecka. Tymczasem, jeżeli n jest większe niż węzeł Jestem obecnie patrząc na, Szukam prawą stronę. Indziej, jeśli drzewo nie jest null, a Jeśli element nie jest na lewo i to nie jest w prawo, co jest cudownie przypadek? Mamy rzeczywiście znaleźć węzeł w pytanie, i tak wracamy prawda. Więc mamy tylko powierzchownie teraz niektóre z tych struktur danych. W problemem ustawić pięć będziesz zbadać te jeszcze dalej, i będziesz mieć twój projekt Wybór, jak go o to. Co chciałbym zawrzeć na jest tylko 30 sekund zwiastun tego, co czeka w przyszłym tygodniu i poza nią. Jak begin-- szczęście może po think-- nasze przejście powoli ze świata C i niższej Poziom, szczegóły realizacji do świata, w którym możemy wziąć na pewnik, że w końcu ktoś inny ma realizowane te dane konstrukcje dla nas, i zaczniemy rozumieć Prawdziwy świat środki realizacji programów opartych na sieci Web i strony internetowe bardziej ogólnie a także bardzo bezpieczeństwa Implikacje, że mamy tylko zaczęły zarysować powierzchnię. Oto, co nas czeka w najbliższych dniach. [ODTWARZANIE] -On Przyszedł z wiadomością, z protokołem wszystkim jego własne. Przyszedł na świat okrutny firewalle, routery niedbały, i zagrożenia znacznie gorsze niż śmierć. Jest szybki. On jest silny. On jest protokół TCP / IP, a on ma swój adres. "Warriors of the Net". [KONIEC ODTWARZANIE] DAVID MALAN: Już w przyszłym tygodniu. Mamy zobaczysz wtedy. [ODTWARZANIE] -A Teraz, "głębokich myśli" przez Daven Farnham. -David Zawsze zaczyna wykłady z "dobrze." Dlaczego nie "Oto rozwiązanie do problemu w tym tygodniu zestaw " lub "Dajemy wam wszystkim?" [ROZEŚMIANY] [KONIEC ODTWARZANIE]