Konuşma notu: Geçen hafta bir kutu tek bir değeri tutuyordu; malloc onu yaratıyor, free onu geri veriyordu. Bu hafta o tek kutudan iki fikir çıkıyor: yan yana, aritmetikle erişilen çok sayıda kutu — dizi — ve bir sonrakini gösteren tek bir kutu — bağlı liste (linked list).
Konuşma notu: On yedi kısa animasyon dersin tamamını taşıyor; her biri, fikri tanıttığımız yerde bir kez görünüyor, ve her biri en can alıcı uç durumuna da bir kez daha bakıyor.
Konuşma notu: Her terim ilk geçtiği yerde tam olarak tanımlanır; bu tablo yalnızca onu nerede tekrar bulacağınızı söylüyor.
Konuşma notu: Canlı çalıştırmak isterseniz şimdi bir terminal açın; bugünün slaytlarındaki her parça, gösterildiği gibi derlenip çalışıyor.
Konuşma notu: Bugünün her şeyi tam olarak bu beş olguya dayanıyor — bellek hakkında yeni bir şey yok, yalnızca ondan kurulan yeni biçimler var.
Konuşma notu: Bu haritadaki her kutunun aşağıda kendi slaytları var, çoğunda kısa bir animasyon ve eksiksiz bir C/Java programı.
Konuşma notu: Bölüm 1, bir dizinin içeriğini yalnızca okumanın değil değiştirmenin bedelini soruyor — ve boyutu yanlış tahmin edildiğinde ne yapılacağını.
Konuşma notu: Sınıfın tahmin etmesine izin verin, sonraki slayt yanıtlıyor: ekleme noktasından sonraki her şey.
Konuşma notu: O(1) indis erişimi dizinin bütün çekiciliği — ve bedeli, bir şeyin hareket etmesi gerektiği an ortaya çıkıyor.
Konuşma notu: Bu ilk sürümde CAP hiç değişmiyor; yalnızca size hareket ediyor, o da 0..CAP arasında.
Konuşma notu: Baştan bir ekleme ile sona bir ekleme arasında kaç hücrenin yandığına bakın — asıl ders o fark.
Konuşma notu: Dolu bir dizi, çökmek yerine eklemeyi doğrudan reddeder — bu kontrol, herhangi bir kaydırma başlamadan önce gelmeli.
Konuşma notu: Kaydırma döngüsü sondan k'ye doğru, geriye çalışır — ileri yönde çalışsaydı değerler kopyalanmadan üzerine yazılırdı.
Konuşma notu: Bu döngü ileri yönde çalışır — insert'in geriye kaydırmasının ayna görüntüsü, ve tersine dönmesi de bir o kadar kolay.
Konuşma notu: Aynı fonksiyon, çağıranın seçtiği k indisine bağlı olarak O(1)'den O(n)'e kadar her şeye mal olabilir.
Konuşma notu: Sınıfın sonraki slayttan önce toplamasına izin verin.
Konuşma notu: Beş değeri yerleştirmek için on kaydırma — baştan eklemenin pahalı olmasının nedeni tam olarak bu: en kötü durumu her seferinde tekrarlaması.
Konuşma notu: Bu, tam olarak Java'nın ArrayList'inin ve C++'ın std::vector'ünün perde arkasında yaptığı şey — aynı numara, endüstriyel ölçekte.
Konuşma notu: Her büyümede dizinin altında beliren geçici satıra bakın — o satır kopyanın kendisi, eski bloğun yerini almak üzere yukarı kaymadan önce.
Konuşma notu: Küçülme isteğe bağlı ve büyümenin simetriği — kullanım dörtte bire düştüğünde kapasite yarıya iniyor, belleği geri vermek için.
Konuşma notu: Var olan her değer yeni bloğa tek tek kopyalanıyor — büyümenin O(n) bedeli tam olarak o tam kopyadan geliyor.
Konuşma notu: Yeniden boyutlandırma yalnızca blok zaten doluyken çalışıyor — çoğu çağrı doğrudan sondaki tek satırlık yazmaya atlıyor.
Konuşma notu: Amortize etmek, uzun bir işlem dizisi üzerinden ortalama almak demektir — bir ekleme pahalı olabilir, ama ortalama hiçbir zaman pahalı değildir.
Konuşma notu: Sınıfın ikiye katlamaları saymasına izin verin: 1, 2, 4, 8... sonraki slayttan önce.
Konuşma notu: İkiye katlama, büyüme sayısının yalnızca son boyutun logaritması kadar artması demek — toplam kopyalamanın ucuz kalmasının nedeni tam olarak bu.
Konuşma notu: Bölüm 2, hiçbir zaman tek boyutlu olmaktan başka bir şey olmamış bellekte "iki boyutlu" bir dizinin aslında neye benzediğini soruyor.
Konuşma notu: Gerçekten iki boyutlu bir bellek diye bir şey yok — her "2B" dizi aslında kılık değiştirmiş bir 1B dizidir.
Konuşma notu: Satır öncelikli ile sütun öncelikli tamamen bir kural meselesi — "satır" ya da "sütun"un belleğe daha doğal geleni yok.
Konuşma notu: İki formül var, ve bu bölümün sorduğu her "2B dizi" sorusu doğru olanı seçip uygulamaya iniyor.
Konuşma notu: Izgaranın altındaki bellek satırına bakın — satır öncelikli bir gezinme, birbirini izleyen bellek hücrelerine, adım adım iner.
Konuşma notu: Buradaki gezinme sırası depolama sırasıyla çelişiyor — artık her adım bir sonraki hücreye değil, bellekte bir sıçramaya karşılık geliyor.
Konuşma notu: Dıştaki i döngüsü ve içteki j döngüsü, satır öncelikli formülü birebir izliyor — sırayla, her adres için bir ziyaret.
Konuşma notu: Formülün bedeli hiç değişmiyor — değişen, art arda gelen ziyaretlerin gerçek bellekte ne kadar uzağa düştüğü, ve işlemcinizin önbelleğinin asıl hissettiği de bu.
Konuşma notu: Sınıfın formülü kendisinin uygulamasına izin verin, sonraki slayttan önce.
Konuşma notu: Bu bir adımlık bitişiklik tam olarak "satır öncelikli"nin kazandırdığı şey, ve sütun öncelikli bir gezinmenin harcayacağı şey.
Konuşma notu: Bölüm 3, tek bir fikri paylaşan iki dizi numarasını kapsıyor — değerleri yalnızca O(1) ek alanla, hiçbir zaman ikinci bir dizi kullanmadan hareket ettirmek.
Konuşma notu: Bariz yaklaşım — yeni bir diziye kopyalamak — tam olarak bu bölümün dışladığı yaklaşım.
Konuşma notu: Bu numara ilk seferde büyü gibi hissettiriyor; animasyonda bir ters çevirmeyi tek tek izlemek, işte o zaman oturuyor.
Konuşma notu: Her ters çevirme tek başına yanlış görünür; yalnızca üçüncüsü, dizinin tamamı üzerinde, her şeyi yeniden düzeltir.
Konuşma notu: Her ters çevirmenin sonucu altta yeni bir satır olarak tutuluyor, böylece üç aşama da bir arada, yan yana görünür kalıyor.
Konuşma notu: 10 değer üzerinde d=23 yine de çalışır, çünkü tek bir ters çevirme bile başlamadan d % n onu 3'e indirger.
Konuşma notu: Üç farklı aralıkla üç kez çağrılan bu tek yardımcı fonksiyon, döndürme algoritmasının tamamı.
Konuşma notu: Üç çağrı, üç aralık — bu fonksiyonda başka hiçbir şey iş yapmıyor.
Konuşma notu: Üç geçiş, üç kat yavaş olması gerekiyormuş gibi geliyor, ama üç kere O(n) yine sadece O(n)'dir.
Konuşma notu: Bu, tam olarak bir quicksort bölümleme adımıyla aynı iki-işaretçi biçimi — aynı fikir gelecek dönem yeniden karşımıza çıkacak.
Konuşma notu: left ve right'ın birbirine doğru yürüyüşünü izleyin, her biri zaten doğru tarafta olan değerleri atlayarak.
Konuşma notu: Hiç takas gerekmese bile işaretçiler burada dizinin tamamını yine de yürür — kontrolün kendisi yine de O(n) tutar.
Konuşma notu: İki iç while döngüsü, zaten doğru tarafta olan değerleri atlar; yalnızca ikisi de durunca gerçek bir takas olur.
Konuşma notu: Her iç döngü ayrıca left < right'ı kontrol eder, yoksa iki işaretçi birbirini geçip birbirinin ötesini okuyabilir.
Konuşma notu: Sınıfın segregate'in aslında neyi karşılaştırdığını düşünmesine izin verin.
Konuşma notu: Ayırmak ve sıralamak farklı işler; bu algoritma yalnızca "negatif mi" diye sorar, hiçbir zaman "hangisi büyük" diye sormaz.
Konuşma notu: Bölüm 4, bir matrisin çoğunlukla sıfırlardan oluştuğu — gerçek bilimsel ve çizge hesaplamalarında çok yaygın olan — durumda ne yapılacağını soruyor.
Konuşma notu: Bir milyon int, yalnızca bu tek matris için 4 MB — ve matris %99,98 boş; israf hiç de varsayımsal değil.
Konuşma notu: Kimse her boş otopark yerini fotoğraflayıp boş olduğunu kanıtlamaz — yalnızca arabaların nerede olduğunu yazar.
Konuşma notu: Her sıfır olmayan hücre için üç sayı, çoğunlukla sıfırlardan oluşan koca bir satırın yerini alır — kazanç, matris ne kadar seyrekse o kadar büyür.
Konuşma notu: Kaç hücrenin sessizce atlandığına bakın — yalnızca bir avuç sıfır olmayan hücre bir triplet satırı üretir.
Konuşma notu: Her hücre taranır ve atlanır — triplet tablosu tamamen boş kalır, ve bu da kendi başına geçerli, doğru bir sonuçtur.
Konuşma notu: İç içe döngüler her hücreyi ne olursa olsun tarar, ama if kontrolü sayesinde yalnızca sıfır olmayan hücreler out[]'a yazılır.
Konuşma notu: Taramanın kendisi tüm matristen daha ucuz olamaz, ama sonuçtan sonra kurulan her şey küçük çıktıdan faydalanır.
Konuşma notu: Bu gerçekten zekice bir numara — her kaydın nereye ait olduğunu önceden bilmek, hiç sıralamaya gerek kalmaması demek.
Konuşma notu: Önce count[]'un, sonra bu sayıları başlangıç ofsetlerine çeviren pos[]'un dolduğuna bakın — tek bir çıktı triplet'i yerleşmeden önce.
Konuşma notu: Her hücre sıfır olmasa bile hızlı devrik yine çalışır — yalnızca yerleştireceği triplet sayısı, matrisin hücre sayısı kadar olur.
Konuşma notu: pos[c], c'den önceki her sütunun toplamı — c sütununun triplet'lerinin çıktıda tam olarak başlaması gereken yer.
Konuşma notu: pos[c]++, hem c sütunu için bir sonraki boş hücreyi okur hem de oraya inecek bir sonraki triplet için o hücreyi ayırır.
Konuşma notu: Önek toplamı adımını atlayın, her triplet yine de bir yere yerleşir — sadece algoritmanın vaat ettiği sıralı düzende değil.
Konuşma notu: Her iki girdi de zaten sıralı olduğu için, toplama hiçbir zaman arama yapmak zorunda kalmıyor — yalnızca iki mevcut konumu karşılaştırması gerekiyor.
Konuşma notu: i ve j işaretçilerinin bağımsız ilerlediğine bakın, her biri yalnızca kendi listesinde adım atarak — tam olarak iki sıralı diziyi birleştirmek gibi.
Konuşma notu: İptal olan bir hücre çıktıya hiç yazılmaz — sonuç seyrek kalır, yeni bir sıfır kayıt hiç kazanmaz.
Konuşma notu: Yalnızca üç durum: a daha erken, b daha erken, ya da ikisi de tam olarak aynı hücreye düşer ve değerleri toplanır.
Konuşma notu: Bu yaklaşımın tamamı, iki listenin de zaten sıralı olmasına dayanıyor — sırasız triplet'ler verin, birleştirme sessizce yanlış yanıt verir.
Konuşma notu: Sınıfın hesabı yapmasına izin verin, sonraki slayttan önce.
Konuşma notu: Sıfır değerli bir triplet'i tutmak, tüm gösterimin dayandığı "yalnızca sıfır olmayan hücreler" sözünü sessizce bozardı.
Konuşma notu: Bölüm 5, haftanın ikinci büyük fikrini tanıtıyor — ekleme yapmanın hiçbir zaman başka bir şeyi kaydırmak zorunda olmadığı bir yapı.
Konuşma notu: Sınıfa bir an verin — yanıt, bugünün geri kalanının üzerine kurulduğu şey.
Konuşma notu: McCarthy "veri yapıları" diye bir konu düşünmüyordu, sembolik akıl yürütme için bir dil kuruyordu — bu fikir sadece her yerde çıktı karşımıza.
Konuşma notu: Bir dizi bir kerede tuttuğunuz bir harita; bir bağlı liste yalnızca tek seferde bir adım yürüyebildiğiniz bir iz.
Konuşma notu: Bu hafta ve gelecek haftaki her bağlı liste programı, tam olarak bu beş satırlık struct üzerine kuruluyor.
Konuşma notu: head'i kaybedin, ondan sonraki her düğüm erişilemez hale gelir — head, tüm listenin asılı durduğu tek iplik.
Konuşma notu: Bu kendine gönderme ilk seferde birçok öğrenciyi takıldırıyor — anahtar nokta, bir işaretçinin neyi gösterdiğine bakmaksızın hep aynı küçük, sabit boyutta olması.
Konuşma notu: NULL bir işaretçiyi dereferans etmek, bu dönemin her bağlı liste programındaki en yaygın çökme nedeni.
Konuşma notu: Sınıfın bunu "inception" slaytıyla bağlantılandırmasına izin verin, yanıttan önce.
Konuşma notu: Bir işaretçi, neyi gösterdiğine bakmaksızın hep aynı küçük bayt sayısı — döngüsel bağımlılığı kıran şey tam olarak bu.
Konuşma notu: Bölüm 6, sonraki her liste türünün — çift yönlü, dairesel, XOR, atlamalı — yeniden kullandığı ya da genişlettiği dört işlemi kuruyor.
Konuşma notu: Yanıt tamamen listenin ayrı bir son (tail) işaretçisi tutup tutmadığına bağlı — bu sürüm tutmuyor.
Konuşma notu: "Sırayla" burada bir üslup tercihi değil — çalışan bir liste ile koparılmış bir liste arasındaki fark.
Konuşma notu: Özellikle insert_tail'i izleyin — son işaretçisi olmadığı için önce var olan her düğümü geçmesi gerekiyor.
Konuşma notu: Bu gösterim gerçek listeye hiç dokunmaz — yalnızca insert_after'daki yazım sırasının neden gerçekten önemli olduğunu göstermek için var.
Konuşma notu: Bir malloc, bir işaretçi yazımı, bir dönüş — insert_head listenin geri kalanına hiç bakmaz bile.
Konuşma notu: Bu iki satırı takas edin, 1. adım onu okuduğunda prev->next zaten n'e eşit olur — yeni düğüm kendini gösterir hale gelir.
Konuşma notu: insert_after'ın kendisi O(1), ama prev'i baştan bulmak, yani arama yapmak, genellikle değil.
Konuşma notu: Bypass oku tüm numaranın kendisi: artık kimse cur'u göstermiyor, o yüzden erişilemez hale geliyor, serbest bırakılmaya hazır.
Konuşma notu: prev ve cur'un birlikte hareket etmesini izleyin — prev her zaman cur'un bir adım gerisinde, cur bulunur bulunmaz yeniden bağlanmaya hazır.
Konuşma notu: Bu kodda son düğümü silmek ayrı bir durum bile değil — aynı prev/cur taramasından doğal olarak çıkıyor.
Konuşma notu: Baş durumu burada ayrı ele alınıyor, çünkü değişmesi gereken yalnızca bir düğümün next alanı değil, head'in kendisi.
Konuşma notu: prev, cur ile aynı adımda güncellenmezse, bypass oku tamamen yanlış düğümden çıkmış olur.
Konuşma notu: Bu, bir listenin bir diziye göre feda ettiği en büyük şey — k konumuna doğrudan atlamanın hiçbir yolu yok.
Konuşma notu: Karşılaştırma sayacının yükselmesine bakın — ziyaret edilen her düğüm, aranan değer olsun olmasın, bir karşılaştırmaya mal olur.
Konuşma notu: Boş bir liste, for döngüsünün koşulu olan cur != NULL'ın hemen başarısız olması demek — arama hiçbir şeyi karşılaştırmadan -1 döner.
Konuşma notu: Bu fonksiyonun tamamı bir slayta sığıyor — bugünkü derste ondan hiçbir şey kesilmiyor.
Konuşma notu: Bu O(n) sayısını aklınızda tutun — üç bölüm sonraki diziler-listeler tablosundaki en büyük argüman bu.
Konuşma notu: Üç işaretçinin bir seferde bir düğüm üzerinde uyum içinde dans etmesi, algoritmanın tamamı — ne özyineleme, ne ek bellek.
Konuşma notu: Her okun teker teker, hep aynı sırayla çevrilmesini izleyin: next'i kaydet, curr'un okunu çevir, ikisini de ilerlet.
Konuşma notu: En küçük önemsiz olmayan durum bile aynı üç-işaretçi dansından geçiyor, yalnızca çok yerine tek bir tekrarla.
Konuşma notu: Bu fonksiyonun tamamı da bir slayta sığıyor, ve onu en az bir kez satır satır, sesli okumaya değer.
Konuşma notu: Üç işaretçinin ötesinde hiç ek bellek gerektirmeyen yerinde tersine çevirme, bu algoritmayı ezbere bilmeye değer kılan asıl neden.
Konuşma notu: Sınıfın yanıttan önce her adımda curr->next'in gerçekte neyi tuttuğunu izlemesine izin verin.
Konuşma notu: Bu, insert_after'ın adım sırasıyla tamamen aynı "önce kaydet, sonra üzerine yaz" dersi, yalnızca farklı bir işlemde yeniden karşımıza çıkıyor.
Konuşma notu: Bölüm 7, düğüm başına ikinci bir işaretçi ekliyor, karşılığında iki yönde de yürüyebilmek için.
Konuşma notu: Yanıt söylendiğinde neredeyse fazla bariz geliyor — ama her işlemin nasıl yazılması gerektiğini değiştiriyor.
Konuşma notu: Ama ek işaretçi bedavaya gelmiyor — her ekleme ve silmede doğru tutulması gereken bir alan daha.
Konuşma notu: Ekleme noktasını atlayan her işaretçinin artık geri yönde eşleşen bir işaretçisi var — ikisinin de düzeltilmesi gerekiyor.
Konuşma notu: Her düğümdeki iki oka bakın — satırın üstünde kavis çizen next, altında kavis çizen prev — birlikte güncelleniyor, hiçbir zaman yalnızca biri değil.
Konuşma notu: Şu anki tail'den sonra eklemek, yeni düğümün yeni tail olması demek — sadece bir next işaretçisi değil, list->tail'in kendisi güncellenmeli.
Konuşma notu: Toplamda dört işaretçi yazımı: yeni düğümün kendi prev'i ve next'i, eski sonraki'nin prev'i (ya da list->tail), ve cur'un next'i.
Konuşma notu: cur->prev burada doğrudan okunuyor — tekil sürüm, tararken ayrı bir prev değişkenini elle takip etmek zorundaydı.
Konuşma notu: Arama bedeli ikinci bir işaretçiyle hiç iyileşmiyor — yalnızca yeniden bağlama adımı, ve geriye yürüyebilme değişiyor.
Konuşma notu: Yanıttan önce delete_value kod slaytına geri işaret edin.
Konuşma notu: Saklanan o prev alanı, çift yönlü listelerin var olmasının tüm nedeni — geri kalan her şey, her düğümde onun bulunmasından çıkıyor.
Konuşma notu: Bölüm 8, NULL'ı tamamen kaldırıyor — liste sona ermek yerine sarılıyor — ve bu biçimi çok eski bir bulmacayı çözmek için kullanıyor.
Konuşma notu: Bunu denememek için bariz bir neden yok — ve tam olarak Josephus probleminin ihtiyaç duyduğu şey olduğu ortaya çıkıyor.
Konuşma notu: Bunu unutmak klasik dairesel liste hatası: NULL'da durmak üzere yazılmış bir döngü hiçbir zaman durmaz.
Konuşma notu: Yalnızca tail'i tutup head'i tail->next'ten türetmek, bu programın bilinçli, küçük bir tasarım tercihi.
Konuşma notu: Satırın altında bir eğri olarak çizilen sarılma okuna bakın — son düğümü doğrudan ilk düğüme bağlıyor.
Konuşma notu: Tek düğümlü dairesel bir liste kendini gösterir; o tek düğümü silmek, listeyi gerçekten boş bırakmalı, tail geri NULL'a dönmeli.
Konuşma notu: Boş liste durumu özel, çünkü korunacak henüz bir head->next ilişkisi yok — yeni düğümün kendine dönmesi gerekiyor.
Konuşma notu: Bu hafta yalnız başına, bu haftaki materyalin diğer her hatasından daha fazla sonsuz döngüye neden oluyor.
Konuşma notu: Efsane tam olarak doğru olsun ya da olmasın, tarif ettiği eleme örüntüsü tam olarak bu algoritmanın simüle ettiği şey.
Konuşma notu: Her eleme, tıpkı dairesel silme gibi, yalnızca tek bir bypass oku — tüm problem az önce gösterilen işleme indirgeniyor.
Konuşma notu: Her elemede çemberin tam olarak bir düğüm küçülmesine, sarılma okunun her seferinde yeniden çizilmesine bakın.
Konuşma notu: Çemberde yalnızca bir kişi varken, eleme döngüsünün remaining > 1 koşulu hemen yanlış olur — kimse hiç elenmez.
Konuşma notu: İç for döngüsü tam olarak k-1 adım ileriyi sayar — dairesel silmeden aynı bypass oku, sonra üzerine geldiğini kaldırır.
Konuşma notu: Simülasyon, animasyonun adım adım gösterdiği şey; yineleme ise hiç çembere gerek kalmadan yalnızca son yanıta giden bir kısayol.
Konuşma notu: Sınıfın k=1'in gerçekte ne anlama geldiğini düşünmesine izin verin, yanıttan önce.
Konuşma notu: k=1 mümkün olan en basit durum, ve genel algoritmanın hâlâ sade sezginin beklediği gibi davrandığını gösteren iyi bir sağlama.
Konuşma notu: Bölüm 9, bilinmeye değer bir bellek tasarrufu numarası, ama sonundaki hatalar slaytı en çok önemli olan kısım.
Konuşma notu: İlk başta imkânsız geliyor — iki adresi tek bir alanın boşluğunda gerçekten saklayamazsınız — ama bir numara var.
Konuşma notu: Bir değeri kendisiyle XOR'lamak her zaman sıfır verir — bu tek olgu, bu yapının tamamının arkasındaki numara.
Konuşma notu: Ekrandaki her düğümün hex adresine ve npx değerine bakın — gezinme, bir sonraki adresi her adımda gerçekten hesaplıyor.
Konuşma notu: Boş bir listedeki tek düğüm hem baş hem son birden — npx'i yalnızca tek gerçek komşusunun NULL ile XOR'u.
Konuşma notu: xor_node, bu programdaki her başka fonksiyonun çağırdığı tek yardımcı — numaranın gerçekte yaşadığı yer burası.
Konuşma notu: prev, tıpkı sıradan bir tekil gezinmenin başladığı gibi NULL'dan başlıyor — döngünün biçimi hakkında değişen başka bir şey yok.
Konuşma notu: Zaman karmaşıklığı çift yönlü bir listeye göre aslında iyileşmiyor — buradaki tüm kazanç hız değil, bellek.
Konuşma notu: Bu bölümdeki en önemli tek slayt burası — numara zekice, ama gerçekten üretime çıkarılacak bir şey değil.
Konuşma notu: Sınıfın bunu bir çöp toplayıcının gerçekte ne yapması gerektiğiyle bağlantılandırmasına izin verin.
Konuşma notu: Demodaki Java simülasyonu, gerçek bellek adresleri yerine dizi indisleri kullanarak tam olarak bunun çevresinden dolanıyor.
Konuşma notu: Bölüm 10, bir bağlı listenin ikili aramanın O(log n)'ini hiç alıp alamayacağını soruyor, ve bir fazladan fikirle "evet" diyor.
Konuşma notu: Engel şu ki bir listenin hiç indisi yok, yani "ortaya sıçra" henüz anlamlı bir işlem bile değil.
Konuşma notu: Pugh'un kendi savı tam olarak buydu: dengeli bir ağacın beklenen performansı, doğru yazması çok daha az kod ile.
Konuşma notu: Daha fazla hızlı şerit, daha fazla seviye, durak sayısını daha da küçültüyor — bu demo görünür kalması için yalnızca iki seviye kullanıyor.
Konuşma notu: Her arama en yüksek seviyede başlar ve aşağı doğru ilerler, bir kez indikten sonra asla yukarı çıkmaz.
Konuşma notu: Aramanın hızlı şeritte başlayıp, yalnızca fazla ileri gidince seviye 0'a indiğine, sonra bir son adım attığına bakın.
Konuşma notu: Hızlı şeritte neredeyse hiçbir şey yokken, aramanın büyük kısmı yine de seviye 0'da geçmek zorunda kalıyor.
Konuşma notu: Dıştaki for döngüsü seviyeleri en yüksekten aşağı sayar; içteki while döngüsü cur'u yalnızca sağa hareket ettiren tek yer.
Konuşma notu: Gerçek bir uygulama her anahtarın seviyesi için ekleme anında yazı tura atar — bu demo her çalıştırma tekrarlanabilir olsun diye seviyeleri önceden sabitliyor.
Konuşma notu: Sınıfın bunu yalnızca seviye 0'ın gerçekte ne olduğuyla bağlantılandırmasına izin verin.
Konuşma notu: Üzerinde durmaya değer: bir atlamalı listenin hızı hiçbir zaman garanti değil, yalnızca beklenen — en kötü durumu tam olarak düz bir liste.
Konuşma notu: Bölüm 11, bugünün her şeyini tek bir tabloda yan yana koyuyor, ödünleşimi açıkça göstermek için.
Konuşma notu: Yalnızca iki satır gerçekten farklı — indise erişim ve baştan ekleme — ve zıt yönlerde farklılar.
Konuşma notu: Burada evrensel olarak "daha iyi" bir yapı yok — doğru seçim, tamamen programın en çok hangi işlemi yaptığına bağlı.
Konuşma notu: Sınıfın bir yığının gerçekte tek bir işleme ihtiyaç duyduğunu düşünmesine izin verin.
Konuşma notu: Gelecek haftanın yığınları ve kuyrukları bu seçimi somutlaştıracak, ikisi üzerine de gerçek uygulamalarla.
Konuşma notu: Dört fikir, ve her biri gerçekte aynı soruyla ilgili: veri değiştiğinde ne hareket etmek zorunda, ve ne kadar.
Konuşma notu: Bu beş liste türünün her biri, altında hâlâ yalnızca düğümler ve işaretçiler — hiçbiri yeni bir bellek türü gerektirmedi.
Konuşma notu: Bir öğrenci bugünden yalnızca bir cümle hatırlayacaksa, hatırlamaya değer olan bu.
Konuşma notu: Bunlar yazılı notun sonundaki kendi kendine kontrol sınavını, burada daha kısa bir set olarak yansıtıyor.
Konuşma notu: Sorun, bekleyin, sonra ilerleyin.
Konuşma notu: Günün ilk mini sorusundaki aynı en kötü durum, yalnızca daha büyük bir dizide.
Konuşma notu: Bölüm 1'deki amortize maliyet argümanını hatırlayın.
Konuşma notu: Amortize etmek, birçok işlem üzerinden bir ortalama — hiçbir zaman tek bir işlem hakkında bir söz değil.
Konuşma notu: Bölüm 6'daki sıra-takası uç durumunu hatırlayın.
Konuşma notu: Böyle bir kendine döngü, prev'i o zamana kadar izleyen her şeyi sessizce koparır.
Konuşma notu: Bölüm 10'un son mini sorusunu hatırlayın.
Konuşma notu: Bir atlamalı listenin hızı her zaman seviye 0'ın üstünde gerçekten kaç hızlı seviye olduğuna bağlıdır.
Konuşma notu: Gelecek haftaki her yığın ve kuyruk, bugünün iki yapısından tam olarak birinin üzerine kuruluyor, işlemler yalnızca tek bir uca kısıtlanmış halde.
Konuşma notu: Bunlar, haftanın yazılı notunun sonunda listelenen aynı kaynaklar.
Konuşma notu: Tarihsel kaynaklar — Pugh, McCarthy, Josephus — bugünkü "kısa tarihçe" slaytlarının dayandığı kaynaklar.