《算法笔记》
老子是pat甲级皇帝,you know!
wsfhdhjs
这个作者很懒,什么都没留下…
展开
-
《算法笔记》第4章 入门篇(2)第13章 专题扩展
1.分块思想:原创 2020-10-21 19:32:20 · 68 阅读 · 0 评论 -
《算法笔记》第4章 入门篇(2)第11章 动态规划
1.动态规划概念:2.动态规划递归写法:裴波那契数列递归:int F(int n){ if(n==0 || n==1) return 1; else return F(n-1)+F(n-2);}引入数组dpint F(int n){ if(n==0 || n==1) { return 1; //递归边界 } if(dp[n]!=-1) //已经计算过,直接返回结果原创 2020-10-18 22:04:48 · 107 阅读 · 0 评论 -
《算法笔记》第4章 入门篇(2)---算法初步 10.7 关键路径
1.AOV网和AOE网超级源点和超级汇点:10.7.2 最长路径:10.7.3 关键路径:/* 拓扑排序: 1.设置栈 int类型 topOrder 2.bool拓扑排序函数: 1.设置队列q 2.for循环,将所有入度为0的点放入到队列q中 3.while循环: 1.取出队首元素 2.弹出 3.将u加入到拓扑序列中原创 2020-09-21 16:06:33 · 103 阅读 · 0 评论 -
《算法笔记》第4章 入门篇(2)---算法初步 10.6 拓扑排序
1.有向无环图:2.拓扑排序:/* 1.设置vector的int类型 邻接表G 2.设置int类型 n,m,inDegree[maxn] 顶点数,入度 3.bool类型的 topu排序: 1.设置int类型的 num为0 表示拓扑排序的顶点数 2.设置队列q 3.for循环从0--n,将入度为0的点放到队列中 4.while循环队列不为空 1.设置int类型u,为队首元素原创 2020-09-19 12:16:19 · 83 阅读 · 0 评论 -
《算法笔记》第4章 入门篇(2)---算法初步 10.5 最小生成树
10.5.1 最小生成树及其性质10.5.2 prim算法:(求一个无向图中的最小生成树)prim算法的具体实现:prim的邻接矩阵法+邻接表法:/* 邻接矩阵版本: 1.设置最大顶点数,和INF数 2.设置顶点数n和二维数组G 3.设置bool类型 数组 vis 标记其值均为false int类型的prim函数 1.默认从0号为初始起点,函数返回最小生成树的边权之和 2.通过fill,将数组d初始化为IN原创 2020-09-18 13:01:22 · 109 阅读 · 0 评论 -
《算法笔记》第4章 入门篇(2)---算法初步 10.4 最短路径
1.Dijkstra算法:引子:最短路径的方法:头文件:原创 2020-09-12 12:32:01 · 186 阅读 · 0 评论 -
《算法笔记》第4章 入门篇(2)---算法初步 10.3 图的遍历
前言:1.用DFS遍历图:2.DFS的具体实现:邻接表版本://设置最大顶点数 MAXV为1000//设置iNF为100000000000000000 表示一个很大的数//设置int类型 n, 二维数组G//bool类型 vis 初始化为false//函数DFS ,形参为 int u 表示当前访问的顶点编号 depth表示为深度/* 1.在vis中对当前u标记为true 2.for循环 v从0到n 如果vis中标记的是false 且 u可到v 继续调用原创 2020-09-12 11:48:58 · 116 阅读 · 0 评论 -
《算法笔记》第4章 入门篇(2)---算法初步 10.1图的定义和相关术语 10.2 图的存储
10.1 图的定义和相关术语图的存储1.邻接矩阵:2.邻接表:构造函数:#include<iostream>using namespace std;struct studentInfo{ int id; char gender; /* studentInfo(int _id, char _gender) //默认的 { //赋值 id=_id; gender=_gender原创 2020-09-07 12:35:49 · 75 阅读 · 0 评论 -
《算法笔记》第7章 入门篇(2)---算法初步 7.2 队列的应用
队列的基础知识:队列的清空:void clear(){ front=rear=-1;}获取队列内元素个数(size)int size(){ return rear-front;}判空(empty)bool empty(){ if(rear==front) return true; else return false;}入队(push)void push(int x){ q[rear++]=x;}出队(pop)void pop(){ f原创 2020-08-17 20:36:32 · 85 阅读 · 0 评论 -
《算法笔记》第4章 入门篇(2)---算法初步 9.8 哈夫曼树
9,8.1 哈夫曼树\原创 2020-08-17 20:40:16 · 115 阅读 · 0 评论 -
《算法笔记》第4章 入门篇(2)---算法初步 9.7堆
9.7.1 堆的定义与基本操作调整堆函数://设置最大值maxn为100//heap为堆,n为元素个数/* 1.对heap数组在[low,high]范围进行向下调整 2.low为欲调整的结点的数组下标,high一般为数组中最后一个结点的下标 3.void类型函数 downAdjust ,形参为int类型 low,high 4.int类型 i为low,j为i*2(即为左孩子) 5.while循环j<=high 1.如果j在倒数第1位原创 2020-08-16 21:47:05 · 175 阅读 · 0 评论 -
《算法笔记》第4章 入门篇(2)---算法初步 9.6 并查集
9.6.1 并查集的定义:9.6.2 并查集的基本操作:1.初始化:for(int i=1; i<=N; i++){ father[i]=i;}2.查找://findFather函数返回元素x所在的集合的根结点:int findFather(int x){ if(x!=father[x]) //如果不是根结点,继续循环 x=father[x]; //让x为自己的父亲结点 return x; }//使用递归来实现:原创 2020-08-16 20:48:23 · 103 阅读 · 0 评论 -
《算法笔记》第4章 入门篇(2)---算法初步 9.5 平衡二叉树(AVL树)
9.5.1 平衡二叉树(AVL树)/* AVL树的结构: 1.int 类型 v,height 2.node类型 左右孩子地址*/struct node{ int v,height; //v为结点权值,height为当前高度 node *lchild,*rchild; //左右孩子结点地址};/* 新建结点: 1.node类型 指针newnode,形参:int类型 v 2.用new申请一个node类型的指针原创 2020-08-11 21:26:37 · 100 阅读 · 0 评论 -
《算法笔记》第4章 入门篇(2)---算法初步 9.4 二叉查找树的定义
9.4 二叉查找树(BST)9.4.1 二叉查找树的定义;9.4.2 二叉查找树的基本操作:1.查找操作://search函数查找二叉查找树中数据域为x的结点//void类型函数search, 形参:node类型的指针root和int类型x//如果是空树则查找失败,并且输出search failded;//如果查找成功,就输出该数字//如果x比根结点数据域小,则在左边进行搜索,反之,在右边搜索void search(node *root,int x){ if(root==NU原创 2020-08-10 21:18:06 · 94 阅读 · 0 评论 -
《算法笔记》第4章 入门篇(2)---算法初步 9.3 树的遍历
9.3.1 树的静态写法:struct node{ typename data; //数据域 int child[maxn]; //指针域,存放所有子节点的下标}Node[maxn];struct node{ typename data; //数据域 vector<int> child; //指针域,存放所有子节点下标}Node[maxn];int index=0;int newNode(int v){ Nod原创 2020-08-05 19:18:51 · 96 阅读 · 0 评论 -
《算法笔记》第9章 提高篇(2)---数据结构专题 9.2 二叉树的遍历
9.2.1 先序遍历:类似于图中走迷宫,只要遇到岔路口就继续深入下去,一直到遍历完所有的岔路口,不碰到死胡同不回头原创 2020-07-30 22:09:39 · 178 阅读 · 0 评论 -
《算法笔记》第9章 提高篇(2)---数据结构专题 9.1 树与二叉树
9.1.1 树的定义与性质9.1.1 二叉树的递归定义:类似于图中走迷宫,只要遇到岔路口就继续深入下去,一直到遍历完所有的岔路口,不碰到死胡同不回头原创 2020-07-30 20:57:54 · 121 阅读 · 0 评论 -
《算法笔记》第8章 提高篇(2)---搜索专题 8.1 深度优先搜索(DFS)+8.2广度优先搜索(BFS)
8.1深度优先搜索DFS1.概念:类似于图中走迷宫,只要遇到岔路口就继续深入下去,一直到遍历完所有的岔路口,不碰到死胡同不回头2.使用递归的方式来实现深度优先搜索:3.看一个具体的例子://物品编号index//物品总重量sumW,总价值sumC//如果不放入index号物品,则sumW不变,总价值sumC也不变//如果index+1,则前往DFS(index+1,sumW+w[index],sumC+c[index]);//一直到index增长到n,说明把n件物品遍历完了,此时s原创 2020-07-27 22:53:50 · 187 阅读 · 0 评论 -
《算法笔记》第4章 入门篇(2)---算法初步 7.3 链表处理
7.3.1 链表的概念struct node{ typename data; //数据域 node *next; //指针域}; 带头结点的链表,链表实际的存储方式7.3.2 使用new运算符为链表结点分配内存空间 其结构为:new+类型名typename *p=new typename; //typenam类型的指针int *p=new int; //int类型的指针node *p=new node; //node类型的指针 如果new申请失败,则使原创 2020-07-23 20:39:12 · 82 阅读 · 0 评论 -
《算法笔记》第7章 入门篇(2)---算法初步 7.1栈的应用
栈的基础知识:栈的清空:void clear(){ TOP=-1;}获取栈内元素个数(size)int size(){ return TOP+1;}判空(empty)bool empty(){ if(TOP==-1) return true; else return false;}进栈(push)void push(int x){ st[++TOP]=x;}出栈(pop)void pop(){ TOP--;}取栈顶元素(top原创 2020-07-09 21:07:39 · 93 阅读 · 0 评论 -
《算法笔记》第4章 入门篇(2)---算法初步 5.8 组合数
5.8.1关于n!的一个问题:方法1://计算n!中有多少质因子pint cal(int n, int p){ int ans=0; for(int i=2; i<=n; i++) //从2开始遍历一直到n表示n! { int temp=i; while(temp%p==0) //只要temp还是p的倍数则进行统计 { ans++; //p的个数加1 temp/=p; } } return ans;}方法2://计算n!中有多少质因子原创 2020-07-09 20:38:06 · 123 阅读 · 0 评论 -
《算法笔记》第4章 入门篇(2)---算法初步 5.7 扩展欧几里得算法
5.1扩展欧几里得算法定义:int exGcd(int a, int b, int &x, int &y){ //x和y使用引用 if(b==0) { x=1; y=0; return a; } int g=exGcd(b,a%b,x,y); //递归计算exGcd(b,a%b) int temp=x; //存放x的值 x=y; //更新x=y(old) y=temp-a/b*y; //更新y=x(old)-a/b*y(old原创 2020-07-09 19:38:48 · 92 阅读 · 0 评论 -
《算法笔记》第4章 入门篇(2)---算法初步 5.6 大整数运算
1.大整数的存储:大整数结构:数组+长度struct bign{ int a[1000]; int len; //len表示其长度}构造函数:初始化结构体函数,函数名与结构体名相同,无返回值,写在结构体内部:struct bign{ int a[1000]; int len; //len表示其长度 begin() { memset(a,0,sizeof(a)); len=0; } }:将字符串逆转为结构体数组:由于都是用字符串来接受输入的数据,原创 2020-07-06 21:53:00 · 115 阅读 · 0 评论 -
《算法笔记》第4章 入门篇(2)---算法初步 5.5 质因子分解
1.什么是质因子:质因子结构:struct factor{ int x,cnt; //x为质因子,cnt为其个数}fac[10]; //对一个int类型的数字而言,将长度开到10即可进行质因子分解:1.如果p是质因子,如下:if(n%prime[i]==0) //如果prime[i]是质因子{ fac[num].x=prime[i]; //记录该因子 fac[num].cnt=0; while(n%prime[i]==0) //统计出原创 2020-07-01 22:40:56 · 147 阅读 · 0 评论 -
《算法笔记》第4章 入门篇(2)---算法初步 5.4素数
什么是素数:除了自身和1之外没有其他因子,则称为素数5.4.1 素数的判断:1.就是循环的长度从i=2~~i<=sqrt(n)的代码:bool isPrime(int n){ if(n<=1) return false; //n<1叫做待判断 for(int i=2; i<=(int)sqrt(1.0*n); i++) //遍历2~~sqrt(n) { //由于sqrt的参数需要浮点数,所以必须给n*小数原创 2020-06-25 22:40:48 · 133 阅读 · 0 评论 -
《算法笔记》第4章 入门篇(2)---算法初步 5.3 分数的四则运算
5.3.1 分数的表示和简化:1.分数的表示:struct Fraction{ int up,down;};2.分数的化简:struct Fraction{ int up,down; //设置一个分数结构,分母为up,分子为down};Fraction reduction(Fraction result){ if(result.up<0) //如果 分子<0,则把分母,分子都设置为相反数 { result.up原创 2020-06-23 21:52:12 · 128 阅读 · 0 评论 -
《算法笔记》第4章 入门篇(2)---算法初步 5.2.2 最小公倍数
最小公倍数本来是m*n/d(d表示最大公约数),如果m * n有溢出,则应该写成m / d * n原创 2020-06-23 19:48:19 · 102 阅读 · 0 评论 -
《算法笔记》第4章 入门篇(2)---算法初步 5.2.1 最大公约数
1.什么是最大公约数和辗转相除法:2.辗转相除法的具体写法:3.普通版本://普通版本:int gcd(int a, int b){ if(b==0) return a; else return gcd(b,a%b);}4.改进版本://改进版本int gcd(int a, int b){ return !b?a:gcd(b,a%b);}5.输出两个数的最大公约数:参考代码:#include<iostre原创 2020-06-23 19:44:22 · 111 阅读 · 0 评论 -
《算法笔记》第4章 入门篇(2)---算法初步 5.1简单数学
5.1A1069题目意思:输入:输出:解题思路:参考代码:#include<iostream>#include<algorithm>using namespace std;/* 解题思路: 1.这道题中,也就是除了数字为6174或者0000,剩下的都要输出,在输出完之后可以判断上一次计算结果是否为6174 或者0000,如果是则退出循环(当然循环设置为死循环),否则继续循环 2.注意在输入过程中,字符串s有可能不是4位,所以原创 2020-06-22 20:20:45 · 120 阅读 · 0 评论 -
《算法笔记》第4章 入门篇(2)---算法初步 4.7其他高效技巧和算法
4.7.1 打表原创 2020-06-14 21:32:51 · 98 阅读 · 0 评论 -
《算法笔记》第4章 入门篇(2)---算法初步 4.6 two pointer
4.5.1二分查找two pointers的引入:for(int i=0; i<n; i++)for(int j=0; j<n; j++){ if(a[i]+a[j]==m) cout << a[i] << a[j] << endl;}此方法效率低下原因:使用two pointers方法:使用two pointers方法的时间复杂度分析:使用two pointers序列合并问题:int merge(int A[], int原创 2020-06-08 19:19:27 · 186 阅读 · 0 评论 -
《算法笔记》第4章 入门篇(2)---算法初步 4.5二分
4.5.1二分查找二分查找概念:二分查找实例:注意二分查找的过程与序列的下标从0开始还是从1开始无关,参考代码如下:#include<iostream>using namespace std;int erfen(int a[],int left,int right,int x){ int mid; while(left<=right) { mid=(left+right)/2; if(a[mid]>x)原创 2020-06-02 23:14:22 · 129 阅读 · 0 评论 -
《算法笔记》第4章 入门篇(2)---算法初步 4.3递归
4.3.2 递归(很适合实现分治的思想):递归的两个重要概念: 1.递归式:将原问题分解为若干个子问题的手段 2.递归边界:分解的尽头1.递归实现n!#include<iostream>using namespace std;int Fun(int n){ if(n==0 || n==1) return 1; else return Fun(n-1)+Fun(n-2);}int main(){ i原创 2020-05-30 21:32:08 · 195 阅读 · 0 评论 -
《算法笔记》第4章 入门篇(2)---算法初步 4.2散列
4.2.1 散列的定义与整数散列1.散列的引入:2.散列的概念:1. 在N个数中,查询M个数是否存在#include<iostream>using namespace std;const maxn=100010;bool v[maxn]={false};int main(){ int n,m; cin >> n >> m; for(int i=0; i<n; i++) { int temp; cin >> temp;原创 2020-05-30 21:30:23 · 225 阅读 · 0 评论 -
《算法笔记》第4章 入门篇(2)---算法初步 4.4贪心
4.4.1简单贪心:4.4.1.1基本概念:void selectSort(){ for(int i=1; i<=n; i++) //进行n趟操作 { int k=i; for(int j=i; j<=n; j++) //选出[i,n]中最小的元素,下标为k { if(A[j]<A[k]) { k=j; }原创 2020-05-28 19:43:46 · 110 阅读 · 0 评论 -
《算法笔记》第4章 入门篇(2)---算法初步 4.1排序
阿诗丹原创 2020-05-11 23:38:14 · 139 阅读 · 0 评论