寻找“分而治之”算法的数组索引?

时间:2015-03-03 04:46:11

标签: arrays algorithm recursion divide-and-conquer

我必须在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, 12, 3进行调用。第一次递归调用将导致0, 01, 1的调用将正确终止。但是,第二次递归调用将导致使用2, 12, 3进行调用。第一个最终导致超出数组边界,第二个导致无限循环,因为这些参数已被使用。

我曾尝试弄乱它,例如使用(startIdx, endIdx/2 -1)作为第一个边界,使用(endIdx/2, endIdx)作为第二个边界,这解决了递归调用的第二个分支但是弄乱了第一个。

有没有办法找到这些指数导致正确的行为?我很感激帮助。

3 个答案:

答案 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