龙空技术网

算法效率的度量方法

上进的幺幺呦 114

前言:

此刻我们对“算法效率怎么算”大约比较注重,看官们都需要剖析一些“算法效率怎么算”的相关文章。那么小编在网上搜集了一些有关“算法效率怎么算””的相关资讯,希望大家能喜欢,朋友们快快来了解一下吧!

事后统计方法

这种方法主要是通过设计好的测试程序和数据,利用计算机计时器对不同算法编制的程序的运行时间进行比较,从而确定算法效率的高低。

但这种方法显然是有很大缺陷的:

必须根据算法事先编制好程序,这通常需要花费大量的时间和精力。如果编制出来发现它根本是很糟糕的算法,不是竹篮打水一场空吗?时间的比较依赖计算机硬件和软件等环境因素,有时会掩盖算法本身的优劣。现在的一台四核处理器的计算机,跟当年286、386等老爷爷辈的机器相比,在处理算法的运算速度上,是不能相提并论的算法的测试数据设计困难,并且程序的运行时间往往还与测试数据的规模有很大关系,效率高的算法在小的测试数据面前往往得不到体现。

基于事后统计方法有诸多缺陷,不采纳这种方法。

2.事前分析估算方法

在计算机和程序编制前,依据统计方法对算法进行估算。

经过分析,我们发现,一个用高级程序语言编写的程序在计算机上运行时所有消耗的时间取决于下列因素:

算法采用的策略、方法 编译产生的代码质量 问题的输入规模 机器执行指令的速度

一个程序的运行时间,依赖于算法的好坏和问题的输入规模。

我们来看上一篇提到的两种算法:

第一种算法:

第二种算法:

显然,第一种算法,执行了 1+(n+1)+n=2n+2 次;而第二种算法,是 1+1=2次。我们把循环看作一个整体,忽略头尾循环判断的开销,那么这两个算法其实就是n次与1次的差距。算法好坏显而易见。

我们再来延伸一下上面这个例子:

这个算法中,循环部分的代码整体需要执行 n*n 次,显然这个算法的执行次数对于同样输入规模n=100,要多于前面两个算法,这个算法那的执行时间随着n的增加也将远远多于前面两个。

可以这样认为,随着n值的越来越大,他们在时间效率上的差异也就越来越大。

推导大 O阶方法

用常数1取代运行时间中的所有加法常数在修改后的运行次数函数中,只保留最高阶项如果最高阶项存在且不是1,则去除与这个项相乘的函数

常数阶

这个算法的执行次数函数是f(n)=2,根据我们推导大 O阶的方法,第一步就是把常数项 2改为1.在保留最高阶项时发现,没有最高阶,所以这个算法的时间复杂度为 O(1)

线性阶

下面这段代码,它的循环时间复杂度为O(n),因为循环体中的代码执行n次。

对数阶

下面的这段代码,时间复杂度又是多少呢?

由于每次count乘以2之后,据距离n更近了一步,也就是说,有多少个2相乘后大于n,则2^x=n,得到x=log2n,所以这个循环的时间复杂度为O(logn)

平方阶

时间复杂度为O(n²)

常用的时间复杂度所耗费的时间从小到大依次是:

O(1) < O(logn) < O(n) < O(nlogn) < O(n²) < O(n³) < O(2ⁿ) < O(n!) < O(nⁿ)

标签: #算法效率怎么算 #数据结构中算法效率的度量可分为