如何开始学习数据结构和算法
当我在90年代中期十几岁的时候开始学习编程时,我必须学习很多关于搜索和排序算法、链表、智能指针、二叉树和四叉树、设计模式、内存管理等等。
今天,由于Python和JavaScript等高级语言的进步,您可以在不深入研究这些概念的情况下开始编程生涯。这既是好事也是坏事。
一方面,你可以加快学习编码的速度,减少基本工作的挫败感。大多数著名的数据结构、算法和设计模式都融入了流行的编程语言。另一方面,不知道幕后发生了什么会导致选择错误的解决方案和技术,并编写出不是最佳的代码。
对于自学者来说尤其如此,自学者在开发者社区中占了相当大的比例。有一段时间,我一直在寻找一本关于数据结构和算法的入门书籍。
我最近有机会阅读有趣的数据结构 作者Jeremy Kubica,他发现这是新手程序员以及希望提高关键软件概念知识的开发人员的最佳书籍。
学习基础知识
虽然这个名字听起来有点傻(对于编程,我喜欢非常平淡的名字,比如“机器学习入门”或“高级JavaScript安全性”),有趣的数据结构实际上很有深度。
这本书从计算机体系结构的一些基础知识开始,包括内存结构,变量和数组是如何存储的,数据结构是什么样子的,等等。请注意,JavaScript和Python等高级语言使用自己的动态数据存储范例,您需要查看它们的详细文档(例如,V8引擎中的内存存储)。然而,了解内存存储的基本原理总是很有帮助的。
Kubica带你了解所有主要的算法。您将了解流行的搜索算法,如快速排序、树排序和冒泡排序。您还将了解主要数据结构的机制,如链表、双向链表、堆栈、堆、四叉树和八叉树。
即使您不打算手动实现这些算法和数据结构,了解它们也是很重要的。例如,在Python中,有几种方法可以存储数组和索引列表。这些数据类型的接口在很大程度上是重叠的,在某些情况下它们可以互换使用。但是他们使用的算法是非常不同的,这可能导致不同的性能水平取决于你如何使用它们。每种语言的文档通常会说明哪种算法在每种类型的容器的幕后工作。
这些算法和结构中的一些针对索引访问进行了优化,而另一些则适合顺序访问。有些在规模静态时性能更好,而有些则设计为动态增长。了解这些小细节非常重要,尤其是在处理非常大的数据集时。
因此,了解排序和存储的机制将非常有助于为变量选择最佳的存储方法。(我必须再次指出,不同的语言在数据存储方面有各自的细微差别,但基本思想是相同的。)
有趣的例子
我喜欢的一件事是有趣的数据结构库比卡展示例子的方式。在整本书中,你会看到一些关于咖啡豆的假设例子来解释复杂的软件概念。
Kubica使用类似Python的伪代码来显示例子,有好有坏。一方面,这些例子很容易浏览,尤其是当它们变长的时候。另一方面,您必须自己完成完整的实现。话又说回来,这并不是一件太糟糕的事情,因为它迫使你编写自己的代码,并且学得更好。
在…期间有趣的数据结构不是数据结构和算法的最终指南,顾名思义,它是一个有趣的主题介绍。作为一个多次研究和实现数据结构和算法的人,我发现这本书令人耳目一新,尤其是在一些更高级的主题上,如跳过列表和bloom filters。
Kubica的书可能是一个很好的开端,让你踏上深入探索数据结构和算法的旅程。