算法的时间复杂度是什么

算法的时间复杂度是什么

算法的时间复杂度是什么图1

算法的时间复杂度的意思是:

算法的时间复杂度是衡量一个算法效率的基本方法。在阅读其他算法教程书的时候,对于算法的时间复杂度的讲解不免有些生涩,难以理解。进而无法在实际应用中很好的对算法进行衡量。

《大话数据结构》一书在一开始也针对算法的时间复杂度进行了说明。这里的讲解就非常明确,言简意赅,很容易理解。下面通过《大话数据结构》阅读笔记的方式,通过原因该书的一些简单的例子和说明来解释一下算法的时间复杂度和它的计算方法。

算法的时间复杂度是什么的函数

算法的时间复杂度,是一个用于度量一个算法的运算时间的一个描述,本质是一个函数。

根据这个函数能在不用具体的测试数据来测试的情况下,粗略地估计算法的执行效率,换句话讲时间复杂度表示的只是代码执行时间随数据规模增长的变化趋势。

常用大O来表述,这个函数描述了算法执行所要时间的增长速度,记作f(n)。算法需要执行的运算次数(用函数表示)记作T(n)。存在常数 c 和函数 f(n),使得当 n >= c 时 T(n) <= f(n),记作 T(n) = O(f(n)),其中,n代表数据规模也就是输入的数据。

算法的时间复杂度是什么图2

时间复杂度如何计算

1、常量阶:只要代码的执行时间不随 n 的增大而增长,这样代码的时间复杂度都记作 O(1)。或者说,一般情况下,只要算法中不存在循环语句、递归语句,即使有成千上万行的代码,其时间复杂度也是Ο(1)。

2、线性阶、n方阶:一般情况下,如果循环体内循环控制变量为线性增长,那么包含该循环的算法的时间复杂度为O(n),线性阶嵌套线性阶的算法时间复杂度为O(nⁿ),涉及下文乘法法则。

3、线性对数阶:当一个线性阶代码段法嵌套一个对数阶代码段,该算法的时间复杂度为O(nlogn)。

4、指数阶和阶乘阶:根据函数,随着n的增加,运行时间会无限急剧增加,因此效率非常低下。

计算机算法的时间复杂度是指什么

算法的时间复杂度是指:执行程序所需的时间。

一般情况下,算法中基本操作重复执行的次数是问题规模n的某个函数,用T(n)表示,若有某个辅助函数f(n),使得当n趋近无穷大时。

T(n)/f(n)的极限值为不等于零的常数,则称为f(n)是T(n)的同数量级函数。记作T(n)=O(f(n)),称O(f(n))为算法的渐进时间复杂度,简称时间复杂度。比如:

在 T(n)=4nn-2n+2 中,就有f(n)=nn,使得T(n)/f(n)的极限值为4,那么O(f(n)),也就是时间复杂度为O(n*n)。

算法的时间复杂度是什么图3

时间复杂度中大O阶推导是:

推导大O阶就是将算法的所有步骤转换为代数项,然后排除不会对问题的整体复杂度产生较大影响的较低阶常数和系数。

有条理的说,推导大O阶,按照下面的三个规则来推导,得到的结果就是大O表示法:运行时间中所有的加减法常数用常数1代替。只保留最高阶项去除最高项常数。

其他常见复杂度是:

f(n)=nlogn时,时间复杂度为O(nlogn),可以称为nlogn阶。

f(n)=n³时,时间复杂度为O(n³),可以称为立方阶。

f(n)=2ⁿ时,时间复杂度为O(2ⁿ),可以称为指数阶。

f(n)=n!时,时间复杂度为O(n!),可以称为阶乘阶。

f(n)=(√n时,时间复杂度为O(√n),可以称为平方根阶。

算法的时间复杂度指的是什么

时间复杂性,又称时间复杂度,算法的时间复杂度是一个函数,它定性描述该算法的运行时间。这是一个代表算法输入值的字符串的长度的函数。时间复杂度常用大O符号表述,不包括这个函数的低阶项和首项系数。使用这种方式时,时间复杂度可被称为是渐进的,亦即考察输入值大小趋近无穷时的情况。

算法的时间复杂度是什么图4

空间复杂性介绍

空间复杂性是指计算所需的存储单元数量。隶属于计算复杂性(计算复杂性由空间复杂性和时间复杂性两部分组成)。算法的复杂性是算法运行所需要的计算机资源的量,需要时间资源量称为时间复杂性,需要空间资源的量成为空间复杂性。

一个算法的空间复杂度S(n)定义为该算法所耗费的存储空间,它也是问题规模n的函数。渐近空间复杂度也常常简称为空间复杂度。算法的时间复杂度和空间复杂度合称为算法的复杂度。

算法的时间复杂度是什么意思

执行一个算法所耗费的时间,从理论上是不能算出来的,必须上机运行测试才能知道。但不可能也没有必要对每个算法都上机测试,只需知道哪个算法花费的时间多,哪个算法花费的时间少就可以了。一个算法花费的时间与算法中语句的执行次数成正比例,算法中哪个语句的执行次数多,它花费的时间就多。

1.语句频度在算法中一个语句的执行次数称为语句频度或时间频度,记为T(n)。

2)算法的渐进时间复杂度一般情况下,算法的执行时间T是问题规模n的函数,记作T(n)。要精确地表示算法的运行时间函数常常是很困难的,即使能够给出,也可能是个相当复杂的函数,函数的求解本身也是相当复杂的。为了客观地反映一个算法的执行时间,可以用算法中基本语句的执行次数的数量级来度量算法的工作量,称作算法的渐进时间复杂度,简称时间复杂度,通常用O来表示。

算法的基本概念是什么算法复杂度的概念和意义

算法是指按照一定规则解决某一类问题的明确和有限的步骤。 算法复杂度主要表现为时间复杂度和空间复杂度,同一算法其复杂度将直接影响其算法乃至程序的优劣。一般来说,算法的复杂度越低,其效率就越高。算法复杂度是衡量程序优劣及效率的重要指标。

算法的复杂度和时间复杂度的关系


对于一个算法,其时间复杂度和空间复杂度往往是相互影响的。当追求一个较好的时间复杂度时,可能会使空间复杂度的性能变差,即可能导致占用较多的存储空间;反之,求一个较好的空间复杂度时,可能会使时间复杂度的性能变差,即可能导致占用较长的运行时间。

另外,算法的所有性能之间都存在着或多或少的相互影响。因此,当设计一个算法(特别是大型算法)时,要综合考虑算法的各项性能,算法的使用频率,算法处理的数据量的大小,算法描述语言的特性,算法运行的机器系统环境等各方面因素,才能够设计出比较好的算法。

优先时间复杂度的算法

时间复杂度是一个算法流程中,最差情况下常数操作数量的指标。


例子:一个有序数组A,另一个无序数组B,请打印B中所有不在A中的数。A数组长度为N,B数组长度为M。

第一种方法:B中每个数在A中遍历一下,输出所有不在A中的数。


A = list(map(int,input().split()))

B = list(map(int,input().split()))


N = len(A)

M = len(B)


for i in range(M):

j = 0

while j<N and B[i]!=A[j]:

j += 1

if j==N:

print(B[i])

1

2

3

4

5

6

7

8

9

10

11

12

1

2

3

4

5

6

7

8

9

10

11

12

第一种方法包含两个循环,对B遍历一遍,B中每个数又要在A中遍历一遍,因此时间复杂度为O ( M × N ) O(M\times N)O(M×N)。


第二种方法:B中每个数在A中二分找一下。

因A有序(假设升序),将A进行二分,分为left和right。中间位置的数为mid。将B中每个数先与mid相比较,如果B[i]比mid大,那么B[i]只可能在A的right,如果B[i]比mid小,那么B[i]只可能在left。每次砍一半的操作,时间复杂度为O ( log ⁡ 2 N ) O(\log_2N)O(log

2

N),又对B中每个数遍历一次,故这个算法的时间复杂度为M × O ( log ⁡ 2 N ) M\times O(\log_2N)M×O(log

2

N)。


二分法的停止条件是左边界超过右边界,while L<=R,也不用担心mid在加加减减过程中越界。


A = list(map(int,input().split()))

B = list(map(int,input().split()))

N = len(A)

M = len(B)


def binSearch(A,b):

L = 0

R = len(A)-1

while L<=R:

mid = int((L+R)/2)

# 在A中找到b了,返回True

if b==A[mid]:

return True

# b比A[mid]小,说明b在左边

if b<A[mid]:

R = mid - 1

# b比A[mid]大,说明b在右边

if b>A[mid]:

L = mid + 1

# 没找到b,返回False

return False


for i in range(M):

flag = binSearch(A,B[i])

if not flag:

print(B[i])

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

第三种方法:先给B排序,然后用类似外排的方法打印不在A中的数。

关于排序算法之后单独介绍,对B排序后,在A,B均为有序数组。

在这里插入图片描述

a指针指向1,b指针指向3,当a<b时,a只能往后移动,当a=b时,b只能往后移动,当a>b时,打印b,同时b往后移。

(1)排序代价O ( M × log ⁡ M ) O(M\times\log M)O(M×logM) (2)打印数过程中,a最多指N NN个数,b最多指M MM个数,所以时间复杂度O ( N + M ) O(N+M)O(N+M)

因此整个算法时间复杂度O ( M × log ⁡ M ) + O ( N + M ) O(M\times\log M)+O(N+M)O(M×logM)+O(N+M) 。


停止条件是A或B数组已经到界了,如果A到界了,那么B[b,M-1]均需打印出来;如果B到界了,说明B数组里的数已经查找完了。


A = list(map(int,input().split()))

B = list(map(int,input().split()))

N = len(A)

M = len(B)


a = b = 0

while a<N and b<M:

if A[a]<B[b]:

a += 1

elif A[a]==B[b]:

b += 1

else:

print(B[b])

b += 1


while b<M:

print(B[b])

b += 1

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

排序算法

冒泡排序

算法思想:从小到大排。每次找到最大的数放在末位。

第一次看0,1位置比较大小,0位置比1位置大就交换。

第二次看1,2位置比较大小,1位置比2位置大就交换,依次进行下去,第一次遍历,最大的数会被排到最后。

第二次只需遍历0至end-1个数,因为最大的数已经到最后,然后重复第一步步骤,直到所有数被排好。


def BubbleSort(arr):

length = len(arr)

if not arr or length < 2:

return arr

for i in range(length,-1,-1):

for j in range(0,i-1):

if arr[j] > arr[j+1]:

tmp = arr[j]

arr[j] = arr[j+1]

arr[j+1] = tmp

return arr

1

2

3

4

5

6

7

8

9

10

11

1

2

3

4

5

6

7

8

9

10

11

常数操作次数为N + ( N − 1 ) + ( N − 2 ) + ⋯ + 2 + 1 N+(N-1)+(N-2)+\cdots+2+1N+(N−1)+(N−2)+⋯+2+1,所以算法时间复杂度为O ( N 2 ) O(N^2)O(N

2

)。


选择排序

算法思想:从小到大排。

第一步,从0到N-1位置找到最小的数放在[0]位置上。

第二步,从1到N-1位置找到最小的数放在[1]位置上。

如何确定最小的数? 先找一个基准数,比基准数小的就互换,成为新的基准数。


def SelectionSort(arr):

length = len(arr)

if not arr or length < 2:

return arr

for i in range(length):

minNumber = arr[i]

for j in range(i+1,length):

if minNumber > arr[j]:

tmp = minNumber

minNumber = arr[j]

arr[j] = tmp

arr[i] = minNumber

return arr

1

2

3

4

5

6

7

8

9

10

11

12

13

1

2

3

4

5

6

7

8

9

10

11

12

13

算法时间复杂度为O ( N 2 ) O(N^2)O(N

2

)。


插入排序

算法思想:从小到大排。

每进来一个数,与它前面一个数比较,比前面的数小就交换,到了前一个位置后,在与前前位置的数比较大小,小就交换,大就停止。再进来一个数,按照上面的方法与前面的数交换插入。


def InsertSort(arr):

length = len(arr)

if not arr or length < 2:

return arr

for i in range(1,length):

j = i - 1

while j>=0:

if arr[j] > arr[j+1]:

tmp = arr[j]

arr[j] = arr[j+1]

arr[j+1] = tmp

j -= 1

else:

j = -1

return arr

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

插入排序的时间复杂度与数据状况有关。例如数组[1,2,3,4,5]整体有序,那么在计算时代价为O ( N ) O(N)O(N),但如果是[5,4,3,2,1]要升序排列,那么代价就是O ( N 2 ) O(N^2)O(N

2

),按最差情况计算,所以插入排序算法时间复杂度为O ( N 2 ) O(N^2)O(N

2

)。


归并排序

算法思想:将数组一分为二,分别把左侧和右侧部分排好序,然后再利用外排的方式将整体排好序。

左右排好序后,需要一个辅助数组,左右两边比较大小,将小的数依次填入辅助数组。额外空间复杂度为O(n)。


def MergeSort(arr):

length = len(arr)

if not arr or length < 2:

return arr

sortProcess(arr,0,length-1)

return arr


def sortProcess(arr,L,R):

if L==R:

return arr[L]

mid = (L+R)//2

sortProcess(arr,L,mid)

sortProcess(arr,mid+1,R)

merge(arr,L,mid,R)


def merge(arr,L,mid,R):

help = []

p1 = L

p2 = mid+1

while p1<=mid and p2<=R:

if arr[p1] < arr[p2]:

help.append(arr[p1])

p1 += 1

else:

help.append(arr[p2])

p2 += 1

while p1<=mid:

help.append(arr[p1])

p1 += 1

while p2<=R:

help.append(arr[p2])

p2 += 1

for i in range(len(help)):

arr[L+i] = help[i]

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

递过算法的时间复杂度计算有一个master公式:

T ( N ) = a × T ( N b ) + O ( N d ) T(N)=a\times T(\frac{N}{b})+O(N^d)

T(N)=a×T(

b

N

)+O(N

d

)


N b \frac{N}{b}

b

N

表示子过程的规模,a aa表示子过程的个数,O ( N d ) O(N^d)O(N

d

)表示除去调用子过程之外,剩余操作的时间复杂度。


当log ⁡ b a > d \log_ba>dlog

b

a>d时,算法复杂度为O ( N log ⁡ b a ) O(N^{\log_ba})O(N

log

b

a

)

当log ⁡ b a = d \log_ba=dlog

b

a=d时,算法复杂度为O ( N d × log ⁡ N ) O(N^d\times\log N)O(N

d

×logN)

当log ⁡ b a < d \log_ba<dlog

b

a<d时,算法复杂度为O ( N d ) O(N^d)O(N

d

)

归并排序将数据规模一分为二,分为左右两个子过程,即a = 2 , b = 2 a=2,b=2a=2,b=2,且外排时间复杂度为O ( N ) O(N)O(N),d = 1 d=1d=1,所以为第二种情况。归并算法的时间复杂度为O ( N × log ⁡ N ) O(N\times\log N)O(N×logN)。

以上就是关于算法的时间复杂度是什么的全部内容,以及算法的时间复杂度是什么的相关内容,希望能够帮到您。

版权声明:本文来自用户投稿,不代表【易百科】立场,本平台所发表的文章、图片属于原权利人所有,因客观原因,或会存在不当使用的情况,非恶意侵犯原权利人相关权益,敬请相关权利人谅解并与我们联系(邮箱:350149276@qq.com)我们将及时处理,共同维护良好的网络创作环境。

(0)
上一篇 2023年04月22日 14:33
下一篇 2023年04月22日 14:37

相关推荐

  • 新帕萨特油箱盖怎么开,大众帕萨特油箱怎么开启

    新帕萨特油箱盖怎么开新帕萨特油箱盖开启,新帕萨特的油箱盖位置在副驾驶的一侧,开启油箱盖时,将车辆熄火,解锁车辆车门,走到油箱盖的旁边,轻轻按一下就可以打开了。帕萨特的油箱盖很容易坏,所以我们在开关油箱盖的时候一定要小心,不然就要换油箱盖的电机了。油箱盖是指汽车上的用于储备汽油的箱…

    2023-04-28
  • 香满园富强小麦粉是什么面粉,香满园小麦粉是高筋粉还是低筋粉

    香满园富强小麦粉是什么面粉香满园富强小麦粉是指高筋面粉,香满园富强小麦粉是指一种比较精细、面筋含量高、杂质少、较白,类似于精粉的高筋面粉。富强粉是小麦种子最核心的部分磨出的面粉,这种面粉价格偏高,口味也好,主要营养成分为蛋白质,适宜于一般人群食用。在超市通常以独立包装的高档“饺子…

    2023-04-28
  • 爱我就别想太多大结局,电视剧爱我就别想太多结局如何

    爱我就别想太多大结局1、爱我就别想太多大结局:裴红出卖夏可可,李洪海与其离婚。2、《爱我就别想太多》是由曹慧生、韩杰执导,陈建斌、李一桐、潘粤明领衔主演,许文广、周知、张姝、曹然然、孔千千主演的都市情感轻喜剧。该剧讲述了身家数十亿的集团董事长李洪海与服装设计师夏可可,二人偶然相识…

    2023-04-28
  • 腾讯会议退出账号方法,腾讯会议怎么退出登录

    腾讯会议退出账号方法1、打开腾讯会议。2、在主界面点击用户头像位置。3、打开的界面点击底部的退出登录。4、这样就可以退出账号。5、在登录界面,如果要换号登录,输入需要登录的账号。6、可以选择登录方式,密码登录或者验证码登录。按照需要选择操作即可。 腾讯会议怎么退出登录使用腾讯会…

    2023-04-28
  • 怎么做抖音内容,抖音怎么制作视频教程

    怎么做抖音内容视频1、打开电脑上的PPT,在PPT中插入好我们要制作文字视频的幻灯片,并在每个幻灯片中输入文字,设定好文字大小和颜色。2、设定好后点击菜单栏中的【幻灯片放映】,在下方找到【幻灯片切换】并点击。3、点击后会在右边出现幻灯片切换的设置,这里需要设置的包括切换的方式和切…

    2023-04-28
  • 如何区分手机芯片,苹果平板ipad 怎么看A几的芯片

    苹果平板ipad 怎么看A几的芯片1、首先请打开iPhone上的AppStore应用。2、在AppStore里,先点击底部的【搜索】栏目,然后在搜索框中搜索LirumDeviceInfoLite这款应用。3、接下来请点击【获取安装】按钮继续。4、随后请输入AppleID账号的密码…

    2023-04-28
  • ps怎么镜面反转,ps怎么镜像翻转其中一个图层

    ps怎么镜面反转ps镜面反转的方法是:1、首先打开ps,打开需要进行镜像处理的图片。2、找到顶部菜单栏中的图像选项,单击鼠标左键。3、在弹出的下拉菜单中找到图像旋转,将鼠标移动在此选项上。4、在弹出二级菜单中选择镜面反转画布,这时就可以看到画面已经镜像旋转了,点击保存即可。平面设…

    2023-04-28
  • 笔记本电脑用键盘怎么关机

    笔记本电脑用键盘怎么关机可以使用Win加X快捷键呼出超级菜单,再接着按两次U键,可以快速关机。笔记本电脑(Laptop),简称笔记本,又被称为“便携式电脑,手提电脑、掌上电脑或膝上型电脑”,其最大的特点就是机身小巧,相比PC携带方便,是一种小型、可便于携带的个人电脑,通常重1到3…

    2023-04-28
  • 手机可以监听对方手机微信

    手机可以监听对方手机微信吗?用手机不可以监听他人的微信,个人实施对他人的监听行为是非法的,侵犯了他人的隐私。只有公安机关在有一定证据表明监听他人微信有助于案情进展并取得他人同意,获得上级机关允许,或者针对犯罪嫌疑人、被告人以及和犯罪活动直接相关联的人员,取得许可,才能进行微信监听…

    2023-04-28
  • 交通银行周末上班,交通银行周末休息吗?

    交通银行周末上班吗?交通银行周末是上班的,不过需要注意的是,交通银行周末只能办理个人业务,对公业务周末是不上班的。如果你要到交通银行办理信用卡相关的业务的话,那么周末是可以去办理的。交通银行个人业务周末的营业时间是上午的9点到下午的4点,具体营业时间以当地交通银行营业网点公布为准…

    2023-04-28