Algorithm 带分治的数组和的复杂性

Algorithm 带分治的数组和的复杂性,algorithm,time-complexity,Algorithm,Time Complexity,假设以下算法为: sum(v, i, j) { if i == j return v[i] else { k = (i + j) / 2 return sum(v, i, k) + sum(v, k+1, j) } } 这个算法的时间复杂度是O(n),但是我如何(用自然语言)证明它的复杂度呢?问题总是分为两个新问题,即O(logn),但其余的复杂性来自哪里 应用主定理得到预期结果,O(n) 谢谢 将问题分成两部分并不一定意

假设以下算法为:

sum(v, i, j) {
    if i == j
        return v[i]
    else {
        k = (i + j) / 2
        return sum(v, i, k) + sum(v, k+1, j)
    }
}
这个算法的时间复杂度是
O(n)
,但是我如何(用自然语言)证明它的复杂度呢?问题总是分为两个新问题,即
O(logn)
,但其余的复杂性来自哪里

应用主定理得到预期结果,
O(n)


谢谢

将问题分成两部分并不一定意味着复杂性为log(n)

我猜你们指的是二进制搜索算法,但在每一个除法中,每一半都被跳过,因为我们知道搜索键会在除法的另一边

只要看一下sudo代码,就会对每个分区进行递归调用,并且不会跳过任何内容。为什么会是log(n)


O(n)是正确的复杂性

从高层次的角度来看,您的算法就像是在遍历一个平衡的二叉树,其中每个节点覆盖一个特定的间隔
[i,j]
。他们的孩子把间隔分成两个大致相等的部分,即
[i,(i+j)/2]
[(i+j)/2+1,j]

让我们假设它们是相等的,在这种情况下。(换句话说,为了证明,数组的长度
n
是2的幂)

用下面的方法来考虑它。您的算法正在遍历的平衡二叉树中有
n
叶子。每个人都从长度为1的间隔开始负责。树的
n/2
节点是这n片叶子的父节点。那些
n/2
节点具有
n/4
父节点。这一过程一直持续到到达树的根节点,它覆盖了整个时间间隔


想想这棵树中有多少个节点<代码>n+(n/2)+(n/4)+(n/8)+…+2+1。由于我们最初假设n=2^k,我们可以将此和表示为指数之和,求和公式为。结果表明,该树中有
2^(k+1)-1=2*(2^k)-1=2n-1
节点。因此,显然,遍历该树的所有节点将花费
O(n)
时间。

问题总是被划分为两个新问题,即O(logn)
-不。每次划分时,您都不会丢弃任何一半。如果在二进制搜索中丢弃任意一半as,那么它就是O(logn),否则将计算递归树的所有叶子,其顺序为O(n)。