IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 2022年1月12日学习总结 -> 正文阅读

[数据结构与算法]2022年1月12日学习总结

文章目录:

dfs,bfs,以及快排

1.dfs

DFS就是指:优先考虑深度,换句话说就是一条路走到黑,直到无路可走的情况下,才会选择回头,然后重新选择一条路。

适用的题目较为经典的有迷宫类型的题目,以及做数据排列类型的题目等

void dfs(int step){
?? ?判断边界
?? ?尝试每一种可能 for(i=1;i<=n;i++){
?? ??? ?继续下一步 dfs(step+1)
?? ??? ?}
?? ?返回
}
这是大概的模板

如果是迷宫

则dfs后括号里的条件可以换为开始时的坐标和开始的步数等;

但是迷宫最短路径一类的题目最好还是不要用bfs,用dfs会更为方便

迷宫一般分为以下几个部分:

地图部分,mp[Max_n][Max_n]

标记(遍历)部分vis[Max_n][Max_n]

路径部分road[Max_n][Max_n]

计数(方案数,步数等)sum/num;

2.bfs

与dfs不同,它是将图中所有顶点和弧线按照层来依次遍历

完整模板

/*
需要一个顺序队列作为辅助
顶点数据类型为char,边上权值类型为int
*/
#include <stdio.h>
#include <stdlib.h>
#define MAXVEX 100						//最大顶点数
#define INFINITY 99999					//用99999表示无限大

int visited[MAXVEX];				//访问标志数组,其值为1或0,1代表已访问,0代表没访问

//********************邻接矩阵存储结构代码********************
typedef struct
{
	char verx[MAXVEX];					//顶点表
	int arc[MAXVEX][MAXVEX];			//边表
	int numVertexes, numEdges;			//图中当前顶点数和边数
}MGraph;

//********************建立无向图的邻接矩阵表示********************
void CreateMGraph(MGraph* G)
{
	int i, j, k, w;
	printf("输入顶点数和边数\n");
	scanf("%d%d", &G->numVertexes, &G->numEdges);
	getchar();										//获取缓冲区的回车符
	for (i = 0; i < G->numVertexes; i++)			//读入顶点信息
	{
		printf("输入第%d个顶点信息\n", i + 1);
		scanf("%c", &G->verx[i]);
		getchar();										//获取缓冲区的回车符
	}
	for (i = 0; i < G->numVertexes; i++)					//矩阵初始化
		for (j = 0; j < G->numVertexes; j++)
			if (i == j)										//如果i==j;矩阵的主对角线都为0
				G->arc[i][j] = 0;
			else G->arc[i][j] = INFINITY;                    //否则,矩阵初始化,都是无穷大
	for (k = 0; k < G->numEdges; k++)						//建立邻接矩阵
	{
		printf("输入边(vi,vj)上的下标i,下标j和权w:\n");
		scanf("%d%d%d", &i, &j, &w);				//输入边(vi,vj)上的权值w
		G->arc[i][j] = w;
		G->arc[j][i] = G->arc[i][j];				//因为无向图矩阵是对称的
	}
}

//*********************队列的顺序队列存储结构*********************
typedef struct
{
	int data[MAXVEX];                                      //存放队列元素
	int front, rear;										//队头指针和队尾指针
}SqQueue;

//**********************队列的初始化*************************
int InitQueue(SqQueue* Q)
{
	Q->front = 0;
	Q->rear = 0;
	return 1;
}
//***********************队列入队操作********************
int EnQueue(SqQueue* Q, int e)
{
	if (Q->rear == MAXVEX)						 //判断队列是否满
		return 0;
	Q->data[Q->rear] = e;                       //元素e赋值给队尾
	Q->rear++;						//队尾指针后移
	return 1;
}

//************************队列出队操作****************
int DeQueue(SqQueue* Q, int* e)
{
	if (Q->rear == Q->front)          //队空
		return 0;
	*e = Q->data[Q->front];            //对头元素赋值给e
	Q->front++;                       //对头指针后移
	return 1;
}

//************************判断队列是否为空****************
int QueueEmpty(SqQueue Q)
{
	if (Q.front == Q.rear)				//为空返回1
		return 1;
	else return 0;						//非空返回0
}

//********************邻接矩阵广度优先的算法********************
void BFStraverse(MGraph G)
{
	int i, j;
	SqQueue Q;										//辅助队列
	for (i = 0; i < G.numVertexes; i++)
		visited[i] = 0;								//初始化都为0
	InitQueue(&Q);									//初始化辅助队列
	for (i = 0; i < G.numVertexes; i++)				//对每一个点做循环
	{
		if (!visited[i])							//若没有被访问		
		{
			visited[i] = 1;								//将当前结点设置为已访问
			printf("%c", G.verx[i]);					//输出顶点信息
			EnQueue(&Q, i);								//将该顶点入队列
			while (QueueEmpty(Q))						//当前队列不为空
			{
				DeQueue(&Q, &i);						//将对头元素出队,并将其值传给i
				for (j = 0; j < G.numVertexes; j++)
				{
					if (G.arc[i][j] == 1 && !visited[j])		//判断其他顶点若与当前顶点存在边且未被访问过
					{
						visited[j] = 1;							//标记为已访问
						printf("%c", G.verx[j]);				//打印结点信息
						EnQueue(&Q, j);							//将该结点入队
					}
				}
			}
		}
	}
	printf("\n");
}



int main()
{
	MGraph G;
	CreateMGraph(&G);
	printf("广度优先遍历结果为:");
	BFStraverse(G);
	return 0;
}

【模板不是自己自创的多多见谅(>人<;)】

bfs多用于探索最短路径,最优解等问题的时候

3.快排

它是冒泡排序的优化方案,先选定一个基准数(一般为最左边的数字),设置两个指针(right/left)右边的指针往左走,左边的指针往右走(这里基准数在最左边,所以右边的指针先走,这点很重要)右边的指针找到比基准数小的数停下,同理左边的指针找到比基准数大的数停下,然后两者对应的数值交换;随后继续循环,知道两者指针重叠为止,再将重叠位置的数值与基准数交换,然后在基准数的左边/右边继续进行基准工作。快速排序的每一轮处理其实就是将这一轮的基准数归位,直到所有的数都归位为止,排序就结束了。

时间复杂度小的原因

快速排序之所以比较快,是因为与冒泡排序相比,每次的交换时跳跃式的,每次排序的时候设置一个基准点,将小于等于基准点的数全部放到基准点的左边,将大于等于基准点的数全部放到基准点的右边。这样在每次交换的时候就不会像冒泡排序一样每次只能在相邻的数之间进行交换,交换的距离就大的多了。因此总的比较和交换次数就少了,速度自然就提高了。

总结:

今天更近一步的了解了dfs,bfs以及快排背后的原理,但是对它们掌握程度还不够透彻;希望我能尽快熟练地运用o(* ̄▽ ̄*)ブ

?

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-01-14 02:14:08  更:2022-01-14 02:16:18 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 18:48:24-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码