数据结构
第一章 绪论
基本概念
- 数据
- 数据是信息的载体,是描述客观事物属性的数、字符及所有能输入到计算机中并被计算机程序识别和处理的符号的集合
- 数据元素
- 是数据的基本单位,在计算机中通常作为一个整体进行考虑
- 数据对象
- 是性质相同的数据元素的集合,是数据的一个子集
- 数据类型
- 是一个值的集合和定义在这个集上的一组操作的总称
- 分类
- 原子类型:其值不可再分的数据类型
- 结构类型:其值可以再分解为若干成分份量的数据类型
- 抽象数据类型:抽象数据组织及与之相关的操作
- 抽象数据类型
- 由用户定义、表示应用问题的数学模型,以及定义在这个模型上的一组操作的总称。
- 组成
- 数据对象D
- 数据关系R
- 基本操作P
- 数据结构
- 数据结构是相互之间存在一种或多种特定关系的数据元素的集合
- 数据结构包括三方面
- 逻辑结构
- 存储结构
- 数据的运算
数据结构三要素
- 数据的逻辑结构
- 概述
- 逻辑结构是指数据的组织形式,即数据元素之间的逻辑关系的总体。而逻辑关系是指数据元素之间的关联方式或称“邻接关系”
- 与数据的存储无关,是独立于计算机的
- 分类
- 线性结构
- 线性表
- 栈
- 队列
- 数组
- 非线性结构
- 集合
- 树
- 图
- 线性结构
- 概述
- 数据的存储结构
- 概述
- 存储结构是指数据结构在计算机中的表示或称映像,也称物理结构
- 数据元素的表示和关系的表示
- 存储结构是用计算机浯言实现的逻辑结构,它依赖于计算机语言
- 分类
- 顺序存储结构
- 把逻辑上相邻的元素存储在物理位置上也相邻的存储单元中。元素之间的关系由存储单元的邻接关系来体现
- 优点:可以实现随机存取,每个元素占用最少的存储空间
- 缺点:只能使用相邻的一整块存储单元,因此可能产生较多的外部碎片
- 链式存储结构
- 用一组任意的存储单元存储线性表的数据元素(这组存储单元可以是连续的,也可以是不连续的).
- 优点:不会出现碎片现象,能充分利用所有存储单元
- 缺点:每个元素因存储指针而占用额外的存储空间,且只能实现顺序存取
- 索引存储结构
- 在存储元素信息的同时,还建立附加的索引表
- 优点:检索速度快
- 缺点:
- 附加的索引表额外占用存储空间
- 增加和删除时也要修改索引表,会花费较多的时间
- 散列存储结构
- 根裾元素的关键字直接计算的出该元素的存储地址,又称哈希(Hash)存储
- 优点:检索、增加和删除结点的操作都很快
- 缺点:若散列函数不好,则可能出现元素存储单元的冲突,而解决冲突会增加时间和空间开销
- 顺序存储结构
- 概述
- 数据的运算
- 施加在数据上的运算包括运算的定义和实现
- 运算的定义是针对逻辑结构的,指出运算的功能
- 运算的的实现是针对存储结构的,指出运算的具体操作步骤
算法和算法评价
算法的基本概念
- 算法是对特定问题求解步骤的一种描述,它是指令的有限序列,其中的每条指令表示一个或多个操作
- 重要特征
- 有穷性
- 确定性
- 可行性
- 输入
- 输出
- 优秀算法的标准
- 正确性
- 可读性(好的算法)
- 健壮性(好的算法)
- 效率与低存储是需求
算法效率的度量
- 算法效率的度量是通时间复杂度和空间复杂度来描述的
- 时间复杂度
- 一个语句的频度是指该句在算法中被重复执行的次数
- 事前估计分析估计算法
- 空间复杂度
填空错题
- 数据的物理结构包括(数据元素)和(数据元素的关系)
- 抽象数据类型的定义仅取决于他的一组(逻辑特性),而与(在计算机如何表示和实现)无关,即不论其内部结构如何变化,只要他的(数学特性)不变,都不影响其外部使用
- 数据结构主要研究的问题:“如何合理地组织数据、高效地处理数据”。
- 与数据元素本身的形式、内容、相对位置、个数无关的是逻辑结构
第二章 线性表
线性表的基本概念
- 由n(n >= 0)个数据特性相同的元素构成的有限序列
- 特点
- 存在唯一的一个“第一个”的数据元素
- 存在唯一的一个“最后一个”的数据元素
- 除第一个之外,其他数据元素均只有一个前驱
- 除最后一个之外,其他数据元素均只有一个后继
链表
- 逻辑上相邻的两个数据元素其存储的物理位置不要求紧邻
- 链表增加头结点的作用
- 便于首元结点的处理
- 增加头结点,首元结点的地址保存在头结点的指针域中,则对第一个数据元素的操作与其他数据元素相同
- 便于空表和非空表的统一处理
- 增加头结点后,无论链表是否为空,头指针都是指向头结点的非空指针
- 便于首元结点的处理
顺序表和链表的比较
- 空间性能的比较
- 时间性能的比较
填空错题
- 根据线性表的链式存储结构中每一个结点包含的指针个数,将线性链表分成(单链表)、(双链表);根据指针的连接方式,链表又可分为(静态链表)、(动态链表)
- 顺序存储结构是通过(结点上物理相邻)表示元素之间的关系;链式存储结构是通过(指针)来表示数据元素之间的关系的
第三章 队列、栈
基本概念
- 栈
- 限定仅在表尾进行插入和删除操作的线性表
- 后进先出
- 队列
- 只允许在表的一端进行插入,而在另一端删除元素
- 先进先出
- 表示队列的链表结构:带尾指针的单循环链表
- 递归
- 一个函数、过程或者数据结构定义和内部又直接出现定义本身的应用,则称他们是递归的,或者是递归定义的
- 循环队列
- 判断循环队列空或满
- 少用一个元素空间
- 另设标志位以区别队列是“空”还是“满”
- 判断循环队列空或满
错题
第四章 串、数组和广义表
-
串:是由零个或多个字符组成的有限序列。
-
子串:主串任意个连续字符组成的子序列,用“子串一个字符在主串中的位置”来表示子串在主串中的位置
-
数组:由类型相同的数据元素构成的有序集合。
-
广义表:是一种非连续性的数据结构,是线性表的推广。
- 表头:广义表的第一个元素(原子或表)
- 表尾:除了表头其余元素组成的表为表尾(必是表)
-
模式匹配:子串的定位操作
-
第五章 树
- 树的表示方法:孩子表示法、孩子兄弟法、双亲表示法
- 二叉树的两种存储结构:二叉链表、三叉链表
- 一颗有N个结点度为K的树必有N(K-1)+1个空链域
- 具有n个(n>0)结点的完全二叉树的高度为[log2(n+1)]或[log2n]+1
- 具有n个结点的m叉树的最小高度为[logm(n(m-1)+1)]
- 高度为h的m叉树至多有(m^h-1)/(m-1)个结点
- 一共有N个结点的树,其中所有分支结点的度为K,该树中叶子结点的个数:(N(K-1)+1) / K
- 含有N个结点的完全二叉树,最后一个非终端结点 下取整(N/2), 最小的叶子结点下标 (下取整(N/2)+1)
二叉树不是树的特例
树和二叉树的主要区别:
1. 二叉树的度至多为2,树无此限制
2. 二叉树有左右子树之分,即使在只有一个分支的情况下,也必须指出是左子树还是右子树,树无此限制
3. 二叉树允许为空,树一般不允许为空
试证明:同一棵二叉树的所有叶子结点,在前序序列,中序序列、后序序列中都按相同的相对位置出现(即先后顺序相同)
前序遍历是“根-左-右”,中序遍历是“左-根-右”, 后序遍历是“左-右-根”,若将“根”去掉,三种遍历只剩下“左-右”,三种遍历的区别就是访问根节点的时机不同。二叉树是递归定义的,对左右子树均是按左右顺序遍历的,因此三种遍历的叶子结点的先后关系是相同的
图
定义
规范定义为 图是由顶点的有穷非空集合和顶点之间的边的集合组成,通常表示为: G =( V , E )
V是顶点集合,E是边的集合
术语
-
无向完全图:对于无向图种含有n(n-1)/2条边
-
有向完全图:对于有向图含有n(n-1)条边
-
回路(环):
-
简单路径:
-
连通图:
-
强连通图:
-
AOE网:带权的有向无环图
边——表示活动
顶点——表示事件(Event),弧表示活动
权——表示活动持续的时间
求关键路径
-
AOV网:有向无回路的图
顶点——表示活动
用弧——表示活动间的优先关系的有向图称为-顶点表示活动的网
求拓扑排序
-
Dijkstra算法O\((n^2)\) 求某一顶点到其余各顶点的最短路径
-
Folyd算法\(O(n^3)\)求图中任意两个顶点的最短路径
-
拓扑排序算法O(n+e)
-
Prim普里姆算法\(O(n^2)\)
-
Kruskal克鲁斯卡尔算法 O(eloge)
-
n个顶点n条边的无向图一定构成环
-
任何一个无向连通图的最小生成树有一颗或多颗
错题
简答题汇总
- 四种数据结构基本类型
- 集合,线性结构,树形结构,图状结构(网状结构)
- 简述栈和队列的区别
- 栈只允许在表的一端进行插入和删除操作
- 队列只允许在表的一端进行插入,而在另一端进行删除
- 插入排序排序有几类?其中,那些是不稳定排序
- 插入类有:直接插入排序,折半插入排序,希尔排序
- 希尔排序是不稳定的排序算法
- 什么是原地工作?
- 算法原地工作是指算法所需的辅助空间是常量
- 什么是完全二叉树?
- 深度为K的、有n个结点二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从1到n的结点一一对应,称之为完全二叉树
- 什么是稳定排序?
- 当排序记录中的关键字都不相同\(K_i\)时,则任何一个记录的无序序列经排序后得到的结果唯一;反之,当待排序的序列中存在两个或两个以上关键字相等的记录时,则排序所得结果不唯一
- 是指排序前 2 个相等的数其在序列的前后位置顺序和排序后它们两个的前后位置顺序相同。简单来说就是,如果Ai = Aj,Ai原来在位置前,排序后Ai还是要在Aj位置前。
- 数据元素之间的关系在计算机中的存储有几种表示方法?各有什么特点?
- 数据的存储结构主要有:顺序存储、链式存储、索引存储、散列存储
- (1)顺序存储方法:数据元素顺序存放,每一个结点只含有一个元素。存储位置反应数据元素间的逻辑关系,存储密度大,但有些操作效率差
- (2)链式存储方法:每一个结点除了包含数据元素的信息外还包含一组指针。指针反应数据元素间的逻辑关系。这种操作不要求存储空间连续,便于进行插入和删除等操作,但存储空间利用率较低。另外,由于逻辑上相邻的数据元素在存储位置上不一定相邻,所以不能对其进行随机存取
- (3)索引存储方法:除数据元素存储在一地址连续的内存空间外,还要建立一个索引表。索引表中的索引指示结点的存储位置,并兼有动态和静态特性
- (4)散列(哈希)存储方法:通过哈希函数解决冲突的方法,将关键字散列在连续的有限地址空间内,并将哈希函数作为该数据元素的存储地址,其特点是存取速度快,只能按关键字随机存取,不能顺序存取,不能顺序存储,也不能折半存取
- 什么是最优二叉树?
- 带权路径长度WPL最小的二叉树,也叫哈夫曼树
- 什么是哈希表
- 哈希表也叫散列表,一个有限连续的地址空间,用以存储散列函数计算的到相应地址的数据结构
- 什么是AOE网中的关键路径?
- 在AOE网中,有些活动可以并行进行,最短完成时间应是从源点到汇点的最长路径长度
- 简述以下三个概念的区别:头指针、头结点、表头结点
- 头指针:是指向链表中第一个结点的指针
- 头结点:是在首元结点之前附设的一个结点,其指针域指向首元结点
- 表头结点:是指链表中存储第一个数据元素a1的结点
- 什么是递归程序,以及优缺点
- 递归程序:如果一个函数、过程或数据结构定义的内部又之间(间接)出现定义本身的应用,那么这个函数、过程或数据结构是递归的,或者说是定义递归的
- 优点:把一个大型复杂问题转换成一个规模较小的问题来求解,大大减小了程序的代码量,使问题的描述和求解变得简单、清晰、算法更容易设计
- 缺点:通常情况下效率并不高
- 栈和队列与普通线性表相比有什么异同?
- 相同点:数据结构之间存在一对一关系,存储方式和线性表相同
- 不同点:栈是限定在表尾进行插入或删除,是先进后出;队列是限定在一端进行插入另一端删除,是先进先出
- 算法的基本特征
- 有穷性
- 确定性
- 可行性
- 输入
- 输出
- 算法的设计目标
- 正确性
- 健壮性
- 可读性
- 高效率与低存储量需求
- 算法与程序的区别联系
- 联系:
- 算法是解决问题的步骤,程序是算法的代码实现。算法是手段,程序是结果,算法需要依靠程序完成功能,程序需要算法作为灵魂
- 算法+数据结构=应用程序。算法是程序设计的核心,算法的好坏很大程度上决定一个好的算法可以降低程序运行时间复杂度和空间复杂度
- 区别:
- 两者的定义不同。算法是对特定问题求解步骤的描述,它是有限序列指令。程序是实现预期目的而进行操作的一系列语句和指令
- 在语言描述上,程序必须是用规定的程序设计语言来写,而算法较为随意
- 数据结构与数据类型党的区别联系
- 数据结构:相互存在一种或多种特定关系的数据元素的集合
- 逻辑结构:集合结构、线性结构、树形结构、图形结构
- 存储结构:顺序存储、链式存储、散列存储、索引存储
- 数据的运算:算法的定义,算法的实现
- 数据类型:一个值的集合和定义在此集合的一组操作的总称
- 结构类型:值的集合为一种数据结构(线性表、图)以及该集合的一组操作
- 原子类型:为值的集合为一种原子类型(int,double),以及该集合上的一组操作
- 设置头结点的作用
- 便于首元结点的处理:增加头结点后,首元结点的地址保存在头结点的头指针的指针域中,则对链表第一个元素的操作和其他元素相同,无需进行特殊处理
- 便于空表和非空表的统一处理:增加头结点后,无论链表是否为空,头指针都是指向头结点的非空指针
- 什么是数据结构?
- 数据结构是一门研究非数值计算的程序设计问题中的操作对象,以及他们之间的关系和操作等相关问题的学科。
- 逻辑结构中的四大结构
-
集合结构:集合结构中的数据元素除了同属于一个集合外,它们之间没有其他的关系。
-
线性结构:线性结构中的数据元素之间是一对一的关系。
-
树形结构:树形结构中的数据元素之间存在一种一对多的层次关系。
-
图形结构:图形结构的数据元素是多对多的关系
- 数据元素的储存结构形式
- 是把数据元素存放在地址连续的存储单元里,其数据间的逻辑关系和物理关系是一致的。
- 是把数据元素存放在任意的存储单元里,这组存储单元可以是连续的,也可以是不连续的。(链式存储结构的数据元素存储关系并不能反应其洛基关系,因此需要一个指针存放数据元素的地址,这样可以通过地址找到相关联数据元素的位置。)
- 归并排序算法思想
归并排序是用分治思想,分治模式在每一层递归上有三个步骤:
- 分解(Divide):将n个元素分成个含n/2个元素的子序列。
- 解决(Conquer):用合并排序法对两个子序列递归的排序。
- 合并(Combine):合并两个已排序的子序列已得到排序结果。

浙公网安备 33010602011771号