NashZhou

广告算法工程师,目前致力于关键词广告的效果自动优化

通过时间与空间转换来提高算法性能

引入例子:一个人去完成一件事情,如果派多个人去做的话,只要配合默契,效率比一个人做肯定要高,效率提高,所需的时间就减少了。如果只能一个人完成,那么必须设法提高自己的劳动效率,这个提高可以是量的改变也可以是质的改变。我把这个量的改变称为空间上的改变,也就是说空间和时间是可以相互转换的。

如何提高计算机的性能一直是一个热点,通常想要对一个程序或硬件进行质的改变是极具技巧性的。然而通过增加空间从而减少时间是一个普遍可行的策略。

那么在计算机中,空间有那些呢

1硬件上的空间

这个我不多讲,我对硬件也了解不多,但是纵观处理器的更新换代,流水线的提出以及向量机的发展都可以验证一个命题,质变是量变的积累,量变导致质变。

2程序上的空间

首先硬件上的空间给程序上的空间提供条件,最简单的比如多核给并行算法,分布式系统给分布式算法创造了可能,

我们在具体程序设计中如何利用它提高程序的性能呢

1内存

早期,存储器是非常稀有的资源,为了提高利用率和减少成本,人们引入了cache-内存-外存三层结构,对于程序设计而言主要接触的是内存,而链式存储是为了提高利用率,节省空间必然导致时间的增加,众所周知,链式存储是不能立即访问的。当前计算机硬件发展十分迅猛,内存充足,这时通过适当空间的增加从而减少时间是非常有必要的。

典型的例子就是在查找中一级索引甚至多级索引的引入,这个性能的提高是十分客观的,还有就是递归算法与非递归算法的转换。递归算法消耗更多的空间,但他使算法看起来简洁明了,至于性能,具体问题具体分析,但一般不会比非递归算法的性能差。

以下列出几个具体的实例:

(1)             单向链表增加一些指针,可以改成单向循环链表,双向链表,双向循环链表。甚至建立一个对应的地址顺序表,使链表也可以“立即访问”。

(2)             顺序查找中,在线性表的前端增加一个数据单元,用待查找的值给这个单元赋值,也就是所谓的设定“监视哨”。

(3)             冒泡排序中,增加一个变量用于判断是否发生交换,可以在原始数据有序的情况下改善算法性能。

(4)      设计一个栈,要求min(返回栈内最小值),push,pop的时间复杂度都是O(1).此时可以在每个栈结点内附加一个值用于存储当前的最小值。

……

2程序

程序方面主要是多线程以及并行算法的设计。这里不做过多描述 

总结:在算法设计中,在恰当的位置适当的增加一些数据和操作(不是提倡对内存的浪费),可以对算法性能产生一定程度的改善。

后记:一般来说时间与空间的转化是有一定的比例的,但是当我们引入hash函数和允许一定的错误率后,可以在较小辅助内存下获得更大的性能提升。

例如Bloom Filter就是一个非常非常好的例子,可以好好研究研究。

 

posted on 2011-09-17 09:51  NashZhou  阅读(1189)  评论(0编辑  收藏  举报

导航