【发布时间】:2020-04-27 12:24:06
【问题描述】:
这周我开始了 MIT OCW 6.006 讲座,在第一堂课中教授介绍了寻峰算法。
根据他的定义:
[a b c d e f g h i]
1 2 3 4 5 6 7 8 9
a-i 是数字当且仅当 b ≥ a 且 b ≥ c 时,位置 2 才是峰值。如果 i ≥ h,则位置 9 是一个峰值
他提出这个算法来提高它的复杂度:
If a[n/2] < a[n/2 − 1] then only look at left half 1 . . . n/2 − − − 1 to look for peak
• Else if a[n/2] < a[n/2 + 1] then only look at right half n/2 + 1 . . . n to look for peak
• Else n/2 position is a peak: WHY?
a[n/2] ≥ a[n/2 − 1]
a[n/2] ≥ a[n/2 + 1]
但是,如果我有这个示例数组怎么办:
[9,8,7,6,5,2,3,1]
算法会这样工作:
第 1 步:a[n/2] 6 是的,看左半边 [9,8,7,6]
第 2 步:a[n/2] 8 是的,看左半边 [9,8]
第三步:???
虽然有一个峰值,但不会找到峰值:[9,8,7,6,5,2,3,1]
我想我错过了一些东西,但我没有弄清楚。有人可以解释一下为什么它不起作用?
我找到了这个相关的问题,但没有答案:Peak finding algorithm
【问题讨论】:
-
在您的示例中,峰值为 9。该算法假设存在一个峰值。
-
他假设只有尾部可以是峰。 “当且仅当 b ≥ a 且 b ≥ c 时,位置 2 才是峰值。如果 i ≥ h,位置 9 才是峰值”。他没有说“如果 a ≥ b,位置 1 是一个峰值”。
-
是的,但我认为这只是一个疏忽。该算法正在检查斜率,并朝着增加值的方向移动。所以它会在数组的两端找到一个峰值。
-
算法 确实 似乎对像 [1,2,2,2,2,3] 这样的数组有问题,因为它会声明 2 是一个峰值,当不是。
标签: algorithm language-agnostic