第二章——复杂度分析

1. 算法效率评估

‧ 时间效率和空间效率是衡量算法优劣的两个主要评价指标。
‧ 可以通过实际测试来评估算法效率,但难以消除测试环境的影响,且会耗费大量计算资源。
‧ 复杂度分析可以克服实际测试的弊端,分析结果适用于所有运行平台,并且能够揭示算法在不同数据规模下的效率。

2. 时间复杂度

‧ 时间复杂度用于衡量算法运行时间随数据量增长的趋势,可以有效评估算法效率,但在某些情况下可能失效,如在输入的数据量较小或时间复杂度相同时,无法精确对比算法效率的优劣。

‧ 最差时间复杂度使用大𝑂符号表示,对应函数渐近上界,反映当𝑛趋向正无穷时,操作数量𝑇(𝑛)的增长级别。

‧ 推算时间复杂度分为两步,首先统计操作数量,然后判断渐近上界。

‧ 常见时间复杂度从小到大排列有𝑂(1)、𝑂(log𝑛)、𝑂(𝑛)、𝑂(𝑛log𝑛)、𝑂(n^{2})、𝑂(2^{n})和𝑂(𝑛!)等。

1)遍历数组和遍历链表等操作的时间复杂度均为𝑂(𝑛)。

2)平方阶通常出现在嵌套循环中,外层循环和内层循环都为𝑂(𝑛),因此总体为𝑂(n^{2}),举例:冒泡排序。

3)指数阶常出现于递归函数中。指数阶增长非常迅速,在穷举法(暴力搜索、回溯等)中也比较常见。生物学的“细胞分裂”是指数阶增长的典型例子:初始状态为1个细胞,分裂一轮后变为2个,分裂两轮后变为4个,以此类推,分裂𝑛轮后有2^{n}个细胞。时间复杂度为𝑂(2^{n})。

4)对数阶常出现于基于分治策略的算法中,体现了“一分为多”和“化繁为简”的算法思想。

5)线性对数阶常出现于嵌套循环中,两层循环的时间复杂度分别为𝑂(log𝑛)和𝑂(𝑛)。主流排序算法的时间复杂度通常为𝑂(𝑛log𝑛),例如快速排序、归并排序、堆排序等。

‧ 某些算法的时间复杂度非固定,而是与输入数据的分布有关。时间复杂度分为最差、最佳、平均时间复杂度,最佳时间复杂度几乎不用,因为输入数据一般需要满足严格条件才能达到最佳情况。

‧ 平均时间复杂度反映算法在随机数据输入下的运行效率,最接近实际应用中的算法性能。计算平均时间复杂度需要统计输入数据分布以及综合后的数学期望。

3. 空间复杂度

‧ 空间复杂度的作用类似于时间复杂度,用于衡量算法占用空间随数据量增长的趋势。

‧ 算法运行过程中的相关内存空间可分为输入空间、暂存空间、输出空间。通常情况下,输入空间不计入 空间复杂度计算。暂存空间可分为指令空间、数据空间、栈帧空间,其中栈帧空间通常仅在递归函数中影响空间复杂度。

‧ 通常只关注最差空间复杂度,即统计算法在最差输入数据和最差运行时间点下的空间复杂度。因为内存空间是一项硬性要求,必须确保在所有输入数据下都有足够的内存空间预留。

‧ 常见空间复杂度从小到大排列有𝑂(1)、𝑂(log𝑛)、𝑂(𝑛)、𝑂(n^{2})和𝑂(2^{n})等。

1)常数阶常见于数量与输入数据大小𝑛无关的常量、变量、对象。在循环中初始化变量或调用函数而占用的内存,在进入下一循环后就会被释放,因此不会累积占用空间,空间复杂度仍为𝑂(1)。

2)线性阶𝑂(𝑛)常见于元素数量与𝑛成正比的数组、链表、栈、队列等。

3)平方阶常见于矩阵和图,元素数量与𝑛成平方关系。

4)指数阶常见于二叉树。高度为𝑛的“满二叉树”的节点数量为2^{n}-1,占用𝑂(2^{n})空间。

5)对数阶常见于分治算法。例如归并排序,输入长度为𝑛的数组,每轮递归将数组从中点划分为两半,形成高度为log𝑛的递归树,使用𝑂(log𝑛)栈帧空间。

‧ 降低时间复杂度通常需要以提升空间复杂度为代价,反之亦然。我们将牺牲内存空间来提升算法运行速度的思路称为“以空间换时间”;反之,则称为“以时间换空间”。在大多数情况下,时间比空间更宝贵,因此“以空间换时间”通常是更常用的策略。当然,在数据量很大的情况下,控制空间复杂度也是非常重要。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

穿梭的编织者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值