搜索已整理的整数数组

时间:2010-09-16 21:03:16

标签: algorithm search performance

有没有一种简单的方法来搜索这样的数组?以下是一些例子:

5 6 7 8 19 45 21 32 40  // Rolled over at 7 th element
15 22 32 45 121 341 40  // Rolled over at 7 th element
1 22 32 45 121 341 400  // Rolled over at 0 th element

4 个答案:

答案 0 :(得分:6)

在最坏的情况下,找到“翻转”点的任何算法都至少具有O(n)复杂度。

想象一下,你已经对数组进行了排序并检查了少于n个元素。例如,如果在数组1 2 3 4 5 6 7 8 9 10中没有检查元素4,我可以用100替换它并创建“翻转”(1 2 3 100 5 6 7 8 9 10)。你的算法不会知道,因为它从未读过这个元素。

因此,您唯一的选择是遍历所有元素,直到找到翻转为止。

感谢 Eyal Schneider 提供有用的评论。

顺便说一句,我是唯一一个不理解“翻转”这个词的词源的人吗?

答案 1 :(得分:4)

如果您要进行多次搜索,可以使用线性搜索进行一次预处理过程,以获取所有翻转位置的索引,然后在每个区域内进行二进制搜索。

但如果你只想搜索一次,我认为你必须进行线性搜索。所以无论哪种方式都涉及线性搜索。

如果您使用“查找翻转优先”技术,并且您知道只有一个翻转点,则只要找到该点,就可以至少挽救该线性搜索。

答案 2 :(得分:2)

答案 3 :(得分:0)

将您的数组视为数学函数,您想要的是函数的局部最大值。虽然我没有足够的知识来解释,但您可能想要对Hill Climbing进行一些研究。使用一些启发式方法,您可以更有效地找到本地最大值。