だから私は衝突のないハッシュ関数 (非常に単純なもの) を持っていますが、なぜこのような衝突のないハッシュ関数が使用されないのか疑問に思っています。スペースを取りすぎているのが原因かと思いますが、本当の答えを知りたいです。
関数は次のとおりです。
n+1 文字 ß n ß n-1 ... ß 1 ß 0で構成される単語 w がある場合、ハッシュ関数を定義します。
H(w) = 26 n * ß n + 26 n-1 * ß n-1 + ... + 26 * ß 1 + ß 0 .
ここで、たとえば、a = 1、b = 2、c = 3、...、z = 26 です。
この関数は、文字列と整数の間の 1 対 1 のマッピングを定義するため、衝突はありません。
もちろん問題は、単語の長さが長くなると、ハッシュ コードが非常に大きくなることです。
これに対する可能な解決策は次のとおりです: 長い単語を分割し、各ハッシュ コードをベクトルにし、2 番目の要素が単語の残りの部分を指すようにします (2 つ以上に分割された場合、単語の別の部分を指すことができます)。一度)。
私の質問は、なぜこれが実装されていないのですか? メモリの余分なコストは、衝突を回避する価値がありませんでしたか? この方法は別の理由で不十分であることがわかりましたか?このようにしようと考えるのは私が最初ですか?(最後のものについては冗談です。)