算法复杂度的计算

【数据结构与算法】时间复杂度和空间复杂度计算 目录 前言 一、时间复杂度和空间复杂度是什么? 1.算法效率 2.时间复杂度 3.空间复杂度的概念 4.大O的渐进表示法 二、如何计算 1.计算常见的时间复杂度 1.例1 2.例2 3.例3 4.例4 5.例5 6.例6 7.例7 8.例8 9.复杂度大小对比表 2.计算常见的空间复杂度 1.例1 2.例2 3.例3 总结 前言 在做leetcode的相关题目时看到了时间复杂度和空间复杂度的要求,经了解这是数据结构中的内容,于是决定边用空余时间学下数据结构 阅读详情

转贴地址:http://blog.youkuaiyun.com/iluna/article/details/4159485

算法复杂度是在《数据结构》这门课程的第一章里出现的,因为它稍微涉及到一些数学问题,所以很多同学感觉很难,加上这个概念也不是那么具体,更让许多同学学起来无从下手,下面我们就这个问题给各位考生进行分析。

首先了解一下几个概念。一个是时间复杂度,一个是渐近时间复杂度。前者是某个算法的时间耗费,它是该算法所求解问题规模n的函数,而后者是指当问题规模趋向无穷大时,该算法时间复杂度的数量级。

当我们评价一个算法的时间性能时,主要标准就是算法的渐近时间复杂度,因此,在算法分析时,往往对两者不予区分,经常是将渐近时间复杂度T(n)=O(f(n))简称为时间复杂度,其中的f(n)一般是算法中频度最大的语句频度。

此外,算法中语句的频度不仅与问题规模有关,还与输入实例中各元素的取值相关。但是我们总是考虑在最坏的情况下的时间复杂度。以保证算法的运行时间不会比它更长。

常见的时间复杂度,按数量级递增排列依次为:常数阶O(1){Hash表的查找}、对数阶O(log2n){二分查找}、线性阶O(n)、线性对数阶O(nlog2n){快速排序的平均复杂度}、平方阶O(n^2){冒泡排序}、立方阶O(n^3){求最短路径的Floyd算法}、k次方阶O(n^k)、指数阶O(2^n){汉诺塔}。

下面我们通过例子加以说明,让大家碰到问题时知道如何去解决。
1、设三个函数f,g,h分别为 f(n)=100n^3+n^2+1000 , g(n)=25n^3+5000n^2 , h(n)=n^1.5+5000nlgn
请判断下列关系是否成立:
(1) f(n)=O(g(n))
(2) g(n)=O(f(n))
(3) h(n)=O(n^1.5)
(4) h(n)=O(nlgn)
这里我们复习一下渐近时间复杂度的表示法T(n)=O(f(n)),这里的"O"是数学符号,它的严格定义是"若T(n)和f(n)是定义在正整数集合上的 两个函数,则T(n)=O(f(n))表示存在正的常数C和n0 ,使得当n≥n0时都满足0≤T(n)≤C?f(n)。"用容易理解的话说就是这两个函数当整型自变量n趋向于无穷大时,两者的比值是一个不等于0的常 数。这么一来,就好计算了吧。

(1)成立。题中由于两个函数的最高次项都是n^3,因此当n→∞时,两个函数的比值是一个常数,所以这个关系式是成立的。
(2)成立。与上同理。
(3)成立。与上同理。
(4)不成立。由于当n→∞时n^1.5比nlgn递增的快,所以h(n)与nlgn的比值不是常数,故不成立。

2、设n为正整数,利用大"O"记号,将下列程序段的执行时间表示为n的函数。
(1) i=1; k=0
while(i<n)
{ k=k+10*i;i++;
}
解答:T(n)=n-1, T(n)=O(n), 这个函数是按线性阶递增的。
(2) x=n; // n>1
while (x>=(y+1)*(y+1))
y++;
解答:T(n)=n1/2 ,T(n)=O(n1/2), 最坏的情况是y=0,那么循环的次数是n1/2次,这是一个按平方根阶递增的函数。
(3) x=91; y=100;
while(y>0)
if(x>100)
{x=x-10;y--;}
else x++;
解答: T(n)=O(1), 这个程序看起来有点吓人,总共循环运行了1000次,但是我们看到n没有? 没。这段程序的运行是和n无关的,就算它再循环一万年,我们也不管他,只是一个常数阶的函数。

规则:有如下复杂度关系

c < log2N < n < n * Log2N < n^2 < n^3 < 2^n < 3^n < n!

其中c是一个常量,如果一个算法的复杂度为c 、 log2N 、n 、 n*log2N ,那么这个算法时间效率比较高 ,如果是 2^n , 3^n ,n!,那么稍微大一些的n就会令这个算法不能动了,居于中间的几个则差强人意。

我们常需要描述特定算法相对于 n(输入元素的个数 )需要做的工作量。在一组未排序的数据中检索,所需的时间与 n成正比;如果是对排序数据用二分检索,花费的时间正比于logn。排序时间可能正比于n^2或者nlogn。

我们希望能够比较算法的运行时间和空间要求,并使这种比较能与程序设计语言、编译系统、机器结构、处理器的速度及系统的负载等复杂因素无关。

为了这个目的,人们提出了一种标准的记法,称为“大O记法”.在这种描述中使用的基本参数是 n,即问题实例的规模,把复杂性或运行时间表达为n的函数 。这里的“O”表示量级 (order),比如说“二分检索是 O(logn)的”,也就是说它需要“通过logn量级的步骤去检索一个规模为n的数组”记法O ( f(n) )表示当n增大时,运行时间至多将以正比于f(n)的速度增长。这种渐进估计对算法的理论分析和大致比较是非常有价值的,但在实践中细节也可能造成差异。例如,一个低附加代价的O(n2)算法在n较小的情况下可能比一个高附加代价的O(nlogn)算法运行得更快。当然,随着n足够大以后,具有较慢上升函数的算法必然工作得更快。

Temp=i;
i=j;
j=temp;

以上三条单个语句的频度均为1,该程序段的执行时间是一个与问题规模n无关的常数。

算法的时间复杂度为常数阶,记作T(n)=O(1)。如果算法的执行时 间不随着问题规模n的增加而增长,即使算法中有上千条语句,其执行时间也不过是一个较大的常数。此类算法的时间复杂度是O(1)。

例 2.1. 交换i和j的内容

1) sum=0; (一次)
2) for(i=1;i<=n;i++) (n次 )
3) for(j=1;j<=n;j++) (n^2次 )
4) sum++; (n^2次 )

解:T(n)=2n^2+n+1 =O(n^2)

例 2.2.

for (i=1;i<n;i++)
{
     y=y+1; ①
     for (j=0;j<=(2*n);j++)
         x++; ②
}

解:语句1的频度是n-1, 语句2的频度是(n-1)*(2n+1)=2n^2-n-1.
f(n)=2n^2-n-1+(n-1)=2n^2-2,该程序的时间复杂度T(n)=O(n^2).

例 2.3.

a=0;b=1; ①
for (i=1;i<=n;i++) ②
{
     s=a+b;    ③  
     b=a;     ④
     a=s;     ⑤
}


解:语句1的频度:2, 语句2的频度: n, 语句3的频度: n-1, 语句4的频度:n-1,
语句5的频度:n-1, 则:T(n)=2+n+3(n-1)=4n-1=O(n).

例 2.4.

i=1; ①
while (i<=n)
    i=i*2; ②

解:语句1的频度是1, 设语句2的频度是f(n), 则:2^f(n)<=n;f(n)<=log2n
取最大值f(n)= log2n,则该程序的时间复杂度T(n)=O(log2n )

例 2.5.

for(i=0;i<n;i++)
{
     for(j=0;j<i;j++)
    {
         for(k=0;k<j;k++)
         x=x+2;
     }
}


解:当i=m, j=k的时候,内层循环的次数为k
当i=m时, j 可以取 0,1,...,m-1 , 所以这里最内循环共进行了0+1+...+m-1=(m-1)m/2次
所以,i从0取到n, 则循环共进行了: 0+(1-1)*1/2+...+(n-1)n/2=n(n+1)(n-1)/6
所以时间复杂度为O(n^3).

我们还应该区分算法的最坏情况的行为和期望行为。如快速排序的最坏情况运行时间是O(n^2),但期望时间是O(nlogn)。通过每次都仔细地选择基准值,我们有可能把平方情况 (即O(n^2)情况)的概率减小到几乎等于0。在实际中,精心实现的快速排序一般都能以(O(nlogn)时间运行。

下面是一些常用的记法:

访问数组中的元素是常数时间操作,或说O(1)操作。一个算法如果能在每个步骤去掉一半数据元素,如二分检索,通常它就取O(logn)时间。用strcmp比较两个具有n个字符的串需要O(n)时间 。常规的矩阵乘算法是O(n^3),因为算出每个元素都需要将n对元素相乘并加到一起,所有元素的个数是n^2。

指数时间算法通常来源于需要求出所有可能结果。例如,n个元 素的集合共有2n个子集,所以要求出所有子集的算法将是O(2n)的。指数算法一般说来是太复杂了,除非n的值非常小,因为,在这个问题中增加一个元素就导致运行时间加倍。不幸的是,确实有许多问题 (如著名 的“巡回售货员问题”),到目前为止找到的算法都是指数的。如果我们真的遇到这种情况, 通常应该用寻找近似最佳结果的算法替代之。

如何计算算法的复杂度 数据结构的评判标准之一 负责度 大学的学科基础都还给老师了,感叹过后又要捡起来,这次一定要加油~~~ 一、复杂度的计算方式 求在最坏情况下的算法的时间复杂度,即复杂度(函数增长速度)的上界。 二、对应复杂度 1.O(1) var n = 1000 console.log(n); // O(1) var m = 100 console.log(n+1); console.log(n+2)... 阅读详情

相关推荐

常用算法的计算复杂度

凸优化中常用算法的计算复杂度线性规划(LP)逐次凸逼近(SCA)块坐标下降(BCD)二分法 (Bisection)穷举法参考文献 线性规划(LP) As explained in [12], the complexity of a standard linear problem is of order O(a2b)\mathcal{O} (a^2b)O(a2b), where aaa is the number of variables and bbb is the number of constrain

weixin_44655342的博客 1万+

算法的时间复杂度和空间复杂度计算

1、算法时间复杂度 1.1算法时间复杂度的定义:        在进行算法分析时,语句总的执行次数T(n)是关于问题规模n的函数,进而分析T(n)随n的变化情况并确定T(n)的数量级。算法的时间复杂度,也就是算法的时间量度,记作:T(n)= O(f(n))。它表示随问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同,称作算法的渐近时间复杂度,简称为时间复杂度,是一种“渐进表示法”。...

K-fall的博客 4万+

算法复杂度计算

基本的计算步骤 时间复杂度的定义 一般情况下,算法中基本操作重复执行的次数是问题规模n的某个函数,用T(n)表示,若有某个辅助函数f(n),使得当n趋近于无穷大时,T(n)/f(n)的极限值为不等于零的常数,则称f(n)是T(n)的同数量级函数。记作T(n)=O(f(n)),称O(f(n))为算法的渐进时间复杂度(O是数量级的符号 ),简称时间复杂度。根据定义,可以归纳出基本的计算步骤

NoRegret 1850

java中怎么计算算法的时间复杂度_算法的时间复杂度和空间复杂度计算

一、算法的时间复杂度定义在进行算法分析时,语句总的执行次数T(n)是关于问题规模n的函数,进而分析T(n)随n的变化情况并确定T(n)的数量级。算法的时间复杂度,也就是算法的时间量度。记作:T(n)=O(f(n))。它表示随问题n的增大,算法执行时间的增长率和f(n)的增长率相同,称作算法的渐进时间复杂度,简称为时间复杂度。其中,f(n)是问题规模n的某个函数。这样用大写O()来体现算法时间复杂度...

weixin_35501172的博客 1395

路径/运动规划算法计算复杂度

1. 算法的计算时间复杂度 相关链接: (1). “我们假设计算机运行一行基础代码需要执行一次运算”。但这和矩阵的运算复杂度的关系呢?如果矩阵运算就是一行代码,那这就不对了?十分钟搞定时间复杂度 (2). Wiki :computational complexity of various algorithms for common mathematical operations (3)....

rolling0707的博客 2450

算法的时间复杂度的计算

算法的时间复杂度的计算一、时间复杂度的两个概念:1、时间的频度一个算法中的语句执行次数称为语句频度或时间频度,记为T(n)。2、时间复杂度在刚才提到的时间频度中,n称为问题的规模,当n不断变化时,时间频度T(n)也会不断变化。但有时我们想知道它变化时呈现什么规律。为此,我们引入时间复杂度概念。一般情况下,算法中基本操作重复执行的次数是问题规模n的某个函数,用T(n)表示,若有某个辅助函数f(n),使

锅大侠 1903

算法复杂度计算详解

算法复杂度计算详解

ningaiiiii的博客 637

算法复杂度及简单计算

算法复杂度及简单计算复杂性算法复杂度速查大O表示法**定义:****性质:**计算时间复杂度常数阶线性阶对数阶化简规则:注意:补偿复杂性 复杂性 计算复杂性指出了算法的应用需要付出多大的代价。一般涉及两种效率标准,时间和空间。时间因素比空间因素更重要,因此效率的考虑通常都是集中在处理数据耗费的时间上。(编译执行的程序比解释执行的程序运行得快) 通过计算给出源函数效率的近似结果的效率尺度称为渐变复杂...

qq_42429034的博客 1022

算法复杂度的计算方法

简单的说就是语句的执行次数 规则: 1.用常数1来取代运行时间中所有加法常数。 加法的复杂度就为O(1) 2.修改后的运行次数函数中,只保留最高阶项 3.如果最高阶项存在且不是1,则去除与这个项相乘的常数。 int sum = 0,n = 100; //执行一次 sum = (1+n)*n/2; //执行一次 System.out.println (sum); //执行一次 ...

weixin_41012399的博客 9358

算法时间空间复杂度计算—空间复杂度

一、空间复杂度定义 空间复杂度(Space Complexity)是对一个算法在运行过程中临时占用存储空间大小的量度。 一个算法在计算机存储器上所占用的存储空间,包括程序代码所占用的空间,输入数据所占用的空间和辅助变量所占用的空间这三个方面。 二、影响空间复杂度的因素 注意: 一个算法的空间复杂度只考虑在运行过程中为局部变量分配的存储空间的大小,它包括为参数表中形参变 量分配的存储空间和为在...

类人_猿的博客 1万+

NE555构成多谐振荡器及三角波、正弦波的生成(附工程文件)

NE555构成多谐振荡器及三角波、正弦波的生成 续上一篇:NE555基本原理及相关公式的推导

qq_49979053的博客 5万+

算法效率的钥匙:从大O看复杂度计算

数据结构是什么,它对我们有什么用处,我们为什么要学习它?抱着这样的疑问,我们先来介绍数据结构的概念。数据结构(Data Structure)是计算机存储、组织数据的方式,指相互之间存在⼀种或多种特定关系的数据元素的集合。没有⼀种单⼀的数据结构对所有用途都有用,所以我们要学各式各样的数据结构,如:线性表、树、图、哈希等数据结构,数据与结构,其实就是各种数据结合形成了不同的结构,数据本身是离散的、无组织的,而通过不同的结构设计,我们可以将数据以特定方式组织起来,从而实现高效的存储、访问和操作。

2302_79963723的博客 1951

红外热成像仪原理及应用

目录什么是红外热成像背景介绍热成像技术原理热成像分类红外热成像和夜视仪之间的区别红外热像仪夜视仪红外照明相机对比红外热像仪都能看透什么如何选择制冷型和非制冷型红外热像仪制冷型红外热像仪非制冷型红外热像仪实例对比成像速度空间分辨率灵敏度光谱滤波同步何如选择合适的红外热像仪像素测温范围和被测物温度分辨率空间分辨率温度稳定性热像仪的距离系数比常见热成像仪关键参数量程视场角 (FOV)红外分辨率热灵敏度(NETD)焦距光谱范围精度内置优化分析NTED(热灵敏度)什么是NETD如何测量NETD?NETD如何影响测量?

zhy295006359的博客 2万+
上一篇: 淘宝的CheckStyle 1.0.2版
下一篇: BloomFilter——大规模数据处理利器
vba_2001
博客等级 码龄20年 35粉丝 48原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值