简答题背诵知识

树与二叉树

1.\(n-1=kn_k\)结点数与度数的关系

2.满k树的编号为i的结点的双亲结点编号:j=⌊(i-2)/k⌋+1;结点i的最后一个孩子编号为(i-1)*k+1,当(i-1)%k != 0时,结点i有右兄弟,编号为i+1。

3.完全二叉树的最后一个非终端结点序号:⌊n/2⌋

4.二叉树前中后序中,左右孩子的相对顺序是一样的,所有叶子结点的访问次序是一样的。

5.二叉树转树:从结点的左孩子开始,一直向右走,这些结点即为结点的孩子们;二叉树转森林:根开始一路向右,断开所有的边。

6.树的后序遍历,访问顺序与其对应的二叉树中序遍历顺序相同;森林的后序遍历是各个树后序遍历的线性相加

7.哈夫曼树的构造:先对元素进行排序,后找最小的两个进行求和产生根,然后删除刚刚取出的两个最小元素并将根插入队列,接着再寻找两个最小的元素求和,如此往复。(按层排好)

​   树的路径长度PL:从根结点到每个结点的路径长度之和。(∑层数*每层的结点树,根结点是第0层

​   树的带权路径长度WPL:树种所有叶子结点的带权路径长度之和。(∑层数*每层叶结点权值之和根结点是第0层
树的路径长度根结点的层数都是0

​   哈夫曼编码:从哈夫曼树根结点出发,左走0,右走1

8.二叉排序树构造:底部插入,且左子树L<根P<右子树R,故RPL形式的遍历得到从到大小的序列。

9.查找失败和查找成功:查找失败的分母是空结点的数量查找成功的分母是实结点的数量。查找失败的分子是比较次数*各层空结点数,查找成功其式子中分子均为各层结点数*查找次数,根结点查找次数为1

10.二叉树的删除结点:
    ①叶子结点直接删除
    ②只有一棵右子树或者一棵左子树,将其孩子放到现在自己的位置
    ③既有左子树又有右子树,将结点的数据域用其直接前驱数据域覆盖,然后删除直接前驱;直接后继同理

​     二叉排序树中序遍历下的直接前驱和直接后继:

   ​直接前驱(有的话):A的左孩子代表的树的最右侧的结点。

​   直接后继(有的话):A的右孩子代表的树的最左侧的那个结点

11.平衡二叉树:
​    LL: RR:取相反转    LR、RL:按从左到右顺序转

12.二叉判定树
   二叉判定树是用来描述对半搜索过程的二叉树,二叉判定树增加了失败结点,用方形表示。其内部值分为左孩子时与右孩子时,即当外部结点是左孩子,其序号是双亲结点序号-1;当外部结点是右孩子,其序号是双亲结点序号。结合对半搜索的过程其实很好写出来

1.无向图的全部顶点的度之和等于边数的两倍;含有n个顶点的无向完全图有n(n-1)/2条边,最多边数:n个顶点的有向完全图有n(n-1)条有向边。

2.矩阵An的元素An[i][j]等于由顶点i到顶点j的长度为n的路径的数目。

   无向图中矩阵中行(列)非零元素的个数就是该点的度

3.图的广度优先生成树就是二叉树的层序遍历:一链一层,一层访问完即回溯(队列)

   在邻接表中,图的深度优先搜索就是一直按点跳,浅尝辄止。
   在邻接表中,图的广度优先搜索就是走不通再回头。
   图的深度遍历能够判断是否是联通图

4.邻接表占用空间较多,适合稀疏图;邻接矩阵与边数少,适合稠密图。

5.Prim和Kruskal最小(代价)生成树的方法。
  一个具有n个顶点的连通图的生成树是一个极小连通子图,它包括图中全部顶点,以及足以构成一棵树的n-1条边,不同的方法可以得到不同的树,于是就诞生了最小代价树。最典型的问题就是网络通信代价的问题。

    Prim和Kruskal其实不考代码的话就是简单的归纳点点问题。即prim算法是以point点优先,寻找两个之间权值最小的点,把他们连起来,并以此为基础寻找其他与已有点距离最短的点,最终构成一棵最小代价生成树。kruskal算法是以最小权值边为基础,不断去寻找两个点之间最小权值的边,连接,并继续找新的两个顶点并连起来。上述两种方法都不允许找和连接已经在最终图中的两个点。
​   单源最短路径:Dijkstra算法,即表格法按趟数每次最短(贪心 ),每次确定一个点
  常用于实践问题,如从一点出发去其他城市旅游,旅行者需要知道两地之间的最短路径。
   写代码的话需要注意存在数组d用来存放当下的最短路径,path用来存放最短路径结点i的直接前驱结点。

Flyord:(按这个方法画图,100%正确)即题目中会出现dist-1(此为题设所给图),dist0(此为第一次Flyord后图),.....(即每一步的结果)。
   根据有向图画矩阵时,行出列入。
    此方法:
    ①先将主对角线处元素对应顶点画十字,十字所在行列元素不变照抄
​    ②十字区域内有∞的,则该位置的对应的行与列均不变照抄
    ③主对角线元素全为0,直接照抄
    ④剩余位置,从该位置做十字。与第①次的红十字相交的值,将两值相加,与原位置值相比,取最小者入原位置。
    南邮喜欢将其作为下标存放,即\(d_k[i][j]\)表示为从顶点i到j,中间只需要经过顶点k中转的最短路径长度。
   这其中还有与迪杰斯特拉算法同样意义的p[i][j]。

6.输出关键路径:时间允许发生的最早时间和最晚时间:正找、相加,取max;反找、相减,取min。

7.在带权图中,没有边用0和∞表示都可以。

8.AOE网:①画出源点,所有没有先驱工序的边都由源点发出。②所有没有出现在先驱工序里的边都指向最后一个顶点——汇点。
​   工序是工序,顶点是顶点。工序在边上,顶点为Vi
   关键路径就在其中,

9.AOV网,是一个有向无环图,🈚️回路。拓扑排序就是有向图中,每轮输出一个没有入边的点,同时砍掉与该点的一切边。接着输出图中没有入度为0的点,如此往复直到图中没有结点。

查找(搜索)

1.折半查找过程中带外部结点的判定树。

2.为了提高顺序查找的效率,将查找概率高的放在最先被查找的位置(先好后坏)

3.n个符号构造成哈夫曼树的过程中,共新建了n-1个结点(双分支结点),因此哈夫曼树的结点总数为2n-1=115,n的值为58

4.顺序搜索
   无序表搜索成功的平均搜索长度:\(\frac{n+1}2\)
   搜索失败时的平均搜索长度:n
   有序表失败时的平均搜索长度:\(\frac{n}2+2\)

B-树

动态查找有高效率的查找表组织结构是B树

具有n个关键字的m阶B树,有n+1个叶子结点

若B-树有s个失败结点,则元素总数为失败结点总数➖1。B-树树高最高为 \(h=1+\log_{\lceil \frac{m}2\rceil }{ \frac{(N+1)}2}\)

B树中讨论分支结点字数个数时,要记得排除根节点,单独讨论根节点

若B树在删除的过程中引起了树高度的减少,则一定是关键码所在结点和关键码所在结点的兄弟结点的关键字数目均等于\({\lceil \frac{m}2\rceil }\)-1,其中m为B树的度。

B树的插入:分裂相当于将${\lceil \frac{m}2\rceil } $位置的数为分界,将该结点分为两个结点,从中间向上层插入。
B树的删除最坏的情况下,合并操作 会上传播至根结点,当根中只有一个关键字时,合并操作将会使根结点及其两个孩子合并成一个新根,整棵树高度减1层。

散列表

1.平均查找长度ASL:查找成功的分母是关键字数,如7;查找失败的分母是散列函数所能映射的地址数最大值,即d值。

​ 查找失败的分子是从左边第一个元素开始,当它所遇到的第一个空位置,从该元素出发一共有几个数(该元素本身也算1),依次处理后累加(0~P-1,P为%P的P)

​ H(key)=(key*3)%7

​ 线性探测法即探测到空位置就停下来了。总共需要探测\(\frac{k(1+k)} 2\)次探测。每次解决冲突均从H1(H0)开始
2.查找的时间复杂度为O(1).

如果一个线性表既能够快地查找,又能适应动态变化的要求,可以采用哈希查找

哈希表的结点中不仅包含数据元素自身的信息,还包括哈希后的值,即地址值(指针)。

哈希表的检索性能可以表示为装填(载)因子的函数查找成功的平均查找长度直接与装填因子有关。因此在设计时,可以考虑控制装填因子来控制散列表的平均查找长度。
装载因子α=\(\frac{表中记录数n}{散列表长度m}\)

哈希表长用于关键字合集比地址合集大很多情况下的查找,因为Hash是一个压缩函数。

链地址法就是为了处理聚集而动态的生成链表记录地址。

采用散列表实现查找时,需要解决的主要问题有如何构造均匀的散列函数如何解决冲突

常见的构造哈希函数的方法有:平方取中法、取余法、相乘取整法。

二次探测再散列法:di为12,-12, 22,....
即先从冲突点往左走1步,再从冲突点往右走1步,然后再从冲突点往左4步,再向右往右走4步(冲突点均是指第一次冲突的点)

链地址法的平均查找长度较短,顾它更适合于造表前无法确定表长的情况

散列表只能做个标记,进行逻辑上的删除,不可随意进行物理上的删除。

链地址法失败ASL即为每次查找时的空结点之和


↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑

排序

1.二分法插入排序与记录初始状态无关

2直接插入排序:空间O(1),时间O(n^2)

void InsertSort(Element A[], int n)
{
	int i, j;
    for(i = 2;i <= n; i++){
        if(A[i] < A[i-1])
            A[0] = A[i];
    	for(j = i-1; A[j] > A[0]; --j)
            A[j+1] = A[j];
    	A[j+1] = A[0];
    }
}

2.3倍移动次数是冒泡排序的考法:比较次序=交换次序=\(\frac{n(n-1)}2\),移动次序=\(\frac{3n(n-1)}2\).

​ 冒泡排序空间O(1),时间O(n^2)

3.稳定性:插冒归,统计基
复杂度等特性

4.快排的一些细节
本质上n个结点的二叉树,就是划分设置pivots,然后把pivots放置到最终位置上,让pivots的左边数小于pivots值,右边数大于pivots值。嘻嘻🤭
在P135 第4题,请自行查看 王道书在P331。

5.得到一个序列中前k个最小元素的部分排列序列,首选堆排序
堆排序是顺序存储的,因为涉及到随机访问。


归并排序代码

posted @ 2022-11-02 20:52  Ankitone  阅读(313)  评论(0编辑  收藏  举报