您的位置:首页 > 理论基础 > 数据结构算法

数据结构-基本概念和术语

2005-04-17 02:34 417 查看
Data-数据

 数据是信息的载体。它能够被计算机识别、存储和加工处理,是计算机程序加工的"原料"。

 随着计算机应用领域的扩大,数据的范畴包括:

  整数、实数、字符串、图像和声音等。

Data Element-数据元素

 数据元素是数据的基本单位。数据元素也称元素、结点、顶点、记录。

 一个数据元素可以由若干个数据项(也可称为字段、域、属性)组成。

 数据项是具有独立含义的最小标识单位。

Data Structure-数据结构

 数据结构指的是数据之间的相互关系,即数据的组织形式。

Logical Structure-数据的逻辑结构

Storage Structure-数据的存储结构

数据运算-对数据施加的操作

Immediate Predecessor-直接前趋
对表中任一个结点,与它相邻且在它前面的结点

Immediate Successor-直接后趋
与表中任一结点相邻且在其后的结点

Sequential Storage Structure-顺序存储结构
把逻辑上相邻的结点存储在物理位置上相邻的存储单元里,结点间的逻辑关系由存储单元的邻接关系来体现。通常借助程序语言的数组描述。

Linked Storage Structure
-链接存储结构
不要求逻辑上相邻的结点在物理位置上亦相邻,结点间的逻辑关系由附加的指针字段表示。通常借助于程序语言的指针类型描述。

Dense Index
-稠密索引
通常在储存结点信息的同时,还建立附加的索引表。
索引表由若干索引项组成。若每个结点在索引表中都有一个索引项。

Spare Index-稀疏索引
通常在储存结点信息的同时,还建立附加的索引表。
索引表由若干索引项组成。若一组结点在索引表中只对应一个索引项。


1.数据结构一般包括以下三方面内容:



数据元素之间的逻辑关系,也称Logical Structure

 数据的逻辑结构是从逻辑关系上描述数据,与数据的存储无关,是独立于计算机的。数据的逻辑结构可以看作是从具体问题抽象出来的数学模型。


数据元素及其关系在计算机存储器内的表示,称为Storage Structure

 数据的存储结构是逻辑结构用计算机语言的实现(亦称为映象),它依赖于计算机语言。对机器语言而言,存储结构是具体的。一般,只在高级语言的层次上讨论存储结构。

数据的运算,即对数据施加的操作。

  数据的运算定义在数据的逻辑结构上,每种逻辑结构都有一个运算的集合。最常用的检索、插入、删除、更新、排序等运算实际上只是在抽象的数据上所施加的一系列抽象的操作。

 所谓抽象的操作,是指我们只知道这些操作是"做什么",而无须考虑"如何做"。只有确定了存储结构之后,才考虑如何具体实现这些运算。

  为了增加对数据结构的感性认识,下面举例来说明有关数据结构的概念。

【例1.1】 学生成绩表,见下表。

注意:在表中指出数据元素、数据项、开始结点和终端结点等概念

(1)逻辑结构

  表中的每一行是一个数据元素(或记录、结点),它由学号、姓名、各科成绩及平均成绩等数据项组成。

表中数据元素之间的逻辑关系是:对表中任一个结点,与它相邻且在它前面的结点(Immediate
Predecessor
直接前趋)最多只有一个;与表中任一结点相邻且在其后的结点(Immediate
Successor
直接后趋)也最多只有一个。表中只有第一个结点没有直接前趋,故称为开始结点;也只有最后一个结点没有直接后继。故称之为终端结点。例如,表中"马二"所在结点的直接前趋结点和直接后继结点分别是"丁一"和"张三"所在的结点,上述结点间的关系构成了这张学生成绩表的逻辑结构。

(2)存储结构

  该表的存储结构是指用计算机语言如何表示结点之间的这种关系,即表中的结点是顺序邻接地存储在一片连续的单元之中,还是用指针将这些结点链接在一起?

(3)数据的运算

  在上面的学生成绩表中,可能要经常查看某一学生的成绩;当学生退学时要删除相应的结点;进来新学生时要增加结点。究竟如何进行查找、删除、插入,这就是数据的运算问题。

搞清楚了上述三个问题,也就弄清了学生成绩表这个数据结构。

2.数据的逻辑结构分类

在不产生混淆的前提下,常将数据的逻辑结构简称为数据结构。数据的逻辑结构有两大类:

(1)线性结构

线性结构的逻辑特征是:若结构是非空集,则有且仅有一个开始结点和一个终端结点,并且所有结点都最多只有一个直接前趋和一个直接后继。

线性表是一个典型的线性结构。栈、队列、串等都是线性结构。
(2)非线性结构

非线性结构的逻辑特征是:一个结点可能有多个直接前趋和直接后继。数组、广义表、树和图等数据结构都是非线性结构。

3.数据的四种基本存储方法

 数据的存储结构可用以下四种基本存储方法得到:

(1)顺序存储方法

该方法把逻辑上相邻的结点存储在物理位置上相邻的存储单元里,结点间的逻辑关系由存储单元的邻接关系来体现。

由此得到的存储表示称为顺序存储结构
(Sequential
Storage Structure),通常借助程序语言的数组描述。

 该方法主要应用于线性的数据结构。非线性的数据结构也可通过某种线性化的方法实现顺序存储。
(2)链接存储方法

该方法不要求逻辑上相邻的结点在物理位置上亦相邻,结点间的逻辑关系由附加的指针字段表示。由此得到的存储表示称为链式存储结构(Linked
Storage Structure),通常借助于程序语言的指针类型描述。
(3)索引存储方法

该方法通常在储存结点信息的同时,还建立附加的索引表。

索引表由若干索引项组成。若每个结点在索引表中都有一个索引项,则该索引表称之为稠密索引(Dense
Index)。若一组结点在索引表中只对应一个索引项,则该索引表称为稀疏索引(Spare
Index)。索引项的一般形式是:

(关键字、地址)

关键字是能唯一标识一个结点的那些数据项。稠密索引中索引项的地址指示结点所在的存储位置;稀疏索引中索引项的地址指示一组结点的起始存储位置。
(4)散列存储方法

该方法的基本思想是:根据结点的关键字直接计算出该结点的存储地址。

四种基本存储方法,既可单独使用,也可组合起来对数据结构进行存储映像。

同一逻辑结构采用不同的存储方法,可以得到不同的存储结构。选择何种存储结构来表示相应的逻辑结构,视具体要求而定,主要考虑运算方便及算法的时空要求。

4.数据结构三方面的关系

数据的逻辑结构、数据的存储结构及数据的运算这三方面是一个整体。孤立地去理解一个方面,而不注意它们之间的联系是不可取的。

存储结构是数据结构不可缺少的一个方面:同一逻辑结构的不同存储结构可冠以不同的数据结构名称来标识。

【例】线性表是一种逻辑结构,若采用顺序方法的存储表示,可称其为顺序表;若采用链式存储方法,则可称其为链表;若采用散列存储方法,则可称为散列表。

数据的运算也是数据结构不可分割的一个方面。在给定了数据的逻辑结构和存储结构之后,按定义的运算集合及其运算的性质不同,也可能导致完全不同的数据结构。

【例】若对线性表上的插入、删除运算限制在表的一端进行,则该线性表称之为栈;若对插入限制在表的一端进行,而删除限制在表的另一端进行,则该线性表称之为队列。更进一步,若线性表采用顺序表或链表作为存储结构,则对插入和删除运算做了上述限制之后,可分别得到顺序栈或链栈,顺序队列或链队列。

数据类型(Data Type)

  所谓数据类型是一个值的集合以及在这些值上定义的一组操作的总称。通常数据类型可以看作是程序设计语言中已实现的数据结构。

【例1.2】C语言的"整数类型"就定义了一个整数可取值的范围(其最大值INT-MAX依赖于具体机器)以及对整数可施加的加、减、乘、除和取模等操作。

按"值"是否可分解,可将数据类型划分为两类:

原子类型:其值不可分解。通常是由语言直接提供。

【例】C语言的整型、字符型等标准类型及指针等简单的导出类型;

结构类型:其值可分解为若干个成分(或称为分量)。是用户借助于语言提供的描述机制自己定义的,它通常是由标准类型派生的,故它也是一种导出类型。

【例】C的数组、结构等类型。

抽象数据类型(Abstract Type简称ADT)

ADT是指抽象数据的组织和与之相关的操作。可以看作是数据的逻辑结构及其在逻辑结构上定义的操作。

一个ADT可描述为:

ADT ADT-Name{

Data://数据说明

数据元素之间逻辑关系的描述

Operations://操作说明

Operation1://操作1,它通常可用C或C﹢﹢的函数原型来描述

Input:对输入数据的说明

Preconditions:执行本操作前系统应满足的状态//可看作初始条件

Process:对数据执行的操作

Output:对返回数据的说明

Postconditions:执行本操作后系统的状态//"系统"可看作某个数据结构

Operation2://操作2

……

}//ADT

  抽象数据类型可以看作是描述问题的模型,它独立于具体实现。它的优点是将数据和操作封装在一起,使得用户程序只能通过在ADT里定义的某些操作来访问其中的数据,从而实现了信息隐藏。在C﹢﹢中,我们可以用类(包括模板类)的说明来表示ADT,用类的实现来实现ADT【参阅[10]】。因此,C﹢﹢中实现的类相当于是数据的存储结构及其在存储结构上实现的对数据的操作。

  ADT和类的概念实际上反映了程序或软件设计的两层抽象:ADT相当于是在概念层(或称为抽象层)上描述问题,而类相当于是在实现层上描述问题。此外,C﹢﹢中的类只是一个由用户定义的普通类型,可用它来定义变量(称为对象或类的实例)。因此,在C﹢﹢中,最终是通过操作对象来解决实际问题的,所以我们可将该层次看作是应用层。例如,main程序就可看作是用户的应用程序。

  由于C语言中没有提供"类"这一数据类型,因此无法实现ADT,故我们不采用ADT的形式来描述数据结构,以节省篇幅。大家只要记住,它实际上等价于我们定义的数据的逻辑结构以及在逻辑结构上定义的抽象操作。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: