SO に関する別の質問では、一部の言語で、文字列をハッシュしてテーブル内で高速に検索できるようにする機能が取り上げられました。この 2 つの例は、.NET の Dictionary<> と Python の {} ストレージ構造です。他の言語は確かにそのようなメカニズムをサポートしています。C++ にはそのマップがあり、LISP にも同等のマップがあり、他のほとんどの最新の言語と同様です。
文字列のハッシュ アルゴリズムは一定時間内に実行できるという質問への回答で、プログラミングで 25 年の経験を持つ 1 人の SO メンバーが、あらゆるものを一定時間内にハッシュできると主張することで争われました。私の個人的な主張は、特定のアプリケーションが文字列の長さに境界を設定しない限り、これは正しくないということです。これは、定数 K によって文字列の最大長が決まることを意味します。
私は演算にハッシュ関数を使用する Rabin-Karp アルゴリズムに精通していますが、このアルゴリズムは使用する特定のハッシュ関数を指示しません。著者が提案したのは O(m) で、m は長さです。ハッシュされた文字列。
いくつかのハッシュ アルゴリズムを表示するこのページ ( http://www.cse.yorku.ca/~oz/hash.html )などの他のページをいくつか見ますが、それぞれが文字列の全長にわたって繰り返されるようです。その値に到達します。
この件に関する私の比較的限られた読書から、文字列型のほとんどの連想配列は、実際には、フードの下で何らかのツリーで動作するハッシュ関数を使用して作成されているようです。これは、キー/値ペアの値要素の場所を指す AVL ツリーまたは赤/黒ツリーの場合があります。
このツリー構造でも、n をツリーの要素数として theta(log(n)) のオーダーを維持するには、一定時間のハッシュ アルゴリズムが必要です。それ以外の場合は、文字列を反復処理するという追加のペナルティがあります。多くの文字列を含むインデックスの場合、theta(m) は theta(log(n)) によって隠されますが、検索対象のテキストが非常に大きくなるようなドメインにいる場合は無視できません。
接尾辞ツリー/配列と Aho-Corasick を使用すると、検索を theta(m) まで下げてメモリをより多く消費できることを認識していますが、任意の長さの文字列に対して一定時間のハッシュ メソッドが存在するかどうかを具体的に尋ねています。他の SO メンバーによって主張されました。
ありがとう。