简单分析算法的时间复杂度
目录
一.什么是算法的时间复杂度
二.如何分析一个算法的时间复杂度
1.有确定次数的算法
2.次数不确定的算法
一.什么是算法的时间复杂度
时间复杂度是一个函数 ,定性描述一个算法(程序)的运行时间。它可以是渐近的,亦即考察输入值大小趋近无穷时的情况。正常情况下,完成相同的任务的时间复杂度越低,算法越优。
比如 求从1到100的和的两种方法 的时间复杂度:
int i,sum = 0, n = 100;
for (i = 1; i <=n; i++){sum += i;
}
printf ("%d", sum);
-时间复杂度为O(n)-
int sum = 0, n = 100;
sum = (1 + n) * n/2;
printf ("%d", sum);
-时间复杂度为O(1)-
大O记法:用大写O()来体现算法时间复杂度的记法叫大O记法。
二.如何分析一个算法的时间复杂度
大O阶推推导法三个步骤:
(1).用常数1取代运行时间中所有加法常数。
(2).在修改后的运行次数函数中,只保留最高阶项。
(3).如果最高阶项存在且其系数不是1,则去除与这个项相乘的系数。
-得到的结果就是大O阶。(只看文字有些难以理解,可以先看看后面的实例)
针对时间复杂度,我将算法分为有确定次数和次数不确定的算法。
下面从两个方面分析几个实例:( f(n)表示程序运行的次数 )
1.有确定次数的算法
-常数阶-
int sum = 0, n = 100;
sum = (1 + n) * n/2;
printf ("%d", sum);
这个算法的f(n)为3,根据法(1)其时间复杂度为O(1)。
常数项对函数的增长速度影响并不大,所以当 f(n) = c,c 为一个常数的时候,我们说这个算法的时间复杂度为 O(1);如果 T(n) 不等于一个常数项时,直接将常数项省略。
-线性阶-
int i;
for (i = 0; i < n; i++){/*时间复杂度为O(1)的程序*/
}
这个算法的f(n)为n,故其时间复杂度为O(n)。
-对数阶-
int count = 1;
while (count < n)
{count = count * 2;/*时间复杂度为O(1)的程序*/
}
由于2^x=n得到x=(log2)n。所以f(n)为(log2)n,其时间复杂度为O(logn)。
-平方阶-
int i,j;
for (i = 0; i < n; i++)
{for (j = 0; j < n; j++){/*时间复杂度为O(1)的程序*/ }
}
这是个嵌套循环,可以成将时间复杂度为O(n)的语句执行了n次。故其时间复杂度为(n^2)。
若外循环次数改为m,则时间复杂度变为(m*n)。
int i,j;
for (i = 0; i < n; i++)
{for (j = i; j < n; j++) /*此处0换成i*/ {/*时间复杂度为O(1)的程序*/ }
}
而对于这个算法,其f(n)=n+(n-1)+(n-2)...+1=n(n+1)/2=(n^2)/2+n/2。
我们知道高次项对于函数的增长速度的影响是最大的。n^2 的增长速度是远超 n的,因为要求的精度不高,所以直接忽略较低项n/2。
又因为函数的阶数对函数的增长速度的影响是最显著的,所以忽略与最高阶相乘的常数1/2。
方法(1):没有加法常数不予考虑;(2):只保留最高项,故保留(n^2)/2;(3):去除项的系数1/2。
故其时间复杂度为O(n^2)。
-再举例,若一个算法的f(n)=(n^3)*3/2+(n^2)*3/2+n+5时,根据推导大O阶法其时间复杂度为O(n^3)。
-其他情况-
int i, j, sum = 0, n = 100;
for (i = 1; i <=n; i++){sum += i;
}
printf ("%d\n", sum);
for (i = 1; i <=n; i++){for(j = 1; j <=n; j++){sum+=i*j;}
}
对于顺序执行的语句或者算法,总的时间复杂度等于其中最大的时间复杂度。
此时时间复杂度为 max(O(n^2), O(n)),即 O(n^2)。
常见的时间复杂度所耗费的时间从大到小依次是:
O(1)<O(logn)<O(n)<O(nlogn)<O(n^2)<O(n^3)<O(2^n)<O(n!)<O(n^n)
2.次数不确定的算法
最坏情况与平均情况:若要查找一个有n个随机数字数组中的某个数字,最好的情况第一个数字就是,那么算法的时间复杂度为O(1),最坏的情况是最后一个,则时间复杂度为O(n)。而平均运行时间为查找n/2次后发现目标元素。平均运行时间是所有情况中最有意义的,因为它是期望的运行时间。但现实是平均运行时间很难通过分析得到,所以在没有特殊说明的情况下,提到的时间复杂度都指最坏时间复杂度。
-冒泡排序-
int a[n] = {};
for (int i = 0; i < n - 1; i++)
{for (int j; j < n-i-1; j++){if (a[j] > a[j+1]) swap(a[j],a[j+1]); /*swap已定义好*/}
}
最坏的情况即待排序列为逆序时,f(n)=1+2+3...+(n-1)=n*(n-1)/2次,故其时间复杂度为O(n^2)。
简单分析算法的时间复杂度相关推荐
- 【计算理论】计算复杂性 ( 小 O 记号 | 严格渐进上界 | 分析算法的时间复杂度 )
文章目录 一.小 O 记号 ( 严格渐进上界 ) 二.分析算法的时间复杂度 一.小 O 记号 ( 严格渐进上界 ) 如果 g(n)\rm g(n)g(n) 是 f(n)\rm f(n)f(n) 渐进上 ...
- 对下图所示的连通网络G,用克鲁斯卡尔(Kruskal)算法求G的最小生成树T,请写出在算法执行过程中,依次加入T的边集TE中的边。说明该算法的基本思想及贪心策略,并简要分析算法的时间复杂度
对下图所示的连通网络G,用克鲁斯卡尔(Kruskal)算法求G的最小生成树T,请写出在算法执行过程中,依次加入T的边集TE中的 边.说明该算法的基本思想及贪心策略,并简要分析算法的时间复杂度
- 设A和B是两个按元素值递增有序的单链表,写一算法将A和B归并为按按元素值递减有序的单链表C,试分析算法的时间复杂度。(利用上篇带有头结点的线性链表操作)...
#include <stdio.h> #include <malloc.h> typedef int DataType; #include "LinList.h&qu ...
- 算法的时间复杂度和空间复杂度评估
通常,对于一个给定的算法,我们要做 两项分析.第一是从数学上证明算法的正确性,这一步主要用到形式化证明的方法及相关推理模式,如循环不变式.数学归纳法等.而在证明算法是正确的基础上,第二部就是分析算法的 ...
- 【数据结构与算法 10】算法的时间复杂度和空间复杂度
最近在研究数据结构与算法,在B站中找到了小甲鱼的<数据结构与算法课程>,挺有意思的! 尚硅谷Java数据结构与java算法,韩顺平数据结构与算法 对于一个算法来说,分析有两步,第一是从数学 ...
- [算法基础]--时间复杂度和空间复杂度
感谢原文作者:https://blog.csdn.net/zolalad/article/details/11848739 算法的时间复杂度和空间复杂度-总结 通常,对于一个给定的算法,我们要做 两项 ...
- 计算算法的时间复杂度和空间复杂度
算法的时间复杂度和空间复杂度-总结 通常,对于一个给定的算法,我们要做 两项分析.第一是从数学上证明算法的正确性,这一步主要用到形式化证明的方法及相关推理模式,如循环不变式.数学归纳法等.而在证明算法 ...
- 算法的时间复杂度-总结
文章目录 前言 一.什么是时间复杂度? 一种简单粗暴衡量算法时间复杂度的方法(事后统计) 通过预先估算来得到算法复杂度的方法(事前分析) 时间复杂度概念[1] 二.时间复杂度求解具体步骤 常见法则 总 ...
- 简单排序算法时间空间复杂度分析及应用(4)-二分插入排序
简单排序算法时间空间复杂度分析及应用(4)-二分插入排序 背景: 顾名思义,这个二分插入排序是直接插入排序的进化版,主要变化的地方就是在内循环部分,即外循环的循环节点在确定区域的位置查询方式由原来的直 ...
最新文章
- ajax怎样发变量,使用jQuery Ajax发送多个变量
- Vue + ElementUI 如何优雅的上传文件到七牛OSS
- python表白程序-用Python做一个表白小姐姐的程序
- 中间件系列「三」netty之NIO基础
- centos 安装 redmine 2.6.0.stable
- eplan单线原理图多线原理图_【原创分享】西门子PLC电路图高效设计——基于EPLAN与TIA Selection...
- vue源码学习--vue源码学习入门
- 基于.NET下的人工智能系列专题|.NET下的人工智能系列专题|用Keras.NET 做一个图像识别的训练...
- 系统架构设计师-软件水平考试(高级)-理论-操作系统
- 2018年全国《程序员高考》真题试卷
- java文件复制(可过滤)
- 趣谈 JOIN 操作
- 解决企业人力短缺难题?且看RPA如何大展身手!
- 错题分析--ASP.NET
- Java之美[从菜鸟到高手演变]之设计模式四
- 智能硬件市场与产品概况整理
- 微信小程序使用Canvas给图片加水印
- [操作系统] elementary os系统美化插件
- 易优CMS插件易优CMS智能改写插件
- PAT 1072 开学寄语