就像《黑客帝国》里面的Trinity所说的:
“Neo,是这个问题驱使着我们,是这个问题带你来到这儿。”
你知道这个问题,我也是。
作为本书的作者,我们将回答引领你到此的问题:
我能够使用某个算法解决我的问题吗?如果可以,那么怎么实现呢?
你也许并不需要理解一个算法为什么是正确的。如果你需要,那么请看看其他的资料,例如1180页的算法圣经——《算法导论》,作者是Thomas H.Cormen等(2001)。在那本书中你会了解到推论、定理以及证明;你也会从一些练习题和逐步递进的样例中看到算法是如何执行的。也许你会惊奇地发现,在算法导论中你找不到任何的实际代码,仅仅是一些伪代码的片段,伪代码是无数的算法教科书用来阐述算法的高级描述手段。在课堂上,这些教科书是非常重要的,但是在实际软件开发中,它们却起不到应有的作用,因为这些书假定伪代码都能够直接变成实际代码。
我们希望经验丰富的程序员在寻找问题的解决方案时,能够频繁参考本书。作为一名程序员,你每天要解决的问题都能在这里找到解决方案。在软件中,算法是决定成败的关键因素,在这里你能够了解到哪些决定能够改善关键算法的性能,也能够找到适合你的需求和解决方案的实际代码。
所有的算法都有实现,并且都使用测试工具经过仔细测试,以确保其正确性。而且,它们有足够的代码文档,能在这本书的代码库附录中找到它们。我们严格地遵照一系列的原则来设计算法、实现算法,以及编写这本书。如果这些原则对你很有意义,那么这本书也会同样有用。
原则:使用实际代码,而不是伪代码
为了计算最大网络流,一个实践者应该做些什么才能将图P-1的Ford-Fulkerson算法描述转换成实际代码呢?
图 P-1 教科书中常见的伪代码图中的算法描述来自于维基百科(http://en.wikipedia.org/wiki/Ford_Fulkerson),这个描述与《算法导论》上的伪代码极其相似。最好还是不要期望一个软件的开发者能够根据这个Ford-Fulkerson算法的描述开发出实际的代码。翻到第8章,对比一下我们的代码。我们只使用有注释的,并且是精心设计过的代码。在你自己写的代码或者软件系统中使用我们提供的现成代码,或者这些代码的逻辑吧。
一些算法教科书确实有完整的C或者Java代码。但是这些教科书的目的通常是教初学者编程语言,或者是解释如何实现抽象数据类型。而且代码都只是在页面的狭窄边栏,作者通常都会忽略注释和错误处理,或者使用在实际应用中不会用到的快捷方法。我们相信程序员能够从有注释的,并且是精心设计过的代码中学到更多的东西,这就是我们为什么做如此多的工作来开发算法的实际解决方案。