问题
我有2个字符串列表。我想从我的列表中找到最匹配的对。
例如,我有这两个列表:
list1 = {"a1","b1","c1"}
list2 = {"a2","b2","c2"}
我想得到以下结果:
results = {{"a1,"a2"}, {"b1,"b2"}, {"c1,"c2"}}
其他信息
为了比较2个字符串,我想使用与Levenshtein distance类似的东西。例如,当我将"a1"
与"a2"
进行比较时,它会使"a1"
与"b2"
的距离缩短,因此"a1"
+ "a2"
会被认为是更好的匹配。
当不同的对获得相同的距离结果时,我变得复杂。您不能只为list1
中的特定项目选择最小距离,因为list1
中的其他项目可以与list2
中的相同项目获得相同的距离。
问题
你有算法的建议吗?
我现在在哪里
你最好不要先看我的发现,这样你就不会受到我工作的影响。
我计算每对可能的字符串的Levenshtein距离,并将结果存储在一个二维数组中。然后我构建了一个单维数组,其中每个元素都有:
然后我使用distance元素对此数组进行排序。
最后,我浏览已排序的数组并一起解析具有共同距离的项目(所有距离== 0首先,然后所有距离== 1,等等...)。每次,我解析一个元素,我在我的2D数组中标记它,这样我就可以快速跳过已排序数组中已解析的项目。
我认为我可以比这个解决方案更好。它在时间和空间上可能不是最有效的。
答案 0 :(得分:2)
一旦确定了要用于跟踪两个字符串之间“距离”的度量标准,无论是Levenshtein距离还是另一个字符串,您都可以使用Hungarian algorithm来解决问题。
我个人从未实现它,但维基百科包含一些可能有帮助的链接。
答案 1 :(得分:0)
我建议对此进行优化:
I calculate the Levenshtein distance for each possible pair of string and store the results in a 2-dimension array.
是否可以通过考虑长度来避免为每个可能的字符串对计算距离。因为我们说:
1. if the pair is e.g. "ab", and "cdefg"
2. and you know that there's another string that has similar length with "ab" e.g. "xy"
然后你不需要计算“ab”和“cdefg”之间的距离。因为在这些长度的字符串之间可以得到的最小距离是3,而两个相等长度的字符串之间的最大距离(如示例中的“ab”和“xy”)将是2.
您可以使用更智能的数据结构来跟踪字符串的长度,例如C ++ 0x或tr1 C ++中的unordered_map<int, vector<string> >
。