有没有一种简单的方法来搜索这样的数组?以下是一些例子:
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
答案 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进行一些研究。使用一些启发式方法,您可以更有效地找到本地最大值。