试题:(中科院)2002年网络中心数据结构试卷

2007年06月12日 来源:考研加油站
二维码
用微信扫描二维码
分享至好友和朋友圈
    一、单项选择填空(每空2分,共20分)
    
    1,设两算法的执行时间分别是T1=2n2+10n1.01+300nlog2n和T2=1.5n2+100n1.01+3nlog2  n,若要比较他们的时间性能,较为合适的表示是( )。
    
    a) T1=2n2+O(n1.01),T2=1.5n2+O(n1.01)
    
    b) T1=2n2+O(nlog2n),T2=1.5n2+O(nlog2n)
    
    c) T1=O(n2),T2=O(n2)
    
    d) T1=2n2+O(300nlog2n),T2=1.5n2+O(3nlog2n)
    
    2,以数组Q[0..m-1]存放循环队列中的元素,若变量front和qulen分别指示循环队列中队头元素的实际位置和当前队列的长度,则队尾元素的实际位置是( )。
    
    a) front+qulen-1
    
    b) (front+qulen) mod m
    
    ]  c) (front+qulen-1) mod m
    
    d) front+qulen
    
    3,设结点x和y是二叉树中的任意两结点,若在该树的先根、中根和后根序列里,x和y中的一个结点皆在另一个结点之前,则它们的关系是( )。
    
    a) x和y必互为兄弟
    
    b) x和y必是树叶
    
    c) 一个是另一个的祖先
    
    d) 彼此无祖先和后代的关系
    
    4,若将数据结构中的数据元素称为结点,则一般没有开始结点和终端结点的数据结构是( )。
    
    a) 树 b) 图 c) 多维数组 d) 线性表
    
    5,用prim算法求下述邻接矩阵表示的连通带权图的最小生成树,在算法执行的某一时刻,已选取的顶点集合为U={1,2},边的集合TE={(1,2)},要选取下一权值最小的边,应当从  ( )组中选取。
    
    ∞  212  10  ∞
    
    2∞  8∞  9
    
    12  8∞  63
    
    10  ∞  6∞  7
    
    ∞  937∞
    
    a) {(1,4),(2,3),(2,5)}
    
    b) {(3,5),(3,4),(4,5)}
    
    c) {(1,3),(3,4),(3,5)}
    
    d) {(2,3),(3,4),(2,5)}
    
    6,设根的层数为0。n个结点的m叉树的高度至少是( )。
    
    a) └logm(n(m-1))┘+1
    
    b) ┌logm(n(m-1))┐
    
    c) ┌logm(n(m-1))┐+1
    
    d) ┌logm(n(m-1))┐-1
    
    7 ,在下列各种数据结构中,查找操作低效的是( )。
    
    a) 二叉排序树 b) AVL树 c) 有序的顺序表 d) 堆
    
    8,在一棵高度为h的2-3树中(设根的层数为1),叶子的数目至少应为( ),至多应为( )。
    
    a) 2h-1 b) 2h-1 c) 2h d) 2h-1-1 e) 3h-1 f) 3h-1 g) 3h h) 3h-1-1 9,
    
    用直接选择排序方法分别对序列S1=(1,2,3,4,5,6,7)和序列S2=(7,5,3,2,4,1,6)进行排序,关键字比较次数( )。
    
    a) 相同 b) 前者大于后者 c) 前者小于后者
    
    二、简要回答下述问题(共15分)。
    
    1,当m阶B-树用于内查找时,通常m取3,为什么?
    
    2,设有两个算法运行于同一台机器上,其执行时间分别是1024n2和2n,要使前者快于后者,n要多大?
    
    3,三层、四层二叉树有多少种形态?请给出求n层二叉树形态数递推公式。
    
    三、阅读程序并填空(共20分)
    
    1,以下C程序的功能是将整数n转换为相应的字符串,请在空白处填上正确的C语句
    
    void itoa(int n,char* s)
    
    { int sign;
    
      char c,*t = s;
    
      if((sign = n)<0)
    
      ___①___;
    
      do { *t++ = n%10 + '0'; }
    
      while ___②___;
    
      if(sign < 0)
    
      *t++ = '-';
    
      *t = '/0';
    
      for(___③___;  s < t;  s++,t--)
    
      { c = *s;
    
     *s = *t;
    
     *t = c;
    
      }
    
    }
    
    该算法的时间复杂度是___④___;
    
    2,以下的C程序是一个既可以做升序又可以做降序排序算法,请在空白处填上正确的C语句或表达式。这里的Comp是一个什么指针?请给出它所对应函数,以及对QuickSort的调用语句,
    
    完成对整数数组R[0..n-1]的升序排序。
    
    void QuickSort(int A[], int start, int end, int(*Comp)(int x, int y))
    
    { int low = start; int high = end; int separator = A[low];
    
      if(start < end)
    
      { while(low < high)
    
     { while(low < high && ((*Comp)(A[high], separator)))
    
    high--;
    
    if(low < high)
    
    A[low++] = A[high];
    
    while(low < high && ___①___)
    
    low++ ___②___;
    
     }
    
     A[low] = separator;
    
     QuickSort(___③___);
    
     QuickSort(___④___);
    
    四、算法题(每题15分,共45分,要求写注解或设计思想)。
    
    1,设主串和子串分别存放在字符数组S[0..n-1]和T[0..n-1]中, 写一串匹配算法,输出T在S中所有的匹配位置(例如,若S="This is a list",T="is",则输出2,5和11)并给出算法的时间复杂度。
    
    2,对有向图进行拓扑排序可通过不断地删除出度为0的顶点来实现, 试以邻接表为存储结构写一算法实现之。要求输出的顶点序列是拓扑序列。
    
    3, 设有n个班皆要在同一个活动中心举行元旦晚会,且所有班的时间表均以确定。第i(1 ≤ i ≤ n) 个班的晚会开始时间和结束时间分别为Si和Fi,这里Si≤Fi。试写一个算法,安排尽可能多的时间不冲突的班使用活动中心。
    
    参考答案
    
    一、单项选择填空(每空2分,共20分)
    
    1,a 2,c 3,d 4,b 5,a
    
    7,d 8,b,f 9,a
    
    二、简要回答下述问题(共15分)。
    
    1,因为B-树的高度为O(logtn),这里t = ┌ m/2 ┐。
    
    当B-树用于内查找时,其时间为O(mlogtn),这里m是结点内的查找时间。而 O(mlogtn) = O(log2n(m/log2t))), 这里O(log2n)是平衡的二叉排序树的查找时间,当m较大时,m/log2t远大于1,因此B-树用于内查找的时间也远远大于平衡的二叉排序树的查找时间。
    
    2,19
    
    3,假设n-1层二叉树的形态数为f(n-1),则n层二叉树的形态数为:
    
    f(n) = f(n-1) * f(n-1) + 2 * f(n-1) *(f(n-2) + ... + f(1) + 1)
    
    f(1) = 1; f(2) = 3; f(3) = 21; f(4) = 651;
    
    三、阅读程序并填空(每空2分,共20分)
    
    1,① n = -n ② ((n /= 10) > 0) ③ t-- (或--t,t=t-1)
    
    ④ O(log10n)
    
    2,① ((*Comp)(separator,A[low])) ② if(low < high) A[high--] = A[low]
    
    ③ A, start, high - 1, Comp ④ A, low + 1, end, Comp
    
    Comp是一个函数指针 //1分
    
    int CompAscending(int x, int y) { return x >= y; } //2分
    
    调用: QuickSort(R, 0, n - 1, CompAscending); //1分