2017-08-07 4 views
2

私はIPv6アドレス範囲を格納するのに使うことができる効率的なデータ構造を考えようとしています。検索時間はすばやくする必要があります。つまり、IPv6アドレスを指定すると、どのインターバルから来たのかをすばやく判断できるはずです。ここの私の場合、アドレス範囲は重複しません。IPv6アドレス範囲を読み書きする効率的なデータ構造とは何ですか?

1つの効率的な方法の1つは、単純なバイナリ検索ツリーを作成することであり、各非リーフノードは単に「ルックアップトラフィックをリダイレクトする」ことです。しかし、このアプローチの問題は、BSTのサイズが本当に大きく、おそらく2^128ノードのオーダーであり、ファイルに読み書きできない可能性があります。

したがって、ファイルサイズの上限が低いクイックIPv6アドレスルックアップには、どのようなデータ構造を使用できますか?

私は途中でJavaを使用しています。

+0

あなたは、サードパーティのライブラリを使用することはできますか? GuavaのRangeSetはこれに適しています。 –

+0

範囲が重複しない場合は、ハッシュテーブルを使用できます。 –

+0

私の専門分野ではありませんが、Postgresデータベースにはネイティブ[ネットワークアドレス用のデータ型](https://www.postgresql.org/docs/current/static/datatype-net-types.html)が組み込まれていますが、 [そのようなアドレスを扱う関数](https://www.postgresql.org/docs/current/static/functions-net.html)を提供しています。範囲検索を実行できると推測しています。 –

答えて

2

インターバルツリーと呼ばれる完全に優れたデータ構造があります。 通常のバイナリ検索ツリーに基づいています。 しかし、キーを保存する代わりに、間隔を保存します。また、値の参照をサポートします。キーが見つかったノードを返すことができます。ノードには境界が含まれているため、ユースケースの実装が容易になります。

あなたはIPv6についての間隔を定義する必要がない場合は、あなたがトライデータ構造を使用することができますhttps://en.wikipedia.org/wiki/Interval_tree

+0

ありがとうございます。多くのノードが必要とする理論上の上限は何ですか? – Ahmad

+0

私は心の上の境界を知らない。私はしかし、ウィキペディアの記事には、その中にJavaコードの例があることがわかりました。あなたはいつもコードをコピー/ペーストすることができ、境界を把握するためのテストを書くことができます。 または、グーグルで行ってください。 –

関連する問題