2012数据结构


一、选择题。

1、求整数n(n≥0)阶乘的算法如下,其时间复杂度是( )

int fact(int n)

{ if (n<=1) return 1;

return n*fact(n-1);

}

A. O(log2n) B. O(n) C. (nlog2n) D. O(n2)

解答://这里涉及递归复杂度的计算:

递归函数 T(n)=n*T(n-1);

         T(1)=1,T(0)=1;

  简化成clip_image002[1]

  渐近复杂是O(n);

http://www.cnblogs.com/python27/archive/2011/12/09/2282486.html

 

2、已知操作符包括‘+’、‘-’、‘*’、‘/’ 、‘(’和‘)’。将中缀表达式a+b-a*((c+d)/e-f)+g转换为等价的后缀表达式ab+acd+e/f-**-g+时,用栈来存放暂时还不能确定运算次序的操作符,若栈初始时为空,则转换过程中同时保存栈中的操作符的最大个数是( )

A. 5 B. 7 C. 8 D. 11

解:

     a+b-a*((c+d)/e-f)+g

   + – * ( (+ )/-) +

因此 括号内的必弹出.没匹配之间最大。+ – * ( (+

重复一个 (

Max=5

 

3、若一颗二叉树的前序遍历序列为a, e, b, d, c,后续遍历序列为b, c, d, e, a,则根节点的孩子节点( )

A. 只有e B. 有e、b C. 有e、c D. 无法确定

解:
前序:

     根左右: a ,e,b d ,c

    左右根:  b,c,d,e,a;

  将三个任意组合是( e,b,d)(b,d,c)

显然在第二次中(b,c,d) => e 必是单节点

A。

 

4、若平衡二叉树的高度为6,且所有非叶节点的平衡因子均为1,则该平衡二叉树的节点总数为( )

A. 10 B. 20 C. 32 D. 33

解:B

     二叉树的总节点公式: 2^n-1;

   每层节点公式:  2^(n-1)

当这是平很因子是0;

当平衡因子变化:

T1; O

T2:   0|0

T3: 0-0-0|0

=> c1=1

c2=2

c3=4

c4=0(0-0-0)-0 -0-0=7

递推关系式是:

   CN=Cn-1 + Cn-2 +1;

=》c5=4+7+1=12

=>c6=c5+c4+1=12+7+1=20;

 

5、对有n个节点、e条边且使用邻接表存储的有向图进行广度优先遍历,其算法时间复杂度( )

A. O(n) B. O(e) C. O(n+e) D. O(n*e)

解答:C

     n 个节点的e边的使用邻接表存贮的空间 广度遍历:

邻接表遍历包含: 一个一维数组的遍历,每个节点的链表指针的遍历:

数组的遍历O(n),每条变长被访问依次, 一共 e 条边, e 是未知的且和一维遍历是无关的,两者是相加的。o(n+e)

   

6、若用邻接矩阵存储有向图,矩阵中主对角线以下的元素均为零,则关于该图拓扑序列的结构是( )

A. 存在,且唯一 B. 存在,且不唯一

C. 存在,可能不唯一 D. 无法确定是否存在

解:

    对角线元素是0,辨明是无环图,

存在拓扑序列。

无环图不存在方向性,=》拓扑序列是不确定。

 

 

7、如下有向带权图,若采用迪杰斯特拉(Dijkstra)算法求源点a到其他各顶点的最短路径,得到的第一条最短路径的目标顶点是b,第二条最短路径的目标顶点是c,后续得到的其余各最短路径的目标顶点依次是( )

clip_image002

A. d, e, f B. e, d ,f C. f,d,e D. f,e,d

解:

//思想是:列表交点求最值,最值点再组合该点的联通点 的最值

     Dijkstra 算法求单原的最短路径。

顶点 1 2 3 4 5
b (a,b) 2        
c (a,c)  5 (a,b,c)  3      
d % (a,b,d)   5  (a,b,c,d)  6    
e % %  (a,b,c,e)  7    
f % %   (a,b,c,f)  4    

                  {a,b}        {}

最左边是 a 到节点的权值。

 

8、下列关于最小生成树的说法中,正确的是( )

Ⅰ、最小生成树的代价唯一

Ⅱ、所有权值最小的边一定会出现在所有的最小生成树中

Ⅲ、使用普里姆(Prim)算法从不同顶点开始得到的最小生成树一定相同

Ⅳ、使用普里姆算法和克鲁斯卡尔(Kruskal)算法得到的最小生成树总不相同

A. 仅Ⅰ B. 仅Ⅱ C. 仅Ⅰ、Ⅲ D. 仅Ⅱ、Ⅳ

解: A

权值是唯一的 真确

  B:   如果权值最小的边有多条并且构成环状,则总有权值最小的边将不出现在某棵最小生成树中,II错误

prim 算法是加点方法,是不相等的

C。当最小的生成树是唯一的,个边的生成是唯一的,(个边的权值是不相等),Prim  算法是相同的

prim 算法在测试边时测试边的连通性,联通权值最小就加入,所以不可避免加入不同顺序的边,也就不会相同了


 

9、已知一棵3阶B-树,如下图所示。删除关键字78得到一棵新B-树,其最右叶结点中的关键字是( )

A. 60 B. 60, 62 C. 62, 65 D. 65

clip_image004

解: B+树操作是被删的关键字的1[3/2

左兄弟是关键字是 =2>[3/2]  ,属于“兄弟够借”

把节点的左兄弟是节点中最大的关键字是上移到父节点中,同时将父节点中

节点中得到了新的平衡。

62— 》65,同时 把 65 移到下面一层中。

D

10、在内部排序过程中,对尚未确定最终位置的所有元素进行一遍处理称为一趟排序。下列排序方法中,每一趟排序结束都至少能够确定一个元素最终位置的方法是( )

Ⅰ.简单选择排序 Ⅱ.希尔排序 Ⅲ.快速排序

Ⅳ.堆排序 Ⅴ.二路归并排序

A. 仅Ⅰ、Ⅲ、Ⅳ B. 仅Ⅰ、Ⅲ、Ⅴ

C. 仅Ⅱ、Ⅲ、Ⅳ D. 仅Ⅲ、Ⅳ、Ⅴ

解答: 每中确定一个数目是:

简单选择排序是:选择就是有序的。

shell 排序: 增量排序

快速排序是:每一汤中确定一个枢纽元素。‘

堆排序是选择排序:每次会将大根堆的根节点与表尾节点进行交换。

二路归并:没糖中对子表进行两两归并得到的若干个局部有序的结果。

但无法确定最终的位置。

 

 

 

 

 

11.对一待排序序列分别进行折半插入排序和直接插入排序,两者之间可能的不同之处是( )

A. 排序的总趟数 B. 元素的移动次数

C. 使用辅助空间的数量 D. 元素之间的比较次数

解答:

  直接插入: 找到合适位置就插入

   折半插入:先分组确立再比较插入

因此一般来说,其排序的趟数不同的


 

 

41、(10分)设有6个有序表A、B、C、D、E、F,分别含有10、35、40、50、60和200个数据元素,各表中元素按升序排列。要求通过5次两两合并,将6个表最终合并成1个升序表,并在最坏情况下比较的总次数达到最小。请回答下列问题。

(1)给出完整的合并过程,并求出最坏情况下比较的总次数。

(2)根据你的合并过程,描述N(N≥2)个不等长升序表的合并策略,并说明理由。

42、(13分)假定采用带头结点的单链表保存单词,当两个单词有相同的后时缀,则可共享相同的后缀存储空间,例如,“loaging” 和 “being”,如下图所示。

clip_image002[4]

设str1和str2分别指向两个单词所在单链表的头结点,链表结点结构为clip_image004[4],请设计一个时间上尽可能高效的算法,找出由str1和str2所指向两个链表共同后缀的起始位置(如图中字符i所在结点的位置p)。要求:

(1)给出算法的基本设计思想。

(2)根据设计思想,采用C或 C++或java语言描述算法,关键之处给出注释。

(3)说明你所设计算法的时复杂度。

转载于:https://my.oschina.net/u/578921/blog/176119

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值