我有一个巨大的字符串列表,大约有15万个,长度从16到18。我想从列表中搜索最近的字符串。随着列表变大,BKTree数据结构变慢。我想知道任何更好的数据结构,以促进这个大型列表,并提供最近的字符串搜索?
方法:我尝试将字符串聚类成组,并使用集群的根条构建树。但速度仍然不够,因为我有大量的搜索查询。后缀树不利于我需要搜索字符串,例如最大距离为3左右。
更新:字符串非常相似。字符串由具有n个滑动窗口长度的长序列生成。 因此,一个字符串的后缀将是另一个字符串的前缀。
答案 0 :(得分:1)
如果您的最大距离为3,那么您可以确保您的字符串具有至少4个字符的相同运行。
您可以散列长度为4的每个段,并检查每个段是否都在数据集中表示。选择存在但具有最小内容的,并在该池中搜索BKTree。如果您的数据集本身不是高度自冗余的,那么这将大大减少您需要执行的搜索范围。 (一般来说,你需要像以前一样在BKTrees中保留15倍的条目,所以这需要一些维护费用。)
我不确定这个初始查找步骤是否足够便宜,值得后期改进;这在很大程度上取决于150k字符串的结构,以及输入字符串是否可能与其中一个字符串匹配,或者您是否有很多未命中。
另一种方法是使用lernmatrix-style encoding字符串并找到最近的直通模式完成。由于你需要一个大的矩阵来存储它(可能是大约4M个元素),所以我不愿意为速度推荐这个。所有矩阵乘法都需要几毫秒。 (你必须以对Levenstein编辑强有力的方式对字符串进行编码,例如通过在相邻字符上使用增量;这将花费不可忽略的工作量来完成工作。)