算法复杂度分为 时间复杂度 空间复杂度 二者也是衡量代码的好坏两个重要指标:

  • 时间复杂度:指执行算法所需要的计算工作量;
  • 间复杂度:指执行这个算法所需要的内存空间。

算法的复杂性体现在运行该算法时的计算机所需资源的多少上,计算机资源最重要的是时间和空间(即寄存器)资源,因此复杂度分为时间和空间复杂度。

1. 概念理解

1.1 基本执行次数:T(n)

由于运行环境和输入规模的影响,代码的绝对执行时间是无法估计的,但我们可以估算出代码的基本执行次数。

一般情况下,算法中基本操作重复执行的次数是问题规模n的某个函数,用这个函数来表达相对时间,可以记作 T(n)。

1.2 时间复杂度:O(n)

因为执行规则具有不确定性(文章下面就列举4种可能), 所以T(n) 不足以分析和比较一段代码的运行时间,就有了 渐进时间复杂度 (asymptotic time complexity)的概念,官方的定义如下:

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

渐进时间复杂度用大写“O”来表示,所以也被称为大O表示法。

算法时间复杂度里有O(1), O(n), O(logn), O(nlogn), O(n^2)的概念,这是算法的时空复杂度的表示。

它不仅仅用于表示时间复杂度,也用于表示空间复杂度

O后面的括号中有一个函数,指明某个算法的耗时/耗空间与数据增长量之间的关系。 其中的n代表输入数据的量

1.3 空间复杂度:S(n)

与时间复杂度类似,空间复杂度是指算法在计算机内执行时所需存储空间的度量,记作:S(n)=O(f(n)) 。

上面提到过,O(n)不仅仅用于表示时间复杂度,也用于表示空间复杂度。

2. 场景分析:

这是针对时间复杂度的场景分析, 时间复杂度排序为:O(1)< O(log2n)< O(n)< O(n^2)

场景1: T(n) =  O(1)

表示算法的运行时间为常量,这是最低的时空复杂度了,也就是耗时/耗空间与输入数据大小无关,无论输入数据增大多少倍,耗时/耗空间都不变。

哈希算法就是典型的O(1)时间复杂度,无论数据规模多大,都可以在一次计算后找到目标(不考虑冲突的话)。

场景2: T(n) =  O(log2n)

当数据增大n倍时,耗时增大log n倍(这里的log是以2为底的,比如,当数据增大256倍时,耗时只增大8倍,是比线性还要低的时间复杂度)。

二分查找就是O(log n)的算法,每找一次排除一半的可能,256个数据中查找只要找8次就可以找到目标。

场景3: T(n) =  O(n)

表示该算法是线性算法,数据量增大几倍,耗时也增大几倍。

比如常见的for循环遍历,要找到一个数组里面最大的一个数,你要把n个变量都扫描一遍,操作次数为n,那么算法复杂度是O(n)。

场景4: T(n) =  O(n^2)

代表数据量增大n倍时,耗时增大n的平方倍,这是比线性更高的时间复杂度。

比如冒泡排序,就是典型的O(n^2)的算法,对n个数排序,需要扫描n×n次。

在编程的世界中有着各种各样的算法,除了上述的四个场景,还有许多不同形式的时间复杂度,我们按照时间复杂度,按数量级递增依次排列为:

常数阶 O(1) <  对数阶(log2n) < 线性阶 O(n)<  线性对数阶 O(nlog2n) < 平方阶 O(n^2) < 立方阶 O(n^3) < k次方阶 O(n^k) < 指数阶 O(2^n)……

3. 算法比较:

排序算法

平均时间

最差情形

稳定度

额外空间

备注

冒泡

O(n 2 )

O(n 2 )

稳定

O(1)

n 小时较好

交换

O(n 2 )

O(n 2 )

不稳定

O(1)

n 小时较好

选择

O(n 2 )

O(n 2 )

不稳定

O(1)

n 小时较好

插入

O(n 2 )

O(n 2 )

稳定

O(1)

大部分已排序时较好

基数

O(log R B)

O(log R B)

稳定

O(n)

B 是真数 (0-9) ,

R 是基数 ( 个十百 )

Shell

O(nlogn)

O(n s ) 1<s<2

不稳定

O(1)

s 是所选分组

快速

O(nlogn)

O(n 2 )

不稳定

O(nlogn)

n 大时较好

归并

O(nlogn)

O(nlogn)

稳定

O(1)

n 大时较好

O(nlogn)

O(nlogn)

不稳定

O(1)

n 大时较好

借鉴了一些官方统计,再加上自己的理解,整理了一篇比较全面的关于介绍时间复杂度的博客,内容涵盖了从概念延伸到原理,再到算法的总结,希望对大家有一定的帮助。

少侠请留步 ... ヾ(◍°∇°◍)ノ゙ ...
欢迎点赞、评论、加关注,让更多人看到学到赚到
更多精彩,请关注我的"今日头条号":Java云笔记

原创 算法 PPT讲义 时间 复杂 度无非就是while循环的次数!总共有n个元素,渐渐跟下去就是n,n/2,n/4,....n/2^k(接下来操作元素的剩余个数),其 k就是循环的次数由于你n/2^k取整后>=1即令n/2^k=1可得k= log 2n,(是以2为底,n的对数)所以 时间 复杂 度可以表示O(h)=O( log 2n)
按数量级递增排列,常见的 时间 复杂 度有:常数阶O(1),对数阶O( log 2n),线性阶O(n),线性对数阶O(n log 2n),平方阶O(n2),立方阶O(n3)复制代码 代码如下://二分查找O( log 2n)function erfen($a,$l,$h,$f){    if($l >$h){ return false;}    $m = intval(($l+$h)/2);    if ($a[$m] == $f){        return $m;    }elseif ($f < $a[$m]){        return erfen($a, $l, $m-1, $f);    }el
例如,如果一个 算法 时间 复杂 度为O(n),则意味着该 算法 执行所需的 时间 与输入大小成正比。如果一个 算法 时间 复杂 度为O(n²),则意味着该 算法 执行所需的 时间 与输入大小的平方成正比。通过计算 算法 时间 复杂 度,可以确定 算法 在不同输入大小下的执行 时间 ,并选择最适合特定任务的 算法 。最坏情况是指 算法 在最坏情况下的执行 时间 ,而平均情况是指 算法 在所有可能情况下的执行 时间 的平均值。 时间 复杂 度描述了 算法 执行所需的 时间 量,通常以 算法 的输入大小为参数。然后,将所有操作的执行 时间 相加,得到 算法 的总执行 时间 。二、 时间 复杂 度的概念。
今年的ACM集训队有一个叫做EOF的队伍,由阿牛、XC以及COY组 成。在共同的集训生活 ,大家建立了深厚的友谊,阿牛准备做点什么来纪念 这段激情燃烧的岁月,想了一想,阿牛从家里拿来了一块上等的牛肉干,准备 在上面写下一个长度为n的只由"E"、"O"、"F"三种字符组成的字符串(可以 只有其 -种或两种字符,但绝对不能有其他字符),阿牛同时禁止在串 出 现0相邻的情况,他认为,"0O"看起 来就像发怒的眼睛,效果不好。 你,NEW ACMer,EOF 的崇拜者,能帮阿牛算- - 下一共有多少种满足要 求的不同的字符串吗?
时间 复杂 度计算 首先了解一下几个概念。一个是 时间 复杂 度,一个是渐近 时间 复杂 度。前者是某个 算法 时间 耗费,它是该 算法 所求解问题规模n的函数,而后者是指当问题规模趋向无穷大时 ,该 算法 时间 复杂 度的数量级。 当我们评价一个 算法 时间 性能时,主要标准就是 算法 的渐近 时间 复杂 度,因此,在算 法分析时,往往对两者不予区分,经常是将渐近 时间 复杂 度T(n)=O(f(n))简称为 时间 复 杂度,其 的f(n)一般是 算法 频度最大的语句频度。 此外, 算法 语句的频度不仅与问题规模有关,还与输入实例 各元素的取值相关。但 是我们总是考虑在最坏的情况下的 时间 复杂 度。以保证 算法 的运行 时间 不会比它更长。 常见的 时间 复杂 度,按数量级递增排列依次为:常数阶O(1)、对数阶O( log 2n)、线性阶 O(n)、线性对数阶O(n log 2n)、平方阶O( n^ 2)、立方阶O( n^ 3)、k次方阶O( n^ k)、指数阶 O(2^n)。 "定义:如果一个问题的规模是n,解这一问题的某一 算法 所需要的 时间 为T(n)" ",它是n的某一函数 T(n)称为这一 算法 的" 时间 复杂 性"。 " " " "当输入量n逐渐加大时, 时间 复杂 性的极限情形称为算
log cA(c为底数)为常数,由O的运算规则"O(C×f(N))=O(f(N)),其 C是一个正的常数"得O( log aB)=O( log cB)可知 算法 时间 复杂 度与不同底数只有常数的关系,均可以省略自然可以用 log N代替。
数组、链表、树代码题总结——一休如果文档 有什么问题可以找王道班主任或者直接找我。 本来我想讲的东西很多,希望能够把所有可能用到的东西都展示给大家(比如引用,如果 理解 不了,考试 怎么通过其他方法避免使用引用),但是 时间 紧张,之后会考虑制作对应课程包,不同的同学想听的东西不同,大家有什么建议以及这几次课程的评价都可 以填问卷或者直接告诉我或班主任,感谢大家的支持,希望你们能学会这种分析做题的方法,那代码题拿分甚至拿满分都是没问题。数据结构其他部分每一小块我也在做总结,但是这个很难做,你们可以去看一下习题视频里
排序 算法 经过了很长 时间 的演变,产生了很多种不同的方法。对于初学者来说,对它们进行整理便于 理解 记忆显得很重要。每种 算法 都有它特定的使用场合,很难通用。因此,我们很有必要对所有常见的排序 算法 进行归纳。 我不喜欢死记硬背,我更偏向于弄清来龙去脉, 理解 性地记忆。比如下面这张 时间 复杂 度图,我们将围绕这张图来分析。 上面的这张图来自一个PPT。它概括了数据结构 的所有常见的排序 算法 ,给大家总结如下。 区分稳定与不稳定:快速、希尔、堆、选择不稳定,其他排序 算法 均稳定。 平均 时间 复杂 度:冒泡,选择,插入是O(n2),其他均是O(n* log 2n) 最坏 时间 复杂 度:冒泡,选择,插入,快排是O(n2),其他是O
Merge Sort问题 要求将A列表进行排序操作(假设该排序 算法 复杂 度为T(n)T(n)T(n)),那么可以将其对半分,分成子问题1( 复杂 度为T(n2)T(\frac{n}{2})T(2n​))和子问题2( 复杂 度为T(n2)T(\frac{n}{2})T(2n​)),然后将子问题1和子问题2 的元素一个一个对比,最终得到最后的排序 复杂 度为O(n)O(n)O(n),如果是分成三个子问题, 复杂 度为O(2n)O(2n)O(2n),因为这里经过了2次对比操作。 因此分成2次的结果为T(n)=T(n2)+T(n2)+nT(n)=T(\frac{n}{2})+T(\frac{n}{2})+nT(n)=
《数据结构》 第八次实验报告 "学生姓名 " " "学生班级 " " "学生学号 " " "指导老师 " " 实验内容 1) 有序表的二分查找 建立有序表,然后进行二分查找 2) 二叉排序树的查找 建立二叉排序树,然后查找 需求分析 二分查找的基本思想是将n个元素分成大致相等的两部分,取a[n/2]与x做比较,如果 x=a[n/2],则找到x, 算法 止;如果x<a[n/2],则只要在数组a的左半部分继续搜索x, 如果x>a[n/2],则只要在数组a的右半部搜索x. 时间 复杂 度无非就是while循环的次数! 总共有n个元素, 渐渐跟下去就是n,n/2,n/4,....n/2^k(接下来操作元素的剩余个数),其 k就是循 环的次数 由于你n/2^k取整后>=1 即令n/2^k=1 可得k= log 2n,(是以2为底,n的对数) 所以 时间 复杂 度可以表示O()=O( log n) 下面提供一段二分查找实现的伪代码: BinarySearch(max,min,des) mid-<(max+min)/2 while(min<=max) mid=(min+max)/2 if mid=des then re
1)数据是所有能被输入到计算机 ,且能被计算机处理的符号的集合 2)数据是计算机操作的对象的总称,也是计算机处理的信息的某种特定的符号表示形式 (1)数据元素又被称为数据节点或者数据记录 是数据 的一个个体,数据的基本单位 (2)数据结构 带结构的数据元素的集合 (这里强调元素的集合,ID Status Type) 相互之间存在着某种特定关系的数据元素的集合(比如上面3113,3112两两相临就存在联系,线性关系) 数据以及数据元素相互之间的联系 (3)数据的存储结构 数据元素及其关系
数据量大:每天会有亿级数据产生,历史累计万亿级数据。 数据同时使用情况:用户量是百万级的,电商特殊抢购场景下,千亿级用户量同时使用。比如,大家抢同一件商品。 信息技术不断发展:CPU一次计算的 时间 是0.2ns~0.3ns,计算速度相当于每秒几十亿次。 数据结构的意义在于:合理规划数据,保证在大数据时代,在数据层面保持高速客观的数据操作(就是对数据的增删改查)。 常见的 时间 复杂 时间 复杂 度概念:x>1,x足够大的时候,想要达成某个数据操作目的,所需要计算的次数就是 时间 复杂 度.
b'\xe5\x86\x99\xe5\x87\xba\xe6\x97\xb6\xe9\x97\xb4\xe5\xa4\x8d\xe6\x9d\x82\xe5\xba\xa6\xe5\x88\x86\xe5\x88\xab\xe4\xb8\xbao(1)\xe3\x80\x81o( log 2n)\xe3\x80\x81o(n)\xe3\x80\x81o(n log 2n)\xe3\x80\x81o(n2) \xe7\xae\x97\xe6\xb3\x95\xe7\x9a\x84\xe7\xa8\x8b\xe5\xba\x8f\xe3\x80\x82' 这个byte类型的字符串包含了 算法 复杂 度,分别是: - O(1) - O( log 2n) - O(n) - O(n log 2n) - O(n2) 对应的 算法 程序。
异常:Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception 已解决 317531 打开Intellij IDEA(2023.1.1)报错:com.intellij.diagnostic.PluginException: Fatal error initializing ... 35款优秀的 SpringBoot/SpringCloud 开源项目,开发脚手架,总有一款适合你...