笔记
忆南妄北
这个作者很懒,什么都没留下…
展开
-
考研数据结构之topsort核心代码
代码// 由于拓扑排序需要考虑到入度,因此需要把邻接表的数据结构做如下更改如下更改struct vNode { int count; // 代表当前节点入度 ArcNode *firstarc;};// 核心代码int topsort(graph *G){ // 将入度为0的节点放到队列中 // 书中是放入栈,并无区别 queue<int> que; ArcNode *p; int num = 0; // 1. 将当原创 2021-06-09 21:18:11 · 160 阅读 · 0 评论 -
考研之floyd代码核心
代码// 存图方式为邻接矩阵// 方便遍历操作// a存储的是从i到j的最短的距离,path存储的是从i到j需要经过的一个中间节点void print_path(int a[][MAXN], int u, int v, int path[][MAXN]){ if (a[u][v] == INF) return ; else { if (a[u][v] == -1) // 直接输出当前边 else原创 2021-06-09 21:03:44 · 111 阅读 · 0 评论 -
考研数据结构之dijkstra核心代码实现cpp
代码本文使用vetor模拟邻接表,可以直接用二维数组void print_path(int path[], int a){ // path实际是一个双亲存储结构的树 // 只能从叶子节点找到根节点 // 因此需要一个栈,将序列倒着输出,即为从根节点到叶子节点 stack<int> s; while (path[a] != -1) // 一直向上直到查找到根节点 { s.push(a); // 思考一下如果这两句交换原创 2021-06-09 20:49:46 · 181 阅读 · 0 评论 -
判断无向图是否为树
解题思路一个无向图是树的条件是有n-1条边的连通图顶点个数和边的信息在结构体G中含有,剩下的就是判断图是否联通通过dfs如果能访问到所有节点那么这个图就是连通的,这里又计算了一个e其实是多余的部分代码const int MAXN = 1000;int vis[MAXN];void dfs(Graph *G, int v, int &n, int &e){ vis[v] = 1; n++; // 来到一个从来未访问过的节点, 计数器加一 Ar原创 2021-06-09 16:20:24 · 1284 阅读 · 0 评论 -
求不带权无向连通图中距离给定节点最远的节点
解题思路首先确定使用图的BFS,因为BFS是由近到远一点点蔓延过去的。所以队列中的最后一个节点一定是距离给定节点最远的点。代码实现vector模拟邻接表代码#include <iostream>#include <vector>#include <queue>using namespace std;const int MAXN = 2000;int vis[MAXN];//采用vector模拟图的邻接表存储方法//求图中离给定节点最远的节点原创 2021-06-09 16:05:26 · 939 阅读 · 0 评论 -
中缀表达式转后缀表达式
介绍中缀表达式就是我们平时书写的式子比如 2 * 3 + 5 - 4 * (2 + 3)后缀表达式又叫做逆波兰表达式表达式,可以让计算机快速求出一个式子的值。主要通过栈来辅助计算。 一,后缀计算e.g 1 2 3 4 + 8 * + 3 + *遍历整个字符串,将遇到的数字先压入栈中。此时栈中为:1 2 3 4遇到操作符时,从栈中弹出两个数字进行计算,并压入栈中。弹出4 3 相加后 栈中为:1 2 7继续一和二的操作,直到读取到字符串结束,此时栈顶原创 2021-05-03 20:30:39 · 192 阅读 · 0 评论 -
Java连接Oracle方法详解
导入驱动包首先我们得导入Oracle的驱动包,在Oracle安装目录下可以找到,导入它。具体位置是:app\计算机用户名\product\11.2.0\dbhome_1\jdbc\lib可能有的人不太一样,但是大致都差不多,像我就没有dbhome_1这个文件夹。我是直接进入的jdbc。如下图,选择一个将它拖入到java项目中,选择copy即可然后右键点击它,单击build path...原创 2020-04-08 12:00:56 · 4700 阅读 · 0 评论 -
Kolakoski序列
定义Kolakoski序列是一个仅由1和2组成的无限数列,是一种通过“自描述”来定义的数列。他的前几项为1,2,2,1,1,2,1,2,2,1,2,2,1,1,2,1,1,2,2,1,2,1,1,2,1,2,2,1,1,…(OEIS上的A000002)它的定义很简单,若把数列中相同的数定为一组,令a(1)=1,a(2)=2,则a(n)等于第n组数的长度。可以根据这个定义来推算第三项以后的数...原创 2020-04-03 08:02:14 · 806 阅读 · 0 评论 -
牛顿法推导平方根迭代公式
平方根迭代公式假设√a = x则平方根迭代公式为:xn+1 = 1/2 (xn + a/xn)推导过程假设有如上图的曲线,xn点的直线为曲线的切线,容易得到xn的方程为 f(xn) + f’(xn)(x - xn)上面的方程是根据泰勒级数展开后,去除高阶项后得到。这样让切线方程等于0的点的x设为xn+1,方程变为了f(xn) + f’(xn)(xn+1 - xn)(粗体是导数) =...原创 2020-02-22 10:02:20 · 3312 阅读 · 4 评论 -
错排问题-hdu2048
错排介绍n个有序的元素有n!种排列方式,如果一个排列使得所有元素都不在原来的位置上的排列就叫错排。错排推导(1)错排有两种方法进行计算,一种是基于容斥定理最后得出来的一个阶乘的计算式,计算机对于阶乘非常的不友好,因此第一种很少使用。(2)由于阶乘的原因,我们不得不再寻找一种计算错排Dn的方法。首先我们以1,2,3,4的错排为例子,(1,2)的错排唯一,是(2,1)(1,2,3) 的错...原创 2020-01-29 10:34:37 · 230 阅读 · 0 评论 -
普通母函数笔记
定义在数学中,某个序列的母函数(Generating function,又称生成函数)是一种形式幂级数,其每一项的系数可以提供关于这个序列的信息。使用母函数解决问题的方法称为母函数方法。详解以下内容参考Tonyyy的博客。首先举一个经典的例子。现有质量为1, 2, 3的砝码各一枚,问:(1)可以称出多少种不同质量的物品。(2)要称出质量为3的物品,有多少种方案。解:在数字逻辑中...原创 2020-01-27 15:17:37 · 431 阅读 · 0 评论 -
keras实现猫狗识别模型训练并验证
训练模型在项目中,我们可能没那么多时间去思考从算法方面去解决,更多的时候想的是能用就行,但是网上很多的例子很多是基于内置的数据,这是非常让人难受的,或者是基于一张图片进行数据增强,很痛苦。更一般的情况是,对训练集下的某一个文件夹的所有图片进行数据增强。因此需要下面这两个函数:首先介绍两个函数一个是图片读取ImageDataGenerator()。这是详细介绍。还有一个就是ImageDat...原创 2019-12-22 14:44:46 · 1662 阅读 · 5 评论 -
决策树IDC算法笔记(c++代码)
预备知识信息熵信息熵是由香农于1948年提出来的,从此以后,就通过信息熵的大小来判断这个信息包含的信息量。计算公式如下,其中pi代表的是信息 i 再所有信息中出现的几率。不难看出如果一个事件出现的概率小,他的信息熵就会大。因此它所包含的信息量也越多,为什么呢?举一个例子,太阳东升西落,每天都出现,因此它的信息熵很小,而且这种经常出现的事并不会包含什么信息量。而某地地震的话,不经常出现,因此...原创 2019-12-09 23:02:08 · 626 阅读 · 0 评论 -
普通莫队算法笔记
应用:莫队算法是求离线区间询问问题的算法,离线的意思就是上一次的结果并不会作为下一次的询问要求的且只查找询问不会修改的。时间复杂度为O(n*sqrt(n)),可以说是极大的降低了时间复杂度。原理对于一个离线区间询问问题,如果知道了区间[l, r]的结果就可以在O(1)内直到[l-1, r]或者 [l+1, r] 或者 [l, r-1] 或者 [l, r+1] 的结果。因此这个算法把整个数据n...原创 2019-11-29 11:10:40 · 106 阅读 · 0 评论 -
后缀数组倍增算法学习笔记
后缀数组后缀数组(suffix array),简称sa数组里面保存的是字符串s从小到大或从大到小的所有后缀。用处后续补,还不太清楚作用。算法思想首先牢牢记住sa[i],意思是排第 i 的后缀是谁,而rank[i]代表后缀 i 排第几。然后先放上盗来的图片,其实这个算法思路还是很简单的,难的地方在于编码。如果不了解基数排序的话,这个算法学起来非常的吃力,建议先看学习一下基数排序。对于...原创 2019-11-27 11:47:09 · 220 阅读 · 0 评论 -
基数排序
桶排序基数排序之前,先说一下桶排序,桶排序很好理解,比如序列array = {3, 1, 2, 5, 6, 8},这个数组,进行桶排序就可以申请一个大小为10的vis数组,把vis[array[i]]++。在从1遍历到10,只要碰到vis[i] != 0 就直接输出vis[i]个 i,最后就是array排完序的样子了。这个是比较容易理解。基数排序上面桶排序的缺点太明显了,浪费空间不说,如果数...原创 2019-11-22 09:55:28 · 154 阅读 · 0 评论 -
hdu1418 抱歉(多面体欧拉公式)
题目地址hdu1418解题思路首先已知多面体欧拉定理:面数 + 顶点数 - 棱数 = 2证明由于线段不相交,可以看作是三维多面体。AC代码#include <iostream>using namespace std;int main(){ long long n, m; while (scanf("%lld %lld", &n, &m) ...原创 2019-11-19 19:03:14 · 513 阅读 · 0 评论 -
归并排序
思想上面我们讲了快速排序,它的想法是近似于每次都把当前序列一分为二,让左边的小于基数,右边的大于基数。然后在进行递归左半部分和右半部分。他是思想可以说是从上至下,化整为零。这对于学计算机的来说是在熟悉不过的了,对于一个大的项目,都是给它从上到下,化整为零,然后逐个击破。而今天的归并排序,并不是这样的,它的思想正好和快排相反,你不是化整为零嘛,我就画零为整,我的每一个小的分块是有序的,在往上走,小...原创 2019-11-18 14:24:08 · 127 阅读 · 0 评论 -
快速排序
思想假设有这样一个序列,{6, 1, 2, 7, 9, 3, 4, 5, 10, 8},我们要对它进行排序,我就直接借用《啊哈算法》里面的讲解方式了。因为这本书写的真的是特别好。如图,左右分别有一个哨兵,并且左边的哨兵还是基数,现在需要在右边找到一个一个比基数小的数字,然后再从左边找到一个比基数大的数字。交换两者位置,直到左边的哨兵和右边的哨兵站在一个格子上。然后b先走(如果基数是在左边,...原创 2019-11-18 12:14:32 · 330 阅读 · 0 评论 -
散列表(hash表)学习
保留余数法我们知道用数组存数据的好处是直接存取,但是我们又没办法知道哪个元素到底在哪个位置,每次查找很不方便,那么我们能不能设计一个映射f(x),使得f(x)对应数组得一处下标,使用时只需要输入x就可以了?这就是今天得散列表。按照数据结构得顺序来的话,先用数组来实现,然后再试试链表,我们也先说一下数组。首先构造函数f(x)有很多方法,比如f(x) = x,直接把数据存入到它本身值得数组下标里...原创 2019-11-13 16:12:50 · 211 阅读 · 0 评论 -
三种建堆方式和堆排序模板
可以看看大佬的博客,讲解很好,博客模板//堆排序 升序采用大顶堆,降序采用小顶堆 #include <iostream>using namespace std;int a[500001];void adjust(int v, int n){ for (int i=2*v; i<=n; i=i*2) { if (i+1 <= n &&am...原创 2019-11-12 19:46:07 · 335 阅读 · 0 评论 -
莫比乌斯反演笔记
积性函数地址点进去后就能看到常见的积性函数了,我介绍几个下面证明经常用的完全积性函数。狄利克雷卷积如果两个函数f(n), g(n)为数论函数,他们的卷积定义为可简记为:h = f*g 读作“f卷g”。重要的一点性质是,如果两个函数为积性函数,那么他们两个进行卷积后还是一个积性函数。它满足交换律,结合律和分配律。莫比乌斯函数说莫比乌斯反演前,还是应该说一下莫比乌斯函数。...原创 2019-11-03 13:49:54 · 196 阅读 · 0 评论 -
欧拉函数性质
定义φ(n)代表1~n中与n互质的数。计算方法公式: 其中 pi 为n的所有质因子,只需要找到所有质因子然后套一下公式就行了,代码自己实现一下,挺简单的。性质性质1:φ是积性函数,但不是完全积性函数。因此当n, m互质的时候满足φ(n*m) = φ(n) * φ(m)。 把n分解为质因子乘积的形式为: 很显然他们每一个都是互质的,无论多少次方。又因为φ是积性函数,因此...原创 2019-11-02 21:49:49 · 438 阅读 · 0 评论 -
prim算法
挺久之前就学会了kruskal了,但是因为这个算法看起来非常的麻烦,没理解 ,所以一直到最近数据结构学习才认真的研究了一下,懂了之后其实挺简单的。不过要记住的是,只有无向网图才有生成树。首先先文字讲一下过程吧,然后在配合图片进行讲解。我们已知一个图的顶点集合为 U, 和一个已选取点的集合V。然后随机选取一个顶点,从U中删除,并加入到V中以它作为树根进行操作。接下来就是一个循环操作,每次都找一...原创 2019-10-31 18:24:19 · 186 阅读 · 0 评论 -
BSGS算法
BSGS算法介绍BSGS是用来解决形如 yx ≡ z mod p 的问题的,它能够在有解的情况下求出来最小值。这里前提是gcd(y, p) == 1,否则就需要exBSGS解决。算法过程首先我们让 x = i*m-k 这样上面的式子就变为了 yi*m/yk ≡ z mod p, 通过变换得到 yi*m ≡ z * yk mod p。其中m等于ceil(sqrt( p)),也就是向上取整根号...原创 2019-10-29 18:57:44 · 594 阅读 · 0 评论 -
哈夫曼树优先队列实现
哈夫曼树是什么就不解释了,直接贴代码了。#include <iostream>#include <queue>using namespace std;struct TreeNode{ int data; struct TreeNode *LeftChild; struct TreeNode *RightChild; //自定义排序规则...原创 2019-10-28 18:43:02 · 313 阅读 · 0 评论 -
求逆元的方法
逆元简介如果存在x使得a*x ≡ 1 mod ( p ), 我们就说x 是 a 的一个逆元。拓展欧几里得算法求逆元首先拓展欧几里得可以解决的问题是 ax + py = 1,这样通过拓展欧几里得算法求解出来的x既为a的逆元。因为对左右同时取模p,就变回了ax≡ 1 mod ( p )。得到的结果通过对x取模p就能的到最小的正逆元,如果需要当然也可以求出来负数逆元。代码如下:void exg...原创 2019-10-25 16:26:41 · 927 阅读 · 0 评论 -
除法取余解决方法
在实际做题中,我们经常能遇到对除法取余的式子,比如(a/b)%c。碰到这种情况我们有两种方法来解决。通用的方法(a/b)mod m = a mod(m*b) / b证明如下:通过逆元求解首先说一下费马小定理费马小定理(Fermat’s little theorem)是数论中的一个重要定理,在1636年提出。如果p是一个质数,而整数a不是p的倍数,则有a^(p-1)≡1(mod p)...原创 2019-10-24 22:44:27 · 2947 阅读 · 0 评论 -
计算几何(证明三角形内心公式: aOA+bOB+cOC = 0)
公式说明其中大写如果没加绝对值符号均为向量。 求三角形内心时会用到公式:aOA+bOB+cOC = 0 其中各点如图所示证明过程充分性证明 已知aOA+bOB+cOC = 0,证明O点为内接圆圆心。首先我们知道内接圆圆心为三个角的角平分线交点,只要证明O是三条角平分线交点就行了。 假设<A的角平分线交边BC于D。如图 由图可知向量OB = OD+DB...原创 2019-10-24 21:02:54 · 35257 阅读 · 1 评论 -
正则表达式笔记
正则表达式的用处众所周知,正则对于验证数据的准确性是很方便且重要的;它不仅是能验证表单的准确性,它对于服务器处理数据也是一个重要的辅助语言。通过正则表达式,可以把一类性质相似的字符串给匹配出来,比如从一个文本里找到所有超链接,如果单纯的查找实在是太难了,因为每一个超链接都不一样,但通过正则表达式就可以快速的找到。主要元素1,匹配任意字符(.)"."可以匹配任意一个字符。2,转义字符(\)...原创 2019-10-19 21:36:06 · 180 阅读 · 0 评论 -
费马大定理与费马小定理
费马大定理费马大定理,又被称为“费马最后的定理”,由17世纪法国数学家皮耶·德·费玛提出。他断言当整数n >2时,关于x, y, z的方程 xn + yn = zn 没有正整数解。德国佛尔夫斯克曾宣布以10万马克作为奖金奖给在他逝世后一百年内,第一个证明该定理的人,吸引了不少人尝试并递交他们的“证明”。被提出后,经历多人猜想辩证,历经三百多年的历史,最终在1995年被英国数学家安德鲁...原创 2019-08-19 11:19:11 · 2690 阅读 · 0 评论 -
poj3281-二分图-最大流
题意就是给N头牛,F个食物,D个饮料,每头牛喜欢的食物和饮料各不相同。一头牛需要吃到饭和饮料才能满足,问你最多满足多少头牛。其实二分图难的并不是算法,而是其构图过程。如果是简单的分配食物直接用二分图匹配就行,但现在要同时给一头牛分配饮料和食物,我们可以通过题目中给的信息,先画出来牛与食物和饮料的关系图。如图:看到这个图大家可能有一点感觉了,这在加一个s, t不就是一个求权值为1的最大流问题...原创 2019-07-28 16:32:22 · 227 阅读 · 0 评论 -
自己的KMP笔记,不喜勿喷
和其他大佬一样,先说一下暴力求解字符串匹配问题,为什么一定要说呢,因为kmp是根据暴力改进而来,理解了暴力后kmp就不难理解了。比如从s中匹配p,(匹配就是查找s中有没有一个子串等于p),给s串一个i,p串一个j,如果相同就均加一,如果不相等就把i回溯到开始的位置也就是i-j+1,然后把j归0。并不难理解,接下来看代码:#include <iostream>using name...原创 2019-08-08 12:42:56 · 171 阅读 · 0 评论 -
spfa板子
spfa算法是bellman-ford的优化,它比普通dijkstra快,并且可以计算负权回路,具体是通过一个队列,每次将可进行松弛的点放入队列里。循环结束是队列为空或者某个元素进队列的次数大于n次,当队列为空时,即可以找到最短路,而元素进入队列n次的话,就是有负权回路。网上的代码都有一个记录前驱的数组,如果实在不明白,就拿笔写写或者去掉这个,把循环从1-n。具体代码:#include <...原创 2019-08-05 23:52:18 · 229 阅读 · 0 评论 -
二分图最大匹配-poj3041
上一篇博客用最大流解决了二分图的最大匹配问题,并且简单的打了一下poj3041的代码这篇博客将介绍另一种方法并且详细讲解一下poj3041题目https://blog.csdn.net/qq_43227036/article/details/97526214先讲一下这个方法,就是dfs和回溯结合起来的一种算法。如下面这个例子,我们通过dfs先对u1找到了v1。如图:然后u2查找,但...原创 2019-07-28 12:58:29 · 242 阅读 · 0 评论 -
二分图最大匹配(最大流)
先举个例子,有N台计算机和K个任务,每个计算机只能执行一个任务,但可以执行多种任务。现在给出N和K,和其关系,求出最多能处理的任务数。这就是典型的二分图,整张图被分为两半,一半是电脑,一半是任务。这是多源点多汇点问题,我们只要加上两个点后,就可以把问题转换为单源单汇点问题。如图:看到这个图片大家肯定特别的熟悉,这不就转换为了我们的最大流问题了,权值只不过都是固定的1而已,其他的都是套模...原创 2019-07-27 16:42:27 · 4865 阅读 · 0 评论 -
网络流最大流-Ford-Fullerson和dinic算法,最小割
网络就是一张带权有向图,把其看作一个输水的管道更直观一点,源点就是整个系统的水源来处,汇点就是水流最后到达的地方。其他的中间点都是闸门,闸门是不会产生和私吞水量的,而每个闸门之间都是由管道连接的,这个管道决定了你能在这个通道中间最大传多少水。每个闸门之间又会交错相连,由此也就有了最大流问题,也就是这个网络最大的流量是多少。我们还需要知道一个定义:增广路:从源点找到一条能达到汇点的路,这条路会使...原创 2019-07-27 16:21:57 · 285 阅读 · 0 评论 -
poj3723--Conscription
最小生成树算法也就是kruskal算法,求最小森林也是这个算法如果求最大生成树或者最大生成森林就将权值变为负的,怎么理解呢?你想kruskal算法是将权值从小到大排序,变为负值后,最大的值就是最小的值由此求得的最小生成树,就是最大生成树了。下面看一个例题(原题网址)http://poj.org/problem?id=3723这道题很明显就是一道求最大生成树的题如果所有人都没有关系的话,...原创 2019-07-23 13:12:36 · 116 阅读 · 0 评论 -
poj1860--Currency Exchange
题目地址:http://poj.org/problem?id=1860题意就看看这位大佬翻译的吧,https://blog.csdn.net/yslcl12345/article/details/50574213这个题就是对Bellman-ford的一个反向应用,这个题问你能不能找到一种方式,让他的钱捣鼓捣鼓就能变多,平时的话Bellman-ford算法能找到一个负权回路,这个题要求钱数增多,...原创 2019-07-30 22:52:08 · 89 阅读 · 0 评论 -
Bellman-ford算法
Bellman-ford算法能解决有负权边的问题,完美的解决了迪杰特斯拉算法的缺点。核心代码:for (int i=1; i<=n-1; i++){ bool flag = false; for (int j=1; j<=m; j++) { if (dis[v[j]] > dis[u[j]] + cost[j]) { dis[v[j]] = dis[u...原创 2019-07-30 22:40:52 · 188 阅读 · 0 评论