首页 > 编程知识 正文

算法的时间复杂度分析方法,时间复杂度的三种符号

时间:2023-05-04 15:08:03 阅读:109899 作者:2223

算法这个词,其实最早来源于数学领域。 在数学领域,我们最熟悉的算法莫过于“高斯算法”了。 即等差数列之和的公式。 在计算机领域也有很多算法,可以计算排序、检索等。

算法其实有好坏之分。 衡量算法好坏有很多指标,其中最重要的是算法的时间复杂度和空间复杂度。 本节主要论述算法的时间复杂性。

时间的复杂性可以直观地理解为代码执行时间的长短。 实际上,由于运行环境和输入规模的影响无法估计代码的绝对执行时间,所以经常通过计算代码基本操作的执行次数来估计代码的执行时间。

在几个场景中说明如何计算时间复杂度。

场景1 :有10厘米长的面包。 程序员a每3min吃1cm,吃整个面包需要3 * 10=30min。 如果面包长n厘米,吃整个面包需要3 * n=3n min。 如果用一个函数来表达吃整个面包所需的时间,n可以表示为面包的长度。

场景2 :有16厘米长的面包。 程序员a每5min吃剩下的一半面包。 也就是说,第5min吃8cm,第10min吃剩下的8cm的一半4 cm……那么吃面包到只剩下1cm需要几分钟? 关于该场景的数学式,将16个连续的去除设为2,将去除几次后的结果设为1? 这涉及数学中的对数概念,即以2为底16的对数() )。 因此,只剩下1厘米的面包,就需要20min的时间。 如果面包的长度为n cm,则需要合计时间,表示以2为基准的n的对数。 如果用函数表示的话,我会记住的。

场景3 )如果给程序员a一条10cm长的面包和饮料,要求其2min喝完饮料,那么喝完饮料时2min。 如果面包长n厘米呢? 使用的时候也是2min。 与面包的长度无关,程序员喝饮料的时候是2min。 表示为函数。

场景4 :有10厘米长的面包。 程序员a吃前1cm需要1min,吃第2个1cm需要2 min……每吃1cm要比前面1cm多1min。 根据高斯算法,吃掉整个面包所需的时间为55min,可以用函数表示。

分析吃所需时间的思想也适用于程序基本操作执行次数的统计。 将t(n )作为程序基本操作的执行次数的函数(也可以认为是程序的相对的执行时间函数),将n作为输入规模,上述4个场景分别表示为程序中最一般的4种执行方式,即线形、对数、常数、多项式

即使有基本操作执行次数的函数t[n],也还是不能比较不同算法的执行时间。 例如,算法a执行次数,算法b的执行次数,这两个算法哪一个的执行时间长,这取决于n的大小。 因此,为了解决时间分析的难题,引入了渐近时间复杂度。 如果存在一个函数f ) n ),其中当n接近无穷大时,t(n )/f (n )的极限值变为不等于零的常数,则f ) n )被称为t ) n )的同量阶函数。 t(n )=o ) f(n ) ),o为算法的渐近时间复杂度,简称时间复杂度。 渐近时间的复杂度用大写的o表示,因此也称为大o表示法。 简言之,时间复杂度是指将程序的相对执行时间函数t(n )简化为一位数,该一位数可以是n,n(2,n ) 3等。

引导时间的复杂性有几个规则。

如果执行时间是常数等级,则仅存在用常数1表示保持时间函数中的最上位项,如果省略最上位项之前的系数,则与上述4个场景分别对应的时间复杂度函数如下:

场景1 :最高项为3n,如果省略系数3,则变换的时间复杂度为:

场景2 ),最高项,如果省略系数5,则变换的时间复杂度如下。

场景3 :如果只有常量级别,则变换的时间复杂度为:

场景4 ),最上位项为0.5n^2,如果省略系数0.5,则变换的时间复杂度如下。

以上4个时间复杂度,在不知道n的大小的情况下,无法直观地判断哪个算法的执行需要时间,但在n的取值足够大的情况下,可以看出以下内容。

除了这些最基本的时间复杂度之外,还有很少使用的算法的时间复杂度。 例如:

目前,计算机硬件的性能越来越强,但必须重视时间的复杂性。 因为高效算法和低效算法实际上有很大的差距。 例如,算法a的执行次数为时间复杂度,算法b的执行次数为时间复杂度。 算法a在旧计算机上运行,算法b在超级计算机上运行,超级计算机的运行速度是旧计算机的100倍。 那么,随着输入规模n的增大,2个算法的执行速度将进行如下对比。

n=110000005 n=5500000000500 n=1001000000000000 n=1000100000000000000 n=100000000000000 n 00000,n的值较小时,说明算法a的执行远远大于算法b; 当n的值为1000左右时,用于执行算法a和算法b的情况下,相近的n的值已经变大,达到10万、100万水平时,算法a的优势开始显现,但算法b的执行速度变慢,差异也很明显这就是时间复杂性造成的差异。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。