【问题标题】:Distance between two strings [closed]两根弦之间的距离[关闭]
【发布时间】:2013-02-14 16:49:18
【问题描述】:
我不相信标准库提供任何东西来计算两个字符串之间的距离,而且我似乎在 Boost StringAlgo 中找不到任何东西。那么,还有其他我可以使用的库吗?
我对算法不太挑剔。 Jaro-Winkler 很好,Levenshtein 也很好,我愿意接受建议,我不想编写已经有人编写过的代码..
【问题讨论】:
标签:
c++
string
algorithm
distance
【解决方案1】:
您没有使用实际距离度量来定义您的问题,所以我认为它只需要满足“Metric (mathematics)”中的条件:
集合 X 上的度量是一个函数(称为距离函数或简称为距离)
d : X × X → R
(其中 R 是实数集)。对于X中的所有x、y、z,该函数需要满足以下条件:
- d(x, y) ≥ 0(非负性或分离公理)
- d(x, y) = 0 当且仅当 x = y(不可分辨的同一性,或巧合公理)
- d(x, y) = d(y, x)(对称)
- d(x, z) ≤ d(x, y) + d(y, z)(次可加性/三角不等式)。
假设我们这样定义d:
{ 0 if x = y
d(x, y) = {
{ 1 otherwise
所以前三个条件都满足了:
d(x, y) ≥ 0
d(x, y) = 0 iff x = y
-
d(x, y) = d(y, x) = 0 for x = y 和 d(x, y) = d(y, x) = 1 for x ≠ y
对于最后一个条件,有两种情况:
-
d(x, z) = 0。右侧唯一可能的值是0、1 和2,其中任何一个都可以满足条件。
-
d(x, z) = 1。假设右手边不大于或等于一。这意味着它必须为零。那么右侧的两个术语都必须是0,这意味着x = y 和y = z。第二个条件表示x = z,这反过来又表示d(x, z) = 0。这是一个矛盾,所以右手边必须大于或等于一。
那么我们可以将度量定义为:
int d(std::string x, std::string y) {
if (x == y) {
return 0;
} else {
return 1;
}
}
【解决方案3】:
你可以试试SimString。
SimString 是一个用于快速近似字符串检索的简单库。
近似字符串检索在数据库中查找字符串
与查询字符串的相似度不小于阈值。发现
不仅相同而且相似的字符串,近似字符串检索
具有多种应用,包括拼写纠正、灵活
字典匹配、重复检测和记录链接。
SimString 支持 cosine、Jaccard、dice 和重叠系数作为
相似性度量。 SimString 使用字母 n-gram 作为特征
计算字符串相似度。
或者SimMetric 库。
SimMetrics 是一个相似度度量库,例如从编辑距离的
(Levenshtein、Gotoh、Jaro 等)到其他指标(例如 Soundex、
查普曼)。由 (AKT) 资助的英国谢菲尔德大学提供的工作
IRC 由 EPSRC 赞助,授权号 GR/N15764/01。
或者 libdistance 库,它实现了 Levenshtein、Dameru、Needleman-Wunsch、Hamming、Bloom Filter、Jaccard 和 Minkowski 距离。
Phonetic algorithms 也可能感兴趣。