数据结构与算法学习总结-数据结构基础

来源:互联网 发布:单片机电子琴 编辑:程序博客网 时间:2024/05/01 00:58

  数据结构主要在人们使用计算机解决客观世界中存在的具体问题的过程中,从建立概念模型到实现模型转化并为后续程序设计设计提供基础的内容相关。它是用来反映一个概念模型的内部构成,即一个概念模型由哪些成分数据构成,以什么方式构成,呈现什么结构。数据结构主要是研究程序设计问题中计算机的操作对象,以及它们之间的关系和操作的学科。

1.基本概念

  数据元素(data element):是数据的基本单位,是数据集合的个体,在计算机程序中通常作为一个整体来进行处理。
  数据对象(data object):是性质相同的数据元素的集合,是数据的子集。
  数据结构(data structure):是指互相之间存在一种或多种特定关系的数据元素的集合。是组织并存储数据以便能够有效使用的一种专门格式,它用来反映一个数据的内部构成,即一个数据由哪些成分数据构成,以什么方式构成,呈什么结构。
  表示一组数据元素及其相互关系的数据结构同样也有两种不同的表现形式,一种是数据结构的逻辑层面,即数据的逻辑结构;一种是存在于计算机世界的物理层面,即数据的存储结构。
  数据的逻辑结构按照数据元素之间相互关系的特性来分,可以分为以下四种结构:集合、线性结构和树形结构和图状结构。
  数据的逻辑结构可以采用两种方法来描述:二元组、图形。
  数据结构的二元组表示形式为:
    数据结构 = {D,S}
  其中D是数据元素的集合;S是D中数据元素之间的关系集合,并且数据元素之间的关系是使用序偶来表示的。序偶是由两个元素x和y按一定顺序排列而成的二元组,记做<x,y>,x是它的第一元素,y是它的第二元素。
  例2-1**集合结构set=(K,R)**
    K={01,02,03,04,05}
    R={}
  可以看到在数据结构set中,只有数据元素的集合非空,而数据元素之间除了同属一个集合之外不存在任何关系(关系集合为空)。这表明该结构只考虑元素而不考虑它们之间的关系,如图1所示。
  例2-2**线性结构linearity=(K,R)**
    K={01,02,03,04,05}
    R={<01,02>,<02,03>,<03,04>,<04,05>}
  在数据结构linearity中,数据元素之间是有序的。在这些数据袁术中由一个可以被成为“第一个”(元素01)的数据元素;还有一个可以被成为“最后一个”(元素04)的数据元素;除第一个元素以外每个数据元素有且仅有一个直接前驱元素,除最后一个元素以外每个数据元素有且仅有一个直接后续元素。这种数据结构的特点是数据元素之间是1对1的联系,即线性关系,我们把具有此种特点的数据结构成为线性结构,如图1所示。
  例2-3**树结构tree=(K,R)**
    K={01,02,03,04,05,06}
    R={<01,02>,<01,03>,<02,04>,<02,05>,<03,06>}
  在数据结构tree中,除了一个数据元素(元素01)以外每个数据元素有且仅有一个直接前驱元素,但是可以有多个直接后续元素。这种数据结构的特点是数据元素之间是1对N的联系,我们把具有此种特点的数据结构成为树结构,如图1所示。
  例2-4**图结构graph=(K,R)**
    K={01,02,03,04,05}
    R={<01,02>,<01,05>,<02,01>,<02,03>,<02,04>,<03,02>,<04,02>,<04,05>,<05,01>,<05,04>}
  在数据结构graph中,每个数据元素可以有多个直接前驱元素,也可以有多个直接后续元素。这种数据结构的特点是数据元素之间是M对N的联系,我们把具有此种特点的数据结构成为图结构,如图1所示。

4中数据结构的图形表示
图1 四种数据结构的图形表示

  数据元素之间的关系在计算机中主要有两种不同的表示方法:顺映像和非顺序映像,并由此得到两种不同的存储结构:顺序存储结构和链式存储结构。
  顺序存储结构:数据元素的存储对应于一块连续的存储空间,数据元素之间的前驱和后续关系通过数据元素在存储器中的相对位置来反映。
  链式存储结构:数据元素的存储对应的是不连续存储空间,每个存储节点对应一个需要存储的数据元素。元素之间的逻辑关系通过存储节点之间的链接关系反映出来。
  由于我们是在Java这种计算机高级程序设计语言的基础上来讨论数据结构,因此,我们在讨论数据的存储结构时不会在真正的物理地址的基础上去讨论顺序存储和链式存储,而是在Java语言提供的以为数据和对象的应用的基础上去讨论和实现数据的存储结构。

2.抽象数据类型

  抽象数据类型是描述数据结构的一种理论工具。
  数据类型:是一组性质相同的数据元素的集合以及加在这个集合上的一组操作。
  如Java语言中就有许多不同的数据类型,包括数值型的数据类型、字符串、布尔型等数据类型。以Java中的int型为例,int型的数据元素的集合是[-2147483648,2147483647]间的整数,定义在其上的操作有加、减、乘、除四则运算,还有模运算等。
  定义数据类型的作用一个是隐藏计算机硬件及其特性和差别,使硬件对于用户而言是透明的,即用户可以不关心数据类型是怎么实现的而可以使用它。另一个作用是,用户能够使用数据类型定义的操作,方便的实现问题的求解。
  我们在探索运算步骤时,首先考虑的是顶层的运算步骤,然后再考虑底层的运算步骤。所谓底层的运算步骤时指顶层抽象的运算的具体实现。他们依赖于数据模型的机构,依赖于数据模型结构的具体表示。因此,底层的运算步骤包括两部分:一是数据模型的具体表示;二是定义在该数据模型上的运算的具体实现,我们可以把他们理解为微观运算。。于是,底层运算是顶层运算的细化,底层运算为顶层运算服务。为了将顶层算法与底层算法隔开,使二者在设计时不会互相牵制、互相影响,必须对二者的接口进行一次抽象。让底层只通过这个结构为顶层服务,顶层也只通过这个接口调用底层的运算。这个接口就是抽象数据类型。
  抽象数据类型(abstract data type,简称ADT):由一种数据模型和在该数据模型上的一组操作组成。
  抽象数据类型包括定义和实现两个方面,其中定义是独立于实现的。抽象数据类型的定义仅取决于它的逻辑特性,而于其在计算机内部的实现无关,即无论它的内部结构如何变化,只要它的逻辑特性不变,,都不会影响它的使用。
  我们应该看到,抽象数据类型的概念并不是全新的概念。抽象数据类型和数据类型在实质上是一个概念,只不过是对数据类型的进一步抽象,不仅限于各种不同的计算机处理器中已经实现的数据类型,还包括为解决更为复杂的问题而有用户自定义的复杂数据类型。
  根据抽象数据类型的概念,对抽象数据类型进行定义就是约定抽象数据类型的名字,同时,约定在该类型上定义的一组运算的各个运算的名字,明确各个运算分别要有多少个参数,这些参数的含义和顺序,以及运算的功能。一旦定义清楚,人们在使用时就可以像引用基本数据类型那样,十分简便地引用抽象数据类型;同时,抽象数据类型的实现就有了设计的依据和目标。
  由此,抽象数据类型可以使用一个三元组来表示:
    ADT=(D,S,P)
  其中D是数据对象,S是D上的关系集,P是加在D上的一组操作。
  在定义抽象数据类型时,我们使用以下格式:
  ADT抽象数据类型名{
    数据对象:<数据对象的定义>
    数据关系:<数据关系的定义>
    基本操作:<基本操作的定义>
  }

3.总结

  数据结构主要研究三个方面的问题:数据的逻辑结构、数据的存储结构和定义在数据结构上的一组操作。即研究按照某种逻辑关系组织起来的一批数据,并按一定的映像方式把他们存放在计算机的存储器中,最后分析在这些数据上定义的一组操作。
  在数据结构的实现中,我们可以将数据结构中的一些概念和Java语言中的一些感念对应起来:
  一、数据元素可以对应到类,其数据项就是类的成员变量,某个具体的数据元素就是某个类的一个实例;
  二、数据的顺序存储结构与链式存储结构可以通过一维数组和对象的引用来实现;
  三、抽象数据类型也可以对应到类,抽象数据类型的数据对象与数据之间的关系可以通过类的成员变量来存储和表示,抽象数据类型的操作则使用类的方法来实现。

原创粉丝点击