算法星河

乘上探索计算机科学的宇宙飞船,向着星河,立刻出发!

前言

前言到底要不要读?其实读不读随你,错过了什么重要内容可别怪我哦。

关于算法

算法(Algorithm),顾名思义,就是计算某个东西的方法。算法能力对于一个程序员来说,是与其他“代码的搬运工”区别开来的最大依据,是一个程序员是否真正具备计算机科学思维能力的依据。

有些人听到算法便“望而生畏”,认为算法是他不可触及的神秘领域。但实际上,算法很有趣,也很有用。本书,就如其名《算法梦境》,带你在如同梦幻而美妙的梦境中学习精妙而实用的算法知识。算法的趣味,只有接触到之后才能够领略。那么,马上来一起边“做梦”边学习算法吧!

关于本书

本书名称

《算法梦境》,一听就是个高级的名字,对吧?(作者眼神神秘地看着你)

“梦境”这个词,通常是褒义词1,是美妙的、令人回味无穷的。算法也是这样的。真正学习算法的时候,你常常会为那些聪明的前辈而感叹,为精妙的优化而惊叹,为神奇的思路而兴奋。

我既然将本书的名字取为《算法梦境》,就已经决定好了:带你像做梦一样,轻松而愉悦地学会算法!

本书约定

本书使用的编程语言

本书与众不同的一个点就是:本书的算法实现使用 C# 编程语言(主要)和 Rust 编程语言(次要)!

为什么呢?

  1. C# 语言是一门功能非常丰富和强大的现代编程语言,其代码容易阅读和迁移到其他编程语言。
  2. Rust 和 C# 是静态类型的语言,相较于 Python、JavaScript 等动态类型的语言,在代码表达能力方面要强大得多。
  3. C# 语言有强大的 GC 进行内存管理,能够让我们专注于算法的实现的时候不必考虑内存管理以及 Rust 的生命周期管理的琐碎细节。
  4. Rust 使用的独特的所有权系统,让我们从内存管理中解放出来:没有垃圾回收(GC),也不用手动管理内存,又快又安全!但是所有权系统有时候会给编码带来一定麻烦,所以在专注算法的实现的时候,我们会偏向使用 C# 语言。
  5. Rust 严格的所有权系统能够强制让你养成良好的编码习惯,将这个习惯代入任何编程语言与任何项目中,都是对你有所帮助的。尤其使用这种良好的编码习惯来编写算法,对思维能力与编码能力都有很大的提升。
  6. 更重要的是: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 入门的内容了。

各种“框框”

本书会使用各种“框框”来进行内容的补充说明,具体来说,有如下几种:

拓展

拓展

在这个部分,会有各种拓展内容,例如有趣的小故事、拓展的算法优化等等。在这部分的内容是选读的,不读通常不会造成很大的影响,但我还是真诚地建议你阅读一下拓展部分的内容,也许还会有令你会心一笑的内容呢!

提示

提示

这是一小段提示,往往会包括一些小技巧、优化、解释说明等内容。

成功

成功

这是最令人高兴的部分!出现这个东西,通常意味着我们的某个尝试或算法的实现成功了!

赶紧去庆祝一下吧!

警告

警告

我要警告你了!在这里出现的东西,是你千万要小心的

这里的内容通常不建议跳过

危险

危险

这是比警告更严重的东西,出现在这里的,你千万一定要注意并小心

这里的内容通常强烈不建议跳过

通俗性与专业性

本书在通俗性与专业性上做了取舍。本书尽量以简介易懂的语言以及直观的图形描述算法,但某些地方可能难以直观讲述,且某些读者可能希望读到有一定专业性的内容。本书会把一些专业的数学、计算机科学分析放在拓展框或提示框中,以做补充说明。在讲解文本中也会涉及到部分数学说明,但都是很简单的数学。

数学

本书会使用到一些数学公式,这些数学公式严格按照数学的规范进行排版。例如:

f(x)=logx(x21x) f\left(x\right) = \log_{x}\left(x^2 - \dfrac{1}{x}\right)

代码

本书中会出现各种各样的 C# 和 Rust 代码。代码使用等宽字体,有行号,并进行简单的高亮。

例如:

1
2
3
4
5
public static class Program {
private static void Main() {
Console.WriteLine("Hello, World!");
}
}
1
2
3
fn main() {
println!("Hello, World!");
}

本书中,为了节省篇幅,通常会省略一定的已知上下文。例如,你可能会见到这样的代码:

1
2
3
4
5
6
7
public class Sample {
// ...
public void Print() {
Console.WriteLine("Hello, World!");
}
// ...
}
1
2
3
4
5
6
7
impl Sample {
// ...
fn print(&self) {
println!("Hello, World!");
}
// ...
}

其中注释的内容就是省略的其他内容,这些内容通常是上文提到过的。

甚至你可能会阅读到这样的代码:

1
2
3
public void Print() {
Console.WriteLine("Hello, World!");
}
1
2
3
fn print(&self) {
println!("Hello, World!");
}

这种代码将整个 class 块或 impl 块全部省略,但是你也可以根据上下文推测出来这段代码应该放在哪里。

开始吧

现在,你已经大致了解了本书,也终于可以开始你的算法梦境之旅了!

祝你好运!


  1. 你应该没听过谁用“梦境”这个词修饰噩梦吧?
  2. Aders Hejlsberg:中文名安德斯·海尔斯伯格,曾在 Borland 公司参与过 Turbo Pascal 和 Delphi 的开发。被微软聘请后,先参与 Visual J++ 的开发(此项目后来被终止),随后还发明了 TypeScript 语言。它是 .NET 的提出者,主导并开发 C# 编程语言,成为 .NET 的首席架构师。可以说,如果编程语言领域也有图灵奖,那么 Anders 必将是最终大奖的获得者。
  3. 问题驱动:一种高效学习方法,意思是在基本的知识框架搭建完成之后,直接开始应用知识,并在遇到问题的时候想办法解决问题并补充未曾学习到的知识。在知识点较多、学习资源零散的时候,此类学习方法非常有优势,而且能快速将知识投入应用之中。