广义的数据结构是一门研究非数值计算的程序设计问题中的操作对象,以及它们之间的关系和操作等相关问题的学科。
狭义的数据结构是相互之间存在一种或多种特定关系的数据元素的集合。
1 基本概念和术语
1.1 数据
数据是描述客观事物的符号,是计算机中可以操作的对象,是能被计算机识别,并输入给计算机处理的符号集合。
数据不仅仅包括整型、实型等数值类型,还包括字符及声音、图像、视频等非数值类型,对于数值类型,可以进行数值计算;对于非数值类型是通过编码的手段变成数值数据来处理的。
1.2 数据元素
数据元素是组成数据的、有一定意义的基本单位,在计算机中通常作为整体处理,也被称为记录。比如人、牛、狗、猪。
1.3 数据项
数据项是组成数据元素的独立的不可分割的最小基本单位。一个数据元素可以由若干个数据项组成。
比如人这样的数据元素,可以有眼、耳、鼻、嘴、手、脚这些数据项,也可以有姓名、年龄、性别、出生地址、联系电话等数据项,具体有哪些数据项,要视你做的系统来决定。
1.4 数据对象
数据对象是性质相同的数据元素的集合,是数据的子集。比如,人都有姓名、生日、性别等相同的数据项,人属于数据。
在实际应用中,处理的数据元素通常具有相同性质,在不产生混淆的情况下,我们都将数据对象简称为数据。
以上概念的关系图如下:
2 数据结构
数据结构是计算机存储、组织数据的方式,是指相互之间存在一种或多种特定关系的数据元素的集合。包括按照视点的不同,可以分为逻辑结构和物理结构。
2.1 逻辑结构
逻辑结构表示数据元素之间的抽象关联关系。逻辑结构是针对具体问题的,是为了解决某个问题,在对问题理解的基础上,选择一个合适的数据结构表示数据元素之间的逻辑关系。
常见逻辑结构有三种基本类型:线性结构、树形结构和图形结构,也可以统一的分为线性结构和非线性结构。
线性结构:
线性结构中的数据元素之间是一对一的关系,如下图:
树形结构:
树形结构中的数据元素之间存在一对多的关系,如下图:
图形结构:
图形结构中的数据元素之间存在多对多的关系,如下图:
2.2 物理结构
物理结构是指数据的逻辑结构在计算机中的具体的存储形式,也称作存储结构。大概分为两种:顺序存储结构和链式存储结构。
顺序存储结构:
是指数据元素存放在地址连续的存储单元里,其数据间的逻辑关系和物理关系是一致的。比如数组的存储,就是采用的顺序存储结构,数组的存储单元是连续的。
链式存储结构
是指数据元素存放在任意的存储单元里,这组存储单元可以是连续的,也可以是不连续的。数据元素通过指针保持逻辑上的联系。比如链表的常见实现就是采用的链式存储结构。
逻辑结构是面向问题的,而物理结构就是面向计算机的,其基本的目标就是将数据及其逻辑关系存储到计算机的内存中。
3 抽象数据类型(ADT)
3.1 数据类型
是一个值的集合和定义在这个值集上的一组操作的总称。
3.2 抽象
抽取出事物普遍的性质、特征,忽略了具体的性质、特征。
3.3 抽象数据类型(Abstract Data Type,ADT)
是指一个有类似行为的特定类别的数据结构的数学模型数学模型以及定义在该模型上的一组操作。是理论的工具。
抽象数据类型目的是使人们能够独立于程序的实现细节来理解数据结构的特性。抽象数据类型的定义取决于它的逻辑特性,而与计算机内部如何表示无关。
例如:抽象的栈(stack)是一个先进后出的队列,以及由3个操作定义:推入push,弹出pop,查看堆栈顶端数据peek。不同的语言的实现栈的方式不同,但是他们的抽象数据类型是一样的。
每种数据结构都有它的抽象数据类型,要学习数据结构就必须了解它的抽象数据类型。例如现在很多的数据结构和算法书籍,它们使用的是C语言来实现的,但是如果了解了数据结构的抽象数据类型,我们就可以使用Java语言来实现了。
4 数据结构与算法关系
数据结构操作的对象是数据元素,即他们有相同的属性,它们之间的存在的关系会产生不同的结构,数据元素之间的关系+操作构成了数据类型,对已有的数据类型进行抽象就构成了抽象数据类型(ADT),就是封装了值和操作的模型。
操作数据的一组代码就叫算法,我们可以使用相应的算法编写一段代码,形成相应的数据结构。简单地说,一种数据结构具体的实现,是通过相应的的代码(算法)实现的,而后对数据结构中的数据进行某些操作的代码,比如查找,也是用到了算法。
数据结构是为算法服务的,算法也要作用在特定的数据结构之上才有意义。
对于一组数据,我们想到实现某个目的,先要考虑采用什么样的数据结构取存储这些数据,然后使用什么样的算法来操作这些数据,而在数据结构的构建过程中也是使用了相应的算法。比如我们需要对数据进行排序,那么我们可以采用红黑树或者堆这样的数据结构来存储,然后就看我们怎样的算法实现了。
线性表,堆栈,串,树,图是常见的用抽象数据类型定义的数据结构,查找和排序是常见的算法。
关于算法的入门,可以看看这篇文章:算法入门以及时间复杂度推导。
作者:刘Java