【发布时间】:2017-03-12 12:57:13
【问题描述】:
我们有一个未排序的数组,其中包含不同的条目 a_1, a_2, ... a_n,我们还知道一个移位数组 a_(nk), ...a_n, a_1, a_2, ... 我们的目标是找到给定这两个数组的位移 k。当然有一个最坏情况的线性算法 O(n)。但我们能做得比这更好吗?
提示答案与 k 分布有关。如果 k 在 0 和 n 之间均匀分布,那么我们必须在 O(n) 内完成。如果 k 以其他方式分布,可能会有更好的方式。
【问题讨论】:
-
@greybeard 这是个好主意。似乎 BM 算法可能在这里工作,如果 k 很小,那么仍然 O(k) 应该是答案。如果 k 很大(接近 n),那么我们可以尝试 BM 算法。例如,我们选择原始数组的第一个 n/7 条目作为匹配目标。我们预处理 n/7 数组:构建一个哈希表。由于每个条目是不同的,那么我们可以从匹配最后一个条目开始,如果最后一个条目不匹配并且在哈希表中不存在,我们可以跳转 n/7 数组。因此,对于较大的 k,我们可以找到 O(cn) 方法,但前因子 c 较小。
-
@greybeard 我们可以选择长度为sqrt(n),那么我们可能会得到O(sqrt(n))
-
(对于“随机”内容,您可能会得到 预期 o(n),但请尝试使用几乎所有相同的元素来了解最坏情况 .) 太复杂了——只需搜索移位数组中原始数组的前半部分 a₁…aₚ, p=n/2。 (好的,有类似奇数 n=2p+1(p:前缀/模式的长度)的尼特,在 p+1 处匹配:如果“其余”不匹配,则必须在 p+2 处处理可能的匹配”手动”。)
标签: arrays algorithm sorting complexity-theory