时间、空间复杂度

本文深入浅出地解析了算法的时间复杂度,包括O(1)、O(n)、O(n^2)、O(logn)和O(nlogn),并通过生动的例子帮助理解不同复杂度的算法在实际应用中的表现。

原文链接:https://blog.youkuaiyun.com/lkp1603645756/article/details/85013126

O(1)解析
O(1)就是最低的时空复杂度了,也就是耗时/耗空间与输入数据大小无关,无论输入数据增大多少倍,耗时/耗空间都不变。 哈希算法就是典型的O(1)时间复杂度,无论数据规模多大,都可以在一次计算后找到目标(不考虑冲突的话),冲突的话很麻烦的,指向的value会做二次hash到另外一快存储区域。

通俗易懂的例子

什么是O(1)呢,就比如你是一个酒店的管理员,你负责管理酒店的钥匙,你很聪明,你把酒店的100把钥匙放在了100个格子里面存着,并且把格子从1~100进行了编号,有一天有客人来了,酒店老板说,给我拿10号房间的钥匙给我,你迅速从10号格子里面拿出钥匙给老板,速度非常快,这时候你就是一个电脑了,老板跟你说拿几号房房间的钥匙,你只需要看一眼就能知道钥匙在哪里。

O(n)解析
比如时间复杂度为O(n),就代表数据量增大几倍,耗时也增大几倍。

比如常见的遍历算法。 

要找到一个数组里面最大的一个数,你要把n个变量都扫描一遍,操作次数为n,那么算法复杂度是O(n).

通俗易懂的例子

突然,有一天,你的老板给你说,你用100个箱子存100把钥匙,太浪费空间了,你能补能把钥匙上编号一下,然后把钥匙要用绳子穿起来,这样我们可以把这个放箱子的地方再装修一个房间出来。你想了一下,是啊,现在房价这么贵,这样能多赚点钱。所以你就不能通过上面的方法来找到钥匙了,老板跟你说,给我拿45号房间的钥匙出来,你就需要从100个钥匙里面挨个找45个房间的钥匙。

O(n^2) 解析

再比如时间复杂度O(n^2),就代表数据量增大n倍时,耗时增大n的平方倍,这是比线性更高的时间复杂度。比如冒泡排序,就是典型的O(n^2)的算法,对n个数排序,需要扫描n×n次。 

用冒泡排序排一个数组,对于n个变量的数组,需要交换变量位置次,那么算法复杂度就是O().

通俗易懂的例子

随着经济发展越来越好,你的老板把酒店扩大了,有100层每一层有100个房间,当然,你还是你,不过你因为关注我的博客,知道怎么把钥匙排序更好了,你把每一层的钥匙穿在一起,然后一共就有100个用绳子穿起来的钥匙串。然后老板叫你找钥匙的时候,你先要找到楼层的编号,再对应找到房间的编号,所以大概对应的是这样的代码。

O(log n)解析
再比如O(log n),当数据增大n倍时,耗时增大log n倍(这里的log是以2为底的,比如,当数据增大256倍时,耗时只增大8倍,是比线性还要低的时间复杂度)。二分查找就是O(log n)的算法,每找一次排除一半的可能,256个数据中查找只要找8次就可以找到目标。 

通俗易懂的例子

这个就像是有一百把钥匙,你突然觉得,我从头找是不是太慢了,我从中间找,比如我要找到23号的房间钥匙,我从中间切开,找到50编号的位置,然后23在1~50里面,我再把从中间切开变成25,然后23在1~25之间,我再切开变成12.5,然后23在12.5~25之间,依次找下去,直到找到钥匙。这种查找钥匙的方法的复杂度就是O(log^n)

O(n log n)解析
O(n log n)同理,就是n乘以log n,当数据增大256倍时,耗时增大256*8=2048倍。这个复杂度高于线性低于平方。归并排序就是O(n log n)的时间复杂度。

### 排序算法的时间复杂度与空间复杂度 #### 时间复杂度概述 排序算法的时间复杂度描述了其运行时间随输入数据规模增长的变化趋势。通常分为最好情况时间复杂度、最坏情况时间复杂度以及平均时间复杂度[^1]。 对于一些简单的排序方法,例如冒泡排序、选择排序和插入排序,它们的核心逻辑依赖于两层嵌套循环结构来逐一比较并调整元素的位置。因此,这些算法的平均时间复杂度均为 \( O(n^2) \)[^2]。 而更高效的排序算法则利用了不同的策略优化性能。例如快速排序通过分治法实现,在理想情况下能够达到 \( O(n\log n) \) 的平均时间复杂度;然而在极端条件下(如初始序列已完全有序或逆序),它的表现可能退化至 \( O(n^2) \)。归并排序同样基于分治思想,无论何种场景下均能保持稳定的 \( O(n\log n) \) 复杂度,不过它需要额外的空间支持用于分割数组操作[^2]。 特殊用途的非比较类排序像基数排序,则依据数值本身的特性来进行处理。该算法按照指定顺序依次针对每一位数字大小实施排列动作,整体耗时取决于待整理项数量 N 和最高有效位 M ,即呈现为线性的乘积关系——\( O(N \times M) \)[^3]。 #### 空间复杂度分析 除了考量运算速度外,存储需求也是评估排序技术优劣的重要维度之一。原地(in-place)交换机制允许部分方案仅需常量级辅助内存即可完成任务,比如前面提到的选择排序就具备此特点,其空间复杂度仅为 \( O(1) \)[^2]。 相比之下,某些高效但复杂的算法可能会消耗更多资源。典型的例子便是归并排序,默认版本为了合并子列表过程中的临时保存需要用到与原始集合相同容量的新区域,从而导致总体开销上升到 \( O(n) \)[^2]。尽管如此,也有改进措施可将这一指标降低下来,只是相应的代价可能是增加计算负担或者牺牲其他方面的便利性。 至于基数排序由于采用桶分配的方式管理各阶段的数据分布状态,所以一般也需要占用相当于样本总数那么多单位的工作区作为缓冲池,故其典型空间复杂度亦表现为 \( O(N) \)[^3]。 ```python def bubble_sort(arr): n = len(arr) for i in range(n): swapped = False for j in range(0, n-i-1): if arr[j] > arr[j+1]: arr[j], arr[j+1] = arr[j+1], arr[j] swapped = True if not swapped: break ``` 以上展示了经典的冒泡排序实现方式,可以看到内部存在双重迭代控制流,这正是造成其较高时间成本的主要原因所在。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值