走进算法和数据结构(二)——算法绪论(二)

14天阅读挑战赛
上一节说到算法的基本概念,算法与数据结构的关系,那算法的好坏是怎么度量的呢?这一节我们就来探讨一下。

所谓一个好的算法,无非是执行效率高,所用时间短,当然这时间的快慢有时和计算机有一定的关系,计算机内存的大小,处理器的处理速度都影响着计算结果输出的时间,我们研究算法,必须抛开这些外界因素,把代码块孤立出来,单纯来看、来研究代码块运行的时间,同样,代码块也要抛开各种编程语言编译机制的不同,单纯用所见到的代码来看所使用算法的执行效率。

算法的度量方法分为事后的统计方法和事前分析评估方法。

事后的统计方法:是通过对编制好的程序和数据,用不同的算法进行运行,比较得出最优算法的方法。

这种方法有几个很大的缺陷:一是需要设计完相关的程序,如果设计的算法不合理,设计出的程序将是没有意义的。二是处理器的处理速度,有时会掩盖算法的不足。三是对测试数据的设计必须全面,有时很难找到真正能够测试出性能优劣的临界数值。例如,一个数据是2^{n}数量级,我们找到的n的测试数量级是10,得出的数值是1024,如果n取11才是真正的测试临界数值,得出的数值是2048,这是整整一倍的增量,所以说,测试的数值不容易找到合适的。

事前分析评估方法:在程序编制前,依据统计法对算法进行估算。

算法的估算取决于以下几个因素:

1、算法采用的方法;

2、编译代码质量;

3、数据的输入规模;

4、机器执行指令的速度。

我们可以看到,算法估算的因素中,与我们直接有关的只有1和3两个因素,而这两个因素对算法的运行又有什么影响呢,我们通过下表看一看。

问题规模算法1(n+5)算法2(n)算法3(2n+2)算法4(2n)
n=16142
n=27264
n=38386

n=10

15102220
n=505550102100
n=100105100202200

 通过分析我们能够发现,当n=1,n=2时,算法1和算法3进行对比,算法1不如算法3,当n=3时,两者就一样了,但从n>3开始,算法3明显开始极大的高于算法1,因此,我们可以从整体上说,算法1的设计好于算法3的设计。同样我们也能够发现,当n=1,n=2,n=3时候,算法1比算法2、算法3比算法4要高很多,但当随着数据的增大,两者的数量级差距明显变小,当n=100时,就显得那么微不足道了,这显然,普通的常数对算法的影响可以忽略不计,在以后的计算中,我们便可以把这些常量舍去,能够更好的化简相关的数据,去掉干扰因素,对算法的好坏有更好的分析。

说到这里,不得不引出一个定义:函数的渐进增长。

函数的渐进增长是指,给定两个函数F(n)和G(n),如果存在一个正整数N,使得当所有的n>N时,F(n)总是大于G(n)的值,那么,我们就说F(n)增长渐进快于G(n)。

这渐进增长又和哪些因素有关呢?刚才说到,和后面的常数没有关系,我们继续研究一下子,看下面的表格。

问题规模

算法5(2\large n^{2}+2n+1)

算法6(\large n^{2}算法7(2\large n^{3}+2n+1)算法8(\large n^{3}
n=15151
n=2134218
n=32596127
n=1022110020211000
n=5051012500250101125000
n=100202011000020002011000000

通过算法5和算法7来对比,当n=1时,两个算法相同,当n=2时,算法7略高于算法5,但随着n的增大,我们会发现,最高次项的指数数值,随着n的增大,决定了结果的增长快慢,指数越大,增长越快。

那还有没有别的因素相关呢,我们再来看下一个表格。

问题规模

算法9(8n+6)

算法10(n)算法11(2\large n^{2}+2)算法12(\large n^{2}
n=114141
n=2222104
n=3303209
n=108610202100
n=504065050022500
n=1008061002000210000

我们来对比算法9和算法11,当n=1,n=2,n=3时候,算法9要大于算法11,但当n不断增大,算法11的增长速度明显加快,远远地大于算法9,因此,我们看到,数据的增长的更多的在于最高次项是多少,而最高次项前面的系数,每个式子中最高次项前面的常数就显得不重要了。

上面提到,算法的评估与加上的常数项无关,与最高次项的常数无关,与最高次项的指数数值有关,那还有其他的关联因素吗?我们接着来看下面的表格。

问题规模算法13(3n+1)算法14(3\large n^{2}算法15(3\large n^{2}+3n+1)
n=1437
n=271219
n=3102737
n=1031300331
n=5015175007651
n=10030130 00030 301
n=10003 0013 000 0003 003 001
n=10 00030 001300 000 000300 030 001
n=100 000300 00130 000 000 00030 000 300 001

通过表格我们可以发现,随着n的增大,3n在3\large n^{2}+3n+1中对数值增加起到的作用越来越小,3\large n^{2}+3n+1与 3\large n^{2}的数值也越来越近,因此,我们可以得出结论,我们关注最高项阶数就可以了,把常数和其他次要项可以忽略。

因此,随着n的增加,我们会发现,它会越来越接近某一个最优的算法,也会越来越远离一个最差的算法,而这个最优的算法就是我们学习本门课程所期待找出来的。

下一节,我们将学习怎么样量化算法的复杂度,算法的时间复杂度和空间复杂度。

 

 

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小熊恋旧

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值