数据结构的基础概念

首先介绍数据结构的相关术语。

1.数据(Data)

数据是描述客观事物的数值、字符以及能输入机器且能被处理的各种符号集合。换句话说,数据是对客观事物采用计算机能够识别、存储和处理的形式所进行的描述。简而言之,数据就是计算机化的信息。

数据的概念经历了与计算机发展相类似的发展过程。计算机一问世,数据作为程序的处理对象随之产生。早期计算机主要应用于数值计算,数据量小且结构简单,数据仅有进行算术运算与逻辑运算的需求,数据类型只有整型、实型、布尔型,那时程序员把主要精力放在程序设计的技巧上,而并不重视如何在计算机中组织数据。

随着计算机软件、硬件的发展与应用领域的不断扩大,计算机应用领域发生了战略性转移、非数值运算与处理所占的比例越来越高,数据的概念被大大扩展了。它包括数值、字符、声音、图像等一切可以输入到计算机中的符号集合,各种信息通过编码被划归到数据的范畴,大量复杂的非数值处理需求使数据的有效组织显得越来越重要。20世纪70年代后,微型计算机的普及以及数据库、人工智能等研究进一步推动了计算机技术的发展,人们越来越重视运用科学工具来探索数据和程序内部关系以及它们之间的关系,采用新的观点来设计计算机体系,使计算机技术发展为一门科学。

数据的概念不再是狭义的,数据已由纯粹的数值概念发展为图像、字符、声音等各种符号。例如,对于C语言的编译程序来说,它加工的数据是字符流的源程序(.c),输出的结果却是目标程序(.obj);对于C语言的链接程序来说,它加工的数据是目标程序(.obj),输出的结果是可执行程序(.exe),如下列关系所示

C源程序--c编译--目标程序--c编译--可执行程序

而对于整个C编译过程而言,由于它在操作系统控制下接受操作系统的调度,因此相对操作系统来说它又是数据。

2.数据元素(data element)

数据元素是组成数据的基本单位,是数据集合的个体,在计算机中通常作为一个整体进行考虑和处理。一个数据元素可由一个或多个数据组成,数据项(Date Item)是有独立含义的最小单位,此时的数据元素通常称为记录(Record)。例如学籍表是数据,每一个学生的记录就是一个数据元素。

3.数据对象(data object)

数据对象是性质相同的数据元素集合,是数据的一个子集。例如,整数数据对象是集合N={0,+-1,+-2,...},字母字符数据对象是集合C={A,B,...Z},学籍表也可以看作一个数据对象。由此可以看出,不论数据元素集合是无限集(如整数集)、有限集(如字符集),还是由多个数据项组成的复合数据元素(如学籍表),只要性质相同,都属于同一个数据对象。

综上所述,数据概念归纳如下:

数据特点:

1.可被计算机接收(与计算机的关联性)

2.可被加工(能被处理)

数据构成:

1.数据元素——组成数据的基本单位(是数据集合的个体)

2.数据对象——性质相同的数据元素集合(是数据集合的子集)

4.数据结构(data structure)

数据结构是指相互之间存在一种或多种特定关系的数据元素集合,数据结构应该包括数据元素集合及元素间关系的集合,即数据的组织形式。由此可见,计算机所处理的数据并不是数据的简单汇集,而是具有内在联系的数据集合。例如,图书馆的图书并不是书的简单堆积,而是带有相应结构关系的书的集合。再如,表结构、树状结构、图结构。

数据结构要研究数据元素之间的相互关系和组织方式,以及对其施加的运算及运算规则,并不关心数据元素的具体内容是什么值。例如,一堆数组是向量A=(a1,...an)的存储映像,引用时采用下标变量A【i】的方式,关注其按序排列、按行存储的特性,并不关心A【i】中存放的具体值。同理,二维数组A【i,j】是矩阵Am*n的存储映像,我们关心结构关系的特性而不涉及数组元素本身的内容。

5.数据类型(data type)

数据类型是一组性质相同的值集合以及定义在这个值集合上的一组操作的总称。数据类型中定义了两个集合,即该类型的取值范围以及该类型中可允许使用的一组运算。例如,高级语言中的数据类型就是已经实现的数据结构的实例。从这个意义上讲,数据类型是高级语言中允许的变量种类,是程序设计语言中已经实现的数据结构(即程序中允许出现的数据形式)。例如,在C语言中,整形类型的取值范围为-32767~+32768,可用的运算符集合为加、减、乘、除、取模(即+、-、*、/、%)。

从硬件角度来看,他们的实现涉及字、字节、位、位运算等;从用户观点来看,并不需要了解整数在计算机内如何表示、运算细节如何实现,用户只需要了解整数运算的外部运算特性,就可运用高级语言进行程序设计。引入数据类型的目的,从硬件的角度是将其作为解释计算机内存中信息含义的一种手段,对使用数据类型的用户来说则实现了信息隐蔽,将一切用户不必关心的细节封装在类型中。如两整数求和问题,用户仅关注其数学求和的抽象特性,而不必关心加法运算涉及的内部位运算实现细节。

按“值”的不同特性,一般来说,高级程序设计语言中的数据类型可分为两大类:一类是原子类型,原子类型的值是不可再分的,如C语言中提供的整型、实型和字符型及指针;另一类是结构类型,结构类型的值是由若干成分按某种结构组合而成的,因此是可以分解的,并且它的成分可以是原子的,也可以是结构的。例如,数组的值由若干分量组成,每个分量可以是整数,也可以是数组等其它类型。在高级语言程序设计语言中,数据类型由若干分量组成,每个分量可以是整数,也可以是数组等其它类型。在高级程序设计语言中,数据类型包含系统定义的标准类型和用户自定义类型这两大类,对系统定义的标准类型(如C语言的int类型)用户只需按规定的符号形式直接使用,而用户自定义类型必须由用户先定义后使用,用户在系统提供标准类型的基础上根据需要来组合、构造新的类型(如C语言中提供的typedef定义形式)。

6.抽象数据类型

抽象的本质是抽取反映问题的本质点,而忽略非本质的细节,这是从事计算机研究的重要方法。

(1)数据的抽象

计算机中使用的是二进制数,汇编语言中则可给出各种数据的十进制表示,如98.65/9.6E3等,它们是二进制数据的抽象;程序设计人员在编程时可以直接使用,不必考虑实现的细节。在高级语言中,它们是二进制数据的抽象;程序设计人员在编程时可直接使用,不必考虑实现细节。在高级语言中,则给出更高一级的数据抽象,出现了数据类型,如整形、实型、字符型等。抽象数据类型出现后,可以进一步定义更高级的数据抽象,如各种表、队、栈、树、窗口、管理器等,这些数据抽象的层次为设计者提供了更有力的手段,使得设计者可以从抽象的概念出发,从整体考虑,然后自项向下、逐步展开,最后得到所需结果。可以这样看,高级语言中提供整形、实型、字符、记录、文件、指针等多种数据类型,可以利用这些类型构造出像栈、队列、树、图等复杂的抽象数据类型。

(2)抽象数据类型

抽象数据类型(Abstract Data Type,ADT)定义了一个数据对象、数据对象中各元素的结构关系以及一组处理数据的操作。从某种意义上讲,抽象数据类型和数据类型实质上是一个概念,只不过ADT更广义,不仅限于各种不同的计算机处理器中已定义并实现的数据类型,还包括设计软件系统时用户自己定义的复杂数据类型。

ADT包括定义和实现两方面,其中定义是独立于实现的。定义仅给出一个ADT的逻辑特性,不必考虑如何在计算机中实现。

抽象数据类型的定义取决于客观存在的一组逻辑特性,而与其在计算机内如何表示和实现无关,即不论其内部结构如何变化,只要它的数学特性不变,都不会影响其外部使用,从而为是实现软件的部件化和可重用性提供了理论保证,进而提高了软件生产率。

ADT通常是指由用户定义且用以表示应用问题的数据模型,由基本的数据类型组成,并包括一组相关服务操作。本门课程中将要学习的表、堆栈、串、树、图等结构就是一个个不同的抽象数据类型。以盖楼为例,直接用砖头、水泥、沙子来盖,不仅建造周期长,而建筑高度规模受限。如果使用按规范生产成形的水泥预制板,不仅可以高速、安全地建造高楼,水泥预制板使高楼的接缝量大大减少,从而降低了建造高楼的复杂度。由此可见,抽象数据类型是大型软件构造的模块化方法,典型的表、堆栈、队列、串、树、图抽象数据类型,就相当于是设计大型软件的“水泥预制板”,用这些已由专门公司设计好的抽象数据类型就可以安全、快速、方便的设计功能复杂的大型软件。

抽象数据类型最重要的特点是数据抽象与信息隐蔽,抽象的本质是抽取反映时间的本质点,忽视非本质的细节,从而使设计的数据结构更具一般性,可以解决一类问题。信息隐蔽就是对用户隐藏数据存储和操作实现的细节,使用者仅需了解操作或界面服务,通过使用界面服务来访问数据。其中,Request()用于检查书库,回答读者所借图书是否存在;Retrieve()用于从书库取书,送书给读者;Return()用于将书放入书库,将读者所还书放入书架。

抽象数据类型的特征是使用与实现分离,实现封装和信息隐藏,也就是说,在抽象数据类型设计时,类型的定义与其实现分离。数据类型的抽象层次越高,含有该抽象数据类型的软件服用程度就越高。ADT定义该抽象数据类型需要包含哪些信息,并根据功能确定公共界面的服务,使用者可以使用公共界面中的服务对该抽象数据类型进行操作。从使用者的角度看,只要了解该抽象数据类型的规格说明,就可以利用其公用界面中的服务来使用这个类型,不必关心其物理实现,从而集中考虑如何解决实际问题。

ADT物理实现作为私有部分封装在其实现模块中,使用者不能看到,也不能直接操作该类型所存储的数据,只有通过界面中的服务来访问这些数据。从实现者的角度来看,把抽象数据类型的物理实现封装起来,有利于编码、测试,也有利于修改。当需要改进数据结构时,只要界面服务的使用方式不变,只要改变抽象数据类型的物理实现,而无须修改所有使用该抽象数据类型的程序,这样就会提高系统的稳定性。

ADT包括数据对象、数据元素间的结构关系、操作三个部分,其定义格式可以有多种,以下面的方式定义ADT。

ADT<ADT名>

  {数据对象:<数据对象的定义>

   结构关系:<结构关系的定义>

   基本操作:<基本操作的定义>

   }ADT<ADT名>

其中,(1)数据对象定义应在已有数据类型或已定义数据对象基础上对新的数据对象进行定义。

           (2)数据对象和结构关系的定义采用数学符号和自然语言描述。

           (3)基本操作的定义包括操作名称、参数表、初始条件和操作结果四部分内容的定义和描述。

基本操作的定义格式为:

<操作名称>(参数表)

         操作前提:<操作前提的描述>

         操作结果:<操作结果的描述>

下面给出问题求解过程的两个实例,从中体会数据结构对解决问题的重要作用。

例1.   电话号码的查询问题。

【问题描述】

编写程序实现对某市或某个人电话信息的查询功能。具体要求如下:

1.按姓名进行查询。

2.若该人装有电话,则显示其电话号码;若尚未安装,则显示提示信息。

【问题抽象】从实际问题出发,可将市内(单位内)已装电话人员信息抽象为如下所示结构。

                                                            电话簿结构

姓名                                                电话号码

张三                                                8830259

王四                                                8830251

【求解方法】可有顺序表发及索引结构法两种求解方法。

顺序表法:可用数组存储整个表,每个人的信息(即一个人的姓名和电话号码)就是数组中的一个元素。从表的第一项开始依次查找姓名,直至找到或是确定无此姓名为止。这种依次查找方法对于一个规模不大的单位是可行的,但对拥有上百万人电话的城市来说效率太低,应当构建新的数据结构支持快速查找。

索引结构法:采用类似汉语字典的组织形式,按姓氏拼音或姓氏笔画排列构件表,并构造其姓氏或笔画索引表。查找时只需先在索引表中查找姓氏,然后根据索引表指示在登记表中核查姓名,从而提高了查找效率。

猜你喜欢

转载自blog.csdn.net/mez_Blog/article/details/101072409
今日推荐