第一天:算法的评估

先读《程序员实用算法》这本书吧,每天一小步


算法一般被设计用于以最小的代价高效地解决特定的问题。一般来说,算法最重要的度量标准是时间。

度量性能

算法不依赖于计时,而是依赖于一个直观的方程,以显示输入的大小与性能直接的关系。用于显示这种关系的传统方法是使用符号O,称为O表示法(big-oh notation)。在大O表示法中并不考虑可能影响性能的其它因素,该表示法只是简单的说明数据规模(一般用N表示,偶尔也用n表示)与算法的典型性能之间的关系。

例如:冒泡排序算法,对于一个给定的项目列表,通过遍历一次列表对其中的每个项目进行排序。每次遍历,都会减少一个要检查的元素。所以对于N个元素的列表,依次需要比较N-1,N-2,N-3......,2,1,所以比较的总次数为N(N-1)/2,在大O表示法中,数据规模和执行之间的关系(将这种关系成为性能)将记作O(N(N-1)/2)。

如果一种算法的性能比O(N * N)更差,我们通常认为它是无用的。通过分析可以发现在大O表示法中N的阶是至关重要的,二其前面的常数则不是(随着N的增大,常数的作用会越来越小)。因此,大O表示法中仅使用N的阶,不使用常数。因此,冒泡排序法的大O表示为:0(N(N-1))。

平均情况和最坏情况

只根据单个方程或度量标准来确定算法的性能是远远不够的。某些算法在大多数情况下性能很好,但是在最坏的情况下的结果可能是无法接受的。因为对于通用算法而言我们一般无法限定算法的输入,因此分析并处理算法的最坏情况,显得十分重要。

修改算法

一般有两种策略:优化现有的算法或者开发新的算法。优化算法的时候,一般不会尝试使其性能方程降级。而是优化其关键步骤的执行时间,来达到提高性能的目的。新开发的算法,一般就是开发一种新的算法使性能方程降级。

在算法修改中,首先应该应用标准技术:使用输入/输出(I/O)减小到最小,减少函数调用次数,限制计算密集型操作,比如浮点运算和频繁的使用除法运算。然后,必须确定执行得最频繁的算法元素。最后,要检查可能由于疏忽而导致特别缓慢的实现。

1. I/O优化

I/O通常发生在毫秒级时间范围内,而CPU活动一般发生在亚微妙级的范围内。因此,对于算法而言,任何I/O的代价都非常高昂。如果不能消除I/O本身,那么可以通过缓存来减小它的影响

2. 函数调用优化

常见的方法是使用inline函数或者宏,把函数直接隐藏在算法中。另一种方法是消除递归,在可能的情况下,尽量避免使用递归。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值