2016-05-06 13 views
0

外部ストレージに格納されている非常に大きなソートリストを持っている場合。このリストを内部メモリに持ち込むことができないと仮定すると、このリストのキーを擬似コードで探す良い検索アルゴリズムは何でしょうか?時間の複雑さはどうなるでしょうか?また、このアルゴリズムを設計する際に考慮すべき重要な要素は何ですか?外部検索アルゴリズム

+0

キー固有のインデックスファイルを作成し、ドメイン固有の言語を作成することができます。構造化された形式でデータをクエリするSQLを呼び出します。その後、あなたはもっと多くのエキストラを書く時間を費やすことができました。しかし、待ってください - これはすでに完了しました。これはデータベースと呼ばれます。 – BitTickler

+0

多くのデータベースでは、キー固有のファイルが関与していますが、kレコードは64レコードのうちの1つのキーです(64レコード以下になる可能性があります)ただ1つの初期ランダムアクセスで、連続して読み出すことができます。メインフレームや限られたメモリの時代になると、レコードの索引付けなどのネストされた索引が使用されました。 – rcgldr

答えて

0

あなたの外部記憶装置はファイルに保存された固定サイズのレコードの単なる配列であり、プログラミング言語はmemory map the fileであると仮定すると、通常はbinary search algorithmを使用できます。

Cで言う、++あなた

  1. mmapファイルが
  2. 、始まりと のmmap-EDファイルの末尾にvoid *型のポインタを取るには、あなたのレコードタイプ
  3. へのポインタをキャストし、標準バイナリ検索の実装の1つであるstd::lower_bound()を使用してレコードを検索します。

ファイルをメモリにマップしても、ファイル全体が内部メモリにロードされるわけではなく、キャッシュされたサイズを保持するスマートポリシーを使用して、ファイルから読み込まれたページのキャッシュに自動的にロードされます利用可能なメモリ範囲内のページ。

これはソートされたファイルを検索するための標準的な方法であり、それを再設計する理由はありません(私の知る限り)。外部メモリのバイナリ検索アルゴリズムの複雑さは、外部ストレージモデル、バッファリング/ページング戦略などに依存しますが、ハードドライブの場合は通常のO(log N)であると見なすことができます。 out-of-core algorithmsとデータ構造のチュートリアルとライブラリを検索することをお勧めします。