【数据结构与算法】浙大数据结构MOOC课堂测试合集 - 超全版,含解析【更新ing】

文章目录

😶‍🌫️说在最前面

最近在跟着MOOC里浙大的数据结构网课学习,为了方便自己复习纠错就直接把学习过程中的一些小测试题基础题放在这里了。可能也会记录学习过程中遇到的一点小问题,也算帮后面遇到同样问题的朋友节省点时间~

因为是初学者小白,如果文章中有什么错误和待改进的地方,欢迎在评论区指出交流,共同学习和进步!✊

🙂CH1 基本概念

1.1 什么是数据结构

跟着过视频即可。

1.2 什么是算法

🌌CH1.2 章节末小测验 - 算法复杂度

【CH1.2 - 1】 下列函数中,哪个函数具有最快的增长速度:
A. N(logN)2
B. N2logN
C. N3
D. Nlog(N2)

正确答案:C

【CH1.2 - 2】 下面一段代码的时间复杂度是?

if ( A > B ) {
    for ( i=0; i<N; i++ )
        for ( j=N*N; j>i; j-- )
            A += B; } else {
    for ( i=0; i<N*2; i++ )
        for ( j=N*2; j>i; j-- )
            A += B; } 

A. O(N)
B. O(N2)
C. O(N3)
D. O(N4)

正确答案:C
解析:如果有像我一样错选了D的同学…可以详见👉 【数据结构与算法】浙大数据结构MOOC算法复杂度小测试 QAQ犯了审题不仔细的毛病啊…

1.3 应用实例:最大子列和问题

🌌CH1.3 视频中插小练习

【1.3.1 应用实例 - 算法1 & 2】 算法1的时间复杂度是多少?

int MaxSubseqSum1( int A[], int N )  
{   int ThisSum, MaxSum = 0;
  int i, j, k;
  for( i = 0; i < N; i++ ) { /* i是子列左端位置 */
        for( j = i; j < N; j++ ) { /* j是子列右端位置 */
                ThisSum = 0;  /* ThisSum是从A[i]到A[j]的子列和 */
                for( k = i; k <= j; k++ )
                          ThisSum += A[k];
                          if( ThisSum > MaxSum ) /* 如果刚得到的这个子列和更大 */
                                    MaxSum = ThisSum;    /* 则更新结果 */
        } /* j循环结束 */
   } /* i循环结束 */
   return MaxSum;  
}

A./B./C./D. …(图片加载失败,直接当填空题做吧)

正确答案:C. O(N3)
解析:算法一共有三层for循环,约等于T(N)=O(N3)这么一个数量级(这个说法不一定准确)。

【1.3.1 应用实例 - 算法1 & 2】 算法2的时间复杂度是多少?

int MaxSubseqSum2( int A[], int N )  
{   int ThisSum, MaxSum = 0;
   int i, j;
   for( i = 0; i < N; i++ ) { /* i是子列左端位置 */
         ThisSum = 0;  /* ThisSum是从A[i]到A[j]的子列和 */
         for( j = i; j < N; j++ ) { /* j是子列右端位置 */
                 ThisSum += A[j];        /*对于相同的i,不同的j,只要在j-1次循环的基础上累加1项即可*/ 
                 if( ThisSum > MaxSum ) /* 如果刚得到的这个子列和更大 */
                           MaxSum = ThisSum;    /* 则更新结果 */
         } /* j循环结束 */    
    } /* i循环结束 */    
    return MaxSum;  
}

A./B./C./D. …(图片加载失败,直接当填空题做吧)

正确答案:O(N2)
解析:算法一共有两层for循环。

【1.3.3 应用实例 - 算法4】 算法4的时间复杂度是多少?

int MaxSubseqSum4( int A[], int N )  
{   int ThisSum, MaxSum;
   int i;
   ThisSum = MaxSum = 0;
   for( i = 0; i < N; i++ ) {
         ThisSum += A[i]; /* 向右累加 */
         if( ThisSum > MaxSum )
                 MaxSum = ThisSum; /* 发现更大和则更新当前结果 */
         else if( ThisSum < 0 ) /* 如果当前子列和为负 */
                 ThisSum = 0; /* 则不可能使后面的部分和增大,抛弃之 */
   }
   return MaxSum;  
}

A./B./C./D. …(图片加载失败,直接当填空题做吧)

正确答案:O(N)
解析:算法只有一层for循环。

🪜CH2 线性结构

2.1 线性表及其实现

🌌CH2.1 视频中插小练习

【2.1.1 引子:多项式表示】 用顺序存储结构直接表示多项式 x + 3x2000 ,数组大小需要多少?
A. 2
B. 2000
C. 2001
D. 2002

正确答案:C
解析:a[i]: 项 xi 的系数 ai 。i∈[0,2000] 共2001项。

【2.1.2 顺序存储的插入和删除】 如果把后移数组元素的循环

   for ( j = PtrL->Last; j >= i-1; j-- )
      PtrL->Data[j+1]=PtrL->Data[j];

改为

   for ( j = i-1; j <= PtrL->Last; j++ )
      PtrL->Data[j+1]=PtrL->Data[j];

那会是什么后果?
A. 效果一样,没区别
B. 分量Data[i-1]到Data[Ptrl->Last+1]都是同一个值,即移之前Data[i-1]的值
C. 分量Data[i-1]到Data[Ptrl->Last+1]都是同一个值,即移之前Data[Ptrl->Last]的值
D. 说不清楚,要看具体数据

正确答案:B

【2.1.5 链式存储的插入和删除】 如果语句执行顺序为:(1) p->Next=s; (2) s->Next=p->Next; 那么后果是什么?
2.1.5题目图片
A. 也能正确插入s结点
B. s->Next指向s,从而不能正确完成插入
C. p->Next指向p,从而不能正确完成插入
D. 说不清楚,直接告诉我答案吧

正确答案:B

【2.1.6 广义表与多重链表】 在矩阵的多重链表表示中,第 i 行的 head 和第 i 列的 head 实际上是同一个结点

A. √
B. ×

正确答案:A
解析:“在矩阵的多重链表表示中,每行、每列都需要有个头指针来指示相应链表的头一个元素结点。每个head结点有down、right和next三个指针,第 i 个head结点用它的right把第i行的结点串起来,同时用它的down指针把第i列串起来,而通过next把每行(每列)的head结点串起来。所以,第i行的head和第i列的head实际上是同一个结点,图中只是为了方便理解和图的简洁把同一个结点画在两处。”
学习参考:
知乎问答:为什么“在矩阵的多重链表表示中,第i行的head和第i列的head实际上是同一个结点”是对的?
CSDN博客:【线性表】在矩阵的多重链表表示中,第i行的head和第i列的head实际上是同一个结点?

🌌CH2.1 章节末小测验 - 线性表

【CH2.1 - 1】 对于线性表,在顺序存储结构和链式存储结构中查找第 k 个元素,其时间复杂性分别是多少?
A. 都是O(1)
B. 都是O(k)
C. O(1)和O(k)
D. O(k)和O(1)

正确答案:C

【CH2.1 - 2】 在顺序结构表示的线性表中,删除第 i 个元素(数组下标为 i-1 ),需要把后面的所有元素都往前挪一位,相应的语句是:

   for (___________ )
         PtrL->Data[j-1]=PtrL->Data[j];  

其中空缺部分的内容应该是
A. j = i; j< = PtrL->Last; j++
B. j =PtrL->Last; j>= i; j–
C. j = i-1; j< = PtrL->Last; j++
D. j =PtrL->Last; j>= i-1; j–

正确答案:A

【CH2.1 - 3】 下列函数试图求链式存储的线性表的表长,是否正确?

int  Length ( List  *PtrL ){
    List  *p = PtrL;      
    int  j = 0;
    while ( p ) { 
          p++; 
          j++;                 
    }   
    return  j;
}

A. √
B. ×

正确答案:B
解析:链表的节点存储位置可能不是连续的,所以需要用“p = p -> next”来指向下一个节点,而非p++。

2.2 堆栈

🌌CH2.2 视频中插小练习

【2.2.1 什么是堆栈 - 1】 还有一种表达式叫“前缀表达式”,即运算符号位于运算数之前,比如a + b * c的前缀表达式是 + a * b c。你能写出a + b * c - d / e的前缀表达式吗?

正确答案:-+a*bc/de

【2.2.1 什么是堆栈 - 2】 按ABC顺序入栈,可以产生CAB这样的出栈序列。
A. √
B. ×

正确答案:B

【2.2.2 堆栈的顺序存储实现】 根据刚才讲的方法,用一个数组来表示双堆栈,如果这两个堆栈的栈顶位置分别是 top1 和 top2 ,那么可以用 top1 + top2 == MaxSize (数组大小)来判别堆栈是否满?
A. √
B. ×

正确答案:B
解析:应该是 top1 == top2 时,堆栈满了。

【2.2.3 堆栈的链式存储实现】 若用单向链表实现一个堆栈,链表的头和尾都可以作为top。
A. √
B. ×

正确答案:B
解析:应该用链表的头。当用链表尾时,可以实现堆栈插入,但无法删除(单向链表)。

【2.2.4 堆栈应用:表达式求值】 请试试应用堆栈将中缀表达式 2 * (6 / 3 + 4) - 5 转换为后缀表达式。在这个转换过程中,堆栈元素最多时元素个数是多少?
A. 2
B. 3
C. 4
D. 5

正确答案:B

🌌CH2.2 章节末小测验 - 堆栈

【CH2.2 - 1】 借助堆栈将中缀表达式 A - (B - C / D) * E 转换为后缀表达式,则该堆栈的大小至少为:
A. 2
B. 3
C. 4
D. 5

正确答案:C
解析:转换后的后缀表达式为:ABCD/-E*-,所以大小为4.
学习参考:
CSDN博客:中缀表达式转换成后缀表达式 – 栈
CSDN博客:中缀表达式转换为后缀表达式(C语言代码+详解)

【CH2.2 - 2】 设 1、2、…、n–1、n 共n个数按顺序入栈,若第一个出栈的元素是n,则第三个出栈的元素是:
A. 3
B. n-2
C. n-3
D. 任何元素均可能

正确答案:B
解析:先进后出。

【CH2.2 - 3】 若用单向链表实现一个堆栈,当前链表状态为:1->2->3。当对该堆栈执行pop()、push(4)操作后,链表状态变成怎样?
(1)4->2->3; (2) 1->2->4

A. 只能是(1)
B. 只能是(2)
C. (1)和(2)都有可能
D. (1)和(2)都不可能

正确答案:A
解析:对于链栈,插入和删除操作只能在链栈的栈顶进行,栈顶指针Top在链表的头。

【CH2.2 - 4】 如果一堆栈的输入序列是aAbBc,输出为 abcBA,那么该堆栈所进行的操作序列是什么? 设P代表入栈,O代表出栈。
A. PPPOOPOPOO
B. POOPPPOPOO
C. POPPOPPOOO
D. PPOPPOOOPO

正确答案:C
解析:
首先,第一个输入是a,第一个输出也是a,我们把a进栈,然后再弹出去就可以了。操作为 PO。
然后,第二个输入是A,进栈,但是不能这个时候弹出去,因为第二个输出应该是b,正好第三个输入为b。操作为PPO。
然后,第四个输入为B,第三个弹出为c,栈里没有c,故继续读取,读到c,弹出。操作为PPO。
现在栈里还有两个数:a , b,所以按顺序出栈即可:OO。
最后,连起来,即 POPPOPPOOO。
学习参考: CSDN博客:算法题分析 出入栈问题

2.3 队列

🌌CH2.3 视频中插小练习

【2.3.1 队列及顺序存储实现】 如果空队列开始时 front 和 rear 值都是 -1,当插入 4 个元素并删除 2 个元素后,front 和 rear 值分别是多少?
A. 1和3
B. 2和4
C. 1和4
D. 2和3

正确答案:A
解析:队列:先进先出,在一端插入,另一端删除。依次插入 4 个元素并删除 2 个元素,front 和 rear 值的对应变化:front = -1, rear = -1; 👉 front = -1, rear = 0; 👉 front = -1, rear = 1; 👉 front = -1, rear = 2; 👉 front = -1, rear = 3; 👉 front = 0, rear = 3; 👉 front = 1, rear = 3;

【2.3.2 队列的链式存储实现】 队列的 front 也可以设在链表的尾。
A. √
B. ×

正确答案:B
解析:理由同前,用链表的头可以实现插入和删除,用链表的尾只能实现插入,不能实现删除操作。

🌌CH2.3 章节末小测验 - 队列

【CH2.3 - 1】 在一个链表表示的队列中, f 和 r 分别指向队列的头和尾。下列哪个操作能正确地将 s 结点插入到队列中:
A. f->next=s; f=s;
B. r->next=s; r=s;
C. s->next=r; r=s;
D. s->next=f; f=s;

正确答案:B

【CH2.3 - 2】 现采用大小为 10 的数组实现一个循环队列。设在某一时刻,队列为空且此时 front 和 rear 值均为 5。经过若干操作后,front为 8,rear为 2,问:此时队列中有多少个元素?
A. 4
B. 5
C. 6
D. 7

正确答案:A
解析:个数等于 + 7 - 3 = 4。
CH2-队列操作图示
学习参考: CSDN博客:浙大数据结构与算法一些有意思的理论基础题 - 队列

2.4 应用实例:多项式的加法运算

🌌CH2.4 视频中插小练习

【2.4 多项式的加法运算实现】 如果当前p1指向项的(系数,指数)为(2,4),同时P2指向项为(2,6),那么循环中的switch是执行哪个case?
CH2-课件截图
A. case 1
B. case -1
C. case 0
D. 以上都不是

正确答案:B

🌳CH3 树(上)

3.1 树与树的表示

🌌CH3.1 视频中插小练习

【3.1.1 引子(顺序查找)】 在顺序查找中,如果把下列程序中的循环条件 “i > 0” 去掉,会发生什么后果?

int SequentialSearch(List Tbl,ElementType K){
         /*在表Element[1]~Element[n]中查找关键字为K的数据元素*/
 int i;
 for(i = Tbl->Length; i>0 && Tbl->Element[i] != K;  i--);
 return i;   /*查找成功返回所在单元下标;不成功返回0*/
}

A. 没有影响,结果一样
B. 要查找的元素存在时找不到
C. 要查找的元素不存在时发生数组越界(i指向小于0的位置)
D. 要查找的元素不存在时函数返回0

正确答案:C
解析:如果不对 i 限制,则会减成负的。

【3.1.2 引子(二分查找例子)】 判断正误:在13个元素的二分查找中,找第10个元素比找第8个元素快。
A. √
B. ×

正确答案:A
解析:找10 (k = 10) - 共2步:
(1) left = 1, right = 13; mid = (left + right) / 2 = 7; [ k = 10 > mid = 7 ]
(2) left = mid + 1 = 8, right = 13; mid = (left + right) / 2 = 10.5 = 10; [ k = 10 = mid = 10 ]
找8 (k = 8) - 共3步:
(1) left = 1, right = 13; mid = (left + right) / 2 = 7; [ k = 8 > mid = 7 ]
(2) left = mid + 1 = 8, right = 13; mid = (left + right) / 2 = 10.5 = 10; [ k = 8 < mid = 10 ]
(3) left = 8, right = mid - 1 = 9; mid = (left + right) / 2 = 8.5 = 8; [ k = 8 = mid = 8 ]

【3.1.3 引子(二分查找实现)】 判断正误:在二分查找的程序实现中,如果 left 和 right 的更新不是取 mid+1 和 mid-1 而是都取 mid,程序也是正确的。

// 二分查找实现算法(CH3.1 PDF P9/17)
int BinarySearch ( StaticTable * Tbl, ElementType K)
{ /*在表Tbl中查找关键字为K的数据元素*/
  int left, right, mid, NoFound=-1;
  left = 1;            /*初始左边界*/
  right = Tbl->Length; /*初始右边界*/
  while ( left <= right )
  {
    mid = (left+right)/2; /*计算中间元素坐标*/
    if( K < Tbl->Element[mid])       right = mid-1; /*调整右边界*/
    else if( K > Tbl->Element[mid])   left = mid+1; /*调整左边界*/
    else return mid; /*查找成功,返回数据元素的下标*/
  }
  return NotFound; /*查找不成功,返回-1*/
}

A. √
B. ×

正确答案:B
解析:这里的意思应该是,针对以上这段程序,因为while 判断条件中是( left <= right ),所以 left 和 right 的更新值不能直接等于 mid,而是相对应的+1或-1,否则当 mid = left 时程序陷入死循环。并非说二分查找的左右边界值不能更新为 mid,只是要和合适的while判断对应。
⭐推荐阅读:二分法的细节加细节 你真的应该搞懂!!!⭐ 里面讲到了更多关于二分法需要注意的小细节。

【3.1.4 树的定义和术语】 有一个m棵树的集合(也叫森林)共有k条边,问这m颗树共有多少个结点?
A. k + m - 1
B. k + m
C. k + m + 1
D. 不确定,要看具体树结构

正确答案:B
解析:已知:对于一棵有 N 个结点的树,有 N - 1 条边。可以理解为,对于每一棵树,每个节点都有一条边连向他的父节点,所以有 1 * N 条边,但根节点除外,所以这棵树总边数是 N - 1。
即是说,对于有 m 棵树的集合,假设总共有 x 个结点,那么边数每有一棵树就要在结点总数上减去1,一共有 m 棵,所以共有 k 条边 k = x - m。

【3.1.5 树的表示】 在用“儿子-兄弟”法表示的树中,如果从根结点开始访问其“次子”的“次子”,所经过的结点数与下面哪种情况一样?(注意:比较的是结点数,而不是路径)
A. 从根结点开始访问其“长子”的“长子”
B. 从根结点开始访问其“长子”的“长子”的“长子”
C. 从根结点开始访问其“长子”的“长子”的“长子”的“长子”
D. 不能确定,要看具体树结构

正确答案:C
解析:
(0)从根结点开始访问其“次子”的“次子”步骤:↓→↓→ (经过4个结点)
(1)从根结点开始访问其“长子”的“长子”步骤:↓↓(经过2个结点)
(2)从根结点开始访问其“长子”的“长子”步骤:↓↓↓(经过3个结点)
(3)从根结点开始访问其“长子”的“长子”的“长子”的“长子”步骤:↓↓↓↓(经过4个结点)
CH3.1树-儿子兄弟表示法

🌌CH3.1 章节末小测验 - 树的表示

【CH3.1 - 1】 在分量 1 ~ 11 的数组中按从小到大顺序存放 11 个元素,如果用顺序查找和二分查找分别查找这 11 个元素,哪个位置的元素在这两种方法的查找中总次数最少?
A. 1
B. 2
C. 3
D. 6

正确答案:A
解析:用顺序查找和二分查找的对应次数:
A. 找1 - 共 4 次 = 顺序法 1 次 + 二分法 3 次(mid = 6, 3, 1)
B. 找2 - 共 6 次 = 顺序法 2 次 + 二分法 4 次(mid = 6, 3, 1, 2)
C. 找3 - 共 5 次 = 顺序法 3 次 + 二分法 2 次(mid = 6, 3)
D. 找6 - 共 7 次 = 顺序法 6 次 + 二分法 1 次(mid = 6)

【CH3.1 - 2】 在分量1~11的数组中按从小到大顺序存放11个元素,如果进行二分查找,查找次数最少的元素位于什么位置?
A. 1
B. 5
C. 6
D. 11

正确答案:C
解析:left = 1, right = 11, mid = (left + right) / 2 = 6.

【CH3.1 - 3】 一棵度为 m 的树有 n 个节点。若每个节点直接用 m 个链指向相应的儿子,则表示这个树所需要的总空间是n * (m+1) (假定每个链以及表示节点的数据域都是一个单位空间)。当采用儿子/兄弟(First Child/Next Sibling)表示法时,所需的总空间是:
A. 3n
B. 2n
C. n * m
D. n * (m-1)

正确答案:A
解析:度 m 为树中最大的子树个数。“每个节点直接用 m 个链指向相应的儿子” 意思是一个结点有 m 个指针域。这个树共有 n 个结点,所需要的总空间是 n * (m+1) ,加1是包含了数据域的。
对于儿子/兄弟表示法,每一个结点都需要 2个指针域 + 1个数据域,1个存儿子的地址、1个存兄弟的地址、一个存自身的数据,无论是否有具体值(或为零),存储结构固定,所以n个结点需要总空间3n。

3.2 二叉树及存储结构

🌌CH3.2 视频中插小练习

【3.2.1 二叉树的定义及性质】 有一颗二叉树,其两个儿子的结点个数为15个,一个儿子的结点个数为32个,问该二叉树的叶结点个数是多少?
A. 15
B. 16
C. 17
D. 32

正确答案:B
解析:运用二叉树的重要性质:n0=n2+1.
CH3.2-二叉树的重要性质

【3.2.2 二叉树的存储结构】 如果参照完全二叉树的表示方法用数组存储下面这棵二叉树,那么结点e所对应的数组下标是多少(树根下标为1)?
题目图片
A. 5
B. 6
C. 7
D. 8

正确答案:B
解析:a-1, b-2, c-3, ^-4, d-5, e-6, ^-7.

🌌CH3.2 章节末小测验 - 二叉树性质

【CH3.2 - 1】 如果一个完全二叉树最底下一层为第六层(根为第一层)且该层共有8个叶结点,那么该完全二叉树共有多少个结点?
A. 31
B. 39
C. 63
D. 71

正确答案:B
解析:从第1~5层结点是满的,共25-1 = 31,再加第6层的8个,总共结点数 = 31+8 = 39.

【CH3.2 - 2】 若有一二叉树的总结点数为98,只有一个儿子的结点数为48,则该树的叶结点数是多少?
A. 25
B. 50
C. 不确定
D. 这样的树不存在

正确答案:D
解析:由题目,n1=48,总结点数 = n0 + n1 + n2 =98,且n0 = n2 + 1,2*n2 + 1 =50,故不存在这样的树。

【CH3.2 - 3】 设深度为d(只有一个根结点时,d为1)的二叉树只有度为0和2的结点,则此类二叉树的结点数至少为2d-1
A. √
B. ×

正确答案:A
解析: 结点的度(Degree):结点的子树个数。
只有度为0和2的结点,结点最少是这种情况👇,结点数确实是2d-1.

CH3-二叉树只有度为0和2结点的极端情况

3.3 二叉树的遍历

🌌CH3.3 视频中插小练习

【3.3.1 先序中序后序遍历】 给出下面这棵树的中序遍历结果。
3.3.1

正确答案:BDAEC
解析:遵循左、根、右的先后顺序。
先序:根、左、右;
中序:左、根、友;
后序:左、右、根。
(所以这里所谓的先/后/中 是针对的什么时候经历根节点。)

【3.3.2 中序非递归遍历】 非递归方法中序遍历下面这颗二叉树,其堆栈操作序列(P代表为push,O代表为pop)是什么?
3.3.2
A. PPOOPOPPOO
B. PPPPPOOOOO
C. PPPOOOPPOO
D. PPOPOOPPOO

正确答案:D
解析:中序遍历遵循左、根、右的先后顺序。详见下示手绘图。
CH3.3.2 - 二叉树中序遍历的堆栈进出示意

【3.3.4 遍历应用例子】 已知有颗5个结点的二叉树,其前序遍历序列是a???,中序遍历序列是a???,可以断定:
A. 该树根结点是a,且没有左子树
B. 该树根结点是a,且没有右子树
C. 该树最左边的结点是a
D. 该树不存在

正确答案:A
解析:前序遍历序列第一个元素“a”即是树的根节点,中序遍历序列在根节点前应该是左子树内容,但这里中序遍历序列第一个元素也是“a”,那么即是说左子树内容为空。
CH3.3.4-先序和中序遍历序列来确定一棵二叉树

🌌CH3.3 章节末小测验 - 树的遍历

【CH3.3 - 1】 假定只有四个结点A、B、C、D的二叉树,其前序遍历序列为ABCD,则下面哪个序列是不可能的中序遍历序列?
A. ABCD
B. ACDB
C. DCBA
D. DABC

正确答案:D
解析:由题目知:根节点为A。详见图解。
前序遍历:根 | 左子树 | 右子树
中序遍历:左子树 | 根 | 右子树
后序遍历:左子树 | 右子树 | 根
CH3.3-1 二叉树图示

【CH3.3 - 2】 对于二叉树,如果其中序遍历结果与前序遍历结果一样,那么可以断定该二叉树________
A. 是完全二叉树
B. 所有结点都没有左儿子
C. 所有结点都没有右儿子
D. 这样的树不存在

正确答案:B
解析:情况同第一题A选项。如下所列,没有左子树时,整体来看的顺序都是跟 - 右子树。
前序遍历:根 | x | 右子树
中序遍历:x | 根 | 右子树

【CH3.3 - 3】 已知一二叉树的后序和中序遍历的结果分别是FDEBGCA 和FDBEACG,那么该二叉树的前序遍历结果是什么?
A. ABDFECG
B. ABDEFCG
C. ABDFEGC
D. ABCDEFG

正确答案:A
解析:根据后序和中序遍历结果,分析出该二叉树的结构如下图所示。
CH3.3-3 二叉树结构图示

🌳CH4 树(中)

4.1 二叉搜索树

🌌CH4.1 视频中插小练习

【4.1.1 二叉搜索树及查找 - 1】 判断:图所示的树不是搜索树。
4.1.1
A. √
B. ×

正确答案:A
解析:二叉搜索树左侧应该比根节点小,右侧应该比根节点大,左下角和右下角子树均不满足。

【4.1.1 二叉搜索树及查找 - 2】 对于搜索树的最大元素结点,下面哪个说法是正确的?
A. 一定是叶结点
B. 一定没有左儿子
C. 一定没有右儿子
D. 是后序遍历的最后一个结点

正确答案:C
解析:对于A:可以是单独有左儿子但没有右儿子的根节点;对于B:左儿子反正比根节点小,有没有都不影响;对于C:右儿子是比这个根结点更大的存在!对于D:后序遍历最后遍历的是树的根节点,只要有右儿子,他就不是最大元素结点。

【4.1.2 二叉搜索树的插入】 Dec应该插在哪个位置?
4.1.2
A. Nov的右边
B. Aug的右边
C. Feb的右边
D. July的左边

正确答案:B
解析:(刚开始自己错选为了D…) 个人推测不能选D的原因是,Dec < Feb,所以都不能放Feb的右边,就更不能放到右子树上了。

🌌CH4.1 章节末小测验 - 二叉搜索树

【CH4.1 - 1】 已知一棵由1、2、3、4、5、6、7共7个结点组成的二叉搜索树(查找树),其结构如图所示,问:根结点是什么?
CH4.1-1
A. 1
B. 4
C. 5
D. 不能确定

正确答案:C
解析:如图。(参考了这个帖:数据结构 树 思考题 4
CH4.1-3

【CH4.1 - 2】 在上题的搜索树中删除结点1,那么删除后该搜索树的后序遍历结果是:
A. 243765
B. 432765
C. 234567
D. 765432

正确答案:A
解析:后序遍历:左子树 | 右子树 | 根 —— ((243)(76)5.
CH4.1-2

【CH4.1 - 3】 若一搜索树(查找树)是一个有n个结点的完全二叉树,则该树的最大值一定在叶结点上。
A. √
B. ×

正确答案:B
解析:如下图这棵完全二叉树(或者去掉F的),最大值在C,不是叶节点。
👉关于完全二叉树的补充:完全二叉树是由满二叉树而引出来的,若设二叉树的深度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数(即1~h-1层为一个满二叉树),第 h 层所有的结点都连续集中在最左边,这就是完全二叉树。
CH4.1-3

【CH4.1 - 4】 若一搜索树(查找树)是一个有n个结点的完全二叉树,则该树的最小值一定在叶结点上。
A. √
B. ×

正确答案:A
解析:同上。

4.2 平衡二叉树

🌌CH4.2 视频中插小练习

【4.2.1 什么是平衡二叉树】 画画看,至少需要多少个结点才能构造出一棵4层(h=3)的平衡二叉树?
A. 5
B. 6
C. 7
D. 8

正确答案:C
解析:平衡二叉树:空树,或者任一结点左、右子树高度差的绝对值不超过1。尝试绘制的结点最少的形状如下图所示。
CH4.2.1 4层平衡二叉树的结点最少形状
也可以直接根据公式来算:
CH4.2.1 平衡二叉树的最小结点数计算公式

【4.2.2 平衡二叉树的调整】在下列平衡树中插入3后,该树是否还平衡?如果不平衡应该做什么旋转进行调整?
CH4.2.2
A. 还是平衡的
B. 不平衡了,应该做LL旋转
C. 不平衡了,应该做RR旋转
D. 不平衡了,应该做LR旋转

正确答案:C
解析:结合课件即可。

🌌CH4.2 章节末小测验 - 平衡二叉树

【CH4.2 - 1】 将1、2、3、4、5、6顺序插入初始为空的AVL树中,当完成这6个元素的插入后,该AVL树共有多少层?
A. 2
B. 3
C. 4
D. 5

正确答案:B
解析:插入和调整过程如图。(图片来源:牛客网类似真题
CH4.2-1 AVL树的顺序插入和调整过程图示

【CH4.2 - 2】 若一AVL树的结点数是21,则该树的高度至多是多少?注:只有一个根节点的树高度为0
A. 4
B. 5
C. 6
D. 7

正确答案:B
解析:根据公式,高度为h的平衡二叉树的最小结点数nh = Fh+2 - 1, (h ≥ 0).
h = 5, nh = 20; h = 6, nh = 33. 所以21个结点构不成高度为6的AVL树,此树的高度最多是5。

🌳CH5 树(下)

5.1 堆

🌌CH5.1 视频中插小练习

【5.1.2 堆的插入】 “哨兵”是在创建堆(Create函数)时设置的:H->Elements[0]=MaxData;
A. √
B. ×

正确答案:A
解析:略。

【5.1.3 堆的删除】 有个堆其元素在数组中的序列为:58,25,44,18,10,26,20,12。如果调用DeleteMax函数删除最大值元素,请猜猜看:程序中的for循环刚退出时变量parent的值是多少?
A. 3
B. 4
C. 5
D. 6

正确答案:D
解析:详解见图,来源博客:数据结构 树 思考题 5
CH5.1.3

【5.1.4 堆的建立】 建堆时,最坏情况下需要挪动元素次数是等于树中各结点的高度和。问:对于元素个数为12的堆,其各结点的高度之和是多少?
A. 10
B. 11
C. 12
D. 15

正确答案:A
解析:学习参考来源博客:数据结构——堆_BasquiatAphrodite
堆首先是一个完全二叉树,在这个基础上,堆又可以分为最大堆和最小堆。
对于元素个数为12的堆,画出对应的完全二叉树:
CH5.1.4
最终的运算过程为:3* 1 +2* 2+1*3 = 10
在计算时,我们只计算具有儿子的结点。并且从下到上递增。

🌌CH5.1 章节末小测验 - 堆

【CH5.1 - 1】下列序列中哪个是最小堆?
A. 2, 55, 52, 72, 28, 98, 71
B. 2, 28, 71, 72, 55, 98, 52
C. 2, 28, 52, 72, 55, 98, 71
D. 28, 2, 71, 72, 55, 98, 52

正确答案:C
解析:最小堆:完全二叉树,每个结点的元素值不大于其子结点的元素值。(根小,叶子大)

【CH5.1 - 2】在最大堆 {97,76,65,50,49,13,27}中插入83后,该最大堆为:
A. {97,76,65,83,49,13,27,50}
B. {97,83,65,76,49,13,27,50}
C. {97,83,65,76,50,13,27,49}
D. {97,83,65,76,49,50,13,27}

正确答案:B
解析:详解见图,来源博客:数据结构 树 思考题 5
CH5.1-2

【CH5.1 - 3】 对由同样的n个整数构成的二叉搜索树(查找树)和最小堆,下面哪个说法是 不正确 的:
A. 二叉搜索树(查找树)高度大于等于最小堆高度
B. 对该二叉搜索树(查找树)进行中序遍历可得到从小到大的序列
C. 从最小堆根节点到其任何叶结点的路径上的结点值构成从小到大的序列
D. 对该最小堆进行按层序(level order)遍历可得到从小到大的序列

正确答案:D
解析:A-正确,因为最小堆是完全二叉树,除了最底下一层都占满了,层数是最小的情况了;B-正确,中序遍历,顺序为左根右,符合从小到大单向递增变化;C-正确,最小堆的定义就是叶子值一定大于等于根值,所以一定构成从小到大序列;D-错误,与C矛盾,最小堆的定义并没有限定同一层内左右叶子结点的大小关系。

5.2 哈夫曼树与哈夫曼编码

🌌CH5.2 视频中插小练习

【5.2.1 什么是哈夫曼树】下面这棵树的带权路径长度值(WPL)是多少?
CH5.2.1
A. 14
B. 15
C. 35
D. 50

正确答案:D
解析:WPL = 4*(5+4) + 33 + 22 + 1*1 = 50。
CH5.2.1 哈夫曼树

【5.2.2 哈夫曼树的构造】这棵哈夫曼树的左子树也是哈夫曼树。
CH5.2.2
A. √
B. ×

正确答案:A
解析:哈夫曼树的构造方法:每次把权值最小的两棵二叉树合并。
如果这是一棵哈夫曼树,那其 左/右 子树肯定都是哈夫曼树。所以还是分别来看,从底部往上检查。

【5.2.3 哈夫曼树编码】如果a、e、s、t分别编码为1、0、10、11,那么下列哪个字符串的编码不是1011?
A. aet
B. saa
C. st
D. at

正确答案:D
解析:略。

🌌CH5.2 章节末小测验 - 哈夫曼树

【CH5.2 - 1】如果哈夫曼树有67个结点,则可知叶结点总数为:
A. 22
B. 33
C. 34
D. 不确定

正确答案:C
解析:67 = 2n - 1, n = 34.

【CH5.2 - 2】为五个使用频率不同的字符设计哈夫曼编码,下列方案中哪个不可能是哈夫曼编码?
A. 00,100,101,110,111
B. 000,001,01,10,11
C. 0000,0001,001,01,1
D. 000,001,010,011,1

正确答案:A
解析:哈夫曼树只有度为2或0的节点,A左侧00处不满足。
CH5.2-2

【CH5.2 - 3】一段文本中包含对象{a,b,c,d,e},其出现次数相应为{3,2,4,2,1},则经过哈夫曼编码后,该文本所占总位数为:
A. 12
B. 27
C. 36
D. 其他都不是

正确答案:B
解析:详见图解。
CH5.2 - 3

5.3 集合及运算

🌌CH5.3 视频中插小练习

【5.3.1集合的表示及查找】如果有10台电脑{1,2,3,4,…,9,10},已知下列电脑之间实现了连接:
1和2,2和4,3和5,4和7,5和8,6和9,6和10
问:2和7,5和9之间是否可以连通?

A. 2和7是连通的,5和9不连通
B. 2和7不连通,5和9是连通的
C. 2和7是连通的,5和9也是连通的
D. 2和7不连通,5和9也不连通

正确答案:A
解析:略。
CH5.3.1

🌌CH5.3 章节末小测验 - 集合

【CH5.3 - 1】已知a、b两个元素均是所在集合的根结点,且分别位于数组分量3和2位置上,其parent值分别为-3,-2。问:将这两个集合按集合大小合并后,a和b的parent值分别是多少?
A. -5,2
B. -5,3
C. -3,3
D. 2,-2

正确答案:B
解析:需要把小的集合 合并到大的集合中去。a、b分别位于数组分量3和2位置上,parent = -3,-2 表示:a,数组位置在3,集合中有3个元素;b,数组位置在2,集合中有2个元素。所以合并后a集合有5个元素,parent=-5;b成为a的元素,所以parent=3.

5.4 小白专场:堆中的路径 - C语言实现

5.5 小白专场:File Transfer - C语言实现

🌌CH5.5 视频中插小练习

【5.5.1 FT.1 集合的简化表示】对于有N个元素的集合,这样查找N次的最坏时间复杂度是?

正确答案:O(n2)
解析:略。

【5.5.2 FT.2 题意理解与TSSN的实现】下列哪个是正确的 void Initialization( SetType S , int n ) 函数实现?
A. for ( i=0; i<n; i++ ) S[i] = -1;
B. for ( i=n; i>0; i-- ) S[i] = -1;
C. for ( i=0; i<n; i++ ) S[i] = 0;
D. for ( i=n; i>0; i-- ) S[i] = 0;

正确答案:A
解析:初始时每个都没有父结点,所以赋值-1,集合下标应从0开始。

【5.5.3-1 FT.3 按秩归并】刚才一系列Union( Find(i), Find(1) )(其中1 < i ≤ n)操作的时间复杂度是?

正确答案:O(n2)。

【5.5.3-2 FT.3 按秩归并】按秩归并最坏情况下产生的树高是?

正确答案:O(logN)。

【5.5.4 FT.4 路径压缩】已知Ackermann 函数的定义为:
CH5.5.4
则A(2,4)等于多少?

正确答案:
CH5.5.4A

🗺️CH6 图(上)

6.1 什么是图

🌌CH6.1 视频中插小练习

【6.1.2 什么是图 - 邻接矩阵表示法】对于有N个顶点的无向图,怎样存储可以省一半空间?

正确答案:用一个长度为N(N+1)/2的1维数组
解析:仅存储上三角或下三角。

【6.1.3 什么是图 - 邻接表表示法】需要N个头指针 + 2E个结点(每个结点至少2个域),则E小于多少是省空间的?

正确答案:N(N-1)/4
解析:详见图片,图片来源戳这里,或者这里的文字版讲解

🌌CH6.1 章节末小测验 - 什么是图

【CH6.1 - 1】用邻接表表示有N个顶点、E条边的图,则遍历图中所有边的时间复杂度为:
A. O(N2)
B. O(E)
C. O(N+E)
D. O(N)

正确答案:C

6.2 图的遍历

🌌CH6.2 视频中插小练习

【6.2.1 图的遍历 - DFS】若有个N顶点、E条边,DFS的时间复杂度是多少?

正确答案:无法确定。

【6.2.2 图的遍历 - BFS】若有个N顶点、E条边,BFS的时间复杂度是多少?

正确答案:和DFS一样。

🌌CH6.2 章节末小测验 - DFS & BFS & 连通性

【CH6.2 - 1】已知一个图如下图所示,从顶点a出发按深度优先搜索法进行遍历,则可能得到的一种顶点序列为
在这里插入图片描述
A. a,e,b,c,f,d
B. a,b,e,c,d,f
C. a,c,f,e,b,d
D. a,e,d,f,c,b

正确答案:D
解析:结合课件,可以再补充看看这个帖子理解DFS和BFS

【CH6.2 - 2】已知一个图如下图所示,从顶点a出发按广度优先搜索法进行遍历,则可能得到的一种顶点序列为
在这里插入图片描述
A. a,b,c,e,d,f
B. a,b,c,e,f,d
C. a,e,b,c,f,d
D. a,c,f,d,e,b

正确答案:B
解析:C的正确版本应该是a, e, b, c, d, f.

【CH6.2 - 3】具有N(>0)个顶点的无向图至多有多少个连通分量
A. 0
B. 1
C. N-1
D. N

正确答案:D
解析:

【CH6.2 - 4】如果从无向图的任一顶点出发进行一次深度优先搜索可访问所有顶点,则该图一定是
A. 有回路的图
B. 完全图
C. 连通图
D. 一棵树

正确答案:C
解析:不选A貌似是因为就算时不连通的图也可以有回路…?

【CH6.2 - 5】具有N(>0)个顶点的无向图至少有多少个连通分量
A. 0
B. 1
C. N-1
D. N

正确答案:B

6.3 拯救007

6.4 六度空间

6.5 小白专场:如何建立图

🗺️CH7 图(中)

7.0 树之习题选讲

【7.0.1 树之习题选讲】要使 L=2H-1-1+X 得到正确结果,X能取的最大值是 ——

正确答案:2H-1

7.1 最短路径问题

🌌CH7.1 视频中插小练习

【7.1.2-1 无权图的单源最短路】dist[W] = V 到 W 的最短距离;那么dist[W]应该被初始化为多少呢?
A. 正无穷
B. 负无穷
C. -1
D. 这三种都可以

正确答案:D.
解析:只要吧dist[ ]的值初始化为一个一看就不可能的值即可,要避开后面可能真实赋值的值。

【7.1.2-2 无权图的单源最短路】如果有|V|个顶点和|E|条边的图用邻接表存储,则算法的时间复杂度是多少?

正确答案:T=O(|V| + |E|)。

【7.1.3-1 有权图的单源最短路】Dijkstra算法中的dist应该如何初始化?
如果s到w有直接的边,则dist[w]=<s,w>的权重;否则dist[w]定义为?

A. 正无穷
B. 负无穷
C. -1
D. 这三种都可以

正确答案:A.

【7.1.3-2 有权图的单源最短路】算法的时间复杂度是多少?
void Dijkstra( Vertex s )
{ while (1) {
V = 未收录顶点中dist最小者;
if ( 这样的V不存在 )
break;
collected[V] = true;
for ( V 的每个邻接点 W )
if ( collected[W] == false )
if ( dist[V]+E<V,W> < dist[W] ) {
dist[W] = dist[V] + E<V,W> ;
path[W] = V;
}
}
}

正确答案:这个问题不科学…

【7.1.4-1 多源最短路算法】D矩阵应该初始化为什么?
A. 带权的邻接矩阵,对角元是0
B. 带权的邻接矩阵,对角元是无穷大
C. 全是0的矩阵
D. 全是无穷大的矩阵

正确答案:A.

【7.1.4-2 多源最短路算法】如果i和j之间没有直接的边,D[i][j]应该定义为?
A. 正无穷
B. 0
C. 负无穷
D. 这三种都可以

正确答案:A.

🗺️CH8 图(下)

8.1 最小生成树问题

🌌CH8.1 视频中插小练习

【8.1.1 树之习题选讲】Prim算法中的dist[V]应该初始化为?
A. E(s,V) 或 正无穷
B. 0
C. 正无穷
D. 这个问题不科学

正确答案:A。

🌌CH8.1 章节末小测验 - 最小生成树

【8.1-1】给定下图,其最小生成树的总权重是?
在这里插入图片描述
A. 21
B. 30
C. 34
D. 35

正确答案:B。
8.1-1

【8.1-2】判断:连通图的最小生成树一定是唯一的。
A. √
B. ×

正确答案:B。

8.2 拓扑排序

🌌CH8.2 视频中插小练习

【8.2.1 拓扑排序】在TopSort函数中,如果外循环还没结束,就已经找不到“未输出的入度为0的顶点”,则说明
A. 图中必定存在回路
B. 图不连通
C. 图中可能有回路
D. 程序写错啦

正确答案:A。

🌌CH8.2 章节末小测验 - 拓扑排序+关键路径

【8.2-1】拓扑序一定是唯一的。
A. √
B. ×

正确答案:B。

【8.2-2】下图给定了一个项目的AOE。整个项目最早完工需要的时间是
8.2-2题目图
A. 17
B. 19
C. 20
D. 23

正确答案:D。
解析:分析如图。
8.2-2分析图

【8.2-3】在上图中,如果<0,2>组能加快进度,整个项目就能提前完工。
A. √
B. ×

正确答案:A。

🚂CH9 排序(上)

9.1 简单排序(冒泡、插入)

🌌CH9.1 视频中插小练习

【9.1.2 什么是图 - 邻接矩阵表示法】给定初始序列{34, 8, 64, 51, 32, 21},冒泡排序和插入排序分别需要多少次元素交换才能完成?
A. 冒泡8次,插入8次
B. 冒泡8次,插入9次
C. 冒泡9次,插入8次
D. 冒泡9次,插入9次

正确答案:D.

【9.1.4 时间复杂度下界】序列{34, 8, 64, 51, 32, 21}中有多少逆序对?
A. 7
B. 8
C. 9
D. 10

正确答案:C.

🌌CH9.1 章节末小测验 - 冒泡排序+插入排序

【9.1-1】对于7个数进行冒泡排序,最坏情况下需要进行的比较次数为
A. 7
B. 14
C. 21
D. 49

正确答案:C.
解析:(6+1)*6/2 = 21。

【9.1-2】对一组包含10个元素的非递减有序序列,采用插入排序排成非递增序列,其可能的比较次数和移动次数分别是
A. 45, 44
B. 54, 63
C. 100, 54
D. 100, 100

正确答案:C.
解析:比较次数:10 ~ 45;移动次数:10 ~ 45。

9.2 简单排序(冒泡、插入)

🌌CH9.2 章节末小测验 - 希尔排序

【9.2 Shell希尔排序】希尔排序是稳定的。
A. √
B. ×

正确答案:A。
解析:根据上一节所讲:
稳定性:任意两个相等的数据,排序前后的相对位置不发生改变,则是稳定的。
如果在排序过程中仅交换相邻元素,则一定是稳定的。(一次插入排序)
“对于多次插入排序,虽然一次插入排序是稳定的、不会改变相同元素的相对顺序,但在不同的插入排序过程中,相同的元素可能在各自的插入排序中移动,最后其稳定性就会被打乱,所以shell排序是不稳定的。” —— 判断各种排序算法的稳定性

9.3 堆排序

🌌CH9.3 视频中插小练习

【9.3.2 堆排序 - 堆排序】在堆排序中,元素下标从0开始。则对于下标为i的元素,其左、右孩子的下标分别为:
A. 2i-1, 2i
B. 2i, 2i+1
C. 2i+1, 2i+2
D. 2i+2, 2i+3

正确答案:C.

🌌CH9.3 章节末小测验 - 堆排序

【9.3-1】对N个记录进行堆排序,最坏的情况下时间复杂度是
A. O(N)
B. O(2N)
C. O(NlogN)
D. O(N2)

正确答案:C。

【9.3-2】有一组记录(46,77,55,38,41,85),用堆排序建立的初始堆为
A. 38,77,55,46,41,85
B. 38,41,46,77,55,85
C. 85,55,77,38,41,46
D. 85,77,55,38,41,46

正确答案:D。

【9.3-3】堆排序是稳定的。
A. √
B. ×

正确答案:B。

9.4 归并排序

🌌CH9.4 视频中插小练习

【9.4.1 归并排序 - 有序子列的归并】如果两个子列一共有N个元素,则归并的时间复杂度是?

正确答案:O(N).

【9.4.3 归并排序 - 非递归算法】非递归算法的额外空间复杂度是?

正确答案:O(N).

🚂CH10 排序(下)

10.1 快速排序

🌌CH10.1 视频中插小练习

【10.1.1 快速排序 - 算法概述】什么是快速排序算法的最好情况?
A. 初始就顺序
B. 初始就逆序
C. 每次主元的位置都在数组的一端
D. 每次正好中分

正确答案:D.
解析:这种情况下,T(N) = O(N logN)。

【10.1.4 快速排序 - 算法实现】快速排序的标准接口应该怎么写?
void Quick_Sort(ElementType A[], int N) { /* 这里写什么?*/ }
A. Quicksort( A, 0, N );
B. Quicksort( A, 0, N-1 );
C. Quicksort( A, 0, N-1 );
D. Quicksort( A, 0, N-1 );

正确答案:B.

🌌CH10.1 章节末小测验 - 快速排序

【10.1-1】快速排序是稳定的算法。
A. √
B. ×

正确答案:B。

10.2 表排序

🌌CH10.2 章节末小测验 - 快速排序

【10.2-1】给定A[ ]={46, 23, 8, 99, 31, 12, 85},调用非递归的归并排序加表排序执行第1趟后,表元素的结果是:
A. 0, 1, 2, 3, 4, 5, 6
B. 1, 0, 3, 2, 6, 5, 4
C. 1, 0, 2, 3, 5, 4, 6
D. 0, 2, 1, 4, 3, 5, 6

正确答案:C.
解析:非递归的归并排序(详细解析)

【10.2-2】给定A[ ]={23, 46, 8, 99, 31, 12, 85},调用表排序后,表元素的结果是:
A. 1, 2, 3, 4, 5, 6, 7
B. 2, 0, 3, 5, 1, 4, 6
C. 3, 6, 1, 5, 2, 7, 4
D. 2, 5, 0, 4, 1, 6, 3

正确答案:D.

10.3 基数排序

🌌CH10.3 视频中插小练习

【10.3.1 基数排序 - 桶排序】桶排序算法的时间复杂度T(M, N)是多少?
10.3.1

正确答案:T(N, M) = O(M+N)。

【10.3.2 基数排序 - 基数排序】设元素个数为N,整数进制为B,LSD(次位优先)的趟数为P,则最坏时间复杂度是?

正确答案:T = O(P(N+B))。

🌌CH10.3 章节末小测验 - 基数排序

【10.3-1】基数排序是稳定的算法。
A. √
B. ×

正确答案:A。
解析:每次都是将当前位数上相同数值的元素统一“装桶”,并不需要交换位置。

10.4 排序算法的比较

🌌CH10.4 章节末小测验 - 排序算法的比较

【10.4-1】请选择下面四种排序算法中最快又是稳定的排序算法:
A. 希尔排序
B. 堆排序
C. 归并排序
D. 快速排序

正确答案:C。

【10.4-2】下列排序算法中,哪种算法可能出现:在最后一趟开始之前,所有的元素都不在其最终的位置上?
A. 堆排序
B. 插入排序
C. 冒泡排序
D. 快速排序

正确答案:B。

【10.4-3】当待排序列已经基本有序时,下面哪个排序算法效率最差?
A. 快速排序
B. 直接插入
C. 选择排序
D. 堆排序

正确答案:C。

【10.4-4】数据序列(3,2,4,9,8,11,6,20)只能是下列哪种排序算法的两趟排序结果:
A. 冒泡排序
B. 插入排序
C. 选择排序
D. 快速排序

正确答案:D。
解析:
冒泡经过两趟,应该冒出2个最大值在最后,pass;
插入排序,第一趟排序范围0-1,前一个数比后一个数小,第二趟排序范围0-2,前三个数从小到大排列,pass;
选择排序经过两趟,会筛选出两个最小值在最前面,pass;
快速排序,第一趟以20为主元,第二趟以4为主元。
参考资料看这里

【10.4-0 思考讨论题】从1000个数字中找出最大的10个数字,最快的算法是——
A. 归并排序
B. 快速排序
C. 堆排序
D. 选择排序

学习参考:经典算法应用之七----10亿数据中取最大的100个数据_简书1亿个数中找出最大的100个数(top K问题)_CSDN

🚦CH11 散列查找

11.1 散列表(Hash哈希表)

11.2 散列函数的构造方法

11.3 冲突处理方法

🌌CH11.3 视频中插小练习

只有几个比较简单的判断,略…

🌌CH11.3 章节末小测验 - 散列冲突

【11.3-1】设有一组记录的关键字为 {19,14,23,1,68,20,84,27,55,11,10,79},用分离链接法构造散列表,散列函数为H(key)= key mod 13。问:散列地址为1的链中有几个记录?
A. 1
B. 2
C. 3
D. 4

正确答案:D.
解析:14,1,27,79.

【11.3-2】设一个散列表的大小是11, 散列函数是H(key)=key mod 11. 若采用平方探测(di = +/- i2)冲突解决方法,将4个元素{14,38,61,86}顺序插入散列表中。如果再插入元素49,则该元素将被放在什么位置?
A. 4
B. 6
C. 9
D. 10

正确答案:A.

**【11.3-3】 假设一散列表的大小是11,散列函数是H(key)=key mod 11,用线性探测法解决冲突。先将4个元素{14,38,61,86}按顺序插入初始为空的散列表中。如果再插入元素49,则该元素被插入到表中哪个位置(下标)? **
A. 4
B. 5
C. 6
D. 7

正确答案:D.

11.4 散列表的性能分析

🌌CH11.4 视频中插小练习

**【11.4】 对于线性探测,如果当前装填因子值为0.654321, 此时不成功情况下的期望探测次数小于成功情况下的期望探测次数。 **
A. √
B. ×

正确答案:B.
解析:
CH11.4-1

🌌CH11.4 章节末小测验 - 散列性能

【11.4-1】一个大小为11的散列表,散列函数为H(key)=key mod 11,采用线性探测冲突解决策略。如果现有散列表中仅有的5个元素均位于下标为奇数的位置,问:该散列表的平均不成功查找次数是多少?
A. 6/11
B. 1
C. 16/11
D. 不确定

正确答案:C.
解析:ASL u= (1+2+1+2+1+2+1+2+1+2+1) / 11 = 16/11

【11.4-2】在一个大小为K的空散列表中,按照线性探测冲突解决策略连续插入散列值相同的N个元素(N<K)。问:此时,该散列表的平均成功查找次数是多少?
A. 不确定
B. K/N
C. (N+1)/2
D. 1

正确答案:C.
解析:详见此文

**【11.4-3】 当采用线性探测冲突解决策略时,非空且有空闲空间的散列表中无论有多少元素,不成功情况下的期望查找次数总是大于成功情况下的期望查找次数。 **
A. √
B. ×

正确答案:A.
解析:因为(1-α)<1.

11.5 应用实例:词频统计

11.6 小白专场:电话聊天框人

🌌CH11.6 视频中插小练习

**【11.6-1】 直接映射需要存储2*1010个短整型数字,大约是多少字节空间? **
A. 40KB
B. 40MB
C. 40GB
D. 300GB

正确答案:C.

…未完待续…

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值