算法与数据结构
本人在学习算法与数据结构时的代码与批注
秃头的毛睿
爱好是力量,篮球和技术以及漂亮的姑娘;
梦想是做一名会编码的厨子。
展开
-
减治算法——序列中第k大的数字
现在有一个无序序列T,我们现在的需求是寻找其中第k大的一个数字。这种问题我一般就直接sort然后返回了,但是这里使用减治法,我们可以参考之前的快速排序的思路,先把整个数组从轴值划分,但是不用像快排那样对轴值两边的再次划分,只用对下标判断之后对一边进行划分或者得到结果。#include<iostream>#include<vector>using namespace std;//查找一个序列中第k大的元素void Swap(int&a,int&b){原创 2020-11-06 11:14:17 · 581 阅读 · 1 评论 -
减治算法——两个序列的中位数
这种算法与分治算法类似,分治法是把一个大问题分成若干个子问题,分别求解各个子问题,然后再把子问题的解进行合并得到原问题的解。而剪枝法同样是把一个大问题划分成为若干个子问题,但是这些子问题不需要分别求解,只需要求解其中一个子问题,所以也不需要对子问题的解进行合并。所以严格的说减治法是一种退化了的分治法。问题:规定一个长度为n(n>=1)的升序序列S,处在第n/2个位置的数称为序列S的中位数,例如,序列S1={11,13,15,17,19}的中位数是15.两个序列的中位数是他们所有元素的升序序列的原创 2020-11-03 14:11:16 · 1632 阅读 · 0 评论 -
分治算法——棋盘覆盖问题
整个题目还是分治的思想,由于棋盘是2^k*2^k的,所以我们可以把他平均分成4份,每一份再递归的调用覆盖函数,直到需要覆盖的边长为1,说明只有一个位置,并且该位置放置的是特殊方格。传入的参数中,tr,tc是棋盘的坐标,dr,dc是已经特殊方格的坐标,size是棋盘的边长。覆盖函数的思路就是,从宏观的角度思考,把棋盘分为左上右上,左下右下,如果方格在当前的方位,就递归的覆盖棋盘,如果方格不在当前方位,就把目前围绕整个棋盘中心点的四个方格的当前方位的方格填充,并当作下一次递归的特殊方格。#in..原创 2020-10-20 16:02:24 · 585 阅读 · 0 评论 -
分治算法——最大子段和问题
最大字段和原创 2020-10-18 14:49:28 · 1759 阅读 · 0 评论 -
分治算法——数字旋转矩阵
这道题以前就写过,使用的是循环以及判断,最近学习了分治的思想,这个思想其实以前学习归并的时候就大概有个体会,但是最近系统学习了这个思想,有了更加体系的思想。#include<vector>#include<iostream>using namespace std;void Helix_matrix(vector<vector<int>>&mtx,int begin,int size,int number){ if(size==.原创 2020-10-18 08:28:14 · 648 阅读 · 0 评论 -
算法——快速排序
快速排序原创 2020-10-14 23:17:25 · 158 阅读 · 0 评论 -
数据结构——散列表
定义:散列表是一种以常数平均时间执行插入、删除和查找的技术。它可以根据给定的关键字来计算关键字在表中的地址的数据结构,它建立了关键字和存储地址之间的一种直接映射关系。散列函数就是可以将每个关键字映射到从0到 散列表长度-1 这个范围中的某个数,并且放到适当的单元中的一种函数。冲突就是当散列函数把两个或者两个以上的不同关键字映射到同一地址的时候,我们把这种情况的发生称为冲突,这些发生碰撞的不同关键字称为同义词。散列函数的构造方法:1.直接寻址法:取关键字的某个线性函数为散列地址,散列函数为原创 2020-07-13 17:20:17 · 1653 阅读 · 0 评论 -
数据结构——并查集
并查集这个数据结构可以查询两个节点是否相连,给所有相连节点赋予相同的祖先,使用数组实现,数组下标代表每一个不同节点,而数组中的元素代表的是每一个节点的祖先,一开始所有节点的祖先都是本身,所有链接操作完成之后如果还有节点的祖先是他本身,说明这个节点就是一片链接的节点的最终祖先节点,否则当前节点就不是最终祖先节点!!!class union_set{private: vector<int>parents;public: union_set(int len);//初始化并查原创 2020-07-10 15:01:17 · 70 阅读 · 0 评论 -
数据结构——字典树
字典树是一个存储字符串集合的一种数据结构,它显著的特点就是牺牲大量的空间来换取程序运行的时间。当字符串有公共前缀的时候会公用一个分支,节点中的flag标志标记着从头节点到当前节点沿途字母是否构成一个单词,而节点中包含的一个长达26的指针数组的下标是可以理解为当前节点所代表的字母(由于所有小写字母只有26个,所以数组长度为26),而指针指示的是下一个字母的节点的地址。1.插入操作void Tries::insert(const string&s){ Tries*cur=this原创 2020-07-09 22:30:40 · 127 阅读 · 0 评论 -
算法——判断一棵二叉树是否是平衡二叉树
计算一棵树的高度int height(TreeNode*p){ if(p==nullptr) return 0; return max(height(p->left),height(p->right))+1;}真正确定上下界的检查函数bool For_use(TreeNode*p,long long int low,long long int top){ if(p==nullptr) return true;原创 2020-07-04 22:24:54 · 359 阅读 · 0 评论 -
数据结构——平衡二叉树
建议学习此数据结构可以先观看此视频https://www.bilibili.com/video/BV1xE411h7dd平衡二叉树的定义:1.必须是一颗二叉查找树;2.每一个节点的左子树和右子树的高度差至多为1。平衡因子:二叉树节点的左子树高度减去右子树高度的值称为该节点的平衡因子(我在代码中的注释称为平衡度),一个平衡二叉树节点的平衡因子只能是0,1,-1.平衡二叉树的节点结构:typedef struct tree{ int data; int hei原创 2020-07-04 17:40:43 · 277 阅读 · 0 评论 -
数据结构——二叉搜索树
二叉树搜索树是一种特殊的二叉树,他对于树中的每一个节点X,他的左子树中的所有关键字的值都小于节点X,而它右子树中的所有关键字的值都大于节点X。一.插入算法:1.沿着树查找,如果找到了插入值x,就什么都不做;2.否则就判断当前节点和x的大小,如果x比当前节点小,就向左子树搜索,否则向右子树搜索;3.直到搜索的节点为空,那么就在该节点处创建一个新的节点并且插入值,然后返回新节点的地址,由其正确的父节点正确的建立链接。tree* ADT::insert(int x,tree*p){原创 2020-06-29 20:41:42 · 173 阅读 · 0 评论 -
算法——有向图的最短路径算法
建议学习最短路径算法时,观看这个视频https://www.bilibili.com/video/BV1q4411M7r9?from=search&seid=9662298119837732890Dijkstra算法//有向图#include<iostream>#include<vector>#include<queue>#include<climits>using namespace std;//边表节点typedef .原创 2020-06-20 08:46:00 · 3233 阅读 · 0 评论 -
算法——无向图的最短路径算法
https://www.jb51.net/article/154796.htm我是看上面的文章写的程序,他的第一种解法还需要我再理解理解!!思路:1.先从v到u的使用BFS遍历一遍图,得到每个节点到v的最短距离,使用数组first记录;2.再从v到u的使用BFS遍历一遍图,得到每个节点到u的最短距离leastpath,同时判断first[v]-每一个节点的leastpath,看是否等于每一个节点对应的first数组的值。3.如果相等,说明当前节点是最小路径的其中一个节点,但是当前算法也有原创 2020-06-17 22:33:53 · 7825 阅读 · 0 评论 -
算法——lower_bound和upper_bound的实现
二分法实现两个搜索算法1.lower_bound寻找数组中第一个大于等于target的数的下标,如果全部小于target的话,返回-1int lower_bound(vector<int>&nums,int target)//寻找数组中第一个大于等于target的数的下标,如果全部小于target的话,返回-1{ int len=nums.size(); int left=0; int right=len-1; int mid; i原创 2020-06-14 22:57:53 · 520 阅读 · 1 评论 -
算法——判断无向图是否含有回路
1.并查集——存疑无法实现2.DFS——存疑无法实现3.剪枝法剪枝法思路:1.如果存在环,那么环中所有节点的度是大于等于2的2.根据图论,如果无向图弧的个数大于等于节点个数,那么图必定存在环3.把度小于2的点全部删除,并且删除与此节点相关的弧,再统计剩下节点度小于2的点,再把这些点删除,同时删除与此节点相关的弧,直到最后,形成环的节点是不会被删除的,所以如果结束后,删除节点个数小于总结点个数,那么有环,否则无环4.整个算法借助栈来实现,并使用一个标记数组来表示节点的被删除状态,用原创 2020-06-13 16:01:41 · 2624 阅读 · 0 评论 -
算法——判断有向图是否有回路
思路:一.借助AOV的拓扑排序算法来对整个有向图进行排序拓扑排序算法:1.统计所有节点的入度2.把所有入度为0的节点入栈3.在栈不为空的条件下把栈顶元素一个一个的弹出,并把与此节点相连的节点(即此节点指向的节点)的入度减一,再判断入度减一的节点的入度是否为0,如果为0就把此节点入栈。二.判断拓扑排序遍历的节点个数如果恰好等于节点总数,说明此有向图中没有回路否则说明图中有回路关键代码:int AOV::Topusort_AOV(){ stack<int原创 2020-06-12 19:36:24 · 7421 阅读 · 2 评论 -
算法——Kruskal与数据结构——并查集的应用
使用并查集来检测弧的两端节点是否连通。#include<iostream>#include<vector>#include<climits>#include<cstdbool>#include<algorithm>using namespace std;//并查集class union_set{private: vector<int>parents;public: union_set(int .原创 2020-06-11 09:03:56 · 103 阅读 · 0 评论 -
算法——DFS的非递归实现
思路:#include<iostream>#include<stack>#include<vector>using namespace std;//边表节点typedef struct ADTnode{ int node; ADTnode*next; ADTnode(int x,ADTnode*p):node(x),next(p) {}} ADTnode; //顶点表节点typedef struct upnode{ .原创 2020-06-06 21:55:04 · 744 阅读 · 0 评论 -
数据结构——AOE与算法——关键路径的计算
AOE图:节点表示事件,弧表示活动,弧的权重表示活动进行的时间。关键路径:在AOE网中,从起始点到终点具有最大路径长度的一条路径被称为关键路径。算法思路:1.利用拓扑排序求出AOE网的一个拓扑序列;2.从拓扑排序的序列的第一个顶点(源点)开始,按拓扑顺序依次计算每个事件的最早发生时间;3.再从拓扑排序的序列的最后一个顶点开始,按拓扑排序依次计算每个事件的最晚发生时间4.然后根据每个事件的最早发生时间与最晚发生时间来计算每一个活动的最早与最晚发生时间,如果活动的最早与最晚发生时间相等,原创 2020-06-06 19:45:08 · 1062 阅读 · 2 评论 -
数据结构——AOV图与算法——拓扑排序
#include<iostream>#include<vector>#include<stack>using namespace std;//边表节点typedef struct ADTnode{ int node; ADTnode*next; ADTnode(int x,ADTnode*p):node(x),next(p) {}}ADTnode;//顶点表节点typedef struct upnode{ int no.原创 2020-06-04 19:13:10 · 2777 阅读 · 0 评论 -
数据结构——最小生成树
1.Prim算法思路:(1).选取图中任意一个节点(2).将选取的节点加入集合(3).在集合中的所有节点中的周边弧选取权重最短的弧与集合外的节点进行连接(4).把新的节点入集合,并且执行下一次的选择,直到所有弧都选择完毕 邻接矩阵的实现:#include<iostream>#include<vector>#include<climits>using namespace std;//Prim算法———邻接矩阵clas...原创 2020-06-01 22:43:33 · 283 阅读 · 0 评论 -
数据结构栈的应用——表达式求值
#include<iostream>#include<string>using namespace std;class Stack{private: string Expression; double numbers[1000]; int c_top=-1;//运算符栈顶元素下标 int c_i=0; int d_top=-1;//数值栈顶元素下标 int d_j=0;public: //运算符栈 voi.原创 2020-05-28 19:23:42 · 107 阅读 · 0 评论 -
数据结构——二叉树
//二叉树#include<iostream>#include<queue>#include<stack>using namespace std;//二叉树节点(储存自然数整形数据)//三叉链节点typedef struct TreeNode_th{ int data;//数据域 TreeNode_th*leftchild;//左孩子 TreeNode_th*rightchild;//右孩子 TreeNode_th*par.原创 2020-05-28 18:04:09 · 124 阅读 · 0 评论 -
数据结构——哈夫曼树
/*数组形式的哈夫曼树*/#include<iostream>#include<vector>#include<algorithm>using namespace std;typedef struct HuffmanTree{ int weight;//当前节点的权值 int parents;//双亲结点 int lchild;//左孩子 int rchild;//右孩子}HuffmanTree;typedef stru.原创 2020-05-28 18:01:13 · 137 阅读 · 0 评论 -
数据结构——矩阵
#include<iostream>#include<vector>#include<algorithm>#include<string>#define MAXSIZE 100using namespace std;//对特殊矩阵的操作class spematrix{public: //保存上三角 void saveup(vector<vector<int>>&mtx,int mu) .原创 2020-05-28 17:58:07 · 280 阅读 · 0 评论 -
数据结构——图
#include<iostream>#include<vector>#include<stack>#include<queue>using namespace std;//邻接表的节点声明与定义//边表节点typedef struct ArcNode{ int Adjvex; ArcNode*next=nullptr; ArcNode(int x,ArcNode*p):Adjvex(x),next(p) {}} .原创 2020-05-28 13:03:14 · 161 阅读 · 0 评论