递归划分和征服算法修改

时间:2014-03-15 16:49:25

标签: c++ arrays algorithm recursion

所以在我的教科书中,有一段代码可以通过使用除法和征服递归算法找到数组中的最大元素:

Item max(Item a[], int l, int r)
{
    if (l == r) return a[1];
    int m = (l+r)/2;
    Item u = max(a, l, m);
    Item v = max(a, m+1, r);
    if (u > v) return u; else return v;
}

对于代码之后的一个问题,它要求我修改该程序,以便通过将大小为N的数组划分为大小为k = 2^((lgN)-1)的一个部分而另一个大小为{1}}来找到数组中的最大元素N-k(以便至少有一个部分的大小是2的幂。

所以我试图解决这个问题,我才意识到我无法在代码中做出指数。我该如何实现将一个数组划分为大小k = 2^((lgN)-1)

2 个答案:

答案 0 :(得分:0)

可以使用标准库中的函数计算日志和指数。

但一个简单的解决方案是从1开始并保持加倍,直到达到比预期更大的数字。回过头来,然后给你答案。

(当然整个想法都很疯狂 - 这个算法比明显的线性扫描更复杂,更慢。但我会假设疯狂中有一些方法。)

答案 1 :(得分:0)

这会发现最大k是2的幂并且小于数组项的数量(因此数组部分被分成两个非空部分):

Item max(Item a[], int l, int r)
{
    if (l == r) return a[r];

    int s = r-l, k = 1;
    while (2*k <= s)
        k = 2*k;

    Item u = max(a, l, l+k-1);
    Item v = max(a, l+k, r);
    return u > v ? u : v;
}

然而,这不一定是最好的选择。例如,您可能希望寻找最接近数组长度一半的k(对于10个项目,k = 4而不是8)。
或者你可以尝试将数组分成两部分,长度为2的幂(如果可能的话,10个项目将是8 + 2)......