Algorithm 在未排序的列表中查找序列

Algorithm 在未排序的列表中查找序列,algorithm,Algorithm,因此,我得到了一个包含n个不同元素的未排序列表A=(a1,a2,…,an)。我的目标是找到中间索引i(1首先,请注意,如果有三个元素a_i,a_j,a_k与i a_k,那么在i和k之间必须有一个峰值。证明很简单:介于a_i和a_k之间的最大值必须是峰值,不能是任何一个端点。 您可以使用此观察值在对数时间内解决此问题 我们将保留三个值:x,y,z,以便xa_z。在开始时,初始化x,y,z到0,(n+1)/2,n+1(条件将保持不变,因为a_0=a(n+1)=-inf) 现在考虑三元组(x,(x+y

因此,我得到了一个包含n个不同元素的未排序列表A=(a1,a2,…,an)。我的目标是找到中间索引i(1首先,请注意,如果有三个元素
a_i
a_j
a_k
i a_k
,那么在
i
k
之间必须有一个峰值。证明很简单:介于
a_i
a_k
之间的最大值必须是峰值,不能是任何一个端点。

您可以使用此观察值在对数时间内解决此问题

我们将保留三个值:
x,y,z
,以便
xa_z
。在开始时,初始化
x
y
z
0,(n+1)/2,n+1
(条件将保持不变,因为
a_0=a(n+1)=-inf

现在考虑三元组<代码>(x,(x+y)/ 2,y)<代码>,<代码>((x+y)/ 2,y,(y+z)/2)<代码>,代码>(y,(y+z)/2,z)< /代码>。这些三元组中的一个可以用作我们的下一个代码>(x,y,z)< /代码>。(证明很简单,但我会留给你们)。


这个过程将每次搜索的范围减半,当我们下降到一个小的间隔(比如说
z-x<5
)时,我们就会停止,此时峰值最多为1或2个元素。

这是否回答了您的问题?是的!这几乎是我的问题,但答案并没有说明算法在O(logn)中运行时间。另一件事是,我不知道zip函数在python中的作用。是的,我将收回我的投票。我想我知道如何解决这个问题,我将在这里回答。如果存在多个(不止一个)怎么办峰值?这个问题看起来是leetcode 162,我明白了。所以基本上我们要用x,y和z来进行分治,其中x,y和z将表现为左,右和中间点。我想对了吗?是的,对了。唯一令人惊讶的是,通常在分治中我们会去中间点的左边或右边,但是我在这个算法中,我们也可以取中间的第三个。我想我已经掌握了窍门。非常感谢!我会记下你的答案。