算法
偷到月亮了吗.
这个作者很懒,什么都没留下…
展开
-
图的深度优先遍历(DFS)和广度优先遍历(BFS)非递归实现C++
1. 思想从已发现的顶点集合F中拿出一个顶点,访问该顶点,将该顶点的所有相邻且未被发现的顶点加入F,继续执行上述操作,直至F为空。若F为栈,则是深度优先,为队列,则是广度优先。2. 图度优先遍历(DFS)void DFS(MGraph G) //栈实现DFS{ stack<int> visit; //栈,已发现,未访问过的点 int flag[MaxVex]; //标记已访问过的点 for (int i = 0; i < G.numVer; i++) flag[i原创 2022-03-04 08:56:49 · 1304 阅读 · 2 评论 -
数据结构总结
一、线性表一组先后有序存储的数据,分为顺序存储和链式存储。我们把链式存储第一个结点叫做头指针,不存储数据,当头指针的next为空时,线性表空;链式线性表插入数据一般使用头插法,这样更简单而且不用再单独用一个指针。顺序:Typedef struct{ ElemType data[MAXSIZE]; int length;}链式:Typedef struct Node{ ElemType data; struct Node *next;}另外还有一种特殊的结构,静态链表,原创 2022-03-13 17:14:26 · 601 阅读 · 0 评论 -
排序算法合集:冒泡排序、选择排序、插入排序、希尔排序、堆排序、递归归并排序、非递归归并排序、快速排序
部分排序算法的理解由小到大简单选择排序:从未排序序列中选择一个最小的,加入到已排好序列末尾。直接插入排序:当前结点之前的序列已全部排好,若当前值小于前一个结点,说明它需要换位置,把它先存起来,然后在它之前的序列中,所有比它大的序列后移一位,再把这个结点放到空出来的位置上。希尔排序:设置一个增量k,从第一个点开始,它以及与它相隔n个k位置的数看作一组,每个组内的几个数据用插入方式排好序;实际实现的方式是,从第一个点加上增量k+1的点,也就是第一个分组的第二个点的位置开始,往后逐个做各原创 2022-03-11 21:30:12 · 1071 阅读 · 0 评论 -
散列表查找(哈希表)C++
概述哈希表查找的思想就是,用哈希函数对每个数据根据键值直接计算出存储位置,这样查找时就不需要逐个比对。哈希查找的重点就是哈希函数的选择以及冲突的处理,不同选择会影响查找的速度。例子哈希函数:addr = key%m冲突处理:(addr+1)%m#include<iostream>using namespace std;#define HASHSIZE 20#define NULLKEY -12345typedef struct{ int* elem; int co原创 2022-03-09 14:46:51 · 1297 阅读 · 0 评论 -
二叉排序(搜索)树
特点每个顶点总是大于它的左孩子,小于它的右孩子。插入新结点:沿着根节点开始,key大于当前结点就往右子树搜,小于当前结点就往右子树搜,如果等于,说明已经有该结点,插入失败,否则,一直到叶子结点,将当前结点插入对应位置称为新的叶子。删除结点:先找有无结点p,若无,删除失败。若有,分为三种情况:p只有左孩子,将左孩子链接到p的父结点,删除p;p只有右孩子,将右孩子链接到p的父结点,删除p;p有两个孩子,找到p的左孩子的最右孙子,或者p的右孩子的最左孙子,根据二叉排序树的特点可以知道这两个点最接近p,原创 2022-03-09 10:11:18 · 41 阅读 · 0 评论 -
斐波那契查找C++
斐波那契数列首先要知道斐波那契数列,它利用了黄金分割原理,该序列越往后越接近黄金分割比例0.618,前两个数是对后一个数的分割。算法思路首先要会二分查找,斐波那契查找是对二分查找的mid值的改进。首先我们根据查找数组的长度n,找到大于n且与之最接近的斐波那契数 F[k], 这样我们在后面计算时就可以把这个查找数组根据长度按黄金分割比例分为左右两部分,我们分为左边长F[k-2],右边长F[k-1]。取mid为low+左边长度F[k-1] -1,比较key和a[mid],跟二分查找一样,修改low和h原创 2022-03-06 09:53:52 · 995 阅读 · 0 评论 -
AOE网关键路径算法C++(结合拓扑排序)
AOE网AOE即用边来表示活动,点表示事件的网,为有向无环图。只有进入顶点之前的活动全部完成后,才可以开始当前事件。关键路径完成整个工程所需的最短时间取决于从起点到终点中,具有最长路径长度的路径,这条路径即为关键路径。求解过程先求出每个事件(顶点)的最早开始时间(etv)和最晚开始时间(ltv),再根据这个顺序求得每个活动(边)的最早开始时间(ete)和最晚开始时间(lte),ete = lte 的活动即为关键活动。先初始化etv[ ] = {0};etv[ i ] = max{ (etv[原创 2022-03-05 16:15:40 · 2133 阅读 · 0 评论 -
KMP算法C++
#include<iostream>#include<string>using namespace std; int* KMP_next(string T){ int* next = new int[T.length()];//重点,对指针数组的理解 int i = 0, j = -1; next[0] = -1; while (i < 6) { if (j == -1 || T[i] == T[j]) next[++i] = ++j; els原创 2022-03-05 10:19:21 · 324 阅读 · 0 评论 -
C++拓扑排序
思想1.先求的图中每个顶点的入度,将入度为0的顶点加入栈或者队列 F;2.从F中取出一个顶点,输出,count++,并删除它的出边,将它邻接顶点的入度-1,并将修改后入度为0的顶点加入F;3.重复第二步直至F为空,若count等于图的总顶点数,说明图中无环。代码//输入示例// 6 7 0 1 2 3 4 5 0 1 1 0 2 3 0 4 3 1 3 5 2 3 1 3 5 4 3 4 3#include<iostream>#include <stack原创 2022-03-05 10:15:15 · 346 阅读 · 0 评论