- 算法设计与分析
- 首页
- 算法基础
- DAA - 算法导论
- DAA - 算法分析
- DAA - 分析方法
- DAA - 渐近符号与先验分析
- DAA - 时间复杂度
- DAA - 主定理
- DAA - 空间复杂度
- 分治法
- DAA - 分治算法
- DAA - 最大最小问题
- DAA - 归并排序算法
- DAA - Strassen矩阵乘法
- DAA - Karatsuba算法
- DAA - 汉诺塔
- 贪心算法
- DAA - 贪心算法
- DAA - 旅行商问题
- DAA - Prim最小生成树
- DAA - Kruskal最小生成树
- DAA - Dijkstra最短路径算法
- DAA - 地图着色算法
- DAA - 分数背包问题
- DAA - 带截止日期的作业排序
- DAA - 最优合并模式
- 动态规划
- DAA - 动态规划
- DAA - 矩阵链乘法
- DAA - Floyd-Warshall算法
- DAA - 0-1背包问题
- DAA - 最长公共子序列算法
- DAA - 使用动态规划的旅行商问题
- 随机化算法
- DAA - 随机化算法
- DAA - 随机化快速排序算法
- DAA - Karger最小割算法
- DAA - Fisher-Yates洗牌算法
- 近似算法
- DAA - 近似算法
- DAA - 顶点覆盖问题
- DAA - 集合覆盖问题
- DAA - 旅行商问题近似算法
- 排序技术
- DAA - 冒泡排序算法
- DAA - 插入排序算法
- DAA - 选择排序算法
- DAA - 希尔排序算法
- DAA - 堆排序算法
- DAA - 桶排序算法
- DAA - 计数排序算法
- DAA - 基数排序算法
- DAA - 快速排序算法
- 搜索技术
- DAA - 搜索技术导论
- DAA - 线性搜索
- DAA - 二分搜索
- DAA - 插值搜索
- DAA - 跳跃搜索
- DAA - 指数搜索
- DAA - 斐波那契搜索
- DAA - 子列表搜索
- DAA - 哈希表
- 图论
- DAA - 最短路径
- DAA - 多阶段图
- DAA - 最优代价二叉搜索树
- 堆算法
- DAA - 二叉堆
- DAA - 插入方法
- DAA - 堆化方法
- DAA - 提取方法
- 复杂度理论
- DAA - 确定性计算与非确定性计算
- DAA - 最大团
- DAA - 顶点覆盖
- DAA - P类和NP类
- DAA - Cook定理
- DAA - NP难类和NP完全类
- DAA - 爬山算法
- DAA有用资源
- DAA - 快速指南
- DAA - 有用资源
- DAA - 讨论
时间复杂度
本章我们将讨论算法的时间复杂度及其影响因素。
时间复杂度
一般来说,算法的时间复杂度是指算法执行代码中每条语句所需的时间。它不是算法的执行时间。这个量会受到多种因素的影响,例如输入大小、使用的方法和过程。当在尽可能短的时间内产生输出时,算法被认为是最有效的。
找到算法时间复杂度的最常用方法是将算法推导为递推关系。让我们进一步了解它。
求解递推关系
递推关系是由自身较小输入定义的方程(或不等式)。这些关系是基于数学归纳法求解的。在这两个过程中,一个条件允许问题被分解成较小的部分,这些部分使用较低值的输入执行相同的方程。
这些递推关系可以使用多种方法求解;它们是:
代换法
递归树法
迭代法
主定理
代换法
代换法是一种试错法;其中,我们可能认为可能是关系解的值被代入并检查方程是否有效。如果有效,则找到解。否则,检查另一个值。
步骤
使用代换法求解递推关系的步骤如下:
基于试错法猜测解的形式
使用数学归纳法证明该解对所有情况都正确。
示例
让我们来看一个使用代换法求解递推关系的例子:
T(n) = 2T(n/2) + n
这里,我们假设该方程的时间复杂度为**O(nlogn)**。因此,根据数学归纳法,T(n/2) 的时间复杂度将为**O(n/2logn/2)**;将该值代入给定方程,我们需要证明T(n)必须大于或等于**nlogn**。
≤ 2n/2Log(n/2) + n = nLogn - nLog2 + n = nLogn - n + n ≤ nLogn
递归树法
在递归树方法中,我们绘制一个递归树,直到程序无法进一步细分为更小的部分。然后,我们计算递归树每一层所需的时间。
步骤
绘制程序的递归树
计算每一层的时间复杂度,并将它们加起来以找到总的时间复杂度。
示例
考虑二分查找算法并为其构建递归树:
由于该算法遵循分治策略,因此递归树绘制到它达到最小输入级别$\mathrm{T\left ( \frac{n}{2^{k}} \right )}$.
$$\mathrm{T\left ( \frac{n}{2^{k}} \right )=T\left ( 1 \right )}$$
$$\mathrm{n=2^{k}}$$
在方程的两边应用对数,
$$\mathrm{log\: n=log\: 2^{k}}$$
$$\mathrm{k=log_{2}\:n}$$
因此,二分查找算法的时间复杂度为**O(log n)**。
主方法
主方法或主定理应用于递减或划分递推关系以查找时间复杂度。它使用一组公式来推导出算法的时间复杂度。
要了解更多关于主定理的信息,请点击这里