算法和数据结构并不是同一件事。严格来说,它们并不是等效的。但是,我们通常在使用的时候会互换这两个术语。为了简便,后文我们会用数据结构这个术语来指代“数据结构及其所有相关的方法”。
有很多方法可以用来说明这两个术语之间的区别,但是笔者特别喜欢下面这个比喻:数据结构好比名词,而算法好比动词。
笔者之所以喜欢这个比喻,是因为这个比喻不仅表明了它们的不同行为,还暗示了它们之 间的依赖性。例如,要在英语中构建一个有意义的短语,就需要同时包含名词和动词,还需要 给出主语(或宾语)以及将要执行(或承受)的动作。
数据结构和算法是相互联系的,就好比一张纸的正反两面。
■ 数据结构是基础,是一种通过组织内存区域来表示数据的方法。
■ 算法是过程,是用来对数据进行转换的一系列指令。
如果没有用来对数据进行转换的算法,数据结构就只是存放在内存芯片里的一堆二进制数; 而如果没有可以操作的数据结构,则大多数算法甚至不会出现。
除此之外,每种数据结构还隐式地定义了其中可以执行的算法。例如,用来向数据结构中 添加元素的方法以及从中获取或删除元素的方法。
实际上, 一些数据结构的定义就是为了能让某些算法更高效地运行而出现的,例如哈希表 以及按键进行搜索的算法|。
因此,我们可以把算法和数据结构当作同义词来使用,毕竟在这个上下文中提到其中一个 时总会暗示另一个。例如,在描述数据结构时,如果要让描述是有意义且准确的,就必须同时描述数据结构的方法(算法)。
书籍推荐:
1、高级算法和数据结构
本书的大部分章节是为对算法、编程和数学已有一些基本了解的读者编写的。如果你想复 习一下这些基本内容或者希望快速了解这部分知识,请参阅本书的附录部分。
如果你事先熟悉了如下概念,则可以更好地掌握本书的内容。
■ 良好的数学和代数基础,大O 符号(见附录B) 以及渐近分析的相关内容。
■ 简单的数据结构。
■ 附录C 中的概念。
这是一本关于“高级/进阶”算法和数据结构的图书,主要介绍了用于Web 应用程序、系统 编程和数据处理领域的各种算法,旨在让读者了解如何用这些算法应对各种棘手的编码挑战, 以及如何将其应用于具体问题,以应对新技术浪潮下的“棘手”问题。
本书对一些广为人知的基本算法进行了扩展,还介绍了用于改善优先队列、有效缓存、对 数据进行集群等的技术,以期读者能针对不同编程问题选出更好的解决方案。书中示例大多辅 以图解,并以不囿于特定语言的伪代码以及多种语言的代码样本加以阐释。
学完本书,读者可以了解高级算法和数据结构的相关内容,并能运用这些知识让代码具备 更优性能,甚至能够独立设计数据结构,应对需要自定义解决方案的情况。
本书可作为高等院校计算机相关专业本科高年级学生以及研究生的学习用书,也可供从事与 算法相关工作的开发者参考。
2、数据结构与算法之美(全彩印刷)
本书分为11章。第1章介绍复杂度分析方法。第2章介绍数组、链表、栈和队列这些基础的线性表数据结构。第3章介绍递归编程技巧、8种经典排序、二分查找及二分查找的变体问题。第4章介绍哈希表、位图、哈希算法和布隆过滤器。第5章介绍树相关的数据结构,包括二叉树、二叉查找树、平衡二叉查找树、递归树和B+树。第6章介绍堆,以及堆的各种应用,包括堆排序、优先级队列、求Top K、求中位数和求百分位数。第7章介绍跳表、并查集、线段树和树状数组这些比较高级的数据结构。第8章介绍字符串匹配算法,包括BF算法、RK算法、BM算法、KMP算法、Trie树和AC自动机。第9章介绍图及相关算法,包括深度优先搜索、广度优先搜索、拓扑排序、Dijkstra算法、Floyd算法、A*算法、Z小生成树算法、Z大流算法和Z大二分匹配等。第10章介绍4种算法思想,包括贪心、分治、回溯和动态规划。第11章介绍4个经典项目中的数据结构和算法的应用,包括Redis、搜索引擎、鉴权限流和短网址服务。另外,附录A为书中的思考题的解答。
尽管本书的大部分代码采用Java语言编写,但本书讲解的知识与具体编程语言无关,因此,本书不但适合各种类型的研发工程师,而且可以作为高校计算机相关专业师生的学习用书和培训学校的教材。
3、编程珠玑 第2版
算法和数据结构习题,程序员案头书单,融实战技术与趣味轶事于一炉,带你领略计算机科学之美。
本书是计算机科学方面的经典名著。书的内容围绕程序设计人员面对的一系列实际问题展开。作者Jon Bentley 以其独有的洞察力和创造力,引导读者理解这些问题并学会解决方法,而这些正是程序员实际编程生涯中至关重要的。本书的特色是通过一些精心设计的有趣而又颇具指导意义的程序,对实用程序设计技巧及基本设计原则进行了透彻而睿智的描述,为复杂的编程问题提供了清晰而完备的解决思路。本书对各个层次的程序员都具有很高的阅读价值。