算法的时间复杂度详解


目录

前言

时间复杂度的概念

例题一:

大O渐近表示法

常见时间复杂度例题(含分析)

例一:

例三:

例四:

例五:

例六:

例七:

例八:


前言

避免在处理大规模问题时出现效率低下,耗费较多资源,所以引入了算法复杂度,算法复杂度可以来衡量算法的效率和算法的可行性,可以帮助选择出最优的算法来解决问题;

时间复杂度的概念

在计算机科学中,算法的时间复杂度是一个函数,它定量描述了该算法的运行时间。一个算法执行所耗费的时间,从理论上说,是不能算出来的,只有你把你的程序放在机器上跑起来,才能知
道。但是我们需要每个算法都上机测试吗?是可以都上机测试,但是这很麻烦,而且每个人的机器不同,网络等因素的影响,不同时间地点所测出来的时间都不同,所以才有了时间复杂度这个分析方式。一个算法所花费的时间与其中语句的执行次数成正比例,算法中的基本操作的执行次数,为算法的时间复杂度。
即:找到某条基本语句与问题规模N之间的数学表达式,就是算出了该算法的时间复杂度。
如下例一所示

例题一:

分析:

我们很容易知道

第一个 for循环 里面还嵌套了一个 for循环 ,总的会循坏执行N*N次;

第二个 for循环 会循环执行 2*N 次;

while循环 会执行10次;

所以Func1 执行的基本操作次数 : N^2 +2*N +10

但是需要注意的是,实际中在计算时间复杂度时,并不是要计算出精确的执行的次数,而是只需要计算出大概次数,抓大头,这种表示方法叫大O渐近表示法(下面会详细讲解该方法的规则)

例如 N^2+2*N+10

当 N = 10 F(N) = 130
N = 100 F(N) = 10210
N = 1000 F(N) = 1002010

随着N越来越大,2*N +10的值与N^2的值相比,2*N +10的值的值太小,可以忽略,这里用大O渐近表示法 时间复杂度记为 O(N^2)

大O渐近表示法

大O符号(Big O notation):是用于描述函数渐进行为的数学符号。
推导大O阶方法:
1、用常数1取代运行时间中的所有加法常数;
2、在修改后的运行次数函数中,只保留最高阶项;(例如上面的 N^2 + 2*N +10 中N的最高阶项为N^2 )
3、如果最高阶项存在且不是1,则去除与这个项目相乘的常数。得到的结果就是大O阶;

(如2*N^2 + N + 40 最高阶存在,为2*N^2 ,用大O渐近表示法表示为 N^2 需要去除系数)

通过上面我们会发现大O的渐进表示法去掉了那些对结果影响不大的项,简洁明了的表示出了执行次数。
4,另外有些算法的时间复杂度存在最好、平均和最坏情况:(时间复杂度取最坏情况)
最坏情况:任意输入规模的最大运行次数(上界)
平均情况:任意输入规模的期望运行次数
最好情况:任意输入规模的最小运行次数(下界)

++例如:在一个长度为N数组中搜索一个数据x++ (例题代码下面例题4)
最好情况:1次找到
最坏情况:N次找到
平均情况:N/2次找到
在实际中一般情况关注的是算法的最坏运行情况,所以数组中搜索数据时间复杂度为O(N)

常见时间复杂度例题(含分析)

例一:

分析:

第一个 for循环 循环了2*N 次

while循环 循环了10次

所以总的次数为 2*N -10

根据上面的规则2和3的 Func2的时间复杂度为 :O(N) ;

例二:

分析:

第一个for循环 循环了M次;

第二个for循环 循环了N次;

总的执行次数为 M+N 次

由于M与N的关系(大小关系c3的时间复杂度为 O(M+N)

如果题中说M>>N 则Func3的时间复杂度为 O(M)

N>>M 则Func3的时间复杂度为 O(N)

如果M=N 则执行总次数为2*M或则2*M 所以时间复杂度为 O(M) 或则 O(N) (由上面的规则3)

例三:

分析:

该算法只有一个for循环,执行了k=100次;

根据上面规则1可知,Func4的时间复杂度为 : O(1)

例四:

分析:

strchr函数的作用是在一个字符串中找到目标字符在该字符串中第一次出现的位置,并返回该位置;

最好情况:1次找到 目标字符就在字符串的第一个元素;
最坏情况:N次找到 目标字符在字符串的末尾;
平均情况:N/2次找到

根据上面的规则4, strchr 的时间复杂度 为O(N)

例五:

分析:

由上述的代码易知,该算法为冒泡排序算法;

最好情况 当遍历完一遍时,没有元素的交换,即exchange为0,跳出循环 N次找到

最坏情况 全部元素都是无序的,则第一次遍历N次,第二次遍历N-1次,第三次遍历N-3次,以此类推,总的次数为 N+(N-1)+(N-2)............+(2)=( 2+N)*N/2 次

根据上面所述规则2,4可知 BubbleSort的时间复杂度为:O(N^2)

例六:

分析:

由所示代码可知,该算法是二分查找法;

最好情况: 1次找到

最坏情况: 当查找所剩元素只有一个,或则查找完了还没找到该元素;

所以二分查找的时间复杂度为 O(log N)

例七:

分析:

当计算N的阶乘时,需要递归N次;

所以 阶乘递归的时间复杂度为 O(N)

例八:

分析:

由图分析得 时间复杂度为 O(2^N)

本章完~ 空间复杂度的详解正在更新中

作者:GOTXX


相关推荐
武子康10 分钟前
大数据-212 数据挖掘 机器学习理论 - 无监督学习算法 KMeans 基本原理 簇内误差平方和
大数据·人工智能·学习·算法·机器学习·数据挖掘
passer__jw76738 分钟前
【LeetCode】【算法】283. 移动零
数据结构·算法·leetcode
Ocean☾1 小时前
前端基础-html-注册界面
前端·算法·html
顶呱呱程序1 小时前
2-143 基于matlab-GUI的脉冲响应不变法实现音频滤波功能
算法·matlab·音视频·matlab-gui·音频滤波·脉冲响应不变法
TeYiToKu1 小时前
笔记整理—linux驱动开发部分(9)framebuffer驱动框架
linux·c语言·arm开发·驱动开发·笔记·嵌入式硬件·arm
互联网打工人no11 小时前
每日一题——第一百二十四题
c语言
爱吃生蚝的于勒1 小时前
深入学习指针(5)!!!!!!!!!!!!!!!
c语言·开发语言·数据结构·学习·计算机网络·算法
羊小猪~~1 小时前
数据结构C语言描述2(图文结合)--有头单链表,无头单链表(两种方法),链表反转、有序链表构建、排序等操作,考研可看
c语言·数据结构·c++·考研·算法·链表·visual studio
洋2402 小时前
C语言常用标准库函数
c语言·开发语言
王哈哈^_^2 小时前
【数据集】【YOLO】【VOC】目标检测数据集,查找数据集,yolo目标检测算法详细实战训练步骤!
人工智能·深度学习·算法·yolo·目标检测·计算机视觉·pyqt