本当はむずかしいハッシュテーブル
某所より自己転載。数え方にもよりますが、レベル1からレベル3まで、三つぐらい罠があります。(これは解説する予定はありませんが、他の方の解答・コメントは歓迎します。コメント、トラックバック、ブックマークはネタバレ有りです。念のため。)
次の内部ハッシュの実装(C言語のプログラムの一部)には誤りがある。誤っている部分を正しく修正せよ。ただし、Bはハッシュ表のサイズ、hashはハッシュ関数である。ハッシュ表の要素は正の整数とし、要素の個数はハッシュ表のサイズBより小さいとする。
#define EMPTY 0 int h[B]; /* ハッシュ表hを空にする */ void clear() { int i; for (i = 0; i < B; i ++) { h[i] = EMPTY; } } /* 要素xをハッシュ表hに追加 */ void insert(int x) { int i = hash(x); while (h[i] != EMPTY) { i = (i + 1) % B; } h[i] = x; } /* 要素xをハッシュ表hから削除(xがhにない場合は考えなくて良い) */ void delete(int x) { int i = hash(x); while (h[i] != x) { i = (i + 1) % B; } h[i] = EMPTY; } /* 要素xがハッシュ表hにあれば1を、なければ0を返す */ int member(int x) { int i = hash(x); while (h[i] != x) { if (h[i] == EMPTY) return 0; i = (i + 1) % B; } return 1; }