数据结构 习题 综合复习
最近在复习数据结构,所以把做的习题做个总结加小知识点,如果大家有遇到这方面的问题就可以参考一下了,废话不多说,直接开始吧。
1.从一个长度为n的顺序表中删除第i个元素(1<= i <= n)时,需向前移动 (n - i)个元素。
2.对于一个具有n个顶点的无向连通图,它包含的连通分量的个数为( 1 )。
在无向图G中,若从顶点Vi到顶点Vj有路径(当然从Vj到Vi也一定有路径),则称 Vi和Vj 是联通的。若V(G)中任意两个不同的顶点Vi 和Vj都联通(即有路径),则称G为连通图。
无向图的极大联通子图称为G的 联通分量 。任何连通图的联通分量只有一个,即是其自身。
3.此算法的时间复杂度是( O (m*n))
for(i = 0 ; i < m ; i++) for(j = 0 ; j < n ; j++) a[i][j] = i*j ;
4.对线性表进行二分查找时,要求线性表必须:
- 以顺序方式存储,且结点按关键字有序排序。
5.等概率查找时,采用顺序查找方法查找长度为 n 的线性表时,每个元素的平均查找长度为
(n+1)/2
6.由二叉树的前序和中序遍历或中序和后序遍历,可以唯一确定一棵二叉树。
7.就平均时间而言,下列排序方法中最差的一种是:(D)
A.堆排序 最坏时间复杂度:O(n log 2(n))
B.快速排序 平均时间复杂度:O(n log 2(n))
C.希尔排序
D.直接选择排序 平均时间复杂度:O(n2)
- 插入排序:
1.直接插入排序:算法平均时间复杂度 O(n2)
需要监视哨时的空间复杂度是:S(n)=O(1)
设置监视哨的作用:
①备份待排序元素
②防止扫描指针越界,指针j最坏情况下终结在监视哨处
是稳定的排序方法
2.希尔排序:
时间复杂度是 n 和 d 的函数:
O(n1.25)∼O(1.6n1.25)\mathbf{O}\left(n^{1.25}\right) \sim \mathbf{O}\left(1.6 n^{1.25}\right)O(n1.25)∼O(1.6n1.25)
空间复杂度是:O(1)
是不稳定的排序方法- 交换排序:
1.起泡排序(冒泡排序)函数代码如下:
BUBBLESORT (R) //从下往上(从后往前)扫描的起泡排序 rectype R[]; { int i,j,noswap; rectype temp; for (i=0;i < n-1; i++) //做n-1趟排序 { noswap = TRUE; //置未交换标志 for(j=n-2 ; j>=i ; j--) //从下往上扫描 if(R[j+1].key < R [j].key) //交换记录 { temp = R [j+1]; R[j+1]=R[j]; R[j]=temp; noswap=FALSE; } if(noswsp) break; //本趟排序中未发生交换,则终止算法 } } //BUBBLESORT
j 的取值范围确定:
① i<= j<= n-1
② i<= j+1 <= n-1 联立这两个方程组,得到取值范围:i <= j <= n-2
起泡排序稳定。
2.快速排序:(效率最高)是目前基于内部排序中速度最快的排序方法
最坏的时间复杂度是:O(n2)
最好的时间复杂度是:O(n log 2(n))
平均时间复杂度:O(n log 2(n))
快速排序不稳定。
- 选择排序
1.直接选择排序:
平均时间复杂度:O(n2)
直接选择排序不稳定。
2.堆排序:
由于建初始堆所需的比较次数较多,所以,堆排序不适宜于记录数较少的文件。
最坏时间复杂度:O(n log 2(n))
堆排序不稳定。
- 对n个记录的文件进行快速排序,所需要的辅助存储空间大致为:
O( log 2(n))
8.若某算法核心操作的频度 f (n)= 6n2 + 9 n , 则此算法的时间复杂度为 O(n2)
9.已知字典为(33,50,66,73,181,200,202,350),采用二分检索法检索200,则依次比较的元素是:73,200.
这题有8个元素,所以从第8/2=4个元素开始检索,73<200,故从181~305这段比较,这段有4个元素,所以从第4/2=2个元素比较,第二个元素刚好是200,检索成功!
如果是奇数,从第 (n+1) / 2 个元素开始比较。
10.恰好有 n(n-1)/2 条边的无向图称为无向完全图,
恰有 n(n-1) 条边的有向图称为有向完全图。
11.算法分析的目的是:分析算法的效率以求改进。
12.线性链表不具有的特点是:随机访问。
13.在一个单链表中,若p所指结点之后插入一个结点s,则执行
s->next=p->next; p->next=s;
14.假若一组记录的排序码为(46,79,56,38,40,84),则利用快速排序的第一趟结果为: 40,38,46,56,79,84
- 排序大致过程如下:*荧光处数字为交换位置的数字
- 40 79 56 38 46 84
- 40 46 56 38 79 84
- 40 38 56 46 79 84
- 40 38 46 56 79 84 (最终第一趟结果)
15、若线性表最常用的操作是在最后一个元素之后插入一个元素和删除第一个元素,则采用 _________存储方法效率最好。
带尾指针的单循环链表
16、二叉排序树的中序 (对称)遍历,可以得到二叉排序树的关键码的升序排列。
17.用链接方式存储的队列,在进行插入运算时________
头、尾指针可能都要修改(前插操作和后插操作)
18.设有一个二维数组A[m]
,假设A[0][0]存放位置在676 (10进制),A[2][2]存放位置在676(10进制),每个元素占一个空间,问A[3][3] 存放在什么位置?
676=644+[(2-0)*n +2 ] *1 解得 n= 15
LOC(A[3][3])=644+[(3-0)*15 +3 ] *1 =644+48=692
关于数组位置的计算,我上一篇文章写过了,如果感兴趣,可以看看哦
19.如果一个算法的时间复杂度为(n3+n2log2(n)+14n)/n2,其数量级表示为:O(n)
20.设哈夫曼树中的叶子结点总数为m,若用二叉链表作为存储结构,则该哈夫曼树中总共有 2m 个空指针域。
21.设某有向图中有n个顶点,则该有向图对应的邻接表中有 n个表头结点。
22.为了能有效地应用HASH查找技术,必须解决的两个问题是:
①构造一个好的HASH函数
②确定解决冲突的方法,如:开放地址法(线性探查法、二次探查法、随机探查法、双散列函数探查法)、拉链法
23.设某棵二叉树中度数为0的结点数为N0,度数为1的结点数为N1,则该二叉树中度数为2的结点数为N0-1;
若采用二叉链表作为该二叉树的存储结构,则该二叉树中共有2N0+N1个空指针域。
计算过程:此二叉树的总结点数为N0+N1+N0-1 = 2N0+N1-1 ,所以有2*(2N0+N1-1)= 4N0+2N1-2 个指针域,其中只有2N0+N1-2个用来指示结点的左右孩子,其余的【(4N0+2N1-2) - (2N0+N1-2) = 2N0+N1】个指针域为空。
24.设指针变量p指向单链表中结点A,若删除结点A,则需要修改的指针的操作序列为:
q=p->next; p->data=q->data; //因为q要删掉,所以只要把q的数据域交换过来 p->next=q->next; free(q);
- 删除结点p,可以转化为删除p的后继(逻辑删除)
- 将后继结点q的数据域与p结点的数据域交换,然后删p的后继,逻辑上相当于删除了p
- 二叉排序树 就是 二叉检索树 。 这题是正确的,要特别注意。(我们考试的时候考到了这个判断题,我写错了,老师刚刚跟我们说。我留下了不学无术的泪水,希望大家引以为鉴)
- 二叉排序树、二叉检索树、二叉查找树 都是同一个东西。
但是二分查找的判定树和二叉排序树不是同一个东西。定义如下: - 二分查找过程可用二叉树来描述,我们把当前查找区间的中间位置上的结点作为根,左子表和右子表中的结点分别作为根的左子树和右子树,由此得到的二叉树,称为描述二分查找的判定树。
- 二叉排序树又称为二叉查找树。 它是一种特殊结构的二叉树,其定义为:二叉排序树(Binary Sort Tree)或者是一棵空树,或者是具有如下性质的二叉树:
(1)若它的 左子树 非空,则左子树上所有结点的值均 小于 根结点的值;
(2)若它的 右子树 非空,则右子树上所有结点的值均 大于 根结点的值;
(3)左、右子树本身又各是一棵二叉排序树。
从二叉排序树的定义可得出二叉排序的一个重要性质:
按中序(左根右)遍历该树所得到的中序序列是一个递增有序序列(在结点不重复时,如果结点重复 得到的是非递减序列)
我把我目前写的关于数据结构 题目 的链接全部汇总整理在下面,有需要的小伙伴自己点击哈。
- 数据结构 习题 第一章 概论
- 数据结构 习题 第二章 线性表 (C语言描述)
- 数据结构 习题 第三章 栈和队列 (C语言描述)
- 数据结构 习题 第四章 串 (C语言描述)
- 数据结构 习题 第五章 多维数组和广义表(C语言描述)
- 数据结构 习题 综合复习
因为最近还在准备别的考试,所以目前就先更新这么多哈,后面有时间的话,还会再写一篇关于数据结构实验的题目,欢迎大家关注呦!
如果大家觉得对你们有帮助的话,可以点个赞再走吗,嘿嘿。
笔者使用的教材是高等教育出版社唐策善、李龙澍、黄刘生编著的《数据结构——用C语言描述》。
因为都是我自己打字,或者我的答案,可能会有错误的地方,如果有的话,欢迎大家指出。
- 栈相关习题及详解(选择题和综合题) ——数据结构
- 队列相关习题及详解(选择题和综合题) ——数据结构
- 线性表链表表相关习题及详解(综合) ——数据结构
- 2019数据结构考研复习指导习题代码(王道论坛)
- 重新复习数据结构-------ArrayList
- 数据结构习题学习笔记(The Second Day)
- 【数据结构二叉树复习】
- 面试复习-------算法与数据结构------链表
- 数据结构复习之–“2路归并排序”-JAVA实现
- 数据结构复习笔记三:串
- 一步一步复习数据结构和算法基础-深度优先搜索
- 数据结构复习--数组的移动
- Java语言程序设计与数据结构(梁勇版) 基础版 课后习题 第三章
- 一步一步复习数据结构和算法基础-dijkstra算法
- 一步一步复习数据结构和算法基础-双链表
- 数据结构链表习题2.27,假设以两个元素依值递增有序排列的线性表A和B分别表示两个集合,现要求另辟空间构成一个顺序链表
- C++(虚函数习题及复习题目)
- 数据结构复习笔记— —堆
- 数据结构-----复习(严蔚敏版)part1
- 严蔚敏版_数据结构_第一章_习题