python - 为什么 peak1d 不会错过峰值(如果存在)?

标签 python algorithm proof

我在here中看到了peak1d算法和 Peak finding algorithm .

我不明白为什么它一定会找到峰值(如果存在)。似乎我们决定去一半,而另一半可能会错过一个高峰。我不明白你怎么可以对随机数组应用“二进制搜索”技术(该数组没有先验属性)。

我如何证明如果在 a 中至少有一个峰,以下算法将找到其中一个峰

import random
a = [random.randint(0,100) for i in xrange(10)]

def peak1d(a,i,j):
    m = (i+j)/2
    if a[m-1] <= a[m] >= a[m+1]:
        return m
    elif a[m-1] > a[m]:
        return peak1d(a,i,m)
    elif a[m]<a[m+1]:
        return peak1d(a,m+1,j)


print a[peak1d(a,0,len(a))]

最佳答案

案例 1,a[m-1] <= a[m] >= a[m+1] , 我们有一个峰值。

案例 2,a[m-1] > a[m] ,假设我们沿着列表走,向左走。我们可能会在一段时间内找到越来越高的元素,但最终会发生以下两种情况之一:

  1. 我们找到一个小于或等于我们刚刚查看的元素的元素。那么刚刚过去的那个就是一个峰顶。

  2. 我们点击了列表的开头。那么第一个元素就是峰。

因此,列表的前半部分在某处有一个峰值,我们可以只看那一半。我们不需要考虑下半场。

情况 3 等同于情况 2。我们只需要考虑列表的后半部分,同理。

请注意,您对寻峰算法的实现是错误的。它没有正确处理列表的端点。

关于python - 为什么 peak1d 不会错过峰值(如果存在)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23004137/

相关文章:

java - 通过 java 中的继承为不同的实现重用算法逻辑

proof - 未能细化任何待定目标

Coq 计算风格双条件链

python - 将所有列从 int64 转换为 int32

python - IRR 库仅适用于支付期和复利期以年为单位的情况(工程经济)

python - 在 Python 中包装多行字符串(保留现有的换行符)?

algorithm - 如果一个节点等于二叉搜索树中的父节点,我们将它放在哪一边

python - Seaborn 联合图,绝对轴标签未偏移

c - 在替换从文本文件中读取的单词的程序中,如何解释不同的单词长度?

algorithm - Codeforces问题: Boxers (rated 1500)正确性证明