首页 > 其他分享 >时间复杂度O(1),O(logn) ,O(n),O(nlogn)...

时间复杂度O(1),O(logn) ,O(n),O(nlogn)...

时间:2023-06-23 09:00:55浏览次数:63  
标签:... log int 复杂度 logn 对数 n2 排序

写在前面

在学习数据结构和算法的时候,经常会碰到O(1),O(n)等等用来表示时间和空间复杂度,那这到底是什么意思。我们对于同一个问题经常有不同的解决方式,比如排序算法就有十种经典排序(快排,归并排序等),虽然对于排序的结果相同,但是在排序过程中消耗时间和资源却是不同。

对于不同排序算法之间的衡量方式就是通过程序执行所占用的时间空间两个维度去考量。

高中数学

函数

AB是非空的数集,如果按照某个确定的对应关系f,使对于集合A中的任意一个数x,在集合B中都有唯一确定的数f(x)和它对应,那么就称fAB为从集合A到集合B的一个函数。记作:y=f(x),xA。其中,x叫做自变量,x的取值范围A叫做函数的定义域;与x的值相对应的y值叫做函数值,函数值的集合{f(x)| xA }叫做函数的值域。

例:已知f(x)的定义域为[3,5],求f(2x-1)的定义域。

image-20210712224936223

幂函数

y = x k y=x^ky=xk

指数函数

函 数 y = a x ( a > 0 且 a ≠ 1 ) 叫 做 指 数 函 数 , 自 变 量 叫 做 指 数 , a 叫 做 底 数 。 函数y=a^x (a>0且a\neq1)叫做指数函数,自变量叫做指数,a叫做底数。函数y=ax(a>0且a=1)叫做指数函数,自变量叫做指数,a叫做底数。

image-20210712231115266

对数函数

如 果 a ( a > 0 , a ≠ 1 ) 的 b 次 幂 等 于 N , 即 a b = N , 那 么 b 叫 做 以 a 为 底 N 的 对 数 , 记 作 l o g a N = b , 其 中 a 叫 做 对 数 的 底 数 , N 叫 做 真 数 如果a(a>0,a\neq1)的b次幂等于N,即a^b=N,那么b叫做以a为底N的对数,记作log_aN=b,其中a叫做对数的底数,N叫做真数如果a(a>0,a=1)的b次幂等于N,即ab=N,那么b叫做以a为底N的对数,记作logaN=b,其中a叫做对数的底数,N叫做真数

image-20210712231247169

时间复杂度

若存在函数 f(n),使得当n趋近于无穷大时,T(n)/ f(n))的极限值为不等于零的常数,则称 f(n)是T(n)的同数量级函数。记作 T(n)= O(f(n)),称O(f(n))为算法的渐进时间复杂度,简称时间复杂度。

简单理解就是一个算法或是一个程序在运行时,所消耗的时间(或者代码被执行的总次数)。

在下面的程序中:

int sum(int n) {
①   int value = 0;
②   int i = 1;
③   while (i <= n) {
④       value = value + i;
⑤       i++;
    }
⑥   return value;
}

假设n=100,该方法的执行次数为①(1次)、②(1次)、③(100次)、④(100次)、⑤(100次)、⑥(1次)
合计1+1+100+100+100+1 = 303次
123456789101112

上面的结果如果用函数来表示为:f(n) = 3n+3,那么在计算机算法中的表示方法如下。

表示方法

大O表示法:算法的时间复杂度通常用大O来表示,定义为T(n) = O(f(n)),其中T表示时间。

即:T(n) = O(3n+3)

这里有个重要的点就是时间复杂度关心的是数量级,其原则是:

  1. 省略常数,如果运行时间是常数量级,用常数1表示
  2. 保留最高阶的项
  3. 变最高阶项的系数为1

如 2n 3 + 3n2 + 7,省略常数变为 O(2n 3 + 3n2),保留最高阶的项为 O(2n 3 ),变最高阶项的系数为1后变为O(n 3 ),即O(n 3 )为 2n 3 + 3n2 + 7的时间复杂度。

同理,在上面的程序中 T(n) = O(3n+3),其时间复杂度为O(n)。

注:只看最高复杂度的运算,也就是上面程序中的内层循环。

时间复杂度的阶

时间复杂度的阶主要分为以下几种

常数阶O(1)

int n = 100;
System.out.println("常数阶:" + n);
12

不管n等于多少,程序始终只会执行一次,即 T(n) = O(1)

image-20210713004054384

对数阶O(logn)

// n = 32 则 i=1,2,4,8,16,32
for (int i = 1; i <= n; i = i * 2) {
    System.out.println("对数阶:" + n);
}
1234

i 的值随着 n 成对数增长,读作2为底n的对数,即f(x) = log2n,T(n) = O( log2n),简写为O(logn)

则对数底数大于1的象限通用表示为:

image-20210713120354751

线性阶O(n)

for (int i = 1; i < n; i++) {
    System.out.println("线性阶:" + n);
}
123

n的值为多少,程序就运行多少次,类似函数 y = f(x),即 T(n) = O(n)

image-20210713121441117

线性对数阶O(nlogn)

for (int m = 1; m <= n; m++) {
    int i = 1;
    while (i < n) {
        i = i * 2;
        System.out.println("线性对数阶:" + i);
    }
}
1234567

线性对数阶O(nlogn)其实非常容易理解,将对数阶O(logn)的代码循环n遍的话,那么它的时间复杂度就是 n * O(logn),也就是了O(nlogn),归并排序的复杂度就是O(nlogn)。

若n = 2 则程序执行2次,若n=4,则程序执行8次,依次类推

image-20210713152935478

平方阶O(n2)

for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= n; j++) {
        System.out.println("平方阶:" + n);
    }
}
12345

若 n = 2,则打印4次,若 n = 3,则打印9,即T(n) = O(n2)

image-20210713145035411

同理,立方阶就为O(n3),如果3改为k,那就是k次方阶O(nk),相对而言就更复杂了。

以上5种时间复杂度关系为:

image-20210713152953541

从上图可以得出结论,当x轴n的值越来越大时,y轴耗时的时长为:

O(1) < O(logn) < O(n) < O(nlogn) < O(n2)

在编程算法中远远不止上面4种,比如O(n3),O(2n),O(n!),O(nk)等等。

这些是怎么在数学的角度去证明的,感兴趣的可以去看看主定理

注:以下数据来自于Big-O Cheat Sheet,常用的大O标记法列表以及它们与不同大小输入数据的性能比较。

大O标记法 计算10个元素 计算100个元素 计算1000个元素
O(1) 1 1 1
O(logN) 3 6 9
O(N) 10 100 1000
O(NlogN) 30 600 9000
O(N2) 100 10000 1000000
O(2N) 1024 1.26e+29 1.07e+301
O(N!) 3628800 9.3e+157 4.02e+2567

常见数据结构操作的复杂度

数据结构 连接 查找 插入 删除
数组 1 n n n
n n 1 1
队列 n n 1 1
链表 n n 1 1
哈希表 - n n n
二分查找树 n n n n
B树 log(n) log(n) log(n) log(n)
红黑树 log(n) log(n) log(n) log(n)
AVL树 log(n) log(n) log(n) log(n)

数组排序算法的复杂度

名称 最优 平均 最坏 内存 稳定
冒泡排序 n n2 n2 1
插入排序 n n2 n2 1
选择排序 n2 n2 n2 1
堆排序 n log(n) n log(n) n log(n) 1
归并排序 n log(n) n log(n) n log(n) n
快速排序 n log(n) n log(n) n2 log(n)
希尔排序 n log(n) 取决于差距序列 n (log(n))2 1

空间复杂度

空间复杂度表示的是算法的存储空间和数据之间的关系,即一个算法在运行时,所消耗的空间。

空间复杂度的阶

空间复杂度相对于时间复杂度要简单很多,我们只需要掌握常见的O(1),O(n),O(n2)。

常数阶O(1)

int i;
1

线性阶O(n)

int[] arr;
1

平方阶O(n2)

int[][] arr;
1

总结

写这篇文章的目的在于,我在更新栈和队列的时候,留下了一个问题栈的入栈和出栈操作与队列的插入和移除的时间复杂度是否相同,确实是相同的 ,都用了O(1)。由此我想到,对于刚开始或者说是不太了解复杂度的同学,碰到此类的问题,或者是我在跟后续数据结构和算法文章的时候不懂,十分的不友好,于是就写了一篇关于复杂 度的文章。

本文只对时间复杂度和空间复杂度做了简单介绍,有错误可以指正,不要硬杠,杠就是我输。

标签:...,log,int,复杂度,logn,对数,n2,排序
From: https://www.cnblogs.com/javaxubo/p/17498724.html

相关文章

  • 大根堆和小根堆在海量数据的top N问题中,时间复杂度O(nlogN)
    堆可视化操作演示:https://visualgo.net/zh/heap堆实际上是一棵完全二叉树,其任何一非叶节点满足性质:小根堆:Key[i]<=key[2i+1]&&Key[i]<=key[2i+2]或者大根堆Key[i]>=Key[2i+1]&&key>=key[2i+2]即任何一非叶节点的关键字不大于或者不小于其左右孩子节点的关键字。堆分为大根堆......
  • 优雅代码try...except...
    try:from_heapqimport*exceptImportError:pass#Whenn>=size,it'sfastertousesorted()try:size=len(iterable)except(TypeError,AttributeError):passelse:ifn>=size:......
  • [转]火狐浏览器访问github提示:未连接:有潜在的安全问题...github.com 启用了被称为 HTT
    火狐浏览器访问github,提示:       未连接:有潜在的安全问题;       Firefox检测到潜在的安全威胁,并因github.com要求安全连接而没有继续。如果这种情况是因为使用DevSidecar而引起的,可以使用以下方式解决:在地址栏输入:about:config在搜索框输入:security.en......
  • MYSQL 8 上云 performance_schema 里面参数我们打开了那些 5个表调整脚本?(POLARDB
    关于监控如果上云后,到底还需要自行进行监控吗,是一个问题,是否把所有的数据库监控都放到云上,通过云来获取数据库的信息是一个问题。首先回答是否定的,1  云的数据库监控的数据,部分也是通过数据库中的系统的表中获得的2 云的监控数据的需要进行处理加工,处理加工的方式对不对,这也是......
  • 95后Android开发:“我现在是真想躺平...“
    我是真想躺平…说实话,我现在每天上班都很难受,我也不知道为啥反正就很丧,很想当一条咸鱼,就想躺着。最近疫情、裁员…坏消息很多,大环境不好,我本就打算今年换工作的,现在这环境就有点烦…其他行业可能不知道,程序员跳槽最佳的时间就是3-4月,或者9-10月,被称为金三银四和金九银十,但是今年这......
  • MYSQL 8 从PS说起,但不止于PS , 不在使用淘汰的慢查询日志,那我怎么查慢查询(6)...
    这是关于MYSQL8获取信息的方式的第六篇,终于到达了慢日志查询的位置,在MYSQL的DBA的管理员的心目中,pt-query-digest和SLOWQUERYLOG是分析慢查询的唯一的方式。实际上在MYSQL8中这样的慢查询的数据获取方式,已经被淘汰了,或者说不合时宜了。主要的原因是获取信息的时效性的问题......
  • 四年Android开发,在拉勾上投了十几个简历,没有一个面试邀请......药丸了
    在浏览某论坛的时候看到一名程序员吐槽:坐标杭州,四年Android开发一枚,技术不顶尖也不算差吧,这边加班太猛了,在考虑换一个岗位。在拉勾上投了十几个简历,全都是不合适,没有一个面试邀请!!!简历在拉勾上是开放的,竟然没有一个感兴趣的公司打电话给我。前年这个时候,接到的电话还是很多的,这才过......
  • 渣硕Android开发找工作都这么难了吗?千万不要轻易离职......
    坐标北京,21年3月毕业工作,北京某大型互联网码农集散基地渣硕背景。第一份工作在北京的一个80人左右规模的小公司做Android,最近刚刚跳槽成功。做Android是从19年中旬开始,毕业前的第一份工作和第二份工作都在规模不超过20人的小团队练级,毕业前本来有计划留杭州,也拿到不少心仪Offer,但是......
  • 常用STL时间复杂度
    缘由最近有好几次写题因为STL的时间复杂度弄错导致题目T了,还找不到原因后(自己以为时间复杂度没有问题),被学长狠狠嘲讽了:( 所以写下这篇blog来总结常用的STL复杂度(我不想原地退役),希望以后不会错了。vectorpush_back:O(1)pop_back:O(1)insert:O(n)erase:O(n)......
  • 001.简单的复杂度分析
       ......