算法的时间复杂度详解

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

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)

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


目录
相关文章
|
1月前
|
机器学习/深度学习 缓存 算法
Python算法设计中的时间复杂度与空间复杂度,你真的理解对了吗?
【10月更文挑战第4天】在Python编程中,算法的设计与优化至关重要,尤其在数据处理、科学计算及机器学习领域。本文探讨了评估算法性能的核心指标——时间复杂度和空间复杂度。通过详细解释两者的概念,并提供快速排序和字符串反转的示例代码,帮助读者深入理解这些概念。同时,文章还讨论了如何在实际应用中平衡时间和空间复杂度,以实现最优性能。
62 6
|
3月前
|
机器学习/深度学习 算法 程序员
读《趣学算法》:重开算法之门,时间复杂度与空间复杂度
本文是作者阅读《趣学算法》后的笔记,介绍了算法复杂度的基本概念,包括时间复杂度和空间复杂度的不同阶表示,并通过具体例子展示了如何计算和理解算法的效率。
65 2
读《趣学算法》:重开算法之门,时间复杂度与空间复杂度
|
30天前
|
搜索推荐 算法
插入排序算法的平均时间复杂度解析
【10月更文挑战第12天】 插入排序是一种简单直观的排序算法,通过不断将未排序元素插入到已排序部分的合适位置来完成排序。其平均时间复杂度为$O(n^2)$,适用于小规模或部分有序的数据。尽管效率不高,但在特定场景下仍具优势。
|
4月前
|
机器学习/深度学习 存储 算法
颠覆认知!Python算法设计中的时间复杂度与空间复杂度,你真的理解对了吗?
【7月更文挑战第22天】在Python算法设计中,时间与空间复杂度是评估算法效能的核心。时间复杂度不仅限于大O表示法,还涵盖平均与最坏情况分析。空间复杂度虽关注额外存储,但也反映内存效率。平衡二者需视场景而定,如利用原地算法减少内存消耗,或牺牲空间加速执行。算法优化技巧,如分治与动态规划,助你在资源与速度间找寻最优解,从而高效应对大数据挑战。
48 3
|
1月前
|
机器学习/深度学习 存储 缓存
数据结构与算法学习十:排序算法介绍、时间频度、时间复杂度、常用时间复杂度介绍
文章主要介绍了排序算法的分类、时间复杂度的概念和计算方法,以及常见的时间复杂度级别,并简单提及了空间复杂度。
24 1
数据结构与算法学习十:排序算法介绍、时间频度、时间复杂度、常用时间复杂度介绍
|
1月前
|
存储 算法
算法的时间复杂度和空间复杂度
本文详细讨论了算法的时间复杂度和空间复杂度,包括它们的概念、计算方法和常见复杂度的对比,并通过多个实例解释了如何计算算法的时间和空间复杂度。
64 0
算法的时间复杂度和空间复杂度
|
2月前
|
算法 Python
震惊!Python 算法设计背后,时间复杂度与空间复杂度的惊天秘密大起底!
在 Python 算法设计中,理解并巧妙运用时间复杂度和空间复杂度的知识,是实现高效、优雅代码的必经之路。通过不断地实践和优化,我们能够在这两个因素之间找到最佳的平衡点,创造出性能卓越的程序。
39 4
|
1月前
|
算法 C语言
深入理解算法效率:时间复杂度与空间复杂度
深入理解算法效率:时间复杂度与空间复杂度
|
3月前
|
机器学习/深度学习 存储 算法
算法时间复杂度分析
这篇文章讲解了如何分析算法的时间复杂度,包括关注循环执行次数最多的代码段、总复杂度的确定、嵌套代码复杂度的计算方法,并提供了大O阶的推导步骤和常见时间复杂度的列表,同时还介绍了空间复杂度的概念及其重要性。
|
3月前
|
搜索推荐
九大排序算法时间复杂度、空间复杂度、稳定性
九大排序算法的时间复杂度、空间复杂度和稳定性,提供了对各种排序方法效率和特性的比较分析。
149 1