部分文字列が必要な場合は、トライまたはパトリカトライが出発点として適している可能性があります。
順序を気にせず、各記号または文字の数だけを気にする場合は、すべての文字列のヒストグラムを計算し、それらを入力のヒストグラムと比較します。
ABCDEFGHIJKLMNOPQRSTUVWXYZ
Hello World => ...11..1...3..2..1....1...
O(26 * m + n)
大文字と小文字を区別しないラテン文字のみを考慮する場合、これによりコストが削減され、前処理が 1 回行われます。
m が定数の場合、正規化することにより、ヒストグラムを 26 次元単位球上の 26 次元ベクトルとして解釈できます。次に、2 つのベクトル間の角度のコサインを生成する 2 つのベクトルの内積を計算するだけで、この値は文字列の類似度に比例するはずです。
、サイズ 3 のみm = 3
のアルファベット、および次の文字列のリストを想定します。A = { 'U', 'V', 'W' }
L = { "UUU", "UVW", "WUU" }
ヒストグラムは次のとおりです。
H = { (3, 0, 0), (1, 1, 1), (2, 0, 1) }
ヒストグラムは、ヒストグラムのユークリッド ノルム、つまり に正規h = (x, y, z)
化されh' = (x/r, y/r, z/r)
ます。r
h
r = sqrt(x² + y² + z²)
H' = { (1.000, 0.000, 0.000), (0.577, 0.577, 0.577), (0.894, 0.000, 0.447) }
入力S = "VVW"
には、ヒストグラムhs = (0, 2, 1)
と正規化されたヒストグラムがありhs' = (0.000, 0.894, 0.447)
ます。
h1 = (a, b, c)
これで、2 つのヒストグラムの類似性をh2 = (x, y, z)
、両方のヒストグラムのユークリッド距離として計算できます。
d(h1, h2) = sqrt((a - x)² + (b - y)² + (c - z)²)
取得した例について。
d((3, 0, 0), (0, 2, 1)) = 3.742
d((1, 1, 1), (0, 2, 1)) = 1.414
d((2, 0, 1), (0, 2, 1)) = 2.828
したがって、「UVW」は「VVW」に最も近いです (数字が小さいほど類似性が高いことを示します)。
正規化されたヒストグラムを使用するh1' = (a', b', c')
とh2' = (x', y', z')
、両方のヒストグラムの内積として距離を計算できます。
d'(h1', h2') = a'x' + b'y' + c'z'
取得した例について。
d'((1.000, 0.000, 0.000), (0.000, 0.894, 0.447)) = 0.000
d'((0.577, 0.577, 0.577), (0.000, 0.894, 0.447)) = 0.774
d'((0.894, 0.000, 0.447), (0.000, 0.894, 0.447)) = 0.200
ここでも、「UVW」が「VVW」に最も近いと判断されます (数値が大きいほど類似性が高いことを示します)。
どちらのバージョンでも数値は異なりますが、結果は常に同じです。たとえば、マンハッタン距離 (L1 ノルム) など、他のノルムを使用することもできますが、有限次元ベクトル空間のノルムはすべて同等であるため、これは数値のみを変更します。