知识大全 数据结构第七章(图)串讲+复习要点
Posted 知
篇首语:坚硬的城市里没有柔软的爱情,生活不是林黛玉,不会因为忧伤而风情万种。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 数据结构第七章(图)串讲+复习要点相关的知识,希望对你有一定的参考价值。
排序是组织数据最基本的运算 排序的方法也很多 本章给出了几种典型的排序方法 见下表
排序类别 插入排序 交换排序 选择排序 归并排序 分配排序
排序方法 直接插入 冒泡法 直接选择 * 归并排序 箱排序
希尔排序 * 快速排序(分治法) * 堆排序 * 基数排序
这 五类 内部排序方法的基本思想 排序过程 算法实现 时间和空间性能的分析以及各种排序方法的比较和选择都是本章内容 带*号的几种排序方法的基本思想及排序过程是本章需重点理解掌握的部分 同时这四个排序算法的实现是难点 总之这章的内容很多 实在是多 太多 可是大家都不怕
一 基本概念( 识记 )
记录 中用于某一 项 可用来标识一个记录 则称为 关键字项 该数据项的值称为 关键字 (注意其区别)
排序 就是要整理文件中的记录 使之按关键字递增(或递减)次序排列起来 当待排序记录的关键字均不相同时 则排序结果是唯一的 否则排序的结果不一定唯一 如果在待排序文件中存在多个关键字相同的记录 经过排序后这些具有相同关键字的记录之间的相对次序保持不变 则称这种排序方法是稳定的 否则排序算法是不稳定的
这里的 稳定性的含义 就是指用某种排序方法在对文件进行排序后 关键字 相同的 记录 的 相对次序的稳定性 稳定是 针对 所有 输入实例 而言的 只要存在一个输入实例在排序后关键字相同记录的相对次序发生变化 就足以认定该排序算法是 不稳定的
排序过程中 整个文件在内存中处理 不涉及数据的内 外存交换则称之为 内部排序 (内排序) 反之 若存在数据的内外存交换 则称之为外排序
内部排序 方法可分 五类 插入排序 选择排序 交换排序 归并排序和分配排序
评价排序算法好坏的标准 主要有 两条 执行 时间 和所需的 辅助空间 另外算法的复杂程序也是要考虑的一个因素
二 插入排序( 综合应用 )
插入排序 的基本思想是 每次将一个待排序的记录 按其 关键字 大小插 入到 前 面已经排好序的子文件中的适当 位 置 直到全部记录插入完成为止
直接插入排序算法比较容易理解 其中的 哨兵 的作用应当深刻理解并能运用
哨兵 (监视哨)有两个作用 一是作为临变量存放R[i] (当前要进行比较的关键字)的副本 二是在查找循环中用来监视下标变量j是否越界
实际上 一切为简化边界条件而引入的附加结点(元素)均可称为哨兵
直接插入 排序 是稳定的 也就是相同关键字的记录的相对位置在排序后不发生改变
直接插入排序 的时间复杂度在不同输入实例时是不同的 最好情况是文件初态为正序 此时算法的时间复杂度为O(n) 最坏情况是文件为反序 时间复杂度为O(n^ ) 算法的 平均时间复杂度也是O(n^ ) 该算法的空间复杂度为O( ) 是就地排序
对于一个给定的输入实例 我们应当能够写入直接插入排序的排序过程
对于 希尔排序 要记住它的算法是 不稳定 的
三 交换排序( 综合应用 )
交换排序 的基本思想是 两两比较 待排序记录的关键字 发现两个记录次序相 反 时 即 进行交 换 直到没有反序的记录为止
冒泡排序 的基本思想是 将每个记录R[i]看作是重量为R[i] key的气泡 根据轻泡不能在重泡之下的原则 从 最后 一个记录(最下方的记录) 开始往上扫 描 两两 进行 比较 凡扫描到违反上述原则的 气泡 就进行交换 保证 轻 气 泡 在 上 如此反复进行 直到任何两个气泡都达到轻者在上 重者在下为止
冒泡排序比较简单 其算法也容易理解 冒泡排序算法是稳定的 主要的难点还是快速排序
快速排序 其基本思想是将原问题分解为若干个规模更小但结构与原问题相似的子问题;递归地解这些子问题 然后将这些解组合为原问题的解 由于采用了分治的策略 因此通常称为 分治法 (教材中写为 冶 我拍拍脑袋想想 大概是作者笔误吧 这个 冶 字好象与 Conquer 搭不上边 )
分治法有三个步骤 分解 求解 组合
分解 就是在原记录中任选一个记录作为基准 以此基准把当前无序区划分为左右两个较小的子区间 并使左边的记录关键字均小于等于基准记录的关键字 右边子区间中的记录关键字均大于这个基准记录的关键字 分解的过程其实是一次粗略排序的过程 即它 只做一件事 把整个无序区 排列 成三部分 小于等于基准的部分 基准和大于等于基准的部分
求解 就是递归调用了 也就是在左子区间和右子区间里再进行分解 求解 直到不用再分就可以求解
组合 什么也不做 求出的解就是组合的结果
所以在分治法中 最关键的一步就是分解算法的实现 即确定当前无序区中的 基准 记录所在位置 以便递归调用时能够知道当前无序区的区间
那么在分治法中分解一步选哪个记录作为基准呢? (选定一个基准后 就将以它为界把关键字比它大的记录移到右边 比它小的移到左边) 当然可以随意选定一个 为了算法的简明 可以选无序区的第一个记录作为基准 算法的实现也不复杂 如果我们能够写出算法每次划分后的状态 则理解算法的实现也就很容易了
对于快速排序 其时间主要耗费在划分操作上 最坏的情况是每次划分选取的基准都是当前无序区中关键字最小(或最大)的记录 这时快速排序必须作n 次划分 时间复杂度为O(n^ ) 这种情况就是文件已按递增序或递减序排列 在最好的情况下 每次划分所选的基准都是当前无序区的 中值 记录 此时的时间复杂度为O(nlgn) 由于出现最坏情况的输入实例概率极小 因此它的 平均性能接近于它的最好时间复杂度 也是O(nlgn)
快速排序 算法是 非稳定 的 比如[ ]这个序列 排序后的结果为
三 选择排序( 简单应用 )
选择排序 的基本思想是 每一趟从 待排 序的 记录 中 选 出关键字 最小 的记录 顺序存放已排好的子文件的最后(最前) 直到全部记录排序完毕
直接选择 排序 容易理解 其 时间复杂度为O(n^ ) 就地排序 算法是 不稳定 的
本来知道直接选择法就行了 可是就是有人吃饱了 撑 的 又弄出了 堆排序 有什么好呢 就是因为它更省时间 更完美 就象上面的分治法
为了弄清堆排序是什么东西 还得先知道堆是什么东西
堆就是一个关键字序列 并且这n个关键字的序列K K Kn要满足以下性质( 堆性质 ) 就是 Ki≤K i且Ki≤K i+ 或者 Ki≥K i且Ki≥K i+ 当把这个序列存入一个向量并把它看作是一棵完全二叉树的存储结构时 堆就是这样一棵二叉树 任一非叶结点的关键字均不大于(或不小于)其左右孩子结点的关键字 (是不很象一堆从小到大(或从大到小)的关键字堆起来的塔?)
如这棵二叉树的根结点(堆顶)是树上所有结点关键字中最小和最大者 则称这两种堆为 小根堆 和 大根堆 堆中任一子树亦是堆
知道了这些 就可以讨论堆排序了 其实堆排序就是运用了上述堆的性质 这里以大根堆为例 因为堆顶是最大的数 所以当把一个关键字序列排成一个 大根堆 时 就很容易地找到 最大 或最小的数 它就 在序列的第一个位置上 然后把这个最大的数与最后一个记录交换 这时 最后一个记录就是关键字最大的记录了 这是确定的 对于 剩下 的关键字序列 我们仍然把它排成一个大根堆 然后再把第一个记录(当前堆中的堆顶)与当前堆的最后一个记录交换 这时 在整个序列后面就有了两个有序的关键字(从小到大) 重复这样的过程 就可以把有序区不断扩大直到全部关键字都进入有序区 直到排序完成
这个算法主要是 建立初始堆和重建堆 的过程 它的时间复杂度 最坏情况下为O(nlgn) 而平均性能接近于最坏性能 堆排序不适宜于记录数较少的文件 堆排序 是 就地排序 是 不稳定 的
对于给定的序列 用堆排序的过程主要是通过画完全二叉树来演示
四 归并排序( 领会 )
归并就是将若干个已排序的文件合成一个有序的文件 这个算法容易理解 其时间复杂度 无论在最好还是最坏的情况下都是O(nlgn) 它不是就地排序 因为用到了一个辅助向量 归并排序是稳定的
五 分配排序( 领会 )
分配排序的思想是不通过关键字的比较来进行排序 而是根据关键字的取值来进行分配
箱排序的平均时间复杂度是线性的O(n)
基数排序是对箱排序的改进和推广 其基本思想是 从低位到高位依次对关键字进行箱排序 要保证基数排序是正确的 就必须保证 除第一趟外各趟箱排序是稳定的
我们要能够对一给定序列写出其基数排序的过程
六 各种排序方法的比较和选择( 简单应用 )
这一节还比较重要的 主要是简单应用 就是给定一类记录 其数目以及其他条件 让我们选择一个最合适的排序算法 这就要了解各种排序方法的优缺点
选择排序方法时应 综合考虑下列因素
待排序的记录数目n;(n较大的就要用时间复杂变为O(nlgn)的排序方法 所以也要记一下算法的时间复杂度)
记录的大小(规模);(记录很大的话要用大量时间和空间来移动它们 因此最好用链表作为存储结构 而快速排序和堆排序在链表上难于实现)
关键字的结构及其初始状态;(比如实数就不能使用箱排序和基数排序)
对稳定性的要求(这一点要多多注意 记住哪些排序算法是稳定的)
语言工具的条件(有的语言没有提供指针类或递归算法 则不易用归并 快速排序和基数排序等算法);
相关参考
本章的重点是掌握顺序表和单链表上实现的各种基本算法及相关的时间性能分析难点是使用本章所学的基本知识设计有效算法解决与线性表相关的应用问题 要求达到<识记>层次的内容有:线性表的逻辑结
本章的重点是了解数据结构的逻辑结构存储结构数据的运算三方面的概念及相互关系难点是算法复杂度的分析方法 需要达到<识记>层次的基本概念和术语有数据数据元素数据项数据结构特别是数据结构的
本章介绍了串的逻辑结构存储结构及串上的基本运算由于在高级语言中已经提供了较全善的串处理功能因此本章的重点是掌握在串上实现的模式匹配算法同时这也是本章的难点但是从全书来讲这属于较简单的一章内容 串
第三章栈和队列 本章介绍的是栈和队列的逻辑结构定义及在两种存储结构(顺序存储结构和链式存储结构)上如何实现栈和队列的基本运算本章的重点是掌握栈和队列在两种存储结构上实现的基本运算难点是循环队列中
前面我们学习的线性表栈队列和串都是线性结构本章起学习的是非线性结构它们的逻辑特征是一个数据元素可能有多个直接前趋和多个直接后继 本章重点是熟悉多维数组的存储方式矩阵的压缩存储方式广义表的定义及其
本章介绍了线性表树和散列表的查找方法算法实现以及各种查找方法的时间性能分析重点是顺序查找二分查找二叉树查找以及散列表上查找的基本思想和算法实现 一基本概念(识记) 查找的同时对表做修改操作(如
第七章图 图的概念 图G是由顶点集V和边集E组成顶点集是有穷非空集边集是有穷集; G中每条边都有方向称有向图;有向边称弧;边的始点称弧尾;边的终点称弧头;G中每条边都没有方向的称无向图 顶
.对有五个结点ABCDE的图的邻接矩阵 ().画出逻辑图 ().画出图的十字链表存储 ().基于邻接矩阵写出图的深度广度优先遍历序列 ().计算图的关键路径【华南师范大学三(分)】 .何
.一带权无向图的邻接矩阵如下图试画出它的一棵最小生成树【浙江大学五 (分)】 .请看下边的无向加权图 ().写出它的邻接矩阵(分) ().按Prim算法求其最小生成树并给出构造最小
.().对于有向无环图叙述求拓扑有序序列的步骤 ().对于以下的图写出它的四个不同的拓扑有序序列【南开大学二 (分)】 cha138/Article/program