mid
设置为什么?顺便说一下,我的算法在最大值在两端时也适用。也许你误解了它的实现方式。 - גלעד ברקןceil[O(logn)]
个索引,因此应选择二分搜索的变体。left := 0
right := n - 1
while left < right do
mid := left + (right - left) / 2
if values[mid] > values[mid + 1]
right := mid
else
left := mid
end
print left
然而,要在非凸形状的图形中找到最大或最小点,三分搜索 是最好的选择。但是,三分搜索基于一些非整数评估函数来削减空间,这不适用于整数。
如果您不需要精确结果,接受近似结果,则也可以尝试使用三分搜索。
[0,1,0,0,0,0,0]
时返回了错误的结果。 - גלעד ברקןdef search(f, begin, end):
if end - begin <= 3:
return max(map(f, range(begin, end)))
low = (begin * 2 + end) / 3
high = (begin + end * 2) / 3
if f(low) > f(high):
return search(f, begin, high - 1)
else:
return search(f, low + 1, end)
low
和high
的表达式以更好地匹配实际数据。k
。也就是说,对于 k = 2
,它是二分查找,对于 k = 3
,它是三分查找,对于更高的 k
值,它只是查看更靠近 begin
和 end
边界的值。此外,对于近似测量,它还可以实现检查 abs(f(low) - f(high))
是否小于某个值,如果是,则将 low
和 high
都作为 begin
和 end
值。但在我的情况下,这并不是真正必要的。 - Yeti
f(x)
,对于给定的x
值进行测量。这类似于具有离散值输入数组x
和输出数组以获取结果的情况。你为什么问呢? - Yeti