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: