Preface - 前言
在我大学期间刷算法题目的时候,经常遇到的情况是:要么题目太简单一看就会做,要么题目太难想三天也做不出来。
后来我明白了其原因在于我并没有做到真正的深刻理解这些题目背后的算法,只会把一些算法原理套用在最简单的算法题目上面,题目稍微改变,我就没办法搞定它们了。
当时我一边刷OJ题目,一边把自己遇到的各种算法源码进行整理并归类,放在github库上。可过了半年之后再看这些代码,发现我已经完全不认识它们了。
因为如果不理解算法背后的数学意义,只看代码确实很难搞清楚那些代码到底在干什么。
我认为单纯的算法源码很难学习理解,而将算法图形化、公式化才是最容易让人理解的方式,因为可以从数学角度来准确的描述问题和解决过程。
因此我将这些内容用自己的方式画出来,配合代码和测试,就形成了目前这本关于大学生计算机算法的书籍。它不再是简单的“源码”合集,而更加是一本“书”,
本书的每一章专门讲解一类算法问题,其中又划分多个小节,专门讲解其中的一个分支或变种。
同一章节中各个小节间会有明显的联系,基础的算法在前面,变种的、高级的算法在后面。每个算法都有讲解、源码和测试三个部分。
在编写的过程中,我学习和参考了非常多的资料,有很多都忘记了,记得的会列在参考资料中。
本书的发布方式也几经周折。我需要一种能够同时展示文字段落、数学公式、插图和源代码这四个部分的载体,来展示自己的想法。之前尝试过用doc编写,到处pdf展示(github上可以直接浏览pdf文档)。但因为二进制文件(pdf)没办法被版本控制软件git去重,导致项目库臃肿,每次更新docx文档,都会生成新的pdf文件。
后来尝试了markdown编写,再用visio绘制png图片,用github page来发布静态文档,这样可以避免生成pdf文件,但png图片仍然无法会占用大量的仓库存储。后来发现SVG这种基于文本文件且支持浏览器的图片可以完美解决,最终采用了draw.io来绘制SVG图片的方式。
最后一个问题就是如何在markdown文档中显示数学公式,当我发现gitbook的插件”mathjax”可以支持Latex,而”include-codeblock”甚至可以在文档中直接展示算法源码时,立刻决定采用gitbook作为本书的发布方式。
gitbook的发布方式支持markdown文档、Latex公式、SVG图片、展示源码、集成github代码库,而且通过gitbook站点可以直接分发本书。但由于gitbook的插件mathjax对website和ebook的支持存在bug,目前通过浏览器访问需要两次刷新才能正确显示Latex公式,而且pdf也无法正确下载。这些bug可能需要更久的时间等待gitbook及相关作者的修复,或者找到其它更好的替换方案。
本书主要使用markdown编写文档、draw.io制作SVG插图、cmake管理C++11项目、gitbook发布书籍,编写时尽量与书中基本完成的前四章风格保持一致。
后来NEWPLAN同学参加到这本书籍的编写中,他添加了很多内容。
欢迎更多的同学来一起丰富这些资料。也希望可以增加更多专业领域中的计算机算法,不再局限于OJ和算法比赛。
西安交通大学计算机系
林荣彬
2014年2月16日