2018 北京理工大学889 回忆
北理889只考一门数据结构,不像其他院校(408,912)计算机专业要考四大名著(机组,计网,数据结构,操作系统)。
下面列出的选择填空题目不全,只有一些印象深刻的和比较重要的。(大题没有考AVL树,B+树,关键路径,线索二叉树,哈夫曼树,最小增量排序,基数排序有点儿失望)从算法题和简答题可以看出来,北理还是比较注重基础的,但是我在今年的卷纸上看到了往年的影子,拿到卷纸第一感觉是材质很一般,然后就是有种woc我是不是被透题了的感觉。。。今年选择填空没出文字游戏好评,卷面感觉没有哪题有二义性。
成绩已经出来了,数据结构122
转载注明出处 :http://www.cnblogs.com/xuwangzihao/p/8099016.html
感谢北理考研群各位伙伴一路陪伴:492030260
选择(20*2分)
前三道题考什么是逻辑结构什么是存储结构。(存储结构:线性非线性。逻辑结构:hash)
时间复杂度O(n^2)代表程序运行时间与n^2成正比
m阶B-树是m阶平衡二叉树
无向图任意一点可深搜遍历所有的点意味着这图是个连通图。
线性探测解决冲突的hash,k个数字映射到一个位置产生多少次冲突? k(k-1)/2
一个二叉树,每个节点度为0或2,问你高度为h,最少多少个节点?(2h-1)
当一组数据里面的数都离它该在的位置很近的时候,用直接插入排序进行排序。
邻接矩阵是对称矩阵的图是无向图
1001个点的完全二叉树有501个叶子节点。
用数组存储二叉树,21个节点高度为6的至少需要把数组开多大?63
循环队列存在a[0..20],尾指针指向尾元素,头指针指向头元素的前一个,现在头指8尾指3,队里有16个元素。
123456顺序进栈,问不可能的出栈序列。
abcdef顺序进入一个两边都可进,只能一边出的队列,问不可能的出队序列。
填空(20*2分)
两个串相等的充要条件?长度相等,对应位内容相同(超纲,不过幸好没有考KMP)
给你一个广义表,问你表长和深度。(超纲)
7阶B-树非根节点最少有几个子树
20个数字做归并排序,需要5趟归并,第3趟时把长度为4的数据合并成长度为8的。
在稠密图上求最小生成树用prime算法比较好
无向的完全图有多少个边?有向的完全图有多少个边? n(n-1)/2, n(n-1)
给你几个数,问你他们构成的二叉搜索树长啥样。
10个点的图用Dijkstra,时间是10ms,则40个点大概160ms。(考它的时间复杂度的
希尔排序最后一趟的增量必须是1。
有头节点的链表为空的判断条件是什么?head->next=0
顺序表里存了n个数据,查找某个数据并命中最多需要关键字比较n次,不命中,需要比较n+1次。
简答(4*10分)
1,汉诺塔时间复杂度分析。
O(2^n)
2,进栈顺序是abcdefg,出栈序列是bdcfeag,问具体的进栈出栈次序。
操作 栈 输出序列
push(a) push(b) ab NULL
pop(b) a b
push(c) push(d) acd b
pop(d) pop(c) a bdc
push(e) push(f) aef bdc
pop(f) pop(e) pop(a) NULL bdcfea
push(g) g bdcfea
pop(g) NULL bdcfeag
3,n*n的特殊矩阵(主对角线上三角矩阵)A压缩存储在一维数组s里,写出s[k]和a[i][j]的具体关系。(略)
4,链式解决冲突的hash表,hash函数x%13,hash表容量13,给你12个数字,让你画出hash后的情况,问你命中时的ASL和不命中时的ASL。(略)
不命中的ASL比较特别,要去看书不能想当然。
算法设计(3*10分)
1,删除有头节点链表最小值,有头节点,传入参数是头节点的指针。
1 typedef struct Link{ 2 ElemType data; 3 Link* next; 4 }*LinkList; 5 bool deleteMin(LinkList head){ 6 if(!head->next)return 0;//fail 7 //找到想要删除的目标节点的前驱 8 LinkList p=head->next,aim=head; 9 while(p->next){ 10 if(p->next->data<aim->data)aim=p; 11 p=p.next; 12 } 13 //屏蔽掉那个节点并释放空间(删除它) 14 p=aim->next; 15 aim->next=aim->next->next; 16 free(p); 17 return 1;//success 18 }
2,中序遍历,非递归实现。(下面不是标准答案,标准答案去看书)
1 #include<vector> 2 #include<cstdio> 3 using namespace std; 4 typedef struct Node{ 5 int data; 6 Node * lc; 7 Node * rc; 8 }BTNode; 9 vector<pair<BTNode*,bool> > s;//second 表示它的左孩子是否访问过 10 void inOrder(BTNode * root){ 11 pair<BTNode*,bool> tmp; 12 tmp.first=root;tmp.second=0; 13 s.push_back(tmp); 14 while(!s.empty()){ 15 tmp=s.back(); 16 s.pop_back(); 17 if(!tmp.second){ 18 tmp.second=1; 19 if(tmp.first->lc){ 20 s.push_back(tmp); 21 tmp.first=tmp.first->lc; 22 tmp.second=0; 23 s.push_back(tmp); 24 }else{ 25 s.push_back(tmp); 26 } 27 }else{ 28 printf("%d\n",tmp.first->data);//work() 29 if(tmp.first->rc){ 30 tmp.first=tmp.first->rc; 31 tmp.second=0; 32 s.push_back(tmp); 33 } 34 } 35 } 36 } 37 //用到了C++的vector和pair,为了标记当前栈顶元素状态,vector模拟栈
3,递归实现的快排。
1 int Partition(int *a,int l,int r){ 2 a[0]=a[l]; 3 while(l<r){ 4 while(l<r&&a[r]>=a[0])r--; 5 a[l]=a[r]; 6 while(l<r&&a[l]<=a[0])l++; 7 a[r]=a[l]; 8 } 9 a[l]=a[0]; 10 return l; 11 } 12 void QuickSort(int *a,int l,int r){ 13 if(l<r){ 14 int pivot=Partition(a,l,r); 15 QuickSort2(a,l,pivot-1); 16 QuickSort2(a,pivot+1,r); 17 } 18 }