89. 使用正确的数据结构与算法

来源:互联网 发布:手游老是网络异常 编辑:程序博客网 时间:2024/05/13 06:51

使用正确的数据结构与算法

        某个有着很多分办公室的银行抱怨他们给出纳员们买的新电脑都太慢了。这还是电子银行普及、ATM遍布之前。人们经常要去银行,电脑慢就造成了人们在银行里面排队。于是,银行威胁它的供应商要取消合同。

        供应商派出了一个性能分析和调优的专家来调查延迟的原因,很快他就发现有一个特定的程序运行时几乎占用了全部的CPU。通过使用分析工具,他仔细检查了该程序,并看到了出问题的函数。源代码如下:
for (i=0; i<strlen(s); ++i) {  if (... s[i] ...) ...}
        其中,字符串s平均都有几千个字符长。代码(银行写的)很快就被修改了,于是出纳员们从此也就开始了幸福的生活...

        

        程序员用更好的东西来代替不必要的二次度量的代码不是更好吗?

        每次调用strlen时,都遍历了该字符串的每一个字符以找到最终的null字符,但是这个字符串一直没有改变。通过判定它的长度,程序员可以节省数千次的strlen的调用(以及数百万次的循环执行):
n=strlen(s);for (i=0; i<n; ++i) {  if (... s[i] ...) ...}
        每个人都知道“先让它工作,再让它更快地工作”的格言以避免落入微观优化的陷阱。但上面的例子可以让我们相信程序员是遵循了马基雅弗利式的“先让它慢点工作”。
        你可能会不止一次地遇到思考不够的情况,这不只是个“不要重新发明轮子”的事情。有时候新手程序员只是不加思考的信手打字,突然他们就发现了冒泡排序,甚至还会因此吹嘘。
        选择正确算法的另一方面是选择数据结构。它可能会让结果大不相同:如果你对想搜索的数百万条数据采用链表,与采用哈希数据结构或者二叉树相比,可能会极大地影响用户对你的程序的欣赏程度。
        程序员不应该重新发明轮子,应该在可能时就使用现有的库。但为了避免此银行的问题,他们也应该接受算法及其度量的教育。现代的文本编辑器和WordStart之样的老程序一样慢的原因仅仅是那些华而不实的东西吗?很多人说重用在编程中是至高无上的,但程序员应该了解什么时候如何去重用什么。要做到这些,他们就必须有问题领域、算法和数据结构的知识。
        一位优秀的程序员也应该知道何时使用一个不好的算法。比如,如果问题领域已经规定了不可能超过5项(像是Yahtzee游戏中骰子的数目),你就知道总是最多排序五项。这种情况下,冒泡排序可能实际上是最有效率的。什么都有春天。

        所以,读一些书吧,并确保你理解了它们。如果你真的很好地读了Donald Knuth的《计算机编程艺术》,你可能会很幸运:找到作者的一处错误并获得Don Knuth的一张十六进制的美元($2.56)的支票。

原文:Use the Right Algorithm and Data Structure by JC van Winkel

0 0
原创粉丝点击