在数组中找到具有模式的最少元素

时间:2011-09-28 18:25:55

标签: algorithm divide-and-conquer

给出一个数组,使其元素的值从第0个索引增加到某个( k -1)索引。在 k 处,该值最小,并且通过 n 元素再次开始增加。找到最小元素。

基本上,它的一个排序列表附加到另一个;例如:(1,2,3,4, 0 ,1,2,3)。

我尝试过各种算法,例如buliding min-heap,quick select或者只是普通的遍历。但不能低于O(n)。但是这个数组中有一个模式,建议二进制搜索类型的东西应该是可能的,复杂性应该像O(log n),但是找不到任何东西。 思绪??

由于

4 个答案:

答案 0 :(得分:4)

否掉落可以在任何地方,没有结构。

考虑极端情况

1234567890
9012345678
1234056789
1357024689

它减少到找到最小元素。

答案 1 :(得分:1)

对范围递减进行广度二分搜索,在二进制分割处使用单元素重叠。换句话说,如果您有17个元素,则比较元素

0,8
8,16
0,4
4,8
8,12
12,16
0,2
2,4

等,寻找左元素大于右边的情况。

找到这样的范围后,递归,在该范围内进行相同的二分查找。 重复,直到找到减少的相邻对。

平均复杂度不小于O(log n),最坏情况为O(n)。任何人都可以获得更严格的平均复杂度估计吗?它似乎大致在“O(log n)和O(n)之间”,但我不知道如何评估它。它还取决于从一个成员到下一个成员的值范围和增量大小的任何其他约束。

如果元素之间的增量始终为1,则存在O(log n)解。

答案 2 :(得分:1)

不能少于O(n)。

这种最糟糕的情况总会让我们感到不安 -

增加清单 a1,a2,a3 .... ak,ak + 1 ... an

只有一个偏差ak<例如ak-1 1,2,3,4,5,6,4,7,8,9,10

所有其他数字绝对没有关于'k'或'ak'

的价值的信息

答案 3 :(得分:0)

最简单的解决方案是只需向前看列表,直到下一个值小于当前值,或向后查找大于当前值的值。那是O(n)。

同时执行两者仍然是O(n)但运行时间可能会更快(取决于复杂的处理器/缓存因子)。

我认为你不能比O(n)更快地获得它,因为许多分而治之的搜索算法都依赖于排序数据集。