各个复杂度代表的意思

本文解析了常见的时间复杂度,如O(1), O(n), O(n^2), O(logn) 和 O(nlogn),并通过生动的例子帮助理解各种复杂度的特点。

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()解析
O()的写法为:O(n^2)

再比如时间复杂度O(n2),就代表数据量增大n倍时,耗时增大n的平方倍,这是比线性更高的时间复杂度。比如冒泡排序,就是典型的O(n2)的算法,对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在150里面,我再把从中间切开变成25,然后23在125之间,我再切开变成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)的时间复杂度

<think>我们正在讨论时间复杂度中的符号含义。用户之前提到了一个具体的双重循环例子,现在他想了解时间复杂度表示法中各个符号的含义。 常见的时间复杂度表示法使用大O符号(Big O notation),有时也会用到其他符号如Ω(Omega)和Θ(Theta)。下面我将详细解释这些符号的含义。 重点解释: 1. 大O符号(O):表示渐进上界,即算法的最坏情况运行时间。 2. Ω符号:表示渐进下界,即算法的最好情况运行时间。 3. Θ符号:表示渐进紧确界,即同时具有上界和下界。 此外,我们还会提到小o符号(o)和ω符号,但用户主要问的是大O符号,所以重点在大O。 下面我将详细说明每个符号的定义、数学表示和示例。 </think> 在时间复杂度分析中,符号系统用于精确描述算法性能随输入规模变化的增长趋势。以下是核心符号的详细解释(以您提供的双重循环代码为例说明): ### 时间复杂度符号系统 1. **$O$ (大O符号) - 渐进上界** 表示算法在最坏情况下的性能上限 **数学定义**: $$T(n) = O(g(n)) \iff \exists c>0, n_0>0 \quad \forall n \geq n_0: 0 \leq T(n) \leq c \cdot g(n)$$ **示例**: 您提供的双重循环: ```c void aFunc(int n) { for (int i = 0; i < n; i++) { // 外层循环n次 for (int j = i; j < n; j++) { // 内层循环n-i次 printf("Hello World\n"); // 基本操作 } } } ``` 总操作次数:$\sum_{i=0}^{n-1} (n - i) = \frac{n(n+1)}{2} = \frac{n^2}{2} + \frac{n}{2}$ 因此时间复杂度为 $O(n^2)$ [^1] 2. **$Ω$ (Omega) - 渐进下界** 表示算法在最好情况下的性能下限 **数学定义**: $$T(n) = Ω(g(n)) \iff \exists c>0, n_0>0 \quad \forall n \geq n_0: 0 \leq c \cdot g(n) \leq T(n)$$ **示例**: 快速排序最好情况 $Ω(n \log n)$,表示至少需要 $n \log n$ 量级时间 3. **$Θ$ (Theta) - 紧确界** 表示算法性能的精确增长率(同时是上界和下界) **数学定义**: $$T(n) = Θ(g(n)) \iff T(n) = O(g(n)) \ 且 \ T(n) = Ω(g(n))$$ **示例**: 上述双重循环的精确时间复杂度为 $Θ(n^2)$ 4. **$o$ (小o) - 非紧上界** 表示增长率严格小于 **数学定义**: $$T(n) = o(g(n)) \iff \lim_{n \to \infty} \frac{T(n)}{g(n)} = 0$$ **示例**: $2n = o(n^2)$ 因为 $\lim_{n \to \infty} \frac{2n}{n^2} = 0$ 5. **$ω$ (小omega) - 非紧下界** 表示增长率严格大于 **数学定义**: $$T(n) = \omega(g(n)) \iff \lim_{n \to \infty} \frac{T(n)}{g(n)} = \infty$$ **示例**: $n^2 = \omega(n)$ 因为 $\lim_{n \to \infty} \frac{n^2}{n} = \infty$ ### 常见复杂度层级对比 | 符号 | 关系 | 类比 | 示例算法 | |------|--------------|--------------|----------------------| | $O(1)$ | 常数时间 | 即时完成 | 数组随机访问 | | $O(\log n)$ | 对数时间 | 每次减半问题 | 二分查找 | | $O(n)$ | 线性时间 | 逐项扫描 | 遍历数组 | | $O(n \log n)$ | 线性对数时间 | 分治处理 | 快速排序/归并排序 | | $O(n^2)$ | 平方时间 | 双重循环 | 冒泡排序/选择排序 | | $O(2^n)$ | 指数时间 | 组合爆炸 | 暴力穷举 | ### 符号关系图示 ```mermaid graph LR A[实际复杂度T(n)] --> B(Θ-紧确界) A --> C(O-上界) A --> D(Ω-下界) C --> E(o-非紧上界) D --> F(ω-非紧下界) ``` > **关键洞察**:大O符号($O$)是最常用的表示法,因为它关注算法的最坏情况性能,这是工程实践中最重要的考量[^1]。例如您提供的双重循环,虽然精确计算是 $\frac{n^2}{2} + \frac{n}{2}$,但常数项和低阶项在渐进分析中被忽略,简化为 $O(n^2)$。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值