一、【绪论】数据结构的基本概念

数据结构的基本概念


1 基本概念

1.1 数据 Data

在数据结构中,数据是指一切可以被输入到计算机中并被计算机程序识别和处理的符号的集合。

1.2 数据元素 Data Element

数据元素是数据的基本单位,通常作为一个整体进行考虑和处理。一个数据元素可以由若干个数据项(Data Item)组成,数据项是构成数据元素的不可分割的最小单位。例如,数据库中一个学生的登记信息就是一个数据元素,它由学号、姓名、性别等数据项组成。

1.3 数据对象 Data Object

数据对象是具有相同性质的数据元素的集合,是数据的一个子集。例如,正整数数据对象 N ∗ = { 1 , 2 , …   } N^* = \{1, 2, \dots\} N={1,2,}

1.4 数据类型 Data Structure

数据类型这个概念最早出现在高级程序语言中,用来描述操作对象的特性。例如,C语言中的整形变量、字符型变量以及枚举类型变量就是三个不同的数据类型。类型显式或隐式地规定了变量在程序执行期间的所有可能取值范围,以及在这些值上允许的操作。因此,数据类型是一个值的集合定义在这个值集上的一组操作的总称。例如,C语言中的整形变量,其值集为某个区间上的整数(区间大小依赖于不同的机器),定义在其上的操作为:加、减、乘、除等算数运算。

按“值”的不同类型,数据类型可以分为两类:

  • 原子类型(Atomic Data Type):值不可再分解。如:C语言中的基本类型(整形变量、字符型变量以及枚举类型变量等)。
  • 结构类型(Construction Data Type):值是由若干成分按某种结构组成的,因此可以分解。这些成分可以是结构类型,也可以是非结构类型。例如上文提到的学生登记信息就是一种结构类型。

实际上,数据类型的概念并非局限于高级程序语言中,在计算机的各个层面,我们都引入了数据类型的概念。数据库、高级程序语言、操作系统以及计算机硬件系统中都提供了一组原子类型或结构类型。例如,计算机硬件系统中有“位”、“字节”等原子类型,他们的操作通过计算机设计的一套指令直接由电路系统完成。引入“数据类型”的好处,从硬件角度来说,是作为解释计算机内存中信息含义的一种手段,而从用户角度来看,实现了类型的封装,用户只需要知道如何操作即可,不需要了解其他细节。但是对于一些更复杂的问题,用这些基本数据类型也不方便解决时,我们可以引入一个新的,更抽象的概念:抽象数据类型。

抽象数据类型(Abstract Data Type 简称 ADT) 是指一个数学模型以及定义在该模型上的一组操作。抽象数据类型的定义仅取决于它的一组逻辑特性。常见的例子就是各种高级程序语言中的类。抽象指的是只要这个模型的数学特性不变,那么不管它内部的结构如何变化,都不影响外部的使用。在概念上来说,抽象数据类型和数据类型实质上是一样的,各种基本数据类型也都满足抽象数据类型的定义,但是通常我们将所有高级程序语言已定义并实现的数据类型统称为基本数据类型,剩下的都属于抽象数据类型。例如用户在Python自定义一个Car类,这个类就属于抽象数据类型。


2 数据结构

数据结构是相互之间存在一种或多种特定关系的数据元素的集合,数据元素之间的关系被称为结构(Structure)。各种数据之间的相互关系决定了我们如何去操作、维护和存储这些数据,因此数据结构主要包括逻辑结构(数据之间的相互关系)存储结构(计算机存储这些数据的方式)以及对这些数据的操作/运算方法

数据结构的形式定义为:数据结构是一个二元组
D a t a S t r u c t u r e = ( D , S ) \mathrm{DataStructure} = (D, S) DataStructure=(D,S)
其中: D D D是数据元素的有限集, S S S D D D上的关系的有限集。但是这个定义仅仅是对操作对象的一种数学描述,其中的“关系”仅仅描述了数据元素之间的逻辑关系,没有体现出数据的存储和运算。

某种数据采用何种存储结构以及如何定义操方法是要依照它的逻辑结构来判断的。换句话说,数据的逻辑结构是从面向实际问题的角度出发的,只采用抽象表达方式,独立于存储结构。数据的存储方式有很多不同的选择,它不能独立于逻辑结构而存在。

在这里插入图片描述

2.1 逻辑结构

逻辑结构主要描述数据元素之间的逻辑关系,即各种元素在逻辑上是如何被连接在一起的。

数据的逻辑结构可粗略分为线性数据结构非线性数据结构,可细分为四种结构:线性结构、集合、树形结构和图状结构或网状结构

  • 线性结构

    • 最常用的数据结构,其特点是数据元素之间只存在一对一的线性关系。
    • 线性结构可以有两种不同的数据存储结构:顺序存储链式存储。顺序存储中的元素一定是连续的;链式存储的元素不一定连续,元素节点中存放数据元素和相邻元素的地址信息。
    • 常见的线性结构有:数组、队列、链表和栈。
  • 非线性结构

    • 集合:结构中的元素之间除了“同属一个集合”的关系外,没有其他关系。
    • 树形结构:结构中的数据元素之间存在一对多的关系。
    • 图状结构或网状结构:结构中的数据元素之间存在多对多的关系。

2.2 存储结构

在规划好数据的逻辑结构后,我们还需要研究如何在计算机中表示他们。

数据的存储结构也被称为物理结构,包括数据元素以及元素之间的关系在计算机中的表示,通俗来说就是计算机如何在物理层面上存储这些数据。

存储结构有四种:顺序存储、链式存储、索引存储和散列存储。其中顺序存储和链式存储适用于内存结构中,索引存储和散列存储使用于外存和内存交互结构。

  • 顺序存储

    • 顺序存储把逻辑上相邻的元素存储在物理地址上也相邻的存储单元中,元素之间的关系由存储单元之间的临接关系来体现。
    • 优点:
      1. 节省空间:因为顺序存储方法的存储空间除了存储有用数据外,没有用于存储其他附加的信息,所以顺序存储结构一般也被称为紧凑存储结构。
      2. 快捷访问:顺序存储可以用随机存取实现,顺序存储法又为使用整数编码访问数据结点提供了便利。因此对于顺序存储的数据结构我们可以直接使用下标来访问。
    • 缺点:
      1. 不利于数据修改:插入和删除操作需要移动一系列元素。
      2. 只能使用相邻的一整块存储单元,因此可能产生较多的外部碎片。
  • 链式存储

    • 链式存储是在结点的存储结构中附加指针字段来存储结点间的逻辑关系,不要求逻辑上相邻的元素在物理位置上也相邻。链接法中数据结点包括两部分:数据字段存放结点本身的数据,指针字段存放指向其后继结点的指针。
    • 优点:
      1. 方便修改:对数据元素的插入、删除运算时,随机存储不必移动结点,只要改变结点中的指针。
      2. 不会产生磁盘碎片:逻辑上相邻的节点物理上不必相邻,因此不会产生磁盘碎片。
    • 缺点:
      1. 占用空间大:比顺序存储结构的存储密度小 (每个节点都由数据域和指针域组成,所以相同空间内假设全存满的话顺序比链式存储更多)。
      2. 查找效率低:查找结点时链式存储要比顺序存储慢,只能实现顺序存取。
  • 索引存储:

    • 通过建造一个由整数域Z映射到存储地址域的函数,把整数索引值映射到结点的存储地址,从而形成一个存储一串指针的索引表,每个指针指向存储区域的一个数据结点。
    • 优点:
      1. 检索速度快:直接利用结点的索引号来确定结点存储地址 。
    • 缺点:
      1. 占用空间大:增加了附加的索引表,会占用较多的存储空间。
      2. 同时增删改查也需要同步修改索引表,花费更多时间。
  • 散列存储:

    • 散列存储,又称Hash存储,是一种将数据元素的存储位置与关键码之间建立确定对应关系的查找技术,即根据元素的关键字直接计算出该元素的存储地址。
    • 优点:
      1. 检索、增加和删除节点的操作更快。
    • 缺点:
      1. 若散列函数不好,则可能出现元素存储单元的冲突, 而解决冲突需要增加时间和空间开销。

2.3 数据的运算

对于数据的运算包括两部分:运算的定义和实现。运算的定义是针对数据的逻辑结构的,描述运算的功能;运算的实现是针对存储结构的,描述运算的具体步骤。


3 存储结构和存取结构

上文在解释顺序存储时提到了“存取”这一概念,这里记录一下存储和存取的区别。

  • 存储结构
    是数据结构的一部分,描述的是数据元素以及元素之间的关系在计算机中的表示。可分为四种:顺序存储、链式存储、索引存储和散列存储。
  • 存取结构
    描述的是在某种数据结构上对查找操作时间性能的描述。可分为两种:随机存取(Random Access)和顺序存取(Sequential Access)
    • 随机存取: 又称为直接访问,指的是当存储器中的消息被读取或写入时,所需要的时间与这段信息所在的位置无关,可以通过下标直接访问,时间复杂度为 O ( 1 ) O(1) O(1)
    • 顺序存取:指按照信息的存储顺序来存取,如果想要使用第 n n n个信息,那么必须先访问前 n n n-1个信息,所需要的时间和信息的位置有关,时间复杂度为 O ( n ) O(n) O(n)

可以理解为存储结构只关注数据的存储(或写入),而存取结构关注了数据的存储(或写入)和读取(或查找)。


参考资料

相关章节

第一节 【绪论】数据结构的基本概念
第二节 【绪论】算法和算法评价
第三节 【线性表】线性表概述
第四节 【线性表】线性表的顺序表示和实现
第五节 【线性表】线性表的链式表示和实现
第六节 【线性表】双向链表、循环链表和静态链表
第七节 【栈和队列】栈
第八节 【栈和队列】栈的应用
第九节 【栈和队列】栈和递归
第十节 【栈和队列】队列

旧章节待更新
第八节 递归 Recursion
第九节 时间复杂度 Time Complexity
第十节 排序算法 Sort Algorithm
第十一节 冒泡排序 Bubble Sort
第十二节 选择排序 Select Sort
第十三节 插入排序 Insertion Sort
第十四节 冒泡排序,选择排序和插入排序的总结
第十五节 希尔排序 Shell’s Sort
第十六节 快速排序 Quick Sort
第十七节 归并排序 Merge Sort

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值