C++ 递归分治算法的改进

C++ 递归分治算法的改进,c++,arrays,algorithm,recursion,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; } 对于代码后面的一个问题,它要求我修改该程序,以便

因此,在我的教科书中有一段代码,通过使用分治递归算法来查找数组中的最大元素:

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)的一部分和大小为
N-k的另一部分来找到数组中的最大元素(以便至少一个部分的大小为2的幂)


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

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

但一个简单的解决办法是从1开始,一直翻倍,直到你达到一个比期望值更大的数字


(当然,整个想法都是疯狂的-这个算法比明显的线性扫描复杂得多,速度也慢得多。但我假设有某种疯狂的方法。)

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

项目最大值(项目a[],内部l,内部r)
{
如果(l==r)返回一个[r];
int s=r-l,k=1;
而(2*kv?u:v;
}
但是,这不一定是最好的选择。例如,您可能希望查找最接近数组长度一半的
k
(对于10个项目,k=4而不是8)。

或者您可以尝试将数组分成两部分,两部分的长度都是2的幂(如果可能的话,对于10个项目,它将是8+2).

为什么要对此问题进行分治?这将需要与原始遗留解决方案相同的线性时间“我无法在代码中进行指数运算”-为什么不呢?不过我只是想解决这个问题。我对如何将其拆分为大小k=2^((lgN)-1)感到困惑。我知道如何进行简单的指数运算,比如2^5,但lgN-1部分把我搞糊涂了第一次返回:
返回a[1];
是错误的!应该是
返回a[l];
(或等效的
返回a[r];
)。感谢您的回复。我知道这可能不是最有效的,但我认为这只是为了帮助我们更好地理解递归。我仍然不太确定将其拆分为k=2^((lgN)-1)大小的代码这就是我第二段的内容。你在寻找小于N的两个最大的幂。继续加倍,直到达到为止。
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;
}