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ş ConcurrentSkipListMap
yerine bir daha Java HashMap
veya TreeMap
veya 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:
Ve içine bir '8' ekliyoruz. Şimdi elimizde:
Ve bu dengeli değil. Bu yüzden, bazı uygulamalarla dengeleme sihrini yapıyoruz ...
Ve yine dengeli bir ağacın var. Ama bu benim elimi salladığım bir sihirdi.
Bir atlama listesi alalım.
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.
Ş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.
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.
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 .TreeMap
HashMap
Bunların çoğu blog yayınımdan ödünç alındı: Atla Listesi