下面是伪代码。在我看来,伪代码试图在元组列表中找到峰值元素及其索引。
我这边的输出是:[(1, 4), (4, -9), (7, 12), (9, -4)].
但我不知道
(9, -4)
怎么可能是答案?
array[N] # array of N integers, indexed 0 to N-1;
# assume it’s populated with [1,4,2,-2,-9,10,2,12,2,-4,-4,-4,-4,2,6,7]
peak = array[0]
index = 0
output = [] # array of tuples
For x in 1..N-1
if (array[x]*array[x-1] > 0)
if peak < 0 and array[x] < peak
peak = array[x]
index = x
if peak >= 0 and array[x] > peak
peak = array[x]
index = x
else
output.insert( (index, peak) )
peak = array[x]
index = x
end if
end for
return output
伪代码试图在元组列表中找到峰值元素及其索引
看起来可能是这样,但实际上并没有发生。示例输入具有输出中没有的其他局部极值。如果我们将局部极值(峰值)定义为数组中未被较大值和较小值包围的任何元素,则示例输入将具有这些局部极值:
[1, 4, 2, -2, -9, 10, 2, 12, 2, -4, -4, -4, -4, 2, 6, 7]
^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^
我们可以有不同的定义来排除第一个和最后一个元素,或者排除一系列重复值,但值 10、2 和 12 仍将被视为局部极值,但此伪代码不会输出这些值.
当符号从一个值变为下一个值时,伪代码将输出一对:然后输出的一对将代表前一部分同符号数中的峰值。由于在您的示例中输入符号更改了 4 次,因此预计输出中有 4 对。此外,如果输入仅包含负数或仅包含正数,则输出将为空。
符号的变化包括涉及零的情况。此外,该算法将 never 包括输出中的最后一个元素,但可以包括第一个元素。当您镜像输入时,它并不总是提供镜像输出。
例如,我们得到这些输出:
输入 | 输出 |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
我没有看到这个算法的实际用途,想知道它是否真的按照作者的意图去做。