a*算法的时间复杂度_【硬核算法】算法的成绩单——时间复杂度

时间复杂度

前言

hello~欢迎观看【硬核算法】,在今后将会为大家带来一些比较“硬核”的算法知识。

为了在之后比较算法性能的时候“有法可依”,今天将为大家简单介绍时间复杂度

前置知识

看懂本篇文章并不需要任何前置知识。

引入

为了让大家初步认识时间复杂度,我们先来看个很老的例子:

在高斯七岁那年,他的数学老师给同学们布置了一道加法题:,结果高斯立马算出了结果,原来是因为高斯使用了一种更快速的办法:首项末项项数,这个式子后来就被称为等差数列求和公式。

显然,高斯的计算方法比傻傻地一个一个加起来要快得多,这个时候,我们就可以说高斯的计算方法具有更优秀的“快速性”。但是,这里的“优秀”只是我们的感性认识罢了,有没有更为科学的表述呢?能不能用更严谨的方式来衡量“快速性”呢?

时间复杂度

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

嗯上面就是百度百科关于时间复杂度的定义,很显然这个定义对现在的我们来说还是太抽象了一些,我们不妨再来看一个例子:

有一天,凶残的铁老师心血来潮地给老姜和帆帆布置了一个作业:在一串有序的数列中找出一个特定的数的位置,比如说给定数列,和一个特定的数:,很显然我们可以看出的位置为。

下面是老姜给出的算法:

读入数列
读入数k

定义 当前位数 = 1

循环 {
判断 当前位数 的数字是否等于 k
若 等于:
     输出 当前位数
    退出循环
若 不等于:
    当前位数 + 1
}

下面是帆帆给出的算法:

读入数列
读入数k

定义 当前查找区间左端等于 1
定义 当前查找区间右端等于 数列位数n

循环 {
定义 mid = 当前查找区间中点所在数的值
判断 k 是否大于 mid
若 大于:
    当前查找区间左端 = mid
若 小于:
    当前查找区间右端 = mid
若 等于:
    输出 mid
    退出循环
}

简单来说,老姜的算法是挨个查找,从数列的第一位一直查找到数列的最后一位,直到找到;而帆帆的算法是二分查找,利用数列有序的性质,每一次比较之后都会排除掉一半的查找区间

那么怎么比较这两种算法的优劣呢?很简单,看看在最坏情况下语句一共需要运行多少次(注:此处采用最坏时间复杂度的概念)

比如说,在这两个算法中,若数列长度为,在最坏情况下,老姜的算法一共要运行次读入语句来读入数列,运行次判断语句来找出,运行次输出语句来输出结果,运行次数可以记为,;

而帆帆的算法一共要运行次读入语句来读入数列,运行次判断语句,运行次输出语句来输出结果,运行次数可以记为,。

实际上,我们可以发现,不管是帆帆的算法还是老姜的算法,输入和输出部分其实是相同的,换句话说,我们真正关心的其实是中间的查找部分,所以我们可以粗略地转化一下,,

这样来看,孰优孰劣就很明显了,当数据规模趋近于时,帆帆的算法要大幅优于老姜的算法,因此,帆帆的算法具有更优秀的时间复杂度

记法

算法的时间复杂度记作:。它表示随问题规模的增大,算法执行时间的增长率和的增长率相同,称作算法的渐进时间复杂度,简称为时间复杂度。其中,是问题规模的某个函数。

比如, ,当 趋近于 时,常数与低次项对 的影响已经微乎其微,我们就可以记作 。 至此,在科普 意义上的时间复杂度我们已经了解了,接下来的内容可能就需要一些编程知识了。

典型时间复杂度分析

常数时间

//求从j到k所有自然数的和

显然,对于这段代码,与无关,其上界为一个特定的值,我们便称这样的算法的时间复杂度为常数时间,记作。

线性时间

//求从j到k所有自然数的和

显然,对于这段代码,循环部分是复杂度最高的,而循环中的语句最多被执行次,因此随线性增长,我们便称这样的算法的时间复杂度为线性时间复杂度,记作。

平方时间

//编不出来了

同理,我们来观察循环部分,每自增一次,都会自增次,循环体也就会被执行次,而一共会自增次,也就是说循环体一共会被执行次,因此,与线性相关,我们便称这样的算法的时间复杂度为平方时间复杂度,记作。

总结

至此,我们已经简单地了解了时间复杂度的定义、大记号、以及一些常见的时间复杂度,但是,受制于笔者本身的水平限制,尽管经过了仔细地校对,本篇文章仍有可能出现一些疏漏与问题,欢迎大家批评与指正。最后,如果大家想要更深入地认识时间复杂度,推荐阅读《算法导论》[坏笑]

8f1e2becb9c743cf65b2e0d831c0ee3e.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值