期末复习提纲

news2024/10/2 8:40:11

复习提纲

 

题型:编程题3题,综合题4题。

一、编程题:

1、链表的类型定义;邻接矩阵表示图的类型定义;链接表表示图的类型定义;vector数组表示图的定义和使用方法。

2、链表中结点的插入和删除操作,时间复杂度分析。

3、图的连通分量的计算方法:DFS、BFS和并查集。

4、基于有序序列进行二分查找的实现原理和实现方法,时间复杂度分析。

二、综合题

包括画图、计算和算法描述等方面。

1、广义表的结构图以及广义表的表头、表尾、表长和深度。

2、哈夫曼树的构建步骤、构建过程以及带权路径长的计算方法。

3、最小生成树(Kruskal算法、Prim算法)的一般步骤。有一个图生成最小生成树的过程。

4、二叉查找树中插入和删除一个键值的一般步骤、由一个键值序列生成一棵二叉查找树的过程、在一棵二叉查找树中删除一个键值的过程。

注意:考试试题都来自与教材的习题,但是部分题目的数据和要求会做适当的调整。

链表知识全:(1条消息) 链表详解来啦_努力的小羽儿的博客-CSDN博客_链表详解

一、编程题:

1、链表的类型定义;

typedef struct clNode {
	datatype data; //数据域
	clNode* next; //链域
	clNode() :next(NULL) {
		data = 0;
	}
}*chainList;

邻接矩阵表示图的类型定义;

struct adjMatrix {
	datatype data[eNum]; //顶点的数据信息
	int edge[eNum][eNum];//邻接矩阵
	int v; //顶点的数量
	int e; //边的数量
};

链接表表示图的类型定义;

struct vertex {
	int u; //邻接点的编号
	int w; //权重,无权图可忽视该属性
	vertex* next;
	vertex(int u1=0,int w1=0):u(u1),w(w1),next(NULL){}
};
 
typedef struct llNode {
	datatype data[vNum]; //顶点的数据信息
	vertex* edges[vNum]; //边表
	int v, e; //顶点数和边数
	llNode() :v(0), e(0) {
		for (int i = 0; i < vNum; i++)
			edges[i] = NULL;
	}
}*linkList;

vector数组表示图的定义和使用方法。

//图的vector数组表示的类型定义
struct edge {
	int v; //邻接点
	int w; //权重,无权图可忽视该属性
	edge(int v1, int w1) :v(v1), w(w1) {};
};

typedef struct vgNode {
	vector<edge>edges[vNum]; //边表
	datatype data[vNum]; //顶点的数据信息
	int v, e; //顶点数和边数
}vecGraph;
 
//创建vector数组表示的图
void create_vecGraph(vecGraph& g) {
	int i, u, v, w;
	cin >> g.v >> g.e; //输入顶点数和边数
	for (i = 0; i < g.e; i++) {
		cin >> u >> v >> w; //输入边的信息,无权图省略w,且下列语句w变为1
		g.edges[u].push_back(edge(v, w)); //将边(u,v)加入图中
		g.edges[v].push_back(edge(u, w)); //将边(v,u)加入图中,有向图忽略该语句
	}
}
 
//在实际应用中,可以采取如下更简单的表示方法
int v; //顶点数
vector<int>g[vNum]; //无权图
vector<pair<int, int>>g1[vNum]; //有权图,pair中的first代表邻接点,second代表权重

2、链表中结点的插入和删除操作,时间复杂度分析。

void cl_insert(chainList p, datatype x)
{
	chainList q = new clNode;//定义新的结点,用指针指向新定义的指针
	//判断是否有足够的空闲存储空间存放新结点
	if (q == NULL)
	{
		cout << "插入结点失败!" << endl;
		return;
	}
	q->data = x;
	q->next = p->next;
	p->next = q;
}
//查询循环链表中是否存在值为x的结点
chainList rcl_search(chainList h, datatype x)
{
	if (h == NULL) return NULL;
	chainList h1 = h;
	do {
		h1 = h1->next;
		if (h1->data == x)return h1;
	} while (h1 != h);
	return NULL;
}

void cl_delete(chainList h, datatype x)
{
	chainList p = new clNode;
	p = cl_search(h, x);
	if (p == NULL)return;
	chainList q = p->next;
	if (q == NULL)return;
	p->next = q->next;
	delete q; //释放了q所占用的空间,但q指针仍有指向
	q = NULL; //设置为空指针
}

3、图的连通分量的计算方法:DFS、BFS和并查集。

DFS:

#include<iostream>
#include<vector>
using namespace std;
constexpr auto eNum = 102; //图的顶点数量
constexpr auto vNum = 200; //图的边的数量
typedef string dataType; //图顶点中存放数据信息的类型
typedef int datatype;
constexpr auto INF = 0x3f3f3f3f;
 
//图的深度优先搜索,以下模板基于vector数组所表示的图(有向图/无向图)
bool vis[vNum]; //标记每一个顶点的颜色
int dfn[vNum], cnt = 0; //dfn存放DFS序列,cnt为序列的编号
//对图g的顶点cur所在的连通分量进行深度优先搜索,初始出发顶点为cur
void dfs(vector<datatype>g[vNum], int cur) {
	int i, u;
	dfn[++cnt] = cur; //将当前顶点cur的深度优先编号为cnt
	vis[cur] = true; //将当前顶点涂为黑色
	for (i = 0; i < g[cur].size(); i++) { //检查cur的每一个邻接点
		u = g[cur][i]; 
		if (!vis[u]) //u为白色,(cur,u)为树边
			dfs(g, u); //从u出发继续搜索
	}
}
 
//对图g进行深度优先搜索,v为顶点的数量
void dfs_traverse(vector<int>g[vNum], int v) {
	int i;
	memset(vis, 0, sizeof(vis)); //将每个顶点都设置为白色
	for (i = 1; i <= v; i++)
		if (!vis[i]) //如果存在白色顶点,则从该顶点出发进行深度优先搜索
			dfs(g, i);
}
 
int main() {
 
}

BFS:

#include<iostream>
#include<vector>
#include<queue>
using namespace std;
constexpr auto eNum = 102; //图的顶点数量
constexpr auto vNum = 200; //图的边的数量
typedef string dataType; //图顶点中存放数据信息的类型
typedef int datatype;
constexpr auto INF = 0x3f3f3f3f;
 
bool vis[vNum]; //标记顶点的颜色
int bfn[vNum]; //广度优先序列
//对图g中cur所在的连通分量进行广度优先搜索,初始出发点为cur
void bfs(vector<int>g[vNum], int cur) {
	int i, u, v, cnt = 0;
	queue<int>q;
	bfn[++cnt] = cur, vis[cur] = true;
	q.push(cur); //将初始出发点加入队列
	while (!q.empty()) { //对队列中的元素进行处理,直到队空
		u = q.front(), q.pop(); //取出队头元素
		for (i = 0; i < g[u].size(); i++) { //检查顶点u的每一个邻接点
			v = g[u][i];
			if (!vis[v]) { //顶点v为白色
				//(u,v)为树边
				bfn[++cnt] = v;
				vis[v] = true;  //加入队列前将v设置为黑色
				q.push(v); //将v加入队列
			}
 
		}
	}
}
 
//对图g进行广度优先搜索,v为顶点的数量
void bfs_traverse(vector<datatype>g[vNum], int v) {
	memset(vis, 0, sizeof(vis));//将每个顶点设置为白色
	for (int i = 1; i <= v; i++)
		if (!vis[i]) //如果顶点i为白色,则从i出发对其所在的连通分量进行bfs
			bfs(g, i);
}
 
int main() {
 
}

 并查集:

#include<iostream>
using namespace std;
typedef int datatype;
constexpr auto N = 100;
//由并查集的两种操作可知,并查集的操作中主要涉及结点的父节点和树的根结点,
//因此可以采用树的双亲表示法表示并查集。
//由下面并查集的类型定义可知,初始并查集每个集合里就一个元素,mq即表示一个并查集。
struct mqNode {
	int pa;
	datatype data;
	mqNode() :pa(-1) {};
}mq[N];
 
//并查集的查询操作
int query(int x) {
	if (mq[x].pa == -1)return x; //x没有父节点,则x为根结点
	mq[x].pa = query(mq[x].pa); //向上查询x的父节点,并进行路径压缩,让x到根结点的路径都独立出来,成为第二层节点,链接根结点
	return mq[x].pa;
}
 
//并查集的合并操作:1.获取两个元素所在树的根结点 2.检查两个元素是否属于同一集合
void merge(int x, int y) {
	x = query(x), y = query(y);
	if (x != y)
		mq[x].pa = y;
}
 
int main() {
 
}

4、基于有序序列进行二分查找的实现原理和实现方法,时间复杂度分析。

实现原理:

将位于顺序表中间元素的键值与查找键值比较,如果两者相等,则查找成功;否则以中间元素为分割点,将顺序表分割为两个子表,然后在某个子表中进行同样的操作。重复上述过程,直到查找到相应的元素或子表为空。

实现原理: O(logn)

int binary_search(vector<int>sl, int k) {
	int left = 0, right = sl.size() - 1, mid;
	while (left <= right) {
		mid = (left + right) >> 1;
		if (sl[mid] == k) return mid;
		else if (sl[mid] > k) right = mid - 1;
		else left = mid + 1;
	}
	return -1;
}

二、综合题

包括画图、计算和算法描述等方面。

1、广义表的结构图以及广义表的表头、表尾、表长和深度。

结构图

 

广义表是由n个元素组成的序列:LS = (a1,a2, ... an);其中 ai是一个原子项或者是一个广义表。n是广义表的长度。若ai是广义表,则称为LS的子表。

广义表表头和表尾: 若广义表LS不空,则a1,称为LS的表头,其余元素组成的子表称为表尾。

广义表的长度: 若广义表不空,则广义表所包含的元素的个数,叫广义表的长度。

广义表的深度: 广义表中括号的最大层数叫广义表的深度。 

广义表的广度(长度)指:广义表中所包含的数据元素的个数。例:

在广义表{a,{b,c,d}}中,它包含一个原子和一个子表,因此该广义表的长度为2.

在广义表{{a,b,c}}中只有一个子表{a,b,c},因此它的长度为1.

例如:
对广义表LS=((),a,b,(a,b,c),(a,(a,b),c))
表头为子表LSH = ();
表尾为子表LST = (a,b,(a,b,c),(a,(a,b),c));
广义表LS的长度:5
广义表LS的深度:3

2、哈夫曼树的构建步骤、构建过程以及带权路径长的计算方法。

算法步骤

(1)初始化 :构造m棵只有一个结点的二叉树,得到一个二叉树集合F={T1,T2...},Ti的叶结点(也是根结点)的权重为Wi;


(2)选取与合并:新建一个结点tmp,在F中选取根结点权重最小和次小的两棵二叉树Ti和Tj,分别作为tmp的左子树和右子树(顺序可以颠倒),构造一棵二叉树,结点tmp的权重为Ti和Tj的权重之和


(3)删除与加入:在F中删除Ti和Tj,并将以 tmp为根结点的新建二叉树加入F中;


(4)重复步骤(2)和步骤(3),直到F中只剩下一棵二叉树为止,此时,这棵二叉树就是哈夫曼树。           
 

 

#include<iostream>
#include<queue>
using namespace std;
typedef char datatype;
constexpr auto M = 30;;
//由于结点的总数不是太大,因此可以用二叉树左右链数组的表示法做适当的扩展来表示哈夫曼树的特点
//结点定义
typedef struct hutNode {
	datatype data;
	int w, idx; //idx为结点的下标,w表示权重
	int lc, rc;
	bool operator<(const hutNode& hn)const {
		return w > hn.w; //为了使hutNode类型的优先队列中权重较小的优先级较高
	}
}huTree[M<<1];
 
//由于每一步都要选择集合F中的最小权重结点和次小权重结点,
//且F中的结点是不断更新的,因此可以使用priority_queue
//创建哈夫曼树t:参数m为叶结点的数量,data和w分别为叶结点的数据信息和叶结点的权重
void huTree_create(huTree& t, const datatype data[], int w[], int m) {
	int i;
	hutNode hn1, hn2, hn3;
	priority_queue<hutNode>f;
	for (i = 1; i <= m; i++) {
		t[i].data = data[i - 1], t[i].w = w[i - 1], t[i].idx = i;
		t[i].lc = -1, t[i].rc = -1;
		f.push(t[i]);
	}
		while (f.size() > 1) { //当f只剩下一个元素时结束循环
			hn1 = f.top(), f.pop();
			hn2 = f.top(), f.pop();
			hn3.w = hn1.w + hn2.w, hn3.idx = i;
			hn3.lc = hn1.idx, hn3.rc = hn2.idx;
 
			f.push(hn3);
			t[i++] = hn3;
		}
		t[0] = f.top(), t[0].idx = 0; //将最终哈夫曼树的根结点的编号设置为0	
}
 
int main() {
	const char* data = "EDCBA";
	int w[] = { 6,18,21,36,19 };
	huTree t;
	huTree_create(t, data, w, 5);
}

3、最小生成树(Kruskal算法、Prim算法)的一般步骤。有一个图生成最小生成树的过程。

Kruskal算法:

 

一般步骤

(1)定义点集U,并定义一个集合D,编号为v的顶点对应D[v],D[v]包括两个属性:属性d表示v到U的距离,初始时d的值为INF;属性to属于U,且边(v,to)的权重为v到U的最短距离。初始时选择任一顶点v加入U,更新v的邻接点的D的值;

(2)利用D的属性d在V-U中选择到U的距离最小的值顶点v并加入U中,另D[v]=INF,同时江边(v,D[v],to)加入最小生成树中;

(3)利用v更新D,当v的某个邻接点在V-U中时,设边(v,u)的权重为w,如果w<D[u].d,则令D[u].d=w,D[u].to=v;

(4)重复步骤(2)(3),知道所有顶点都加入U中为止。

简言之,就是从第一个顶点开始,然后寻找临近的点,点的信息放入小顶堆中(以距离排序),然后进入while循环,循环n-1次;取出小顶堆的top,即最小的距离,固定住,将该顶点加入u,树边也固定住,然后遍历该顶点的连接点,重复上述操作。

Prim算法:

判断两个顶点是否属于同一颗子树,可用并查集。 

4、二叉查找树中插入和删除一个键值的一般步骤、由一个键值序列生成一棵二叉查找树的过程、在一棵二叉查找树中删除一个键值的过程。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/348080.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

linux高级命令之编辑器 vim

编辑器 vim学习目标能够说出vim的三种工作模式能够说出vim对应复制和粘贴命令1. vim 的介绍vim 是一款功能强大的文本编辑器&#xff0c;也是早年 Vi 编辑器的加强版&#xff0c;它的最大特色就是使用命令进行编辑&#xff0c;完全脱离了鼠标的操作。2. vim 的工作模式命令模式…

2023想转行软件测试的看过来,你想要了解的薪资、前景、岗位方向、学习路线都讲明白了

在过去的一年中&#xff0c;软件测试行业发展迅速&#xff0c;随着数字化技术应用的广泛普及&#xff0c;业界对于软件测试的要求也在持续迭代与增加。 同样的&#xff0c;有市场就有需求&#xff0c;软件测试逐渐成为企业中不可或缺的岗位&#xff0c;作为一个高薪又需求广的…

怎么解密MD5,常见的MD5解密方法,一看就会

MD5是一种被广泛使用的密码散列函数&#xff0c;曾在计算机安全领域使用很广泛&#xff0c;但是也因为它容易发生碰撞&#xff0c;而被人们认为不安全。那么&#xff0c;MD5应用场景有哪些&#xff0c;我们怎么解密MD5&#xff0c;本文将带大家了解MD5的相关知识&#xff0c;以…

Laravel创建定时任务

创建一个任务&#xff0c;创建成功后会在App/Console/Commands中生成一个以Test命名的文件&#xff0c;我们可以在这里面写我们的任务指令。 php artisan make:command Test 运行这个定时任务 run 是运行一次&#xff0c;我们可以用来测试是否成功&#xff0c;work是一直运行&a…

Jenkins的使用教程

介绍&#xff1a; Jenkins是一个开源软件项目&#xff0c;是基于Java开发的一种持续集成工具&#xff0c;用于监控持续重复的工作&#xff0c;旨在提供一个开放易用的软件平台&#xff0c;使软件的持续集成变成可能。 目的: 最重要目的就是把原来分散在各个机器上繁杂的工作全部…

hadoop高可用搭建

修改计算机名称 //修改计算机名称 [rootlocalhost ~]# hostnamectl set-hostname ant150//快速生效 [rootlocalhost ~]# bash 主机名称映射 [rootant150 ~]# vim /etc/hosts 192.168.153.150 ant150 192.168.153.151 ant151 192.168.153.152 ant152 192.168.153.153 ant153 …

数据分析-深度学习 Tensorflow Day6

我们需要解决的问题&#xff1a;1&#xff1a; 什么是bp 神经网络&#xff1f;2&#xff1a;理解bp神经网络需要哪些数学知识&#xff1f;3&#xff1a;梯度下降的原理4: 激活函数5&#xff1a;bp的推导。1.什么是bp网络&#xff1f;引用百度知道回复&#xff1a;“我们最常用的…

【mmrotate】旋转目标检测之训练DOTA数据集

every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?typeblog 0. 前言 mmrotate训练DOTA数据集记录 1. 正文 1.1 数据准备 数据介绍部分&#xff0c;参考DOTA数据介绍&#xff0c;官方提供了裁剪工具development kit。这里…

LINUX内核链表

LINUX内核链表 一、传统链表的缺陷 传统的双向循环链表概念简单&#xff0c;操作方便&#xff0c;但存在有致命的缺陷&#xff0c;用一句话来概括就是&#xff1a; 每一条链表都是特殊的&#xff0c;不具有通用性。换句话说&#xff0c;对于每一种不同的数据&#xff0c;所构…

java对象克隆和面向对象的设计原则

java进阶注解内置注解元注解自定义注解对象克隆浅克隆深克隆java设计模式建模语言类之间的关系依赖关系关联关系单向关联双向关联自关联聚合关系组合关系继承关系实现关系面向对象设计原则单一职责开闭原则里氏替换原则依赖倒置接口隔离迪米特原则组合/聚合复用原则注解 java注…

关于ucharts在小程序中的使用

项目添加组件 画图之前&#xff0c;首先需要引入ucharts组件&#xff0c;引入链接https://ext.dcloud.net.cn/plugin?id271。 点击下图中红色方框内容&#xff1a; 导入完成后&#xff0c;与uni其他组件一样&#xff0c;无需引入&#xff0c;直接使用即可。 使用组件 uchar…

jhipster自动生成java代码的方法

一、前言 java springboot后台项目用到了jpa查询数据库&#xff0c;还用到了jhipster&#xff0c;这个东西可以自动生成基础的Controller、Service、Dao、JavaBean等相关代码&#xff0c;减少重复开发。 在此总结下使用方法。 二、jhipster自动生成java代码的方法 1.需要先…

KDHX-8700无线高压核相相序表

一、产品简介 KDHX-8700无线高压核相相序表&#xff08;以下简称“仪器”&#xff09;用于测定三相线相序、检测环网或双电源电力网闭环点断路器两侧电源是否同相。在闭环两电源之前一定要进行核相操作&#xff0c;否则可能发生短路。仪器适用于380V&#xff5e;35kV交流输电线…

JavaScript void

文章目录JavaScript voidjavascript:void(0) 含义href"#"与href"javascript:void(0)"的区别JavaScript void javascript:void(0) 含义 我们经常会使用到 javascript:void(0) 这样的代码&#xff0c;那么在 JavaScript 中 javascript:void(0) 代表的是什么…

RTSP协议交互时TCP/UDP的区别 以及视频和音频的区别 以及H264/H265的区别

经过这几天的调试 一个功能简单的 RTSP服务端已经实现了 支持TCP/UDP 支持H264 H265 支持同时传输 AAC音频 记录下 交互时需要注意的地方 1.OPTIONS 都一样 如下&#xff1a;左箭头内是客户端发给服务端 箭头内是服务端回给客户端 2.DESCRIBE 目前的流是包含视频和AAC音频…

计讯物联环保数采仪TS910在扬尘预警监测解决方案的应用

方案背景 随着我国经济高速发展和城市化进程的加速&#xff0c;城市建设工程规模不断扩大&#xff0c;工程施工给居住区、学校、医院等周边环境带来了巨大的影响&#xff0c;特别是扬尘污染带来的细颗粒物&#xff0c;严重危害到人体健康和大气环境质量。 因此&#xff0c;计…

MVC与MVVM

MVC与MVVM举例说明MVCMVVM两者比较MVC <!DOCTYPE html> <html><head><meta charset"utf-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><title>mvc案例</title><link rel"styleshe…

ChatGPT初体验(一)

ChatGPT初体验&#xff08;一&#xff09; ChatGPT登陆方式 “OpenAI研发的聊天机器人程序&#xff0c;于2022年11月30日发布。ChatGPT是人工智能技术驱动的自然语言处理工具&#xff0c;它能够通过学习和理解人类的语言来进行对话&#xff0c;还能根据聊天的上下文进行互动&…

05- 泰坦尼克号海难生死预测 (机器学习集成算法) (项目五)

Kaggle: 一个数据建模和数据分析竞赛平台sns画柱状图: sns.barplot(datatrain,xPclass,ySurvived)查看数据分布(survived 和 fare): sns.FacetGrid(train,hueSurvived,aspect3) ageFacetsns.FacetGrid(train,hueSurvived,aspect3) ageFacet.map(sns.kdeplot,Fare,shadeTrue) …

血氧仪「上潜」,智能穿戴「下沉」

文|智能相对论作者|沈浪缺货、涨价、一“仪”难求......过去短短的几周&#xff0c;血氧仪市场持续走热&#xff0c;受到前所未有的关注&#xff0c;像鱼跃医疗这样的业内巨头更是赚得盆满钵满&#xff0c;但同时也深陷“发国难财”的舆论泥潭&#xff0c;说来也是唏嘘。尽管目…