解决现实问题时,我们往往先需要对问题抽象建模,将一个现实问题转换成一个数学问题,然后再利用相应的数学工具去解决。
在计算机科学中同样如此,但不同与以往问题中所用到的数学模型(如物理学中的代数方程,方程组,微分方程等),计算机
中的数学模型有其自身的特点,因而有了专门研究它的一门学问——数据结构。
由于计算机中处理的都为离散数据,理论基于离散数学,所以本质上数据结构所研究的是离散数据及其关系。数据结构是算法的前身
甚至于二者是同时产生的,可以毫不夸张的说,一个人对数据结构的掌握程度代表着其利用计算机的视角理解现实问题的程度,
而只有理解了问题,才可能有算法去解决问题。
数据结构的数学定义: DS = (D, S)
其中D是数据元素的有限集,s是D上关系的有限集(注意是关系的集合,而不是关系,可能包含多个关系)。
其中D上的关系在计算机科学中常见的有:
集合——图 —— 树(一种特殊的图) —— 线性结构(一种特殊的树)
在计算机科学中,往往不仅仅要分析理论,更要实践。在数据结构这门学问中也不例外。一种数据结构不仅仅有其逻辑结构,也有
其物理结构(在计算机中实现时所用的结构)。
然而不同于逻辑结构,物理结构只有顺序和链式两种,一切逻辑结构都必须与这两种物理结构中的一种或是两种建立映射关系,以在
计算机中去描述这种数据结构。因而在学习数据结构时我们不仅仅要知道一种数据结构逻辑结构,同时也要学习其实现方法。
ADT(Abstract Data Type)即抽象数据类型是基于数据结构的一种抽象,它研究的是一种数据结构及其上的基本操作,但这里的数据
结构更强调的是逻辑结构,即ADT不关心数据结构的实现,更侧重于该数据结构所应有的基本操作。可以这样理解ADT是按照逻辑关系
来进行分类,而不是物理结构(类似于c++中的类,接口定义好了,实现不管怎么变,都不影响外部使用)。
其实还有另外一种分类方式,即不管一种数据结构具有怎样的逻辑结构只要其支持相同的一组基本操作,就可以归为一类(类似于c++中
的泛型)。
两种方式各有优缺点,要善于取舍。