数据结构 基础

admin
admin 2019年08月02日
  • 在其它设备中阅读本文章

程序 = 数据结构 + 算法,精心设计的数据结构可以带来更高的运行速度或者存储效率

一、定义

基础术语:

  • 数据 :能被计算机识别,并输入给计算机处理的符号集合。例如数字、字符、声音、图像、视频等等
  • 数据元素 :组成数据的基本单位,数据中的一个“个体”
  • 数据项 :一个数据元素可由若干个数据项组成,数据的不可分割的最小单位
  • 数据对象 :同类数据元素的集合,是数据的子集

数据之间存在的关系称为 结构 ,故 数据结构 = 数据 + 结构 ,则 数据结构是指存在关系的数据元素的集合和该集合中数据元素之间的关系 ,包含数据的 逻辑结构 存储结构 以及 运算 。数据的逻辑结构和存储结构是数据结构的两个密切相关的方面, 同一逻辑结构可以对应不同的存储结构 ,算法设计取决于数据的逻辑结构,而算法实现依赖于指定的存储结构。

二、逻辑结构

指数据元素之间的相互关系,分为以下四种:

  • 集合结构 :数据元素除了同属于一个集合外,别无其它关系。
  • 线性结构 :数据元素之间是一对一的关系
  • 树形结构 :数据元素之间是一对多的关系
  • 图形结构 :数据元素之间是多对多的关系

三、存储结构

又称 物理结构 ,数据在计算机中的存储形式,有两种基本存储方式:

  1. 顺序存储 :把逻辑上相邻的数据元素存储在物理位置相邻的存储单元里,由存储单元的邻接关系来体现其逻辑关系,可用程序设计语言中的 数组 来实现。
  2. 链式存储 :把数据元素存放在任意的存储单元里面(可连续,也可不连续),逻辑关系是由附加的 链接 表示的,可用程序设计语言中的 链接表 (简:链表)来实现。

除了基本的存储方式以外,还有两种存储方式:

  1. 索引存储 :不仅需要存储所有数据元素,还需要建立附加的索引表。每个数据元素都由一个唯一的关键字来标识,由该关键字和对应的数据元素的地址构成一个索引项,存入索引表。
  2. 哈希(或散列)存储 :指依据数据元素的关键字,通过事先设计好的哈希函数计算出一个值,再将其作为该数据的存储地址。

链式存储数据元素之间并不能反映元素间的逻辑关系,因此在链式存储结构中引进了指针存放数据元素的地址,这样通过地址就可以找到相关联数据元素的位置。显然链式结构比较灵活,数据存在哪里并不重要,只要有指针存放了相应的地址,在通过地址就能找到相邻元素。

链表是一种物理存储单元上非连续、非顺序的存储结构,可分为:

  • 线性链表:单向链表 双向链表 以及 循环链表
  • 非线性链表:二叉链表 N 叉链表 邻接表 十字链表 邻接多重表

四、运算

数据结构研究的内容:就是如何按一定的逻辑结构,把数据组织起来,并选择适当的存储表示方法把逻辑结构组织好的数据存储到计算机的存储器里。算法研究的目的是为了更有效的处理数据,提高数据运算效率。数据的运算是定义在数据的逻辑结构上,但运算的具体实现要在存储结构上进行。一般有以下几种常用运算:

  1. 检索:在数据结构里查找满足一定条件的节点,一般是给定一个某字段的值,找具有该字段值的节点
  2. 插入:往数据结构中增加新的节点
  3. 删除:把指定的结点从数据结构中去掉
  4. 更新:改变指定节点的一个或多个字段的值
  5. 排序:把节点按某种指定的顺序重新排列,例如递增或递减

五、抽象数据类型

数据类型 :是指一组性质相同的值的集合及定义在此集合上的一系列操作的总称,基本上可分为两类:

  • 原子类型 :不可再分解的基本类型,例如整形、实型、字符型
  • 结构类型 :由若干个原子类型组合而成,是可以再分解的,例如整形数组就是由若干整形数据组成的

抽象 :从具体事物抽出、概括出它们共同的本质属性与关系等,而将个别的、非本质的属性与关系舍弃。延伸到数据结构中,就是针对具体事物,抽取出 共有属性 一般操作方法

抽象数据类型 (Abstract Data Type 简称 ADT) 是指一个数学模型以及定义在此模型上的一组操作。抽象数据类型可以 通过固有的数据类型来表示和实现 本质还是数据类型 ,但其特征是 使用和实现分离 ,强调了 封装 信息隐蔽 ,一般来说,编程语言(如 c 语言)里自定义的结构体(或类)就可以看作抽象数据类型。
抽象数据类型的一般形式如下:

ADT抽象数据类型名{
  数据对象:
  数据关系:
  数据操作:
}

六、常用数据结构

在计算机科学的发展过程中,数据结构也随之发展。程序设计中常用的数据结构包括如下几个。

  1. 数组 (Array):数组是一种聚合数据类型,它是将具有相同类型的若干变量有序地组织在一起的集合。数组可以说是最基本的数据结构,在各种编程语言中都有对应。一个数组可以分解为多个数组元素,按照数据元素的类型,数组可以分为整型数组、字符型数组、浮点型数组、指针数组和结构数组等。数组还可以有一维、二维以及多维等表现形式
  2. 栈(Stack):栈是一种特殊的线性表,它只能在一个表的一个固定端进行数据结点的插入和删除操作。栈按照先进后出或后进先出的原则来存储数据,也就是说,先插入的数据将被压入栈底,最后插入的数据在栈顶,读出数据时,从栈顶开始逐个读出。栈在汇编语言程序中,经常用于重要数据的现场保护。栈中没有数据时,称为空栈
  3. 队列 (Queue):队列和栈类似,也是一种特殊的线性表。和栈不同的是,队列只允许在表的一端进行插入操作,而在另一端进行删除操作。一般来说,进行插入操作的一端称为队尾,进行删除操作的一端称为队头。队列中没有元素时,称为空队列
  4. 链表 (Linked List):链表是一种数据元素按照链式存储结构进行存储的数据结构,这种存储结构具有在物理上存在非连续的特点。链表由一系列数据结点构成,每个数据结点包括数据域和指针域两部分。其中,指针域保存了数据结构中下一个元素存放的地址。链表结构中数据元素的逻辑顺序是通过链表中的指针链接次序来实现的
  5. 树(Tree):树是典型的非线性结构,它是包括,2 个结点的有穷集合 K。在树结构中,有且仅有一个根结点,该结点没有前驱结点。在树结构中的其他结点都有且仅有一个前驱结点,而且可以有两个后继结点,m≥0
  6. 图 (Graph):图是另一种非线性数据结构。在图结构中,数据结点一般称为顶点,而边是顶点的有序偶对。如果两个顶点之间存在一条边,那么就表示这两个顶点具有相邻关系
  7. 堆(Heap):堆是一种特殊的树形数据结构,一般讨论的堆都是二叉堆。堆的特点是根结点的值是所有结点中最小的或者最大的,并且根结点的两个子树也是一个堆结构
  8. 散列表 (Hash):散列表源自于散列函数(Hash function),其思想是如果在结构中存在关键字和 T 相等的记录,那么必定在 F(T) 的存储位置可以找到该记录,这样就可以不用进行比较操作而直接取得所查记录