在已移动的排序数组中找到一个元素[重复]
Posted
技术标签:
【中文标题】在已移动的排序数组中找到一个元素[重复]【英文标题】:finding an element of in a sorted array thats shifted [duplicate] 【发布时间】:2010-06-02 21:20:03 【问题描述】:可能重复:Searching a number in a rotated sorted Array
假设原始列表是 1 2 3 4 5 6 7 8 9 10
然后你移动它,让它变成
5 6 7 8 9 10 1 2 3 4
所以说我想检查 7 是否在数组中。我将如何有效地做到这一点。
【问题讨论】:
问:你有变速的控制权吗?你能缓存移动的元素数量吗?另外,原始列表是否总是排序的?最后,Set有可能吗? 什么语言?遍历它或使用内置函数,如 Collection.Contains(obj) 我们可以使用java。如果我们遍历列表,我们可以在 O(n) 中找到元素。有什么方法可以让我们做得更好。我们不知道一开始转移了多少。原件已排序。 欺骗:***.com/questions/1878769/… 【参考方案1】:使用三元搜索。它的工作原理类似于二分搜索(也以对数时间),但是当序列形状像楔形 (/) 或 vee (/) 时,您可以找到元素。
【讨论】:
【参考方案2】:使用二进制搜索的变体来查找数组中元素小于前一个元素的点;这确定了换档点。现在将数组分成两半,然后在包含您要搜索的元素的任何一半中进行二分搜索。
【讨论】:
如何使用二分查找在数组中找到这样一个移位点? @Michał Trybus,很难用几句话来解释。您正在寻找数组中小于array[0]的最小值,这需要在每次测试后更改测试条件并调整范围。【参考方案3】:取消移动列表(无论是物理上的,还是仅仅通过查找逻辑),然后进行二分搜索?
【讨论】:
你怎么知道你必须换班到什么时候?以上是关于在已移动的排序数组中找到一个元素[重复]的主要内容,如果未能解决你的问题,请参考以下文章