数据结构

一、数据与数据元素

数据是对客观事物的符号表示,它能被计算机识别、存储和加工处理。它是计算机处理的“原材料”。

在计算机中,数据的范围比较广:数字、字符串、图像、音频等等,都是数据。

数据元素是指数据的基本单位。比方说,一张高考成绩单,含有准考证号、姓名与成绩,每个人的准考证号、姓名和成绩就组成了数据元素。也就是说,数据元素包含了三个数据项。

数据结构

二、数据结构

所谓数据结构,是指数据元素之间的相互关系,也就是数据的组织形式。

数据结构一般包括3个方面的内容:

  1. 逻辑结构,表示数据之间的逻辑关系。这一部分是独立于计算机的,是数据本身就具备的。
  2. 存储结构,是指数据元素及其之间的逻辑关系在计算机存储器内部的表示方式。其逻辑结构与存储结构之间的映射关系,依赖于计算机。
  3. 数据运算,即对数据的操作。运算的定义直接依赖于逻辑结构,但内部的实现依赖于存储结构。

(一)逻辑结构

数据结构的逻辑关系是程序员从实际问题中抽象出来的,经过总结归纳之后,一般分为四种形式:

  1. 集合:任何两个元素之间都没有什么关系,只是同属于一个集合。
  2. 线性结构:结构中的元素之间存在一对一的关系,即所谓的线性关系。
  3. 树形结构:结构中的元素之间存在一对多的关系。
  4. 图形结构:结构中的元素之间存在多对多的关系。

(二)存储结构

不管数据本身是什么,其内部具备何种逻辑关系。要通过计算机进行表示,其实现就必须依赖特定的存储结构。因此,存储结构涉及到两方面的内容,数据元素本身的存储,以及数据元素间逻辑关系的存储。数据结构的存储有下列4种方式:

  1. 顺序存储:将数据元素依次存储于一组地址连续的存储单元中,元素间的逻辑关系直接由存储位置表示。
  2. 链接存储:将数据元素存储于任意的存储单元中,但附加一个指针域表示元素间的关系。使用这种存储结构时,往往把数据元素及其指针,一起称之为结点。
  3. 索引存储:在存储元素的同时,还可以建立附加的索引表。
    索引表中的每一项称之为索引项。
    索引项的格式为:(关键字,地址),其中关键字是数据元素的唯一标志。
    若每个数据元素在索引表中都有一个索引项,则称该索引表为稠密索引。
    如果一个索引项对应一组数据元素,则称该索引表为稀疏索引。
  4. 散列存储:该方法是依据数据元素的关键字,用一个事先设计好的函数计算出该数据元素的存储地址,然后把它存入该地址中。这种函数称为散列函数,由散列函数计算出的地址称为散列地址。

以上4中存储方式,既可单独使用,又可组合使用。逻辑结构确定以后,采取何种存储结构,要具体问题具体分析,主要考虑的标准是:运算方便、算法效率以及空间要求。

存储结构的描述与特定语言有关。对于机器语言来说,则存储结构就是机器的物理存储位置;对于高级程序设计语言来说,则不必涉及计算机的内存地址,通过类型说明存储结构即可。

(三)数据运算

数据运算是对数据施加的操作。每种逻辑结构都有一个基本运算的集合。例如,最常用的基本运算有检索(查找)、插入、删除、更新、排序等。因为这些运算是在逻辑结构上施加的操作,因此它们同逻辑结构一样也是抽象的,只规定「做什么」,无须考虑「如何做」。只有确定存储结构后,才能考虑「如何做」。

简言之,运算在逻辑结构上定义,在存储结构上实现。

必须注意,数据结构包含逻辑结构、存储结构和运算三方面的内容。同一逻辑结构采用不同存储结构,得到的是不同的数据结构,常用不同的数据结构名来标识它们。例如,线性结构采用顺序存储时称为顺序表,采用链接存储时则称为链表。同样,同一逻辑结构定义不同的运算也会导致不同的数据结构。例如,若限制线性结构的插入、删除在一端进行,则该结构称为栈;若限制插入在一端进行,而删除在另一端进行,则称为队列。更进一步,若栈采用顺序存储结构,则称为顺序栈;若栈采用链式存储结构,则称为链栈。顺序栈与链栈也是两种不同的数据结构。

三、数据类型

数据类型是与数据结构非常密切的一个概念,几乎所有高级程序语言都提供了这一概念。

数据类型是指值的集合以及定义在集合上的操作。从值是否可再分的标准上,可以分为两大类:

  1. 原子类型:其值不可分解。比方说:整型、实型、字符型、布尔型、枚举类型、指针类型和空类型。
  2. 结构类型:其值可再分,它的值可能是原子类型、结构类型。比方说:数组类型。

本质上说,数据类型和数据结构是一致的,只是侧重点各有不同。数据类型更偏向于封装,使实现与使用分离,用户不必关心内部细节;而数据结构,其本身就是强调内部的定义与实现。

我们可以把数据类型看做是程序设计语言已经实现了的数据结构,以便程序员使用。

用户头像
登录后发表评论