匹配地图中的近似字符串键

时间:2012-03-20 12:04:43

标签: map string-matching

有没有人知道是否有一种很好的方法来创建一个从字符串到字符串的具有近似字符串键的映射?也就是说,如果我执行以下操作:

map.put("Fuzzy", "string")
map.put("Fuzy", "bear")

我希望生成的地图为:

[ "Fuzzy":{ "string", "bear" } ]

(可能还有一些东西要注意“熊”来自“Fuzy”,但这是次要问题)。当然,字符串之间的近似量(距离)可能是一个参数。在这种情况下,距离为1,但可能更多或更少。

据我所知,Trie可能是一个很好的起点,但我不想实现某些东西,并且发现它已经完成了。

当然,天真的解决方案只是循环遍历地图中的所有键,但我希望效率高于此。

谢谢!

3 个答案:

答案 0 :(得分:1)

我建议您实施hashCodeequals功能,以便它们返回您在地图中存储的Soundex个对象。

然后你应该能够很快地查找单词。

更新:我刚注意到,看起来我们正在谈论python:所以你必须覆盖__hash__函数AFAIK(在{{3}上也有一个好帖子})

答案 1 :(得分:1)

这是一个FuzzyHashMap实现,虽然我没有尝试过:

http://sourceforge.net/projects/fuzzyhashmap/

以及看起来相关的BK-Tree的实现:

https://code.google.com/p/java-bk-tree/

答案 2 :(得分:0)

我有类似的要求,所以我实现了自己的HashMap。

根据我的要求,插入时键很精确,但搜索字符串中可能存在错误。

我的哈希函数:

哈希码的第一部分存储密钥的长度 hashcode的第二部分存储密钥的所有字符的总和

这两个部分的位宽是固定的。因此,对于给定的密钥长度,我们每个都获得一个桶。 第一个存储桶存储长度为1的密钥, 第二个存储桶存储长度为2的密钥, 等等

现在调用find()时 1.它检查完全匹配。如果找到,返回。否则,转到下一步。 2.存在三种错误可能:一个扭曲的字符,一个缺少的字符,一个额外的字符 3.检查扭曲的字符。扭曲不会改变长度,所以我们需要搜索同一个桶。如果一个字符被扭曲,则哈希值可以通过最大值MAX_CHAR_CODE增加或减少。因此,从预期的哈希码的位置,向后和向前搜索MAX_CHAR_CODE索引。大多数值都是NULL。找到非NULL值时,比较键,同时允许一个char的失真。 4.检查缺少的字符。如果缺少char,则新密钥长度将小于实际密钥长度。所以我们需要在下一个桶中搜索。哈希码的总和部分将减少最大MAX_CHAR_CODE。因此,从下一个存储桶中的当前位置进行搜索,MAX_CHAR_CODE会向前移动。找到非NULL值时,比较键,同时允许一个缺少的char。 5.额外的char。非常类似于4.