アナグラムの文字列をテストする際の高速化動作を高速化するために、私は素数ベースのハッシュ スキームを思いつきました。
基本的な考え方は、文字を素数にマッピングし、これらの素数の積を計算することです。文字を並べ替えても結果は同じになり、結果が任意に大きくなる可能性がある場合、他の文字の組み合わせで同じ結果が得られることはありません。
私は当初、これを単なるハッシュとして想定していました。最終的に、製品はオーバーフローし、他の文字の組み合わせにエイリアスを設定し始めます。ただし、最も頻繁に使用される文字を最小の素数にマッピングすることにより、積はゆっくりと成長し、多くの場合、オーバーフローを完全に回避できます。この場合、完全なハッシュが得られ、追加のテストなしで明確な肯定的な結果と否定的な結果の両方が得られます。
注目に値するのは、オーバーフローする前にコーディング スペースを非常に効率的に埋めないことです。素因数が 103 を超える結果はありません。小さな素数の分布は固定されており、必ずしも文字の頻度と完全に一致するとは限りません。
今、これよりもはるかに優れたものがあるかどうか疑問に思っています。完全なハッシュでより多くの結果をカバーし、残りのケースで強力な分布を持つもの。
私が考えることができる最も高密度のコーディング スキームは、文字を並べ替えてから、エントロピー コーダーを使用して単語にパックすることです。このスキームでは、各位置に範囲制約が適用されるため、文字の頻度は明らかに非常に偏っています (たとえば、z で始まる並べ替えられた配列の可能性は、az で終わる並べ替えられた配列の可能性よりも大幅に低くなります)。
しかし、それは大変な作業のように聞こえますが、オーバーフローの場合に適切な分散が保証されるとは思えません。
おそらく、文字をマッピングするためのより良い一連の要因と、エイリアシングのリスクがいつ開始されたかを検出するより良い方法があるでしょう. または、乗算に依存しないハッシュ方式ですか? 計算しやすいもの?
だから〜だ:
- 可能な限り多くの現実世界の入力に対する完全なハッシュ (適切な数のビット)。
- 2 つのケースを区別する手段を備えた、残りのケースの強力なハッシュ。
- 簡単に計算できます。
英語の制約 (典型的な英語のような単語構造を持つ 26 文字) は問題ありません。マルチバイトコーディングスキームは、まったく別の問題です。
私はそれを理解しているので、Cコードが好まれます。