【问题标题】:Recursive Divide and Conquer Algorithm Modification递归分治算法修改
【发布时间】:2014-04-21 00:39:57
【问题描述】:

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

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) 的一部分和大小为 @987654323 的另一部分来找到数组中的最大元素@(因此至少有一个部分的大小是 2 的幂。

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

【问题讨论】:

  • 为什么你需要分而治之来解决这个问题?这将需要与原始遗留解决方案相同的线性时间
  • “我不能在代码中做指数” - 为什么不呢?
  • 我只是在这里关注问题。我对如何将其拆分为大小 k = 2^((lgN)-1) 感到困惑。我知道如何做简单的指数,例如 2^5,但 lgN-1 部分让我很困惑
  • 第一次返回:return a[1];错误!应该是return a[l];(或等效的return a[r];)。

标签: c++ arrays algorithm recursion


【解决方案1】:

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

但一个简单的解决方案是从 1 开始并不断加倍,直到达到比预期更大的数字。退一步给你答案。

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

【讨论】:

  • 感谢您的回复。我知道这可能不是最有效的,但我认为这只是为了帮助我们更多地了解递归。我仍然不太确定将其拆分为 k = 2^((lgN)-1) 大小的代码
  • 这就是我第二段的内容。您正在寻找小于 N 的 2 的最大幂。继续加倍直到到达那里。
【解决方案2】:

这发现最大 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)...

【讨论】:

    猜你喜欢
    • 2011-12-06
    • 1970-01-01
    • 2017-08-19
    • 2015-07-10
    • 1970-01-01
    • 2011-01-16
    • 2019-05-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多