【问题标题】:Cannot understand CLRS Problem 4-2 case 2看不懂 CLRS 问题 4-2 案例 2
【发布时间】:2019-12-20 14:45:26
【问题描述】:

问题:

4-2 参数传递成本

在本书中,我们假设在过程调用期间传递参数需要恒定的时间,即使传递的是 N 元素数组。这个假设在大多数系统中都是有效的,因为传递的是指向数组的指针,而不是数组本身。 这个问题检查了三种参数传递策略的含义:

  1. 数组通过指针传递。时间 Theta(1)

2。通过复制传递一个数组。时间 Theta(N),其中 N 是数组的大小。

  1. 通过仅复制被调用过程可能访问的子范围来传递数组。如果传递了子数组 A[p..q],则时间 Theta(q-p+1)。

一个。考虑在排序数组中查找数字的递归二进制搜索算法(参见练习 2.3-5)。当使用上述三种方法中的每一种传递数组时,给出二分搜索的最坏情况运行时间的递归,并给出递归解的良好上限。设 N 为原始问题的大小,n 为子问题的大小。

b.重做第 2.3.1 节中的 MERGE-SORT 算法的 (a) 部分。

我无法理解如何解决案例 2 的重复问题,即通过复制两种算法来传递数组。

以案例2的二分查找算法为例,大多数答案给出的递归是T(n)=T(n / 2)+Theta(N)。我对此没有任何问题。

这是我在网上找到的一个看起来正确的答案:

T(n)

= T(n/2) + cN

= 2cN + T(n/4)

= 3cN + T(n/8)

= Sigma(i = 0 到 lgn - 1) (2^i cN / (2^i))

= cNlgn

= θ(nlgn)

我无法理解倒数第二行如何导致最后一行的答案。为什么不在 Theta(Nlgn) 中表示它?在 Theta 表示法中,N 怎么变成 n?

N 和 n 感觉有些联系。我无法理解它们之间的联系以及如何将其应用到解决方案中。

【问题讨论】:

    标签: arrays algorithm performance clrs


    【解决方案1】:

    我的回答不是很理论,但也许这种“更经验主义”的方法会帮助你弄清楚。还可以查看Master Theorem (analysis of algorithms),以便更轻松地分析递归算法的复杂性

    我们先解决二分查找:

    1. 按指针

      O(logN) - 就像一个迭代二分搜索,会有 logN 调用,每个调用都有 O(1) 复杂度

    2. 复制整个数组

      O(NlogN) - 因为对于函数的每个 logN 调用,我们都会复制 N 元素

    3. 只复制访问的子数组

      O(N) - 这个不是那么明显,但可以很容易看出复制的子数组的长度为NN/2N/4N/8 .... 并将所有这个条款将是2*N

    现在是合并排序算法:

    1. O(NlogN) - 与a3的方法相同,迭代子数组的长度为N(N/2, N/2)(N/4, N/4, N/4, N/4) ...

    2. O(N^2) - 我们对排序函数进行了2*N 调用,每个函数的复杂度为O(N) 用于复制整个数组

    3. O(NlogN) - 我们将只复制我们将迭代的子数组,因此复杂性将与b1中的一样

    【讨论】:

      【解决方案2】:

      似乎 N 代表整个数组长度,n 是当前块大小。

      但公式实际上只利用初始值,当您从完整长度 n=N 开始时 - 例如,查看 T(n/4)T(N/4),所以到处都是 n===N

      在这种情况下,您可以将 n 替换为 N。

      【讨论】:

        猜你喜欢
        • 2017-09-21
        • 1970-01-01
        • 2017-07-15
        • 2019-06-30
        • 2015-03-04
        • 1970-01-01
        • 1970-01-01
        • 2021-08-07
        • 2014-08-20
        相关资源
        最近更新 更多