前言到底要不要读?其实读不读随你,错过了什么重要内容可别怪我哦。
关于算法
算法(Algorithm),顾名思义,就是计算某个东西的方法。算法能力对于一个程序员来说,是与其他“代码的搬运工”区别开来的最大依据,是一个程序员是否真正具备计算机科学思维能力的依据。
有些人听到算法便“望而生畏”,认为算法是他不可触及的神秘领域。但实际上,算法很有趣,也很有用。本书,就如其名《算法梦境》,带你在如同梦幻而美妙的梦境中学习精妙而实用的算法知识。算法的趣味,只有接触到之后才能够领略。那么,马上来一起边“做梦”边学习算法吧!
关于本书
本书名称
《算法梦境》,一听就是个高级的名字,对吧?(作者眼神神秘地看着你)
“梦境”这个词,通常是褒义词1,是美妙的、令人回味无穷的。算法也是这样的。真正学习算法的时候,你常常会为那些聪明的前辈而感叹,为精妙的优化而惊叹,为神奇的思路而兴奋。
我既然将本书的名字取为《算法梦境》,就已经决定好了:带你像做梦一样,轻松而愉悦地学会算法!
本书约定
本书使用的编程语言
本书与众不同的一个点就是:本书的算法实现使用 C# 编程语言(主要)和 Rust 编程语言(次要)!
为什么呢?
- C# 语言是一门功能非常丰富和强大的现代编程语言,其代码容易阅读和迁移到其他编程语言。
- Rust 和 C# 是静态类型的语言,相较于 Python、JavaScript 等动态类型的语言,在代码表达能力方面要强大得多。
- C# 语言有强大的 GC 进行内存管理,能够让我们专注于算法的实现的时候不必考虑内存管理以及 Rust 的生命周期管理的琐碎细节。
- Rust 使用的独特的所有权系统,让我们从内存管理中解放出来:没有垃圾回收(GC),也不用手动管理内存,又快又安全!但是所有权系统有时候会给编码带来一定麻烦,所以在专注算法的实现的时候,我们会偏向使用 C# 语言。
- Rust 严格的所有权系统能够强制让你养成良好的编码习惯,将这个习惯代入任何编程语言与任何项目中,都是对你有所帮助的。尤其使用这种良好的编码习惯来编写算法,对思维能力与编码能力都有很大的提升。
- 更重要的是:Rust 语言的前途无可限量!Rust 语言的热度越来越高,越来越多的人学习 Rust,越来越多的项目在用 Rust 重写或扩展,C/C++ 的世界早晚要“入侵”一个 Rust,无论最后 Rust 会基本代替 C/C++ 还是与其并存。而 C# 语言则出自编程语言超级大师 Anders Hejlsberg2,兼容了很多语言的优点,只要不是在资源紧缺到连一个字节都需要斟酌的单片机,几乎是万能的语言。
本书在主体的算法讲述部分使用 C# 语言,在本书附录中会给出 Rust 语言的实现以及实现过程中的一些要点。Rust 学习者也可以将附录当作学习 Rust 的一种资源,看看 Rust 是如何被应用到实际算法中的。
为此,你需要掌握一定程度的 C# 和 Rust 编程能力。不需要太多太精,只需要能够编写程序即可。本书中如果出现了 Rust 中较深的内容,会有相关的注释解释的。
由于 .NET 的复杂性和 C# 语言的更新速度,你还真不一定能够完全学会 C#(我也不一定)。而且现有的 C# 学习资源很杂乱,有些甚至是过时的。如果要学习 C# 语言,可以先跟随官方教程学习,在以问题驱动3的方式学习更多内容。本书中若出现 C# 特定的或较高级的代码,会进行一些解释。
学习 Rust 的资源有很多,最好的就是官方教程 The Rust Programming Language 与中文社区翻译《Rust 语言圣经》。本书就不再提供 Rust 入门的内容了。
各种“框框”
本书会使用各种“框框”来进行内容的补充说明,具体来说,有如下几种:
拓展
拓展
在这个部分,会有各种拓展内容,例如有趣的小故事、拓展的算法优化等等。在这部分的内容是选读的,不读通常不会造成很大的影响,但我还是真诚地建议你阅读一下拓展部分的内容,也许还会有令你会心一笑的内容呢!
提示
提示
这是一小段提示,往往会包括一些小技巧、优化、解释说明等内容。
成功
成功
这是最令人高兴的部分!出现这个东西,通常意味着我们的某个尝试或算法的实现成功了!
赶紧去庆祝一下吧!
警告
警告
我要警告你了!在这里出现的东西,是你千万要小心的!
这里的内容通常不建议跳过!
危险
危险
这是比警告更严重的东西,出现在这里的,你千万一定要注意并小心!
这里的内容通常强烈不建议跳过!
通俗性与专业性
本书在通俗性与专业性上做了取舍。本书尽量以简介易懂的语言以及直观的图形描述算法,但某些地方可能难以直观讲述,且某些读者可能希望读到有一定专业性的内容。本书会把一些专业的数学、计算机科学分析放在拓展框或提示框中,以做补充说明。在讲解文本中也会涉及到部分数学说明,但都是很简单的数学。
数学
本书会使用到一些数学公式,这些数学公式严格按照数学的规范进行排版。例如:
代码
本书中会出现各种各样的 C# 和 Rust 代码。代码使用等宽字体,有行号,并进行简单的高亮。
例如:
1 | public static class Program { |
1 | fn main() { |
本书中,为了节省篇幅,通常会省略一定的已知上下文。例如,你可能会见到这样的代码:
1 | public class Sample { |
1 | impl Sample { |
其中注释的内容就是省略的其他内容,这些内容通常是上文提到过的。
甚至你可能会阅读到这样的代码:
1 | public void Print() { |
1 | fn print(&self) { |
这种代码将整个 class 块或 impl 块全部省略,但是你也可以根据上下文推测出来这段代码应该放在哪里。
开始吧
现在,你已经大致了解了本书,也终于可以开始你的算法梦境之旅了!
祝你好运!
- 你应该没听过谁用“梦境”这个词修饰噩梦吧? ↩
- Aders Hejlsberg:中文名安德斯·海尔斯伯格,曾在 Borland 公司参与过 Turbo Pascal 和 Delphi 的开发。被微软聘请后,先参与 Visual J++ 的开发(此项目后来被终止),随后还发明了 TypeScript 语言。它是 .NET 的提出者,主导并开发 C# 编程语言,成为 .NET 的首席架构师。可以说,如果编程语言领域也有图灵奖,那么 Anders 必将是最终大奖的获得者。 ↩
- 问题驱动:一种高效学习方法,意思是在基本的知识框架搭建完成之后,直接开始应用知识,并在遇到问题的时候想办法解决问题并补充未曾学习到的知识。在知识点较多、学习资源零散的时候,此类学习方法非常有优势,而且能快速将知识投入应用之中。 ↩