 の計算量で済む.
これはとても高速である.たとえば,表1に示した単語データベースのよ
うなものを配列に格納することを考える.ただし,以下の条件を課す.
の計算量で済む.
これはとても高速である.たとえば,表1に示した単語データベースのよ
うなものを配列に格納することを考える.ただし,以下の条件を課す.
 ,zが26のようにである.もうひとつアルファ
       ベット長い場合(空白)が必要で,それは0を割り当てる.このようにすれば,
       英単語は整数
,zが26のようにである.もうひとつアルファ
       ベット長い場合(空白)が必要で,それは0を割り当てる.このようにすれば,
       英単語は整数
 で表現できる.
で表現できる.
 (1,16,16,12,5,0,0,0,0)                
       pineapple
(1,16,16,12,5,0,0,0,0)                
       pineapple
 (16,9,14,5,1,16,16,12,5)
(16,9,14,5,1,16,16,12,5)
|  | 
このようにスペルから直接添え字の値が計算できる配列に英単語を格納すると,とても高
速に探索,削除,追加ができるデータ構造となる.すべて,計算量のオーダーは で
ある.しかし,この方法をよく考えると大きな問題がある.巨大なメモリー空間が必要な
のである.配列の最大の添え字は,
で
ある.しかし,この方法をよく考えると大きな問題がある.巨大なメモリー空間が必要な
のである.配列の最大の添え字は,
 となりとても現在のコンピューター
で取り扱うことができない.
となりとても現在のコンピューター
で取り扱うことができない.
このような配列に単語を格納すると,ほとんどその中は空になる.単語の数はそれほど多 くない.諸君の英和辞典の単語数を調べてもよく分かる.そこで,この配列の添え字を 0〜99999に圧縮することを考える.新たな添え字をjとすると,
j=i%100000;とすれば良い.100000で割った余りとすれば,0〜99999の値が得られる. このようにして,データにアクセスする方法をハッシュ法と言う.得られた値(0〜 99999)をハッシュ値と言い,キーを変数として,それを求める関数をハッシュ関数 と言う.
このようにすると,明らかに以下の問題点がある.
ハッシュ法を使うためには,教科書に書いてあるとおり,以下のような動作が必要である.
ハッシュ表は,データを示すポインターを入れる配列である.キーを決めるとハッシュ関 数を計算してハッシュ値が決まる.このハッシュ値がこの配列の添え字の値となる.そし て,そこに格納されている配列の値(ポインター)により,データにアクセスする.
ハッシュ表を作るときにはデータ数よりも大きいことが望ましい.そうしないと,異なっ たキーでも同じハッシュ値となり,衝突が発生し,データの探索スピードが落ちてしまう. 衝突の問題は後で述べるので,ここではハッシュ関数の作り方を説明する.ハッシュ表の 大きさは素数とすることが望ましい.こうすることにより,キーのどのビットが変化して もハッシュ値の値を変化させることができる.
ハッシュ関数は,一般に,次の2つの手順により成り立っている.