【数据结构】(SCNU)课堂小测——高中知识构造等比数列求解汉诺塔时间复杂度

1. 数组 Q[n] 用来表示一个循环队列front 为队头元素的前一个位置,rear 队尾元素的位置,计算队列中元素个数的公式为(  ) 

注意一下细节,我已经加粗了。自己列式子的时候为了避免多1或者少1,自己画图模拟一下

分情况讨论一下: 

(1)当 front <= rear, 则答案直接就是 (rear - front)

(2)当 rear < front, 答案为 n - (front - rear) = rear - front + n

合成一条式子就是 (rear - front + n) % n

 

2. 二维数组 A 中行下标是 1020,列下标是 510,按行优先存储,每个元素占 4 个存储单元,A[10][5]的存储地址是 1000,则元素 A[15][10] 的存储地址是(  )。

数组 A 中每行共有 6 个元素,元素 A[15][10]的前面共存储了(15-10)×6+5 个元素, 每个元素占 4 个存储单元,所以,其存储地址是 1000+140=1140。

元素个数别算错了,这种计算最怕多算1个少算1个。

 

3. 一个 n×n 的对称矩阵,按列优先进行压缩存储,则其存储容量为(  )。

对于对称矩阵,行优先和列优先,其存储容量是一样的,1+2+…+n = n (n+1)/2。

 

4. 带头结点的循环链表 L 为空表的条件是 ( )

 

那么空表就长下面这样:

所以答案为: L->next=L

 

5. 对于由 n 个元素组成的线性表,建立一个单链表的时间复杂度是 ( )

答案: O(n) 。但当时我写了 O(n^2),原因是我认为单链表不知道尾指针,每次添加元素都要遍历到最后找到尾指针。

 

6. 在一个单链表中,已知 q 所指结点是 p 所指结点的直接前驱,若在 q p 之间插入 s 指结点,则需要执行下列操作: ?

q->next=s; s->next=p;

这题为了描述清楚,导致信息有点冗余,思路是这样,但不一定要写得跟答案一样

 

7. 已知一个栈的进栈序列是 123n,其输出序列是 p1p2pn,若 p1=n, 则 pi 的值是() 。

当 p1=n 时,输出序列是唯一的,即为 n、n-1、…、2,1!

想想为什么?没有其他情况了?别想太复杂了(被书本给整蒙了?)。n是最后一个进栈的,却是第一个出栈,这也就是说:在轮到n入栈时,前面没有任何一个数出栈。在n-1入栈时,前面也没有任何一个数出栈...那么再正过来想,1进去后就留在栈中不出来,2进去也留在栈中不出来...,最后n进去。所以出栈序列刚好是反的。

则 p2=n-1,…,pn=1,推断出 i=n-i+1

 

8. 设目标串为 s=abcabababaab”,模式串为 p=babab”,则 KMP 模式匹配算法的 next 数组为 ?

答案: {-1,0,0,1,2}

 

9. 下列求解汉诺塔问题的递归程序,其时间复杂度为 ()

void hanoi(int n, char a, char b, char c) 
{ 
    if(n==1) 
         cout<<”a-c”; 
    else 
    { 
         hanoi(n-1,a,c,b); 
         cout<<”a-c”; 
         hanoi(n-1,b,a,c); 
     } 
}

由代码可推出这两条式子:T(n)=2T(n-1)+1T(1)=1

现在问题是:求T(n)

是不是很熟悉?高中数列时做过很多吧?已知递推式和第一项,求通项。

构造一个等比数列,

T(n) + 1 = 2 ( T(n-1) + 1 )  (注意此递推式成立的条件为 n>=2)

那么数列 { T(n) + 1 } (n>=2) 为首项为 T(2)+1 = 4,公比为2的等比数列

即 : 4 ,            8 ,         16    ....    第n-1项(可通过等比数列的通项公式求出)

          |               |             |                  |

      T(2)+1 ,  T(3)+1,  T(4)+1  ...   第n项为T(n)+1

(注意上面的一一对应,可看出T(n)+1等于我们所构造的等比数列的第n-1项!!!别搞错了)

所以T(n) + 1 = 2 * 2^(n-1) 

所以T(n) = 2^n - 1 (n>=2)

当n=1时,亦满足上式。

故T(n) = 2^n - 1 (n>=1)

所以用大O记表示就是O(2^n) (忽略系数和其他项)

 

10. 已知单链表中各结点的元素值为整数且递增有序,设计算法”DeleteBetween”删除链表中 所有大于 mink 且小于 maxk 的元素,并释放被删结点的存储空间(  )。

what??课堂上,一支笔,一张纸,手写链表?我哭了。。细节太多,不调试估计很多人写出来都是有问题的

本人写的代码 (传送门)

我发现我没写析构函数,强迫症患者表示有点难受。不管了,懒得改了。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值