アグリツリーとは何ですか?


19

古いHacker Newsのアイテムを調べてみると、あるユーザーからの投稿に出会いました。

(ソフトウェアルーティングテーブルで使用するような)境界サイズの基数トライをLRUリストと結合し、パターンから集約(すべてのIPの1,000の観測値から10.0.0.0/16など)を自動的に合成するAguriツリー挿入の。これらはトラフィック分析で最もよく知られていますが、ランタイムメモリ分析でも使用されています。

tptacek

調べてみることにしました

  • 簡単なGoogle検索でF1ドライバーに移動します。
  • ウィキペディアで検索すると、インドの農業カーストと日本からのいくつかのアイテムにつながります
  • Stack Overflow hits 0 results /programming//search?q=aguri site:stackoverflow.com/questions aguri

だから私は最終的にそれをユーザーにリンクしました。彼が彼のブログにリンクを持っているのを見てください

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

しかし、それは死んでいます。

それでは、このAguriデータ構造とは何ですか?それが実際のデータ構造である場合、他のどこにも文書化されていないのはなぜですか?

回答:


15

Aguriは、プレフィックスツリーを使用するトラフィックプロファイラーです。完全な記事は、そのページにあります。つまり、そのシステムで使用されているプレフィックスツリーを独自のサブタイプとしてカウントしない限り、「Aguriツリー」などのデータ構造はありません。


9

インターネット上で死ぬことはほとんどありません。Archive.orgには、たまたまそのブログ投稿が公開されていたときのスナップショットが1つだけあります。ここにコピー:

私の聴衆のPCI監査員のためのいくつかの修復コンピューターサイエンス。

ランダムな整数の配列を渡します。3番が入っているかどうかはどうやってわかりますか?

さて、明らかな方法があります。「3」が見つかるまで、または配列を使い果たすまで番号を順番に確認してください。線形検索。10個の数字が与えられた場合、10ステップかかる可能性があると仮定する必要があります。N個の数字、N個のステップ。

写真1.png

線形検索は悪いです。線形より悪いことをするのは難しい。それを改善しましょう。配列を並べ替えます。

写真2.png

ソートされた配列は、異なる戦略を示唆しています。配列の中央にジャンプして、探している値がより小さい(左)か、より大きい(右)かを確認します。値が見つかるまで、配列を毎回半分にカットして繰り返します。

バイナリ検索。10個の数字が与えられた場合、ソートされた配列でそのうちの1つを見つけるには3つのステップ(log10 of 10)が必要です。O(log n)検索は素晴らしいです。65,000個の要素がある場合、そのうちの1つを見つけるのに16ステップしかかかりません。要素を2倍にすると、17ステップになります。

しかし、ソートされた配列は不愉快です。一つには、ソートは線形検索よりも高価です。したがって、バイナリ検索はあまり使用しません。代わりに、バイナリツリーを使用します。

写真3.png

バイナリツリーを検索するには、一番上から始めて「自分のキーは現在のノードよりも小さい(左)または大きい(右)」と自問自答し、OK、OK、OKになるまで繰り返します。しかし、その木はきれいですね。

(バランスのとれた)バイナリツリーを使用した検索は、バイナリ検索と同様にO(log n)であり、ツリー内の要素の数によって異なります。バイナリツリーは素晴らしいです。ハッシュテーブルから取得できないものをすばやく検索し、ソートされたトラバーサルを取得できます。バイナリツリーは、ハッシュテーブルよりも優れた既定のテーブル実装です。2。

ただし、ツリー構造のルックアップメカニズムはバイナリツリーだけではありません。PATRICIAツリーとも呼ばれる2進基数の試行は、1つの基本的な違いがある2進ツリーのように機能します。各ノードで大なり/小なりを比較する代わりに、ビットが設定されているかどうかを確認し、設定されている場合は右に分岐し、設定されていない場合は左に分岐します。

写真4.png

バイナリ基数がどのように機能するかについては、多くのことを省略しています。これは残念なことです。基数の試みが文書化されていないことで悪名が高いためです。人々はまだそれらを何と呼ぶか​​について議論しています!バックリンクとビット位置ラベル付きエッジの説明の代わりに、小さなRubyの実装があります。

基数の試行が素晴らしい理由は次のとおりです。

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

ツリー内の要素の数に関係なく、バランスが取れていません。

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

「コマンドライン補完スタイルの検索」。基数ツリーでは、「ro *」をすばやく検索して、「rome」と「romulous」と「roswell」を取得できます。

3。

私はあなたを失いました。

これをコンテキストに入れましょう。試行は、インターネットルーティングにとって重要なデータ構造です。ルーティングの問題は次のようになります。

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”

これは基本的なバイナリツリーでは解決が難しい問題ですが、基数トライでは、「1010.0000.0000.0000.0000.0001.0100」(10.0.1.20の場合)および「1010。」(10.0.0.0の場合)を求めるだけです。 )。辞書検索により、ルーティングに「最適な一致」が得られます。上記のRubyコードで試すことができます。*” 10.0.0.0” .to_ipをトライに追加し、「10.0.0.1」.to_ipを検索します。

ルーティングと基数の試行の対応は非常に強いため、最も一般的な汎用基数トライライブラリ(CPANからのもの)が実際にGateDから盗まれます。ちなみに、それは混乱であり、使用しないでください。

トライの仕組みを理解すれば、正規表現の仕組みも理解できます。トライは、決定論的有限オートマトン(DFA)の特殊なケースです。この場合、分岐は排他的にビット比較に基づいており、常に前方に分岐します。優れた正規表現エンジンは、より多くの「機能」を持つDFAを処理するだけです。私の写真があなたにとって理にかなっているなら、トンプソンのNFA-DFA削減アルゴリズムに関するこの優れた記事の写真も、あなたをより賢くします。4。

あなたはバックボーンISPのネットワークオペレーターです。あなたの世界は主に「プレフィックス」で構成されています— IPネットワーク/ネットマスクのペア。これらのプレフィックスのネットマスクは、あなたにとって非常に重要です。たとえば、121/8は韓国に属します。121.128 / 10はKorea Telecomに属し、121.128.10 / 24はKTの顧客に属し、121.128.10.53はその顧客内の1台のコンピューターです。ボットネット、スパム操作、またはワームの伝播を追跡している場合、そのネットマスク番号は非常に重要です。

残念ながら、それらは重要ですが、IPパケットのどこにも「ネットマスク」がスタンプされていません。ネットマスクは完全に構成の詳細です。そのため、トラフィックを監視している場合、基本的に次のデータを処理できます。

ips.png

驚いたことに、見るのに十分なパケットが与えられると、これはネットマスクを推測するのに十分な情報です。ソニーで働いている間、長健次郎は、試行に基づいて、それを行うための本当にエレガントな方法を思いつきました。方法は次のとおりです。

ソフトウェアルーターで使用されるものと同様に、基本的なバイナリ基数トライを使用します。ただし、ツリー内のノードの数を、たとえば10,000に制限します。IPヘッダーからアドレスを記録するバックボーンリンクでは、すぐに10,000ノードを使い果たします。

ノードのリストをリストに保存し、LRU順にソートします。つまり、IPアドレスとノードを一致させると、ノードを「タッチ」して、リストの一番上に貼り付けます。徐々に、頻繁に見られるアドレスが上にバブルし、めったに見られないノードが下に沈みます。

写真6.png

トリックです。ノードが不足して新しいノードが必要になった場合は、リストの一番下から再利用してください。しかし、そうするとき、次のようにノードからその親にデータをロールアップします:

写真5.png

10.0.1.2と10.0.1.3は兄弟/ 32sで、10.0.1.2 / 31の2つの半分です。それらを再利用するには、それらを10.0.1.2/31にマージします。10.0.1.2/31を再生する必要がある場合は、10.0.1.0 / 31とマージして10.0.1.0/30を形成できます。

これを1分以上実行すると、周囲の/ 32ノイズが/ 0までバブルする間、傑出したソースがLRUリストの最上位に留まることでツリー内の位置を守ります。上記のIPの生のリストについては、100ノードツリーで、これを取得します。

チョーはこれを発見的アグリと呼んでいます。5。

AguriはBSDライセンスです。Choの古いホームページから、それとpcapを介してパケットを監視するドライバープログラムをダウンロードできます。6。

私はこれでどこかに行きますが、私は今この記事に1300の言葉を書いています今。それで、Aguriを沈めましょう。今週後半には、Aguriに関係のないクールで役に立たないものをお見せします。

多数のリンクが散在しています。残念ながら、Archive.orgは画像のみを保持し、テキストのみを保持しているため、それらのいくつかは失われています。アーカイブしたものは次のとおりです。


これは確かに情報を示していますが、これらのリンクがすべて利用できなくなった理由はありますか?
phwd

@phwdウェイバックマシンのリンク先の下部にあるリンクをコピー/貼り付けしました。それはそれ自体にリンクしているので、ブログの投稿が行われたときのページが表示されています。ウィキペディアの記事と正規表現の比較、私はまだ存在することを知っています。
イズカタ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.