第1章 概论
- 既指明了存储结构,又指明了逻辑结构的情况就是单独的“物理结构”。(线索二叉树)
- 数据的物理结构不属于数据结构研究的对象。
- 数据结构是一门研究非数值计算的程序设计问题中计算机的操作对象以及它们之间关系和运算等的学科。
- 数据结构是研讨数据的逻辑结构、物理结构以及它们之间的相互关系,并对与这种结构定义相应的运算(操作),设计出相应的算法
- 数据结构被形式地定义为(D,R),其中D是数据元素的有限集合(数据对象),R是D上的关系有限集合。
- P-processing表示基本操作
- 一个算法的效率可分为时间效率和空间效率。
- 算法分析的目的是分析算法的效率以求改进。
- 算法的数量级要加大O!!!
- 数据的物理结构主要包括顺序存储结构、链式存储结构。
- 数据结构在计算机内存中的表示是指数据的存储结构。
- 在数据结构中,与所使用的计算机无关的是数据的逻辑结构。
- 在存储数据时,通常不仅要存储各数据元素的值,还要存储数据元素之间的关系
- 一些表面上很不同的数据可以有相同的逻辑结构
- 通常要求同一逻辑结构中的所有数据元素具有相同的特性,这意味着不仅数据元素所包含的数据项的个数要相同,而且对应的数据项的类型要一致。
- int 4字节,float 4字节,long 8字节,double 8字节,char 1字节
- 索引是为了夹快检索速度而引进的一种数据结构,一个索引隶属于某数据记录集,它由若干索引项组成,索引项的结构为关键字和关键字对应记录的地址。
- 数据对象是指性质相同的数据元素的集合
- 数据结构是带有结构 的数据元素的集合
- 循环队列规定了是顺序存储
- 串属于线性结构,堆存储在一位数组中也是线性结构,广义表不一定是线性结构
- 连续存储设计时,存储单元的地址一定连续
- 算法的时间复杂度取决于问题的规模、待处理数据的初态
- 并非每种数据结构都包括插入和删除运算
- 数据的逻辑结构是指数据的各数据单元之间的逻辑关系,而非数据项
- 数据的逻辑结构与数据元素本身的内容和形式无关
- 数据元素可以由类型互不相同的数据项构成
- 顺序存储结构中不存储数据结构中元素之间的关系,元素之间的关系一定是通过物理上相邻来表示的
- 数据的物理结构包括数据元素的表示和数据元素间关系的表示
- 数据结构由数据的逻辑结构、存储结构和运算三部分组成。
- 抽象数据类型由数据对象、数据关系、基本操作集组成
- 一个数据结构在计算机中的表示(又称映像)称为存储结构
- 数据的逻辑结构是指数据的组织形式,即数据元素之间逻辑关系的总体。而逻辑关系是指数据元素之间的关联方式或称“邻接方式”。
- 标识符必须是以字母或下划线开头
第2章 线性表
- 线性表是具有n各数据元素的有限序列。
- 单链表的存储密度小于1(存储密度=数据项所占空间/结点所占空间)
- 链表的每个结点可以包含多个指针,单链表的每个结点仅包含1个指针。
- 链表的物理存储结构不具有同链表一样的顺序,它的存储结构特点是无序。
- 线性表有两种存储方式:顺序存储和链式存储。后者不要求连续存放。
- 设有头结点的单向循环链表的头指针变量为head,判空条件是head->next = head。
- 建立一个长度为n的有序单链表的时间复杂度为O(n2)
- 二维数组和多维数组是特殊的线性结构
- 不论线性表采用顺序存储结构还是链式存储结构,删除值为X的结点的时间复杂度均为O(n)。
- 判断某种操作选用何种链表时,除了考虑插入和删除操作,还应谨慎考虑是否设有头指针和尾指针。
- 需要分配较大空间,插入和删除不需要移动元素的线性表,其存储结构是静态链表。
- 顺序表插入或删除时移动数据元素的个数与位置有关。
- 根据线性表的链式存储结构中每个结点包含的指针个数,将线性链表分为单链表和双链表
- 顺序存储结构是通过下标表示元素之间的关系的,链式存储结构是通过指针表示元素之间的关系的。
- 带头结点的循环链表L中只有一个元素结点的条件是L->next!=NULL&&L->next->next = L
- 集合通常无序,线性表可以有序也可以无序,二者的区别在于元素是否可以重复。
- 取线性表的第i个元素的时间同i有关(不一定,顺序存储方式)
- 在顺序表中插入或删除一个元素,需要平均移动表中一半元素,具体移动的元素个数与表长和该元素在表中的位置有关。
- 线性表中结点的集合是有限的,结点间的关系是一对一的。
- 在顺序表中访问任意一结点的时间复杂度均为O(1),因此,顺序表也称为随机存取的数据结构。
- 顺序表中逻辑上相邻的元素的物理位置必定相邻。单链表中逻辑上相邻的元素的物理位置不一定相邻。
- 在单链表中,除了首元结点外,任一结点的存储位置由其直接前驱结点的链域的值指示。
- 在n个结点的单链表中要删除已知结点*p需要找到它的前驱结点的地址,时间复杂度为O(n).
- 线性表的顺序存储是一种随机存取的存储结构
- 线性表的逻辑顺序和物理顺序并不总是保持一致
- 二叉树的顺序存储结构并不一定能比链式存储结构节省存储空间。(非完全二叉树)
- 数组结构没有插入、删除运算,只有存取和修改
- 存取指的是读写
- 链表的删除过程包括比较运算,所以时间复杂度为O(n)
- 链式结构不都是动态结构,静态链表属于静态结构
- 在具有头结点的链式存储结构中,头指针指向头结点
第3章 栈和队列(特殊的线性表)
-
栈和队列的相同点:
- 都是运算受限的线性表,只在端点处插入和删除
-
栈和队列的不同点:
-
栈:先进后出;
-
队列:先进先出。
-
-
栈的插入和删除只能在栈的栈顶进行,后进栈的元素必定先出栈,因此把栈又称为FILO表;队列的插入和删除运算分别在队列的两端进行,先进队列的元素必定先出队列,所以又把队列称为FIFO表。
-
用不带头节点的单链表存储队列,其头指针指向队头结点,尾指针指向队尾结点,则在进行出队操作时,队头、队尾指针都可能要修改(一般只需修改头指针,但当队列里面只有一个元素时需要同时修改尾指针)
-
循环队列的优点是什么?
循环队列的优点是:它可以克服顺序队列的“假溢出”现象,能够使存储队列的向量空间得到充分利用。
-
向量、栈、队列都是线性结构,可以在向量的任何位置插入和删除元素;对于栈只能在栈顶插入和删除元素;对于队列只能在队尾插入和队首删除元素。
-
栈是一种特殊的线性表,允许插入和删除运算的一端称为栈顶。不允许插入和删除元素的一端称为栈底。
-
在栈的ADT定义中,除初始化操作外,其他基本操作的初始条件都要求栈已存在
-
在带头结点的链队列中,队头指针指向链表的头结点
-
栈是实现过程和函数等子程序所必须的结构
-
两个栈共享空间时栈满的条件是两栈顶指针相邻
-
多个栈共存时,最好用链式存储结构
-
进行入栈操作前一定要先判断栈未满
-
循环队列是队列的一种顺序存储结构
-
链队列将值x入队前要先申请新空间,赋值,而后入队
-
一个函数在结束本函数运行之前,直接或间接调用函数自身,称为递归。
递归程序的优点是程序结构简单、易读、清晰、易证明其正确性。缺点是执行中占内存空间较多,运行效率低,不易优化。
递归程序执行中需借助栈这种数据结构来实现
递归程序的入口语句和出口语句一半用条件判断语句来实现
第4章 串
- 字符串的长度是指串中所含字符的个数。
- 两个字符串相等的充要条件是两个字符串的长度相等并且对应位置上的字符相等。
- 串的长度为n,其子串的数目为(1+n)n/2+1(空串是任意串的子串)
- 组成串的数据元素只能是单个字符
- 一个字符串中任意多个连续字符组成的序列称为该串的子串
- 串是一种特殊的线性表,其特殊性体现在数据元素是单个字符,而非顺序存储。
- 长度为1的串不等价于一个字符型常量
- 不包含任何字符(长度为0)的串称为空串;由一个或多个空格(仅有空格符)组成的串称为空白串。
- 子串的定位运算称为串的模式匹配,被匹配的主串称为目标串,子串称为模式或模式串。
- 串是一种特殊的线性表,其特殊性表现在其数据元素都是字符;串的两种最基本的存储方式是顺序存储、链式存储
- 朴素的模式匹配(Brute-Force)算法的时间复杂度是O(m*n),KMP算法有一定改进,时间复杂度达到O(m+n).
主要优点是主串指针不回溯。当主串很大不能一次读入内存且经常发生部分匹配时,KMP算法的优点更为突出。
第5章 数组和广义表
- 用邻接矩阵法存储图,占用的存储空间只与图中结点个数有关,而与边数无关
- 对矩阵进行压缩存储是为了减少存储空间
- 稀疏矩阵的压缩方式有三元组和十字链表法
- 假设包含t各非零元素的稀疏矩阵A包含m行n列,并采用三元组顺序表压缩存储,其快速转置算法的时间复杂度为O(n+t)
- 稀疏矩阵的三元组存储法对矩阵的非零元个数和位置在操作过程中变化不大时较有效
- 稀疏矩阵的快速转置算法中,num[col]表示原矩阵M中第col列中非零元的个数
- 三元组的每个元素包括行值、列值、元素值。特别的,A[0]元素包括稀疏矩阵的行数、列数、非零元素个数
- 当广义表非空时,第一个元素为广义表的表头,其余元素组成的表是广义表的表尾
- 从逻辑上看,n维数组的每个元素均属于n个向量
- 严格地讲,广义表不算线性数据结构
- 广义表是由零或多个原子或子表所组成的有限序列,所以广义表可能为空表。原子与表的差别仅在于原子是结构上不可再分的。为了区别原子和表,一般用大写字母表示表,用小写字母表示原子。一个表的长度是指表中元素的个数,而表的深度是指表展开后所含括号的层数。
- 所谓稀疏矩阵指的是非零元素很少,且通常元素分布没有规律
- 一维数组可以用来存储顺序表,和有序表的差别主要在于有序表中的元素按值排序(非递增或非递减),而一维数组中的元素没有按元素排列顺序的要求。另外就是所允许的操作不同,有序表允许插入和删除操作,数组(包括一维数组和多维数组)不允许插入和删除。
第6章 树和二叉树
-
哈夫曼树:在含有n个带权叶子结点的二叉树中,其中带权路径长度(WPL)最小的二叉树称为哈夫曼树。
-
哈夫曼树的构造过程:
-
给定n个带权值的结点,将这n个结点分别作为n棵仅含一个结点的二叉树,构造森林F;
-
构造一个新结点,从F中选取两个根结点权值最小的树作为新结点的左、右子树,并且将新结点的权值置为左、右子树上根结点的权值之和;
-
从F中删除刚才选出的两棵树,同时将新得到的树加入F中;
-
重复上述两步,直至F中剩下一棵树为止。
-
-
哈夫曼编码的过程:
-
构造出对应的哈夫曼树;
-
由于字符结点都出现在叶子结点中。我们将字符的编码解释为从根至该字符的路径上边标记的序列,其中边标记为0表示“转向左孩子”,标记为1表示“转向右孩子”。
-
-
完全二叉树:设一个高度为h、有n个结点的二叉树,当且仅当其每个结点都与高度为h的满二叉树中编号为1~n的结点一一对应时,称为完全二叉树。
-
具有n个结点的完全二叉树的高度为log(n+1)向上取整。
-
深度为k的完全二叉树,其叶子结点必在第k层上,可能在第k或k-1层上。
-
在有n个结点的二叉链表中,空链域的个数为n+1.
-
二叉树中每个结点的两棵子树是有序的。
-
树的度是树中结点的最大度数,而非树的分支数
-
若一个叶子结点是某二叉树中的中序遍历序列的最后一个结点,则它必是该二叉树的先序遍历序列的最后一个结点。
-
线索二叉树的左线索指向遍历序列的前驱,右线索指向其遍历序列的后继
-
二叉树的后序遍历序列中,任意一个结点均处在其孩子结点的后面。
-
度为2的有序树是二叉树的说法是错误的(有序树的结点次序是相对于另一结点而言的,若有序树的子树中只有一个孩子时,这个孩子的结点无须区分左右次序)
-
m个结点进行k路归并,为实现最佳归并(带权路径长度最小),若(m-1)%(k-1) = 0,不需要加虚段,否则第一次构造时要使用(m-1)%(k-1)+1个结点
-
当结点数目一定时具有最小深度的二叉树是完全二叉树
-
若二叉树采用二叉链表存储结构,要交换其所有分支结点左、右子树的位置,利用前序、后序遍历方法最合适
-
二叉树在线索化后,仍不能有效求解的问题是后序线索二叉树中求后序后继
-
由n个结点可以构造出的树的数量与n-1个结点构造二叉树的数量相同
-
具有n个结点,其路径长度最短的二叉树是完全二叉树
-
判断是否为哈夫曼编码时,除了判断是前缀编码外,还得符合哈夫曼树构造规则
-
树与二叉树是两种不同的树形结构,二者不存在谁是谁的特殊情况
-
只有对完全二叉树编号时,其结点下标才有规律,否则慎重思考
-
同一层上的各个结点不一定存在兄弟关系,存在兄弟关系的一定有相同的双亲
-
树的双亲表示法中兄弟节点的编号不一定时连续的
-
并非所有二叉树的后序线索树进行后序遍历时都必须用栈,任意结点只有左子树就不用栈
-
树只有先根遍历和后根遍历
-
对于一个具有n个结点的二叉树,当它为一棵完全二叉树时具有最小高度,当它为一棵高度为n的二叉树时,具有最大高度
-
哈夫曼树是带权路径长度最小的二叉树
-
树的孩子兄弟链表表示法和二叉树二叉链表表示法,本质上是一样的,只是解释不同,也就是说,树是森林的特例,它可用二叉树唯一表示,并可以使用二叉树的一些算法去解决树和森林的问题。
树和二叉树均属于树形结构,其区别有三:一是二叉树的度之多为2,树无此限制;二是二叉树有左右子树之分,即使在只有一个分支的情况下,也必须指出是左子树还是右子树,树无此限制;三是二叉树允许为空,树一般不允许为空。
二叉树不是树的特例。 -
完全二叉树的最后一个非终端结点的序号即完全二叉树最后结点的双亲结点。
第7章 图
-
一个带权的无向连通图存在权值相同的多条边时,最小生成树可能不唯一。
-
拓扑排序:由一个有向无环图的顶点组成的序列,当且仅当满足下列条件时,称为该图的一个拓扑排序
-
每个顶点出现且仅出现一次;
-
若顶点A在序列中排在顶点B的前面,则在图中不存在从顶点B到顶点A的路径。
(由集合上的一个偏序关系得到整个集合上的一个全序,这个操作称为拓扑排序)
拓扑排序应用于判断图中是否有环。
-
-
若一有向图的邻接矩阵中对角线以下元素均为0,则该图的拓扑序列必存在。
-
在一个无向图中,所有顶点的度数之和等于图的边数2倍;在一个有向图中,所有顶点的度数之和等于图的边数。
-
求最小生成树时,权值为负不会对结果产生影响。
-
求最短路径的Dijkstra算法不适用边上带有负权值的图,Floyd算法允许图中有带负权值的边,但不允许有包含带负权值的边组成的回路。
-
最小生成树:连通图的生成树为包括连通图的所有顶点,且任意两顶点有且仅有一条通路的图。在这个生成树集合中边的权值之和最小的那棵生成树称为连通图的最小生成树。
-
权值互不相等的最小支撑树唯一吗?给出理由。
假设存在两棵不同的最小支撑树T1、T2,如果从T1中找出一条边e不在T2中且权值尽可能的小。将e加入T2中,此时图T2+e肯定有一个环。
a) 若该环中每条边都比e小,则这些边应当在T1中,此时T1中存在环,不是支撑树,矛盾;
b) 若环中至少存在一条边必e大,将这条边去掉后形成新的图T3仍是一棵生成树,且权值必T2小,此时T2不是最小支撑树,矛盾。
综上所述,当图中边的权值互不相等时,最小支撑树唯一。
- AOV网是一种有向无回路的图。
- 有向图的入度等于出度等于边数。
- 在图的邻接表中用顺序存储结构存储表头结点的优点是可以随机访问到任意一个顶点的简单链表。
- 无向图建立邻接表的时间复杂度为O(n+e).
- 分块查找的平均查找长度为(t+1)/2+(s+1)/2
- 设无向图有n个顶点和e条边,则用邻接矩阵作为表的存储结构进行DFS遍历的时间复杂度为O(n2),BFS遍历的时间复杂度为O(n2);用邻接表作为表从存储结构进行DFS遍历的时间复杂度为O(n+e),BFS遍历的时间复杂度为O(n+e).
- 如果图的存储结构确定了,那么它的深度遍历和广度遍历应该是确定的。
- 强连通图的各个顶点均可以到达。
- 拓扑排序是基于AOV网的。
- 用邻接表存储的有向图,拓扑排序时间复杂度为O(n+e)
- 邻接矩阵中主对角线以下的元素均为零,则该图的拓扑序列存在但不唯一
- 无向图的连通分量是指无向图中的极大连通子图
- 一个有n个结点的图最少有1个连通分量,最多有n个连通分量
- 顶点v在整个邻接表中出现的次数为入度+1,在链表中出现的次数为入度
- 有向完全图一定是强连通有向图
- 深度优先遍历和拓扑排序可以判断有向图中是否有环
- 邻接表表示图进行深度优先遍历时,通常时采用栈来实现的
- 求关键路径是以拓扑排序为基础的
- 只有无向连通图才有生成树,非连通无向图会形成生成森林。
n个顶点的无向连通图的生成树具有图的全部顶点和足以使图连通的n-1条边,是该图的极小连通子图。
生成树一般不唯一
n个顶点n-1条边的无向图不一定是生成树 - 在拓扑序列中,任意两个相邻结点a和b,不一定存在a到b的路径(如果a和b都是入度为0的点)
- 在AOE图中,关键路径上活动的时间延长多少,整个活动的时间就随之延长多少
- 无向图的压缩存储不保存对角线上的元素
- 有向图G的强连通分量是指有向图的极大强连通子图
- 如果具有n个顶点的图是一个环,则它有n棵生成树
- n个顶点的无向图的邻接矩阵至少有0个非零元素
- 遍历图的过程实质上是查找顶点的邻接点的过程
- 克鲁斯卡尔算法的时间复杂度为O(eloge),对边稀疏的图较为适合
- 图的简单路径是值在路径序列中顶点不重复出现的路径
- 拓扑序列的最后一个顶点必定是出度为0的顶点
- AOV网中,结点表示活动,边表示活动间的优先关系
AOE网中,结点表示事件,边表示活动 - 在AOV网中,存在环意味着某项活动以自己为先决条件
- 弱连通图,将有向图的所有有向边替换为无向边,所得到的图称为原图的基图。如果一个有向图的基图是连通图,则有向图是弱连通图。
含n个顶点的弱连通图最多有n(n-1)条边,最少有n-1条边 - 如果一个矩阵中非零元素排列有序的话,即使元素个数很少也不是稀疏矩阵
- 有n个顶点的有向强连通图最多有n(n-1)条边,最少有n条边
- 二部图的邻接矩阵A是一个分块对称矩阵
- 遍历起始顶点不同,存储结构不同,在邻接表情况下邻接点的顺序不同。以上三点原因可能导致得到的遍历序列不唯一。
- 在边有相等权值(特别是边的权值较小且相等)时可能会生成不同MST
第8章 查找
- 静态链表存放于连续的数据空间,但折半查找不可以对链表进行查找。
- 拉链法解决冲突时需要使用指针指向下一个元素的存储位置。因此散列表的系欸但中不仅包含元素自身的信息,也可能包含指针。
- 随着散列表的装填因子a的增大,查找表中指定表项的平均查找长度也要增大,但如果采用拉链法解决冲突,可以平稳的控制平均查找长度的增大幅度达到最小。
- 二叉检索树和散列表的对比有哪些优势:
a) 二叉检索树不会有冲突,这意味着我们额能够保证二叉检索树的插入和查找操作一直都是O(logn)的时间复杂度;
b) 二叉检索树的空间占用和输入的数据一致,故不需要为其预先分配空间;
c) 所有元素在树中是排好序的;
总的来说,如果进行动态查找,二叉检索树是一个折中的选择。
- 二叉排序数中插入一个结点的最坏时间复杂度为O(n)(退化为单链表),平均时间复杂度为O(logn)。
- 模式匹配字符串下标从1开始。
- 散列表中解决冲突的两种方法是链地址法和开放定址法。
- 顺序表查找指的是在顺序存储结构上进行查找、区别于顺序查找
- 设有n个关键字具有相同的hash函数值,则用线性探测法把这n个关键字映射到hash表中需要做n(n-1)/2次线性探测。(未发生冲突的关键字不需要进行线性探测)
- 分块索引查找中,首先查找索引表,然后查找相应的块表。
- 开放定址法,是指可存放新表项的空闲地址既向它的同义词表项开放,有向它的非同义词表项开放
- 在各种查找方法中,平均查找长度与结点个数n无关的查找方法是散列查找。
- 散列法存储的基本思想是由关键字的值决定数据的存储地址。
- 平衡二叉树删除叶子结点后可能导致树形变化,此时再将该结点添加进去,前后的树的形态也可能不一样
- 散列查找的ASL失败,比较时要一直比到没有元素的位置
- B+树不同于B树的特点之一是能支持顺序查找
- 处理冲突永远无法避免产生聚集现象,只能减少。会直接受其影响的时平均查找长度
- 装填因子只与散列表的长度和元素的个数有关
- 对一颗无重复关键字的AVL树进行中序遍历得到一个降序序列,则树中最大元素一定没有左子树
- 对于顺序查找,假定查找成功与不成功的可能性相同,对每个记录的查找概率也相同,此时顺序查找的平均查找长度为0.75(n+1)
- 如果要求一个线性表既能较快地查找,又能适应动态变化的要求,可以采用分块查找方法(即索引顺序查找)
- 当n足够大时,在按值有序的顺序表中进行折半查找,在等概率查找情况下,查找成功的平均查找长度为log(n+1)-1
- 常见的静态查找表:顺序查找表、二分查找表、索引顺序查找表、次优查找表
- 常见的动态查找表:各种树
- 对动态查找有高效率的查找表组织结构是B树
- 在平衡二叉树中,进行查找的效率与二叉树的深度有关
- B树是索引表的一种组织形式
- 链地址法解决冲突,查找成功的平均查找长度与哈希函数有关
- 顺序查找时,这n个数排列有序或无序,其平均查找长度一样
- 二叉树中叶结点外,对任意结点,其左子树所有结点的值小于该结点的值,才是二叉排序树
- 一个平衡二叉树中并非任意两叶子结点的层次的绝对值都不大于1
- b树插入才可能导致分裂,删除只可能导致合并
- 非空的平衡二叉树中插入一个结点,原有结点中至少一个结点的平衡因子会改变
- 随着装填因子的增大,用闭散列法解决冲突的平均搜索长度不一定比用开散列法解决冲突时平均搜索长度增长得慢
- 在散列检索中,比较操作一般是不可以避免的
- 顺序表查找不成功的平均查找长度为n+1
- 执行顺序查找时,存储方式可以是顺序存储或链式存储
二分查找时,要求线性表顺序存储且有序
分块查找时要求线性表块内顺序存储,块间有序
而散列表的查找要求线性表的存储方式是散列存储 - 查找可分为静态查找、动态查找、哈希查找。处理哈希冲突的方法有开放定址法、链地址法、再散列法、建立公共溢出区
- 哈希表用关键字确定记录的存储位置
- 衡量哈希函数的优劣,哈希表技术中冲突的概念
能否将关键字均匀映射到哈希空间上,有无好的解决冲突的方法,计算哈希函数是否简单高效。
散列函数可能会把两个或两个以上的不同关键字映射到同一地址上,这种情况称为冲突
第9章 排序
- 堆通常是一个可以被看做一棵树的数组对象。堆总是满足下列性质:
a) 堆中某个节点的值总是不大于或不小于其父节点的值;
b) 堆总是一棵完全二叉树。
- 基数排序的时间复杂度是O(d(n+r))。其中d是关键字位数,表示需要d趟分配和收集;r表示关键字的基数即关键字的取值范围,表示一趟排序需要的辅助存储空间为r(r个队列);n是关键字个数。基数排序需要进行d趟分配和收集,一趟分配需要O(n),一趟收集需要O®。
- 堆排序若为说明大根堆或小根堆,则默认为小根堆。
- 设有5000个待排序的记录关键字,如果需要用最快的方法选出其中最小的10个记录关键字,则用堆排序。(快速排序的过程并非局部有序)
- 堆中根结点大于等于或小于等于子结点。
- 快速排序算法的平均空间复杂度为O(logn),最坏空间复杂度为O(n).
- 堆中有n个结点,则在该堆中插入一个新结点的时间复杂度为O(logn)
- 希尔排序的平均时间复杂度为O(n1.3)
- 堆排序是一种选择排序
- 快速排序和冒泡排序属于交换排序
- 快速排序一趟的枢轴最终位置如果在中间,则第二趟排序结束后应该有三个元素回到最终位置上
- 对于希尔排序和堆排序,如果将顺序存储更换为链式存储,算法的时间效率会降低
- 若关键字是实数,不一定适合基数排序(实数有可能是小数)
- 归并排序和简单选择排序,其比较次数与序列初态无关
- 适合并行处理的算法排序是快速排序
- 将待排序的n个元素分为n/k组,每组k个元素,已知块间有序,则若基于比较的排序,时间复杂度为O(nlogk)
- 折半插入排序所需的比较次数与待排序记录的初始状态无关
- 在执行某排序算法过程中出现了排序码朝着最终排序序列位置相反方向移动,则该算法依然有可能是稳定的(基数排序)
- 堆不是平衡二叉树
- 在基数排序(分配排序)时,最高优先分配法不一定比最低优先分配法简单
- 外排序中使用置换选择排序的目的是为了增加初始归并段的长度
- 影响外排序的时间因素主要是内存与外设交换信息的总次数
- 在外部排序中,使用选择树法可以减少初始归并段的数量
- 快速排序在最好每次划分能得到长度相等的两个子序列的情况下最易发挥其长处
- 堆排序是一种选择类型排序,常用的建堆算法是floyed提出的筛选法,堆实质上是一棵完全二叉树。堆排序的时间复杂度为O(nlogn),所需的附加存储结点是1
- LSD最低为优先法、MSD最高位优先法
- 按LSD进行多关键字排序,除了最次位关键字之外,对每个关键字进行排序时只能用稳定的排序算法
- 磁盘排序过程主要是先生成初始归并段,然后对初始归并段合并,而提高排序速度很重要的是减少外存信息读写次数(即减少归并趟数),我们将采用增加归并路数、减少归并段个数(增加初始归并段长度)方法来提高排序速度
- 外排序的基本操作过程是生成初始归并段和归并
- 工作区的容量是W,置换选择所得到初始归并段长度的期望为2W
- 拓扑排序和冒泡排序是两个完全不同的概念,前者是由某个集合上的偏序得到集合上的全序的操作,是对有向图的顶点的排序,主要解决一个工程能否顺利进行的问题;后者是借助交换思想,通过比较相邻关键字大小进行排序的算法,解决无序记录的排序问题
- 记录的关键字基本有序时,快速排序就退化成冒泡排序
- 树形选择排序的时间复杂度为O(nlogn),空间复杂度为O(n)
- 外排序用k路归并,因为k越小,归并趟数越多,读写外存次数越多,时间效率越低,故一般应大于最少的2路归并
若k路归并的败者树思想单纯用于内排序,因其辅助空间大,不如堆排序好,故将其用于内排序的效率并不高。