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

Map 匹配地图中的近似字符串键,map,string-matching,Map,String Matching,有人知道有没有一种好方法可以创建一个字符串到另一个字符串的映射,该映射具有近似的字符串键?也就是说,如果我执行以下操作: map.put("Fuzzy", "string") map.put("Fuzy", "bear") 我希望生成的映射为: [ "Fuzzy":{ "string", "bear" } ] (其中可能还有一些东西值得注意,“熊”来自“Fuzzy”,但这是次要问题)。当然,字符串之间的近似量(距离)可能是一个参数。在本例中,距离为1,但可以是更多或更少 据我所知,Trie可

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

map.put("Fuzzy", "string")
map.put("Fuzy", "bear")
我希望生成的映射为:

[ "Fuzzy":{ "string", "bear" } ]
(其中可能还有一些东西值得注意,“熊”来自“Fuzzy”,但这是次要问题)。当然,字符串之间的近似量(距离)可能是一个参数。在本例中,距离为1,但可以是更多或更少

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

当然,最简单的解决方案就是在地图上的所有关键点上循环,但我希望能有更好的效率


谢谢

我建议实现
hashCode
equals
函数,以便它们返回存储在地图中的对象的名称

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


更新:我刚刚注意到,看起来我们在谈论python:因此您必须重写
\uuuuhash\uuuhaik
函数(还有一篇很好的帖子)

下面是一个FuzzyHashMap实现,尽管我没有尝试过:

以及一个看起来相关的实现:


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

在我的要求中,插入时键是精确的,但搜索字符串中可能出现错误

我的哈希函数:

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

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

现在调用find()时, 1.它检查是否完全匹配。如果找到,请返回。否则,转到下一步。 2.存在3种可能的错误:扭曲的字符、丢失的字符和附加的字符 3.检查字符是否失真。扭曲不会改变长度,所以我们需要搜索同一个桶。如果一个字符被扭曲,则哈希值可以在MAX处增加或减少MAX_char_CODE。因此,从预期hashcode的位置,前后搜索MAX_char_CODE索引。大多数值将为空。当发现非空值时,比较键,同时允许一个字符的失真。 4.检查是否缺少字符。如果缺少字符,则新密钥长度将小于实际长度。所以我们需要在下一个桶中搜索。hashcode的和部分将减少max max_CHAR_CODE。所以从下一个bucket中的当前位置搜索,MAX_CHAR_CODE向前放置。当找到非空值时,比较键,同时允许缺少一个字符。
5.附加字符。与4非常相似。

我以前从未听说过Soundex-这是个好主意!我试试看。实际上,我使用的是Java,我很喜欢maps的Python输出。FuzzyHashMap的问题是,如果“fuzzness”出现在前四个字符中,它就不起作用了。它还具有Soundex功能,但这也存在同样的问题。虽然BK树看起来很有趣。