我必须在C ++中为max
函数实现一个分而治之的算法,该函数返回数组中的最大值。我理解算法并且已经设计了这个函数,但是我遇到了数组索引的问题。
在伪代码中,这是我的功能:
def max(array, startIndex, endIndex)
// if there is only one element, return it
if startIdx = endIdx
return array[startIdx];
leftHigh = max(array, startIdx, endIdx/2);
rightHigh = max(array, endIdx/2 + 1, endIdx);
return maximum of leftHigh and rightHigh;
但是,我遇到了递归调用参数的这些值的问题。以下段落演示了我在精神上逐步完成算法时发现的内容:
最简单的情况是一个包含4个元素的数组。第一次调用max
将获取索引参数0, 3
,并使用参数0, 1
和2, 3
进行调用。第一次递归调用将导致0, 0
和1, 1
的调用将正确终止。但是,第二次递归调用将导致使用2, 1
和2, 3
进行调用。第一个最终导致超出数组边界,第二个导致无限循环,因为这些参数已被使用。
我曾尝试弄乱它,例如使用(startIdx, endIdx/2 -1)
作为第一个边界,使用(endIdx/2, endIdx)
作为第二个边界,这解决了递归调用的第二个分支但是弄乱了第一个。
有没有办法找到这些指数导致正确的行为?我很感激帮助。
答案 0 :(得分:1)
应该是
leftHigh = max(array, startIdx, (startIdx + endIdx)/2);
rightHigh = max(array, (startIdx + endIdx)/2 + 1, endIdx);
答案 1 :(得分:1)
如果我给你两个数字:a< c,那么你将如何描述两者之间的任何数字。 I.E,当a<时,我们能说什么呢? b< c?
a < b < c
0 < b - a < c - a
你正在选择b = c / 2。我们可以看到在某些情况下只符合上述标准:
b = c / 2
and b > a
then c / 2 > a
因此,我们可以看到您的方法与&gt;一样长。 C / 2。在您的情况下a = startIdx和c = endIdx,因此您的算法仅适用于startIdx&lt; endIdx / 2。
仔细考虑这一发现:
a < b < c
0 < b - a < c - a (subtract a from all parts)
如果b介于a和c之间,那它的价值是多少?在这种情况下,(b-a)如何与(c-a)相关?
答案 2 :(得分:0)
Python中的建议解决方案:
from math import floor, ceil
def maximum(arr, left, right):
if left >= right:
if left < len(arr):
return arr[left]
else:
return arr[right]
else:
left = maximum(arr, left, int((left+right)/2)) # pay attention to the midpoint!
right = maximum(arr, int((left+right)/2), right)
return max(left, right)
print maximum([1,8,2,9,3,15,5,3,2], 0, 8)
<强>输出强>
15