big-o - 递归函数的渐近复杂度是如何推导的

标签 big-o complexity-theory binary-search theory asymptotic-complexity

我在网站上没有找到对此问题的一般答案

例如

如果我有一些算法;说二分查找如何导出(以数学方式显示)它的复杂性是O(log(n))

但更一般地说如何推导任何递归算法的渐近复杂度?

最佳答案

很多递归算法的时间复杂度都可以用自身来表示,就像算法一样。这称为递归关系,通常采用以下格式

T(N) = [递归调用 i 的 T(N_i) 之和] + [函数中完成的其他工作的总和]

例如,二分搜索有一个非常简单的递归关系:对于每个递归调用,1)搜索空间减半,2)完成恒定量的工作。因此,关系的形式为 T(N) = T(N/2) + C。要解决此问题,请重复替换它并发现模式:

T(N) = T(N / (2^1)) + C
     = T(N / (2^2)) + 2C
     = T(N / (2^3)) + 3C
     = ... 
     = T(N / (2^m)) + mC

当搜索空间只有一个元素时,即当N/(2^m) = 1时,二分搜索终止。这对应于 m = log2(N)T(N/(2^m)) = 0

因此时间复杂度为O(m) = O(log N)。 (日志的基数并不重要,C 也不重要,因为它们都是乘法常数)

关于big-o - 递归函数的渐近复杂度是如何推导的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45618366/

相关文章:

algorithm - 为什么 Induction 总是不适用于 Big-O?

算法:T(N) =2^N

arrays - 能否在常数时间 O(1) 内使用 n 个 Common CREW 处理器在大小为 n 的排序数组中找到元素 x?

binary-search - D 2.0 (Phobos) 中的二分搜索?

python - 为什么我的二分搜索实现效率很低?

c++ - 二叉树之字形层次顺序遍历算法的紧时间复杂度是多少?

algorithm - 无法理解嵌套循环的大 O

c# - .NET BCL API 或框架方法的时间复杂度

math - 子集积的复杂度

c - SPOJ - 好斗的奶牛, "largest minimum distance"术语的含义是什么?