Aguri ağacı nedir?


19

Bazı eski Hacker News öğelerini inceleyerek, bir kullanıcının gönderdiği bir gönderiyle karşılaştım.

Sınırlı boyutta bir yarıçap trie (bir yazılım yönlendirme tablosunda kullandığınız gibi) bir LRU listesine evlenen ve kümeleri otomatik olarak (tüm IP'lerde 1000 gözlemden 10.0.0.0/16) sentezleyen Aguri ağaçları ekleme. Trafik analizinde en iyi bilinenlerdir, ancak bunları çalışma zamanı bellek analizinde de kullandık.

~ tptacek

Bu yüzden aramaya karar verdim,

  • Hızlı bir Google Arama beni bir F1 sürücüsüne götürür.
  • Wikipedia'da yapılan bir arama Hindistan'da bir tarım kastına ve Japonya'dan bazı ürünlere yol açıyor
  • Yığın Taşması 0 sonuca ulaştı /programming//search?q=aguri site:stackoverflow.com/questions aguri

Bu yüzden sonunda kullanıcıyla blogunda bir bağlantı olduğunu gördüm

http://www.matasano.com/log/1009/aguri-coolest-data-structure-youve-never-heard-of/

Ama öldü.

Peki, bu Aguri veri yapısı nedir ve gerçek bir veri yapısı ise, neden başka bir yerde belgelenmemiştir?

Yanıtlar:


15

Aguri , önek ağaçları kullanan bir trafik profil oluşturucusudur. Makalenin tamamı o sayfada. Kısacası, bu sistemde kullanılan önek ağaçlarını kendi benzersiz alt tipleri olarak saymazsanız, "Aguri Ağacı" diye bir veri yapısı yoktur.


9

Çok az gerçekten internette ölüyor. Archive.org, o blog yayınının yayınlandığı andan itibaren tek bir anlık görüntüsüne sahip olur . Buraya kopyalandı:

Dinleyicilerimdeki PCI denetçileri için bazı düzeltici bilgisayar bilimleri.

Size rasgele tamsayılar dizisi veriyorum. Üçüncüsünün içinde olup olmadığını nasıl anlarsınız?

Açık olan bir yol var: “3” ü bulana veya diziyi tüketene kadar sayıları sırayla kontrol edin. Doğrusal arama. 10 sayı verildiğinde, 10 adım atabileceğini varsaymalısınız; N sayı, N adım.

Resim 1.png

Doğrusal arama kötü. Doğrusaldan daha kötü yapmak zordur. Bunu geliştirelim. Diziyi sıralayın.

Resim 2.png

Sıralanmış bir dizi farklı bir strateji önerir: dizinin ortasına atlayın ve aradığınız değerin (solda) daha küçük veya daha büyük (sağda) olup olmadığına bakın. Değeri bulana kadar diziyi her seferinde yarıya kadar tekrarlayın.

Ikili arama. 10 sayı verildiğinde, sıralı bir dizide bunlardan birini bulmak için 3 adede kadar --- 10'luk log2- gerekir. O (log n) araması harika. 65.000 öğeniz varsa, bunlardan birini bulmak için yalnızca 16 adım gerekir. Elemanları ikiye katlayın ve 17 adım.

Ama sıralanmış diziler emmek; bir kere sıralama doğrusal aramadan daha pahalıdır. Bu yüzden ikili aramayı fazla kullanmıyoruz; bunun yerine ikili ağaçlar kullanıyoruz.

Resim 3.png

Bir ikili ağaç aramak için, en baştan başlarsınız ve kendinize “anahtarım geçerli düğümden daha az (sol) veya daha büyük (sağ) daha büyüktür” sorusunu sorarsınız ve tamam, tamam, tamam, bu şeyleri zaten biliyor olana kadar tekrarlayın. Ama bu ağaç güzel, değil mi?

(Dengeli) ikili ağaçla yapılan arama, ağaçtaki eleman sayısına göre değişen ikili arama gibi O (log n) şeklindedir. İkili ağaçlar harika: hızlı bir tablo ve çapraz geçiş, karma tablodan alamadığınız bir şey olsun. İkili ağaçlar karma tablolardan daha iyi bir varsayılan tablo uygulamasıdır. 2.

Ancak ikili ağaçlar, ağaç yapısına sahip tek arama mekanizması değildir. PATRICIA ağaçları olarak da adlandırılan ikili sayı tabanı denemeleri, temel bir farkla ikili ağaçlar gibi çalışır. Her bir düğümde olandan daha büyük / daha küçük karşılaştırmak yerine, bir bitin ayarlanıp ayarlanmadığını kontrol edersiniz, ayarlanmışsa sağa ve ayarlanmamışsa sola doğru bakarsınız.

Resim 4.png

İkili sayı tabanı çalışmasının nasıl çalıştığı hakkında çok şey bırakıyorum. Bu bir utançtır, çünkü sayı tabanı denemeleri herkesin bildiği gibi belgelenmemiştir - Sedgewick onları “Algoritmalar” a kötü bir şekilde berbat etti ve Wikipedia sayfası berbat. İnsanlar hala onlara ne diyeceklerini tartışıyorlar! Geri bağlantıların ve bit konumu etiketli kenarların açıklaması yerine, burada küçük bir Ruby uygulaması var.

Radyasyon denemelerinin neden bu kadar iyi olduğunu aşağıda görebilirsiniz:

Search performance varies with the key size, not the number of elements in the tree. With 16 bit keys, you’re guaranteed 16 steps

Ağaçtaki elemanların sayısına bakılmaksızın, dengelenmeden.

More importantly, radix tries give you lexicographic matching, which is a puffed-up way of saying “search with trailing wildcard”, or

“Komut satırı tamamlama tarzı arama”. Bir sayı tabanı ağacında, hızlı bir şekilde “ro *” arayabilir ve “roma” ve “romulous” ve “roswell” alabilirsiniz.

3.

Seni kaybettim.

Bunu bağlam içine koyalım. Denemeler, İnternet yönlendirmesi için çok önemli bir veri yapısıdır. Yönlendirme sorunu şöyle gider:

You have a routing table with entries for “10.0.1.20/32 -> a” and “10.0.0.0/16 -> b”.

You need packets for 10.0.1.20 to go to “a”

You need packets for 10.0.1.21 to to to “b”

Bu temel bir ikili ağaçla çözülmesi zor bir problemdir, ancak bir sayı tabanı üçgeninde sadece “1010.0000.0000.0000.0000.0001.0100” (10.0.1.20 için) ve “1010” (10.0.0.0 için) ). Sözlükbilimsel arama size yönlendirme için “en iyi eşleşme” sağlar. Yukarıdaki Ruby kodunda deneyebilirsiniz; trie'ye * ”10.0.0.0” .to_ip ekleyin ve “10.0.0.1” .to_ip öğesini arayın.

Yönlendirme ve sayı tabanı denemeleri arasındaki uyum o kadar güçlü ki, en popüler genel amaçlı sayı tabanı kitaplığı (CPAN'dan bir tane) aslında GateD'den çalındı. Bu arada, bu bir karmaşa ve onu kullanma.

Bir üçlemenin nasıl çalıştığını anlarsanız, düzenli ifadelerin nasıl çalıştığını da anlarsınız. Denemeler, dalların yalnızca bit karşılaştırmalarına ve her zaman ileriye doğru dallara dayandığı özel bir deterministik sonlu otomata (DFA'lar) özel durumudur. İyi bir normal regex motoru DFA'ları daha fazla “özellik” ile ele alıyor. Resimlerim size mantıklı geliyorsa, Thompson'un NFA-DFA azaltma algoritması hakkındaki bu mükemmel makaledeki resimler de olacak ve bu makale sizi daha akıllı hale getirecek. 4.

Bir omurga ISP'sinde ağ operatörünüz. Dünyanız büyük ölçüde “öneklerden” —- IP ağ / ağ maskesi çiftlerinden oluşur. Bu öneklerdeki ağ maskeleri sizin için çok önemlidir. Örneğin, 121/8 Kore'ye aittir; 121.128 / 10 Korea Telecom'a, 121.128.10 / 24 bir KT müşterisine aittir ve 121.128.10.53 bu müşterinin içindeki bir bilgisayardır. Bir botnet'i veya bir spam işlemini veya solucan yayılımını izliyorsanız, bu ağ maskesi numarası sizin için oldukça önemlidir.

Ne yazık ki, önemli olsalar da, bir IP paketinde hiçbir yerde bir “ağ maskesi” damgalı değil - ağ maskeleri tamamen bir yapılandırma detayıdır. Bu nedenle, trafiği izlerken, esas olarak şu verilerle çalışacaksınız:

ips.png

Şaşırtıcı bir şekilde, bakmak için yeterli paket verildiğinde, bu netmaskeleri tahmin etmek için yeterli bilgidir. Sony'de çalışırken Kenjiro Cho, denemelere dayanarak bunu yapmanın gerçekten zarif bir yolunu buldu. Bunu nasıl yapacağınız aşağıda açıklanmıştır:

Yazılım yönlendiricileri tarafından kullanılanlar gibi temel bir ikili sayı tabanı alın. Ancak ağaçtaki düğüm sayısını 10.000'e bağladım. Bir omurga bağlantısında, adresleri IP başlıklarından kaydederek, anlarda 10.000 düğüm tüketirsiniz.

Düğüm listesini LRU sırasına göre sıralanmış bir listede saklayın. Başka bir deyişle, bir IP adresini bir düğümle eşleştirdiğinizde, düğüme listenin en üstüne yapıştırarak düğüme “dokunun”. Yavaş yavaş, sık görülen adresler yukarı doğru kabarcıklaşır ve nadiren görülen düğümler dibe batar.

Resim 6.png

Şimdi hile. Düğümleriniz bittiğinde ve yenisine ihtiyaç duyduğunuzda, listenin altından geri alın. Ancak bunu yaptığınızda, verileri düğümden üst öğesine yuvarlayın, şöyle:

Resim 5.png

10.0.1.2 ve 10.0.1.3, 10.0.1.2/31'in iki yarısı olan kardeş / 32'lerdir. Onları geri almak için 10.0.1.2/31 ile birleştirin. 10.0.1.2/31 i talep etmeniz gerekiyorsa, 10.0.1.0/30 oluşturmak için 10.0.1.0/31 ile birleştirebilirsiniz.

Diyelim ki bir dakika yapın ve göze çarpan kaynaklar LRU listesinin üstünde kalarak ağaçtaki konumlarını korurken, ortam / 32 gürültü / 0'a kadar kabarır. Yukarıdaki IP'lerin ham listesi için 100 düğüm ağacıyla bunu elde edersiniz.

Cho buna sezgisel Aguri diyor. 5.

Aguri BSD lisanslıdır. İndirebilir ve Cho'nun eski ana sayfasından paketleri pcap üzerinden izleyen bir sürücü programı. 6.

Bununla bir yere gidiyorum, ama şimdi bu gönderiye 1300 kelimeyim ve eğer bir algoritma kişi iseniz, şu ana kadar benden bıktınız ve eğer değilseniz, benden bıktınız şimdi. Öyleyse, Aguri'nin batmasına izin verin, bu hafta bununla ilgili size havalı ve yararsız bir şey vereceğim.

Orada dağınık çok sayıda bağlantı vardır. Ne yazık ki, Archive.org görüntüleri değil, sadece metni tutuyor, bu yüzden birçoğu kayboldu. İşte arşivledikleri:


Bu gerçekten bilgileri gösteriyor, tüm bu bağlantıların artık mevcut olmamasının bir nedeni var mı?
doktora

@ phwd Sadece Wayback Machine'in bağlandığı yerden bağlantıları kopyaladım / yapıştırdım. Ve kendi kendine bağlanır, böylece blog yayını yapıldığında bu sayfaları etraflarında görüyorsunuz. Wikipedia makaleleri ve regex karşılaştırması, hala var olduğunu biliyorum.
Izkata
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.