ハッシュテーブル

hash-tableは、キーで連想される値を探すためのクラスである(assocでもできる)。 比較的大きな問題において、hash-tableはassocより良い性能を出す。 キーと値の組数が増加しても探索に要する時間は、一定のままである。 簡単に言うと、hash-tableは100以上の要素から探す場合に用い、 それより小さい場合はassocを用いるべきである。

hash-tableは、テーブルの要素数がrehash-sizeを越えたなら、自動的に拡張される。 デフォルトとして、テーブルの半分が満たされたとき拡張が起こるようになっている。 sxhash関数は、オブジェクトのメモリアドレスと無関係なハッシュ値を 返し、オブジェクトが等しい(equal)ときのハッシュ値はいつも同じである。 それで、hash-tableはデフォルトのハッシュ関数にsxhashを使用している ので、再ロード可能である。 sxhashがロバストで安全な間は、 列やtreeの中のすべての要素を探索するため、比較的に遅い。 高速なハッシュのためには、アプリケーションにより他の特定のハッシュ関数を 選んだ方がよい。 ハッシュ関数を変えるためには、hash-tableに:hash-functionメッセージを 送信すれば良い。 簡単な場合、ハッシュ関数を#'sxhashから #'sys:addressに変更すればよい。 EusLisp内のオブジェクトのアドレスは 決して変更されないため、#'sys:addressを設定することができる。



sxhash obj [関数]

objのハッシュ値を計算する。 equalな2つのオブジェクトでは、同じハッシュ値を生じること が保証されている。 symbolなら、そのpnameに対するハッシュ値を返す。 numberなら、そのinteger表現を返す。 listなら、その要素全てのハッシュ値の合計が返される。 stringなら、それぞれの文字コードの合計をシフトしたものが返される。 その他どんなオブジェクトでも、sxhashはそれぞれのスロットのハッシュ値を 再帰的呼出しで計算し、それらの合計を返す。


make-hash-table &key (:size 30) (:test #'eq) (:rehash-size 2.0) [関数]

hash-tableを作り、返す。


gethash key htab [関数]

htabの中からkeyと一致する値を得る。 gethashは、setfを組み合せることによりkeyに値を設定する ことにも使用される。 hash-tableに新しい値が登録され、そのテーブルの埋まったスロットの数が 1/rehash-sizeを越えたとき、hash-tableは自動的に2倍の大きさに拡張される。


remhash key htab [関数]

htabの中からkeyで指定されたハッシュ登録を削除する。


maphash function htab [関数]

htabの要素全てをfunctionmapする。


hash-table-p x [関数]

もしxがhash-tableクラスのインスタンスなら、Tを返す。



hash-table [クラス]


  :super   object 

:slots (key value count
hash-function test-function
rehash-size empty deleted)


hash-tableを定義する。 keyvalueは大きさが等しい一次元ベクトルである。 countは、keyvalueが埋まっている数である。 hash-functionのデフォルトはsxhashである。 test-functionのデフォルトはeqである。 emptydeletedは、keyベクトルのなかで空または削除された 数を示すsymbol(パッケージに収容されていない)である。


:hash-function newhash [メソッド]

このhash-tableのハッシュ関数をnewhashに変更する。 newhashは、1つの引数を持ち、integerを返す関数でなければならない。 newhashの1つの候補としてsys:addressがある。


2016-04-05