每个程序员都应该阅读关于数据结构和编程语言的十大算法书籍!
点击上方关注,All in AI中国
作者——Kimberly Cook
算法、数据结构与语言并没有直接关系,任何称职的程序员都应该能够将它们转换为自己选择的语言。不幸的是,我遇到过几个非常擅长编程语言的程序员,以Java为例,他们知道API的小细节和复杂的语言流程,但对算法却知之甚少。让他们纠正比较流行的排序算法,比如快速排序算法,他们会难以下手。别说更复杂的算法,如字符串,图像算法,树或贪婪算法(等等)。有一次,我问了一个非常优秀的应聘者,他擅长Java和多线程,但是他在数据结构和算法上的能力是极其浅薄的。我问他,为什么他来面试前不花时间学习算法和解决问题的技巧。他的借口是"这些算法只适用于面试,从未真正用于实际的编码。在我6年的Java开发生涯中,我从未使用过它们。"他是对的,但他没有认识到从长远的角度考虑,算法和数据结构在提高编程技能方面所起的作用。它们是培养编程技巧和编码意识的工具,是将用户需求转化为一行代码(也称为计算机程序)的"必需品"。
10本关于算法和数据结构的书籍,开发人员必读
算法就是数据结构,是为那些想在亚马逊,谷歌,脸书,英特尔或微软工作的人准备的,记住这是唯一永恒的技能。当然,除了UNIX和C语言之外,语言来来去去,似乎很难统一。但编程的核心是算法和数据结构。如果你知道哈希表是如何工作的,那么你可以在任何编程语言中使用它们,例如JDK中的HashMap或C+Boost库中的HashMap。因此,如果你现在认真考虑编程并认识到算法和数据结构是你必须掌握的,这里有一些学习算法的好书。你们中的一些人可能以前读过,但它们值得再读一遍。
托马斯·科尔曼的《算法导论》
(http://aax-us-east.amazon-adsystem.com/x/c/QorfaNaA1mR7FOHY0lphrUIAAAFmR6sZRAEAAAFKAUukP4A/https://assoc-redirect.amazon.com/g/r/http://www.amazon.com/Introduction-Algorithms-Edition-Thomas-Cormen/dp/0262033844/ref=as_at?creativeASIN=0262033844&linkCode=w61&imprToken=gaqdlw0ZBFSHo9hN76xyuA&slotNum=0&tag=javamysqlanta-20)
这是最流行的算法书籍之一,但要知道它包含了大量的理论。这本书的最新版本是第三版,我强烈建议每个程序员都应该把它放在他们的书架上,但仅限于短期阅读和参考。因为一口气读完这本书是不可能的。另外我推荐这本书作为第一本关于算法的书,因为它与语言并没有直接关系。
罗伯特·塞奇维克和凯文·韦恩的《算法》
(http://aax-us-east.amazon-adsystem.com/x/c/QorfaNaA1mR7FOHY0lphrUIAAAFmR6sZRAEAAAFKAUukP4A/https://assoc-redirect.amazon.com/g/r/http://www.amazon.com/Algorithms-4th-Edition-Robert-Sedgewick/dp/032157351X/ref=as_at?creativeASIN=032157351X&linkCode=w61&imprToken=gaqdlw0ZBFSHo9hN76xyuA&slotNum=1&tag=javamysqlanta-20)
很长一段时间以来,这是我最喜欢的算法资源,现在仍然是,但是我现在看它的次数比以前少了。你会学到很多关于算法的背景知识,现在这本书的特定版本可以用在不同的编程语言上,例如Java和c++。还有一门课程是关于这本书的,即《算法》第1部分和《算法》第2部分。这是我对Java程序员学习算法的最好建议,信不信由你。如果你已经知道了一种编程语言,那么阅读这本书你要获得全新的理解。你也可以在网上免费阅读这本书的第四版。
史蒂夫S.斯基纳的《算法设计手册》
(http://aax-us-east.amazon-adsystem.com/x/c/QorfaNaA1mR7FOHY0lphrUIAAAFmR6sZRAEAAAFKAUukP4A/https://assoc-redirect.amazon.com/g/r/http://www.amazon.com/Algorithm-Design-Manual-Steven-Skiena/dp/1849967202/ref=as_at?creativeASIN=1849967202&linkCode=w61&imprToken=gaqdlw0ZBFSHo9hN76xyuA&slotNum=2&tag=javamysqlanta-20)
这是另一本关于算法的好书,里面有大量的算法代码。我特别喜欢这本书的地方是他在实践中使用算法(或其变体)的例子;它确实可以帮助你看到某个特定算法(或一系列算法)是如何解决特定类别的问题。
代码是用C语言编写的,但它不是很深奥,很容易理解。
通过这本书,我在图形算法上得到了很快的提高。我已经用了差不多10年,现在仍然不时地阅读它。
《面试常见算法》
(http://aax-us-east.amazon-adsystem.com/x/c/QorfaNaA1mR7FOHY0lphrUIAAAFmR6sZRAEAAAFKAUukP4A/https://assoc-redirect.amazon.com/g/r/http://www.amazon.com/Algorithms-For-Interviews-Adnan-Aziz/dp/1453792996/ref=as_at?creativeASIN=1453792996&linkCode=w61&imprToken=gaqdlw0ZBFSHo9hN76xyuA&slotNum=3&tag=javamysqlanta-20)
Adnan Aziz写的《面试常见算法》是一本关于算法的必读书籍,它的目的是让编程面试"有迹可循"。封面本身显示了这本书有多有趣,如果你仔细观察封面上的图片,你会发现是用名人的缩略图绘制的,这本书解释了如何开发这种算法。我喜欢这本书,因为它的方法和目标都颇为独特。
《算法技术手册》/即:Algorithm in Nutshell
简而言之,奥莱利的算法是一本学习编程算法的好书,尤其是对Java程序员来说。它描述了算法,重点是如何实现它们。它没有像其他经典的算法书籍一样使用大量的数学理念,而是把所有的算法都以模式的形式呈现,告诉你使用它们的动机,给出概述的图片和伪代码以及工作代码(在C、c++、Java和Ruby中)。这本书为算法的理论性能提供了很好的想法。简而言之,这是为程序员学习算法所准备的最好书籍(之一)。
Kleinberg和Tardos的《算法设计》/即:Algorithm Design
这实际上是继托马斯·科尔曼的《算法导论》之后,算法领域的第二好书。它并不是对算法进行介绍,它更适合有经验的程序员。它更多的是为熟悉基本算法的开发人员准备的。你应该从罗伯特·塞奇维克的《算法》开始,然后再阅读这本书。
《算法导论:一种创造性的方法》/即:Introduction to Algorithms: A Creative Approach
《算法导论:一种创造性的方法》是一本很好的自学书籍,因为它充满了数百个问题和例子。它旨在提高读者解决问题的能力和理解算法设计背后的原则,这将帮助你提高你的程序解决和编码方面的能力。
《算法的设计与分析》/即:The Design and Analysis of Algorithms
这是另一本伟大的计算机算法书籍,值得在程序员的书架上占有一席之地。一旦你学习了Coursera的算法课程和其中一本入门书籍,你就可以阅读这本书来学习算法方面的高级主题。
《数据结构和算法》/即:Data Structures and Algorithms
这是另一本关于算法和数据结构的好书。一本详细而清晰的书,任何不喜欢在算法上大量使用数学的程序员都会喜欢这本书。
《Python算法:掌握Python语言的基本算法》/即:Python Algorithms: Mastering Basic Algorithms in the Python Language
这本书是为Python程序员设计的。MagnusLieHetland也是另外一本流行的python入门书《开始走进Python》的作者。这本书给出了很多关于图形算法的要点。正如我已经告诉过的,算法是独立于语言的,学习python算法并不意味着你不能在Java或C+中实现它们,但是如果你已经知道Python,那么这是一本学习计算机算法的好书。
这就是每个程序员应该阅读的10本算法书籍。我同意算法的复杂性,在一次阅读中很难理解它们,在这种情况下,我建议阅读同一本书两次。此外,仅仅阅读是不够的,试着用你喜欢的编程语言来实现它们。编写自己的动态数组、HashMap或基于树的实现并不为过。学习算法的效果并不是立即可见的,但随着时间的推移,你会注意到你的思维、解决方案的构建和代码质量都有了细微的改进。最后,我们只会有两种类型的程序员,一个懂算法,一个不懂算法。
如果你喜欢这一系列的书籍,那么你也会喜欢我这次收集的每一个程序员都应该读的10本书,这是近50年来关于编程、编码、软件开发技术方面最伟大的书籍清单。
顺便说一下,如果你对在线算法课程感兴趣,我建议你看看《算法和数据结构》的第1和2部分(https://pluralsight.pxf.io/c/1193463/424552/7490?u=https%3A%2F%2Fwww.pluralsight.com%2Fcourses%2Fads-part1)。这门网课Pluralsight上有。这是免费的课程,但你需要登录Pluralsight。它还提供10天的免费试用期,这足以让你选修这门课程以及其他数据结构和算法课程。