【发布时间】:2015-05-03 15:50:05
【问题描述】:
我必须在 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) 用于第二个边界,这修复了递归调用的第二个分支,但搞砸了第一个。
有没有办法找到导致正确行为的这些索引?感谢您的帮助。
【问题讨论】:
-
A 和 B 之间的中点不是 B/2。它必须以某种方式依赖于 A。
标签: arrays algorithm recursion divide-and-conquer