下面是伪代码。在我看来,这是伪代码试图找到峰值元素以及它们在元组列表中的索引。
我最终的输出是:[(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对。此外,如果输入只包含负数或只包含严格的正数,则输出将为空。
符号的改变包括涉及到零的情况。此外,算法将永远不会包括输出中的最后一个元素,但可以包括第一个元素。当您镜像输入时,它并不总是给出镜像输出。当你只是给所有数组值添加一个常量时,它并不总是给出相同的峰值数量(因为这可能会改变数字的符号)。
例如,我们得到这些输出:[0,0,0,0]
[(0,0),(1,0),(2,0)]
[1,1,1,1]
[]
[-1,0,1,2]
[(0,-1),(1,0)]
[2,1,0,-1]
[(0,2),(2,0)]
[0,1,0,1]
[(0,0),(1,1),(2,0)]
[1,2,1]
[]
[-3,-2,-1,0,1,2,3,2,1,0,-1,-2,-3]
[(0,-3),(3,0),(6,3),(9,0)]
[1,2,3,4,3,2,1,2,3,4,3,2,1]
[]