【发布时间】:2012-12-26 06:52:50
【问题描述】:
我不想直接解决这个问题的根源,但这是link:
所以我接收字符串并将它们添加到后缀数组中,该数组在内部实现为排序集,然后我获得的是两个给定字符串的字典排序列表。
S1 = "banana"
S2 = "panama"
SuffixArray.add S1, S2
为了高效搜索k-th 最小子字符串,我对这个排序集进行了预处理,以添加有关后缀与其前身之间最长公共前缀的信息,并密切关注累积子字符串计数。所以我知道对于给定的k 大于最后一项的累积子字符串计数,这是一个无效的查询。
这对于问题定义中给出的约束的小输入和随机大输入非常有效,最多有 50 个长度为 2000 的字符串。我能够通过 7 个案例中的 4 个,并且非常惊讶我没有得到它们。
所以我去寻找瓶颈,它击中了我。给定大量这样的输入
anananananananana.....ananana
bkbkbkbkbkbkbkbkb.....bkbkbkb
对第 k 个最小子字符串的查询仍然像预期的那样快 但不是我预处理排序集的方式...我计算集合元素之间最长公共前缀的方式是效率不高且线性 O(m),像这样,我做了最天真的事情,期望它足够好:
m = anananan
n = anananana
Start at 0 and find the point where `m[i] != n[i]`
之所以这样,是因为后缀和他的前身可能没有关系(即来自不同的输入字符串),所以我想我只能使用蛮力。
这是当时的问题以及我最终将问题减少到的地方。给定一个按我上面描述的方式按字典顺序排序的后缀列表(由多个字符串组成):
什么是计算最长公共前缀数组的有效方法?。
接下来的子问题是,我的方法是否完全不合时宜?如果是这种情况,请提出进一步的调查途径。
脚注,我不想看到已实现的算法,我不介意被告知去阅读有关该主题的某某书籍或资源,因为无论如何我在尝试这些挑战时都会这样做.
接受的答案将引导我走上正确的道路,或者在失败的情况下;教我如何在更广泛的意义上解决这些类型的问题的东西,一本书或其他东西
【问题讨论】:
标签: string algorithm similarity suffix-array