【问题标题】:BK - Tree Search AllBK - 树搜索所有
【发布时间】:2017-08-26 21:39:40
【问题描述】:

BK Trees (Burkhard-Keller Trees) 与模糊字符串搜索相关联(例如拼写检查、单词推荐)。并且所有的 BK Trees 搜索算法都与explained here 相同。目的是返回,例如,"seek" and "peek" if I search for "aeek"

现在,我的问题是,我正在尝试使用这种模糊字符串搜索算法从给定的字典中搜索所有相似的项目。例如,给定一个单词“seek”,我想在字典中找到所有相似的单词,例如“peek”、“geek”、“seat”等。但是我发现BK Trees searching algorithm that everyone uses 不是为此而设计的。

看看我的sample test result here。我发现the dictionary will be different if the feeding words order is different, thus the search result can be different as well

我想要的是,使用我上面的sample test,给定四本 Python 书籍中的任何一本,SearchAll 函数将始终返回这四本 Python 书籍,尽管字典的构建顺序或搜索顺序是完毕。

但是,我尝试了很多方法,但都失败了(例如,this is one of them)。现在我举手寻求帮助。一个伪代码或通用算法描述就可以了。谢谢。

【问题讨论】:

  • @templatetypedef?
  • @Duck,你能帮忙吗?

标签: algorithm search data-structures fuzzy-search bk-tree


【解决方案1】:

bktree.go 的 77106 行有整数溢出:

k := d - r

由于dr的类型是uint8k的类型也是uint8,所以当d < rk最终大于d + r,并且下一个循环不执行。

你可以这样修复它:

k := int16(d) - int16(r)
max_k  := int16(d) + int16(r)
if k < 1 {
    k = 1
}
for ; k <= max_k; k++ {
    ...
}

【讨论】:

  • 实际上,这不会发生,如github.com/go-dedup/simhash/blob/master/sho/bktree.go#L73-L74 行,即在第 77 行和第 106 行时,d 将是 &gt;= r。但是感谢您花时间研究它!
  • 我用调试器完成了它,它确实发生在106 行上。而且,修复后ExampleSearch_filesAExampleSearch_filesBExampleSearch_filesS都输出相同的结果。
  • 哦,那里!多谢!顺便说一句,您使用什么调试器?
  • @xpt 我使用的是 JetBrains Gogland。
  • 感谢@user3290797,对不起,我只能投票,因为我仍然希望有一个SearchAll 函数可以始终为每个人返回四本Python书籍。
猜你喜欢
  • 1970-01-01
  • 2017-07-03
  • 1970-01-01
  • 1970-01-01
  • 2012-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多