Bir atlama listesi nasıl çalışır?


14

Bir ev ödevi için, bir atlama listesinin nasıl çalıştığını anlamam gerekir .

2 yılı aşkın bir süredir programlıyorum (bunun gerçekte o kadar uzun olmadığını biliyorum) ve bir atlama listesi bile duymadım.

Bulabildiğim tüm rehberleri inceledim ve nasıl çalıştıklarını hala zar zor anlıyorum. Hatta örnek bir uygulama için Kod İnceleme aradı ve sadece bir inceleme bulundu; ve tam bir uygulama bile değil. Kurs tarafından sağlanan örnek uygulamaya baktım ve kesinlikle iğrenç. Uygun yöntemlerin olmaması ve tek harfli değişken adları arasında, nasıl çalıştığı hakkında hiçbir fikrim yok.

Bir atlama listesi nasıl çalışır? Daha gelişmiş veri yapılarını anlamak için bir atlama listesi bilgisi gerekli mi?



1
Eğitim tavsiyesi açıkça konu dışıdır . Bu eğitim değil veri yapıları ile ilgili olduğu için, bu bölümleri kaldırmak için sorunuzu düzenledim. Ayrıca, düzenlediğim Wikipedia bağlantısını okumanızı ve sorunuzu hala anlamadığınız şeylerle ilgili daha ayrıntılı ayrıntılarla güncellemenizi öneririz.

@ Teşekkürler Teşekkürler. Bunu sadece "öğretmeninize sorun" gibi yorumları önlemek için ekledim. Bunu bir dahaki sefere aklımda tutacağım. Ve soruyu değiştiren bir düzenleme eklediniz. Sonunda, insanlardan nasıl çalıştıklarını açıklamalarını istemiyorum, çünkü bunun offtopik olduğunu varsayıyorum (iyi bir açıklamaya karşı olmamakla birlikte). Sadece öğrenmelerinin ne kadar önemli olduğunu bilmek istiyorum.
Haziran'da Carcigenicate

1
@Carcigenicate, nasıl çalıştıklarını açıklamak aslında konu üzerinde onları gerçek dünyada görüp görmeyeceğinizi sormaktan daha fazlasıdır. Sadece ne yapacağınızı ve çeşitli alemleri tahmin edebiliriz. Onları gerçek dünyada görüp görmediğimizi sormak bizi "evet, onları görüyorum ve kullanıyorum" veya "hayır, hiç duymadım" diye soruyor.

Yanıtlar:


29

Eskiden veri yapıları sınıfında AVL ağaçlarının nasıl çalıştığını öğrendik . Bunu sınıflarımdan birinde almıştım, ama eğitmen "bunu asla asla kullanamayacaksın" dedi ve bunun yerine bize 2-3 ağaç ve b * ağaç öğrenmiştik. Bunlar hafızanın dar olduğu ve süreçlerin tek tek işlendiği günlerdi. Tek bir bağlantılı liste de işe yaradığında bir deque kullanmadınız.

Atlama listesi bugün daha fazla kullanılabilir bellek ve eşzamanlılık bir sorundur (AVL ağacı olan her şeye kıyasla, atlama listesinde yazar olarak hareket ederken çok fazla kilitlemenize gerek yoktur).

Açıkçası, bu benim en sevdiğim veri yapısı, altında nasıl çalıştığı ve kullanmanın avantajlı veya dezavantajlı olacağı hakkında kolayca akla getirebileceğim bir şey.

Sıfırdan bir tane yazmanıza gerek yoktur (bir röportaj sorusu olarak almazsanız - ancak o zaman bir AVL ağacı uygulama olasılığınız yüksektir).

Sen edilir bir seçmek istediğiniz anlamak gerek gidiş ConcurrentSkipListMapyerine bir daha Java HashMapveya TreeMapveya diğer harita uygulamalarının herhangi.


Nasıl çalıştığını anlamak için bir ikili ağacın nasıl çalıştığını anlamanız gerekir. Bekle, değiştirmeme izin ver. Dengeli bir ikili ağacın nasıl çalıştığını anlamanız gerekir . İkili bir ağacı dengelemeden, aramasıyla gerçek bir avantaj elde edemezsiniz.

Diyelim ki bu ağacımız var:

İkili ağaç

Ve içine bir '8' ekliyoruz. Şimdi elimizde:

Dengesiz bir ikili ağaç

Ve bu dengeli değil. Bu yüzden, bazı uygulamalarla dengeleme sihrini yapıyoruz ...

dengeli ağaç

Ve yine dengeli bir ağacın var. Ama bu benim elimi salladığım bir sihirdi.

Bir atlama listesi alalım.

ideal atlama listesi

Bu idealize edilmiş bir şey. Çok az, ancak atlama listesinin ideal olarak yaklaştığı dengeli ikili ağaç doğasını gösterir.

Şimdi, buraya 6 eklemek istiyoruz. Bu, onu bağlantılı bir liste gibi ekliyor. Ancak, tepeden başlayıp aşağı iniyoruz. En yüksek puan 5'tir. 6> 5 midir? Evet. Tamam, üst şimdi sona erdi, bu yüzden yığını aşağı iniyoruz (5'deyiz). Bir sonraki 7'dir. 6> 7 mi? Hayır! Bu yüzden bir seviyeye iniyoruz ve temel seviyedeyiz, bu yüzden 5'in sağına 6 ekliyoruz.

Bir madeni para çeviriyoruz - inşa ettiğimiz kafalar, kuyruklarımız kalıyor. Kuyruklar. Başka bir şey yapılması gerekmiyor.

bir eklemeden sonra listeyi atla

Şimdi bunu 8 ekleyelim. 8> 5? Evet. 8> 7? Evet. Ve şimdi okları ve etrafındaki yığını takip ettikten sonra tekrar alt seviyedeyiz ve 8> 11'i test ediyoruz? Hayır! Bu yüzden 8'i 7'nin sağına yerleştiriyoruz.

Bir madeni para çeviriyoruz - inşa ettiğimiz kafalar, kuyruklarımız kalıyor. Kuyruklar. Başka bir şey yapılması gerekmiyor.

başka bir eklemeden sonra listeyi atla

Dengeli ağaçta, ağacın şimdi dengelenmemesi konusunda çalışıyorduk. Ama bu bir ağaç değil - bir atlama listesi. Biz yaklaşır bir dengeli ağaç.

Şimdi 10 ekleyelim. Tüm karşılaştırmaları önleyeceğim.

Bir madeni para çeviriyoruz - inşa ettiğimiz kafalar, kuyruklarımız kalıyor. Kafalar! Ve tekrar çevir, Tekrar kafa! Tekrar çevir, tamam, bir kuyruk var. Temel bağlantılı listenin iki düzeyi.

başka bir eklemeden sonra listeyi atla

Buradaki avantaj, şimdi 12 ekleyecek olursak, diğer tüm karşılaştırmaları yapmadan 5'ten 10'a atlayabiliriz . Atlama listesiyle bunları atlayabiliriz. Ve dengeli ağaç hakkında endişelenmemize gerek yok - istiflemenin olasılıksal doğası bunu bizim için yapar.

Bu neden bu kadar faydalı? Çünkü 10'u eklerken bunu yapının tamamı yerine 5 ve 7 ve 8 göstergelerine kilitleyerek yapabilirim. Bunu yaparken, okuyucular hala tutarsız bir durum olmadan atlama listesinden geçebilirler. Eşzamanlı kullanım için daha hızlı kilitlenmesine gerek yoktur. Alt katman üzerinde yineleme yapmak için, bir ağaçtan daha hızlıdır (ağaç navigasyonu için BFS ve DFS algoritmalarının sevinçleri - bunlar hakkında endişelenmenize gerek yoktur).

Karşılaşacak mısın? Muhtemelen yerlerde kullanımda olduğunu göreceksiniz. Ve sonra yazarın neden bir ya da yapı yerine bu uygulamayı seçtiğini anlayacaksınız .TreeMapHashMap

Bunların çoğu blog yayınımdan ödünç alındı: Atla Listesi


Teşekkür ederim. Anlamadığım genel uygulama bile değil; BST'lere benzerliklerini anlıyorum. Nasıl uygulayacağımı düşünmeye çalıştım ve tüm işaretçileri / referansları yönetme düşüncesi beni sürekli karıştırdı. Belki de kendimi çok sinirlendim. Teşekkürler. Cevabınızı başlangıç ​​noktası olarak kullanarak yarın almaya çalışacağım.
Carcigenicate

2
@Carcigenicate ayrıca onları tanıtan orijinal kağıdı da bulabilirsiniz - Listeleri Atla: Dengeli Ağaçlara Olasılıksal Bir Alternatif . Çoğu akademik makaleye kıyasla, insanların kafalarının üzerinden geçebilecek oldukça anlaşılabilir bir kağıt. Tablo 2'de bunların kullanımda olduğunu göreceksiniz. Yerleştirme veya silme için bu zaman faktörü, diğer çözümlerin karmaşıklığına eklenir .

2
Bağlantılı bir liste "sadece yozlaşmış, çok dengesiz bir ağaçtır". Atla listesi, listenin üstüne bir çeşit ağaç yapısını kısmen eklemektir. Şahsen, kalıcı veri yapılarının büyük bir hayranıyım ve ağaçların bu bağlamda akıl yürütmesi daha kolay görünüyor. Clojure, Scala ve ark. temel veri yapısı olarak Bagwell tarzı Hash denemelerinin bir tür yakınlaşıyor gibi görünüyor. (Phil Bagwell, Scala'nın Scala 2.8 için koleksiyon çerçevesinin yeniden tasarımına bile dahil oldu.) Skip listeleri hala güzel.
Jörg W Mittag

Daha önce okuduğum bir atlama listesinin nasıl çalıştığının en iyi açıklaması bu.
gaborous
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.