专栏作者/ 树华子
专栏导读
算法+ 数据结构 = 程序
在计算机领域,有这样一个人尽皆知的著名公式,「算法+ 数据结构 = 程序」,可以说如果把编写程序比作烹饪,那么数据结构就好比菜谱中食材用量,算法就好比烹饪步骤。这个公式由瑞士计算机科学家,Pascal之父,尼古拉斯·沃斯于1976年提出。很多人觉得它已经完全过时了,其实并不然。邹欣的《构建之法》一书中对这个著名公式进行了补充,他说道「程序 = 数据结构+算法、 软件 = 程序 + 软件工程」。虽然当今的软件开发过程已经不像是上个世纪那样简单,但这并不是不去好好学习数据结构这门课程的理由。算法和数据结构就如同程序员的基本功,是重中之重,掌握了其中的思想和原理,很多问题才可以迎刃而解。
很多同学可能会问,「我大概知道算法的含义,可数据结构到底是什么呢?」
什么是数据结构?
要回答这个问题,首先要回答「什么是数据?」
数据是对客观事物的符号表示,在计算机科学中是指所有能输入到计算机中并被计算机处理的符号的总称,在不同是场景中数据有不同的表现形式,可以是数字(整数、浮点数等等)、字符串甚至是图像、声音。
现在你明白了数据的概念,但还不够,你需要明白「什么是数据元素?」
数据元素是数据的基本单位,在计算机程序中通常作为一个整体进行考虑和处理。
为了便于理解,我们举一个简单的例子。在整数数据中,整数“1”可以视作一个数据元素,在本文中我们暂且以上图形式表示它。
接下来你还需要知道另一个概念,「什么是数据对象?」
数据对象是性质相同的数据元素的集合,是数据的一个子集。
继续刚才的例子,整数数据对象可以表示为N={...,-1,0,1,2,...},在本文中我们暂且以上图形式表示它。
好了,现在我们可以回到一开始提出的问题,「什么是数据结构?」
数据结构是相互之间存在一种或多种特定关系的数据元素的集合。换言之,我们可以将数据结构当作是一种附带关系的数据对象。
对于数据集合{1,2,3,7,10},当数据元素之间关系仅为“同属一个集合”,此外无其他关系时,我们暂且以如下的集合来表示:
当数据元素之间存在一对一的关系时,例如对于上述集合,若任意两个元素A和元素B之间存在「A是集合中大于B的最小的元素」这种关系,则可以使用如下的线性结构加以表示:
当数据元素之间存在一对多的关系时,例如对于同样的集合,若元素A和元素B之间存在「可由A和集合中另一元素相加得到B」这种关系,则可以使用如下的树形结构加以表示:
当数据元素之间存在多对多的关系时,例如对于同样的集合,若元素A和元素B之间存在「A和B互质」这种关系,则可以使用如下的图状结构加以表示:
想必你已经对数据结构和它的种类有了大体的认识,实际上,对于数据结构这个概念,至今尚未有一个被一致公认的定义,不同的人在使用这个词的时候所表达的意思可能是不同的,请看一段关于数据结构英文定义:
A data structure is a specialized format for organizing and storing data.General data structure types include the array, the file, the record, the table, the tree,and so on. Any data structure is designed to organize data to suit a specific purpose so that it can be accessed and worked with in appropriate ways. In computer programming, a data structure may be selected or designed to store data for the purpose of working on it with various algorithms.
(请尝试阅读理解上面这段话,计算机领域对英语水平是有基本的要求的...毕竟作为一个“程序员”以后有很多机会混迹SO或是github)
一种数据结构是用来组织和存储数据的一种特定格式。常见的数据结构类型包括数组、文件、记录、表、树等等。任何数据结构都被设计用来组织数据以适应于特定的目的,因此它必须可以访问并且可以在特定方式下工作。在计算机编程中,一个数据结构可以被选择或设计以为不同的算法存储数据。
如果你暂时认为上述解释有些晦涩难懂也没有关系,在日后的学习中相信你会慢慢理解这段话的含义。
数据结构研究什么?
数据的逻辑结构和其存储的物理结构
为不同的数据结构设计不同的算法
对应的算法的时间复杂度(效率)
缘何产生
1968年唐纳德·克努特教授开创了数据结构的最初体系,他所著的《计算机程序设计技巧》第一卷《基本算法》是第一本较系统地阐述数据的逻辑结构和存储结构及其操作的著作。
20世纪70年代初,出现了大型程序,软件也开始相对独立,结构程序设计成为程序设计方法学的主要内容,数据结构作为一门独立的课程开始进入大学课堂。
课程框架
课程纲要
0.1 / 专栏导读
第一章线性结构
1.1 / 线性表
1.2 / 栈
1.3 / 队列
第二章树结构
2.1 / 树和二叉树
2.2 / 遍历二叉树和线索二叉树
2.3 / 哈夫曼树和哈弗慢编码
2.4 / 堆
第三章图结构
3.1 / 图和图的遍历
3.2 / 最短路径问题
3.3 / 最小生成树
第四章查找
4.1 / 静态查找表
4.2 / 动态查找表
4.3 / 哈希表
第五章排序
5.1 / 插入排序
5.2 / 快速排序
5.3 / 选择排序
5.4 / 归并排序
5.5 / 基数排序
第六章延伸
(本章内容和篇数视情况而定)
参考资料
严蔚敏《数据结构》(清华大学出版社)
陈越《数据结构》(高等教育出版社)
教学工具(预备知识)
本专栏教学内容以C语言为样例代码,希望你可以具备C语言的基本知识。
C语言基础可参考:
http://www.runoob.com/cprogramming/c-tutorial.html
http://www.imooc.com/learn/249
推荐阅读
以下书目虽然和本专栏教学内容并无太大关系,请相信我,他们对于刚刚走上或者即将走上这条道路的你会有很大的帮助。
结城浩(Hiroshi Yuki)《程序员的数学》(人民邮电出版社)
乔恩·本特利(Jon Bentley)《编程珠玑》(人民邮电出版社)
邹欣《构建之法》(人民邮电出版社)
吴军《数学之美》(人民邮电出版社)
本来这个系列作为《了不起的数据结构》是发豆瓣专栏的,可仿佛豆瓣不太喜欢专业性的文章,看来还要继续修订《信息浪潮》。
也好没了交稿日期,可以轻松一点写这个系列,在简书慢慢与大家分享。