Darts: Double-ARray Trie System

はじめに

ダウンロード

Source

インストール

新着情報

使い方

クラスのインターフェイス

テンプレート引数の説明

NodeType Trie の各ノードの型です. 一般的な C 文字列の検索なら, char 以外に設定する必要はありません.
NodeUType Trie の各ノードの型を符号無し整数に変換した型です. 一般的な C 文字列の検索なら, unsigned char 以外に設定する必要はありません.
ArrayType Double-Array の Base の要素に使用される型です. 通常は signed の 32bit 整数に設定します
ArrayUType Double-Array の Check の要素に使用される型です. 通常は unsigned の 32bit 整数に設定します
LengthFunc NodeType の配列を引数にしたときに, その配列のサイズを返す関数オブジェクトを 指定します. 内部呼び出しに operator () を使っている ので, () を overload しておく必要があります. NodeType が, char の場合は, strlen を wrap した関数オブジェクトが, それ以外は 0 を終了条件とみなして配列のサイズを計算します.

32bit 整数の定義は OS, コンパイラ依存です.
実際には configure script が, 自動的に判別し,32bit になるように選択してくれます. もし64 bit 整数を用いる場合は, template 引数で個々に指定してください.

typedef の説明

テンプレート引数に与えられた型の別名定義です. 外部から型名を参照する 時に使います.

key_type 検索する key の 1つの要素の型です. NodeType と同一です.
result_type 1つの結果の型です. ArrayType と同一です.

メソッドの説明

サンプルプログラミング

付属プログラムの説明

mkdarts

% ./mkdart DictionaryFile DoubleArrayFile 
ソート済みの辞書を DoubleArrayFile に変換します.

darts

% ./darts DoubleArrayFile 

DoubleArrayFile に対し対話的に common prefix search を行います.
サンプルプログラムの 2番目とほぼ同じです.

使用例

% cd tests
% head -10 linux.words
ALGOL
ANSI
ARCO
ARPA
ARPANET
ASCII
 .. 

% ../mkdarts linux.words dar
Making Double Array: 100% |*******************************************|
Done!, Compression Ratio: 94.6903 %

% ../darts dar
Linux
Linux: found, num=2 3697 3713
Windows
Windows: not found
LaTeX
LaTeX: found, num=1 3529

既知の問題

構造体の表現方法

Double-Array は,

struct Unit
{
   ArrayType    base;
   ArrayUType   check;
};

のような Unit の配列として表現されています. このファイルの入出力は, fread, fwrite を用いて,

fread  ((Unit *)array,  sizeof(Unit), size, fp);
fwrite ((Unit *)array,  sizeof(Unit), size, fp);

のように, 行われています. ごくまれですが, 構造体の配列の間に gap を挿入 する OS/コンパイラがあるそうです. したがって, このような読み書きは厳密に言えば移植性がありません. 私が使用している g++ 2.95.2 と Tru64 に附属の cxx は問題ないようなので, このままの状態にしていますが, いずれ移植性を高めるために書きなおすつもりです.

TODO

参考文献, リンク


$Id: index.html 1575 2007-01-27 13:24:27Z taku $;