算法的时间复杂度详解

简介: 算法的时间复杂度详解

16dceaf0a73b4c2c81d108bc301c74ec.jpgb3ad3988926e43e9a9bcb2cf6c57e480.jpg

前言



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


时间复杂度的概念



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


即:找到某条基本语句与问题规模N之间的数学表达式,就是算出了该算法的时间复杂度。

如下例一所示


例题一:


0b4605e9bffa4a579e677524fdce72cb.png



分析:


我们很容易知道

第一个 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)


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



8111c5659d5846cfafbff283dab9d4a3.png


分析:

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

while循环 循环了10次

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

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


例二:

6e969d2f03b94ab9a9602c38088faf10.png

分析:

第一个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)


例三:


b37c50bcabea49e4a25f31a3d8b4a7ff.png


分析:

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

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


例四:

7b55e43483a14e359da57be01f29b5be.png

分析:

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

   最好情况:1次找到                目标字符就在字符串的第一个元素;

   最坏情况:N次找到                目标字符在字符串的末尾;
  平均情况:N/2次找到            

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


例五:

1765ab7dea28468a9c15c692e5a5da4e.png


分析:


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

最好情况            当遍历完一遍时,没有元素的交换,即exchange为0,跳出循环       N次找到最坏情况            全部元素都是无序的,则第一次遍历N次,第二次遍历N-1次,第三次遍历N-3次,以此类推,总的次数为   N+(N-1)+(N-2)…………+(2)=( 2+N)*N/2   次


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

68a5fb7f541e48a292ff430167b01c5e.png


分析:

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

最好情况:    1次找到

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

b65ffe755f7846b6a15f027876336572.png

例七:


159975dd597d40d592b150f26a2ada16.png

分析:

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

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

例八:

c257ae373dc44eb59e3cda08a963c794.png


分析:

27324dc398f94d9583e011071076a241.png


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

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


目录
相关文章
|
2月前
|
机器学习/深度学习 存储 缓存
数据结构从入门到精通——算法的时间复杂度和空间复杂度
算法的时间复杂度和空间复杂度是评估算法性能的两个重要指标。时间复杂度主要关注算法执行过程中所需的时间随输入规模的变化情况,而空间复杂度则关注算法执行过程中所需的最大存储空间或内存空间。
77 0
|
4月前
|
机器学习/深度学习 存储 算法
数据结构 | 算法的时间复杂度和空间复杂度【详解】(二)
数据结构 | 算法的时间复杂度和空间复杂度【详解】(二)
|
4月前
|
机器学习/深度学习 存储 算法
数据结构 | 算法的时间复杂度和空间复杂度【详解】(一)
什么是数据结构? 数据结构(Data Structure)是计算机存储、组织数据的方式,指相互之间存在一种或多种特定关系的数据元素的集合。
|
4月前
|
机器学习/深度学习 算法
算法的时间复杂度
算法的时间复杂度
41 0
|
5月前
|
机器学习/深度学习 存储 算法
【算法基础】常数操作 时间复杂度 选择排序 冒泡排序 插入排序 位运算
【算法基础】常数操作 时间复杂度 选择排序 冒泡排序 插入排序 位运算
|
6月前
|
机器学习/深度学习 算法
数据结构与算法之时间复杂度和空间复杂度(C语言版)
数据结构与算法之时间复杂度和空间复杂度(C语言版)
数据结构与算法之时间复杂度和空间复杂度(C语言版)
|
5月前
|
算法 Python
Python 数据结构和算法:解释什么是 Big O 表示法?举例说明几种常见的时间复杂度。
Python 数据结构和算法:解释什么是 Big O 表示法?举例说明几种常见的时间复杂度。
|
1月前
|
算法 数据处理 C语言
【数据结构与算法】快速排序(详解:快排的Hoare原版,挖坑法和双指针法|避免快排最坏时间复杂度的两种解决方案|小区间优化|非递归的快排)
【数据结构与算法】快速排序(详解:快排的Hoare原版,挖坑法和双指针法|避免快排最坏时间复杂度的两种解决方案|小区间优化|非递归的快排)
|
2月前
|
算法
TOP-K问题和向上调整算法和向下调整算法的时间复杂度问题的分析
TOP-K问题和向上调整算法和向下调整算法的时间复杂度问题的分析
20 1
|
2月前
|
机器学习/深度学习 存储 缓存
数据结构--算法的时间复杂度和空间复杂度
数据结构--算法的时间复杂度和空间复杂度