- 博客(18)
- 收藏
- 关注
原创 图的应用--拓扑排序(只有代码)
题外话:好久没更了,才不是因为懒。前段时间因为蓝桥杯和实验室的一些事务,再加上校内的学业,一直比较忙。最近期末考试也提前了,也算是百忙之中抽出来点时间写(水)一篇博客。拓扑排序算法网上已经有很多的解释了,代码也是很多。笔者在这里提供一种较为简洁的书写方法,也很好理解。写了一点注释,大家看看就好,要是觉得简洁,可以改变一下自己的写法。#include<iostream>using namespace std;#include<queue>#include<vect
2022-05-12 15:29:29
148
原创 图的应用--最小生成树(Kruskal算法和Prime算法)
最小生成树往往用于解决图的连通性问题,树上任意一个结点可以到达另一个结点。假设一个情景:有n个城市,每个城市之间的距离不同,请问最短修多少米的路可以把这些城市连通起来。这就是最基本的一个最小生成树问题。最小生成树主要有两种算法,一种是Prime算法,还有一种是Kruskal算法,思想都是贪心。相较于前者,我更加习惯用后者解决算法问题,或许是这种算法较容易理解也便于实现。说一下两种算法的大致思想。Prime算法:第一步:先假设图上的所有点位于集合A中,从图上随机选取一个点,加入到集合B。第二步:找
2022-03-26 14:05:54
1395
原创 图的应用--最短路算法
本节适合对最短路稍有了解的读者阅读。最短路是图论这一节中重要的应用,涉及到了相当多的算法。当然这些算法可以不用全部掌握,但最少要略知一二。最短路问题求解主要有两个方向,一个是单源最短路,还有一个是多源最短路(就是是否只有一个起点)。单源最短路求解方法包含了Dijkstra算法,Bellman-ford算法和SPFA算法,而多源最短路问题主要就是用Floyd算法解决,但其时间复杂度较高,代码较为简单,一般算法竞赛中考的比较少(目前本蒟蒻是这样认为的)。算法分类大概如下所示:首先是Dijkstra算
2022-03-18 15:48:42
1680
原创 图论基础(图的存储和遍历)
图论是数据结构中最重要的一章。笔者打算将其分为几篇文章发布出来。本篇文章主要实现了图的存储和遍历,由于BFS,所以本节中用到了STL模板中的队列。比较尴尬的是,笔者这里的实现不适用于算法竞赛,可看但不好用,真正算法竞赛中都用数组实现的。但这种繁琐的代码实现有助于加深我们对图的熟悉程度,间接有利于解决图的问题。后面笔者准备发布“图的应用”的代码,会使用笔者认为较为方便的代码风格,同时也会加上例题,加深读者对这些应用的感受。现在校内数据结构课程似乎对数据结构应用代码的不足够重视,笔者认为一方面是因为实现难度较大
2022-03-15 13:15:02
1653
原创 哈夫曼树和哈夫曼编码
这节主要是树的应用。理解起来并不难,但代码实现有些复杂。想要完全掌握,就要多敲几遍。哈夫曼树是哈夫曼在大学时做课程设计时研究的,不得不感叹人与人之间确实有差距。下面是代码,有些复杂,建议找一个视频来辅助理解。#include"stdio.h"#include"stdlib.h" //该文件中包含malloc和free()#include<cstring>//顺序存储结构//哈夫曼树中一共有2n-1个结点,其中有n-1个是新生成的结点,可以开一个2n大小的数组typedef st
2022-03-11 11:55:41
346
1
原创 二叉树的遍历及各种操作
二叉树是数据结构中极为重要的一章,同时难度也不小,笔者也学了好几遍才彻底明白。贯穿二叉树始终都是递归的思想,如果递归的基础没有打牢,可能学起来会有些吃力。三种遍历方式(先序,中序,后序)是需要着重掌握的地方,检验自己是否真正弄懂,可以用模拟栈来实现三种遍历方式。由于上文所提的栈,以及本章所含的二叉树层次遍历,用到了栈和队列,所以本节代码中用到了c++的STL模板。当然不知道的也没有关系,之前笔者也发过这两种数据结构的手写实现,大家调用即可。#include<iostream>using
2022-03-09 20:28:02
540
1
原创 串的两种表示方法与 BF 及 KMP 匹配算法
串的操作和线性表差不多,但是其链式结构与链表有所不同,运用到了块链的结构。串的两种匹配算法应当是我们应该着重掌握的,BF算法十分简单,属于纯暴力。KMP算法十分晦涩难懂,代码不长,但是需要花一定的时间琢磨。笔者说点题外话:上个学期本人就看到了这个算法,研究了两三天没研究透,一度成为了笔者的噩梦。但当我这次再遇到后,琢磨了一个下午终于研究明白了。推荐B站上一个up主的视频,大家可以参考,up用了图解的形式对next数组的求解问题进行了直观的表现。KMP算法之求next数组代码讲解_哔哩哔哩_bilibil
2022-03-05 15:48:06
211
原创 栈和队列的实现(顺序结构和链式结构)
本节实现的两个数据结构,在实际生活中有不少的应用场景,手写可以加强我们对它们的理解。同时栈也是递归实现的抽象模型,递归应当着重掌握。顺序队列中实现循环的部分应当着重掌握,有点类似于约瑟夫环。#include"stdio.h"#include"stdlib.h" //该文件中包含malloc和free()#define MAXSIZE 100#define MAXQSIZE 100//函数结果状态代码#define TRUE 1#define FALSE 0#define OK 1#d
2022-03-04 11:43:16
511
原创 单链表的实现
单链表对指针操作要求较高,如果有不熟悉的,我推荐一个b站上的专门讲指针的视频。【强烈推荐】4小时彻底掌握C指针 - 顶尖程序员图文讲解 - UP主翻译校对 (已完结)_哔哩哔哩_bilibili视频是一个顶级的印度程序员讲述的,虽然口音有点怪,但是讲的十分清晰。笔者刷了两遍,受益匪浅。单链表各类操作差不多,一些细节需要注意,详细解释我放到代码注释里了。#include"stdio.h"#include"stdlib.h" //该文件中包含malloc和free()//函数结果状态.
2022-03-01 14:53:01
307
原创 顺序线性表的实现(c语言版)
作者学习之余,将顺序线性表的操作手敲了一遍,欢迎取用。同时日后将会持续更新,发布所有数据结构实现的代码。代码解释已放入注释中。#include"stdio.h"#include"stdlib.h" //该文件中包含malloc和free()#define list_init_size 100#define MAXSIZE 100//函数结果状态代码#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define INF
2022-02-27 19:38:33
336
原创 汉诺塔代码执行的流程图
汉诺塔是递归中的经典问题,很多人虽然懂得如何写汉诺塔的代码,但是并不能够完整地明白汉诺塔代码的调用逻辑。作者花了点时间,画了一张流程图,希望能够帮大家理解。
2021-12-07 18:41:28
3536
2
原创 数组越界不会报错的问题
数组的大小与最大下标关系为:数组大小—1=最大下标。及如果定义int a[10],那么a下标的值最大只能是9。那在VC++6.0中为什么可以给不存在的a[10]进行赋值?如果编译器每次都对下标的范围进行检测,那么程序运行速度会变慢。所以本着信任程序员的原则,编译器不会对下标是否越界进行检查,以此换来更快的运行速度。但随着编译器的不断改进,部分编译器(如visual stdio)变得更加智能,会提示下标溢出的错误,并终断程序运行。还有一个问题:既然a[10]不存在,那么是如何进行赋值的呢?数组开辟的.
2021-12-05 15:28:18
2491
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人