基础算法
文章平均质量分 61
moomhxy
你若是天才,我便是疯子
展开
-
辗转相除法求最大公约数与最小公倍数
非常简单的一个小代码,想起初学时看半天没懂,今天遇到了就总结了一下,看代码:#include<stdio.h>int main(){ int a,b,c,d,t,max,min; scanf("%d%d",&a,&b); if(b>a) //如果b>a,交换双方的值,使大者a为被除数 { t=...原创 2018-05-11 17:03:56 · 818 阅读 · 0 评论 -
矩阵快速幂及斐波那契数列模板
本篇博客先给出矩阵快速幂以及利用矩阵快速幂求斐波那契数列的模板,讲解待更新…… const int N=10;int tmp[N][N];void multi(int a[][N],int b[][N],int n){ memset(tmp,0,sizeof tmp); for(int i=0;i<n;i++) for(int j=0;j<n...原创 2018-10-20 10:14:31 · 921 阅读 · 0 评论 -
最短路算法
本文总结了图的几种最短路径算法的实现:深度或广度优先搜索算法,弗洛伊德算法,迪杰斯特拉算法,Bellman-Ford算法1),深度或广度优先搜索算法(解决单源最短路径)从起始结点开始访问所有的深度遍历路径或广度优先路径,则到达终点结点的路径有多条,取其中路径权值最短的一条则为最短路径。下面是核心代码:void dfs(int cur, int dst){ /***oper...转载 2018-11-01 14:25:40 · 590 阅读 · 0 评论 -
并查集
性质并查集算法(union_find sets)不支持分割一个集合,求连通子图、求最小生成树初始化我们将每一个结点的前导结点设置为自己,如果在join函数时未能形成连通,将独立成点for(int i=0;i<n;i++)//n表示输入的结点的个数{ pre[i]=i;//将每一个结点的前导点设置为自己}用法并查集是由一个数组pre[],和两个函数构成的...原创 2018-11-06 17:19:05 · 641 阅读 · 0 评论 -
数据结构二叉树的创建构造及遍历等常用操作详解【C++】
前言 最近学到了二叉树,就学着将二叉树构造,并尝试三种遍历操作。本次主要使用递归,回头会整理非递归的方法。 定义二叉树 typedef int TelemType;typedef struct BinaryTree{ TelemType data; struct BinaryTree *lchild; struct Binar...原创 2018-11-06 22:21:17 · 807 阅读 · 0 评论 -
树状数组入门
前言 最近初学树状数组,原理还不是太理解,等自己什么时候完全理解了再自己总结一番。掌握树状数组~彻底入门先贴一下树状数组的模板代码:int lowbit(int i){ return i & -i;//或者是return i-(i&(i-1));表示求数组下标二进制的非0最低位所表示的值}void update(int i,int va...转载 2018-11-05 11:11:57 · 218 阅读 · 0 评论 -
C语言文件操作函数总结——超详细
版权声明本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl文件与流在C语言中有三种标准流:stdin(standard input stream)标准输入流。在大多数环境中为从键盘输入;scanf( )和getchar( )等函数会从该流中读取字符stdout(standard output stream)标准输出流。在大多数环境...转载 2018-11-12 10:49:52 · 11541 阅读 · 1 评论 -
sort函数用法详解
用于C++中,对给定区间所有元素进行排序。头文件是#include <algorithm>sort函数进行快速排序,时间复杂度为n*log2n,比冒泡之类的要省时不少Sort函数使用模板:Sort(start,end,排序方法)1.第一个参数是要排序数组的起始地址2.第二个参数是数组结束地址的下一位3.第三个是排序的方法,可不填,默认升序一般是直接对数组进行...原创 2018-07-20 11:34:14 · 26521 阅读 · 0 评论 -
常见递归问题(汉诺塔,N皇后,表达式求值,爬楼梯,算24)总结
前言最近在跟着看算法视频,就跟着总结了一下,如果你正好看见这篇文章并且有不懂的问题,欢迎随时跟我交流,视频讲的很不错,贴链接视频汉诺塔古代有一个梵塔,塔内有三个座A、B、C,A座上有64个盘子,盘子大小 不等,大的在下,小的在上(如图)。有一个和尚想把这64个盘子从A座移 到C座,但每次只能允许移动一个盘子,并且在移动过程中,3个座上的盘子 始终保持大盘在下,小盘在上。在移动过程中可以...原创 2018-11-21 22:55:49 · 1002 阅读 · 0 评论 -
各种进制转换(二,八,十,十六进制间转换)详解附代码
进制转换 原理进制转换是人们利用符号来计数的方法。进制转换由一组数码符号和两个基本因素“基数”与“位权”构成。基数是指,进位计数制中所采用的数码(数制中用来表示“量”的符号)的个数。位权是指,进位制中每一固定位置对应的单位值。在知乎有个问题下的解答很不错,可以参考:打开链接他们之间的关系如下:接下来我们一一阐述。一:(二,八,十六进制)转十进...原创 2018-11-15 11:47:57 · 89067 阅读 · 13 评论 -
最大子段和问题(最大子序列和)详解
给出一个整数数组a(正负数都有),如何找出一个连续子数组(可以一个都不取,那么结果为0),使得其中的和最大? 例如:-2,11,-4,13,-5,-2,和最大的子段为:11,-4,13。和为20。 看见这个问题你的第一反应是用什么算法? (1) 枚举?对,枚举是万能的!枚举什么?子数组的位置!好枚举一个开头位置i,一个结尾位置j>=i,再求a[i..j]之间所有数...原创 2018-12-07 22:38:19 · 3315 阅读 · 0 评论 -
动态规划之最大子矩阵和
分析: 我们已经解决了一维的问题(基础篇中的最大子段和问题),现在变成二维了,我们看看能不能把这个问题转化为一维的问题。最后子矩阵一定是在某两行之间的。假设我们认为子矩阵在第i行和第j列之间,我们如何得到i和j呢,对,枚举。 枚举所有1<=i<=j<=M,表示最终子矩阵选取的行范围。 我们把每一列第i行到第j行之间的和求出来,形成一个数组c,于是一个第i行到第j行之间的...原创 2018-12-12 23:17:40 · 1102 阅读 · 0 评论 -
背包九讲
背包九讲 目录 第一讲 01背包问题 第二讲 完全背包问题 第三讲 多重背包问题 第四讲 混合三种背包问题 第五讲 二维费用的背包问题 第六讲 分组的背包问题 第七讲 有依赖的背包问题 第八讲 泛化物品 第九讲 背包问题问法的变化 附:USACO中的背包问题 前言本篇文章是我(dd_engi)正在进行中的一个雄心勃勃的写作计划的一部分,这个计划的内容是写作...转载 2018-10-16 14:54:54 · 243 阅读 · 0 评论 -
位运算基础及简单应用
位运算:程序中的所有数在计算机内存中都是以二进制的形式存储的。位运算就是直接对整数在内存中的二进制位进行操作。含义 C语言 操作 按位与 a & b 如果两个相应的二进制位都为1,则该位的结果值...原创 2018-12-23 18:47:26 · 261 阅读 · 0 评论 -
C++利用rand随机生成数据(序列,区间,树,图)
C++利用rand随机生成树随机生成整数随机生成区间随机生成树随机生成无向连通图原创 2019-02-09 13:04:46 · 4051 阅读 · 0 评论 -
前缀和与差分
一维前缀和就是s[i] = a[i] + a[i - 1],如果要求某个区间[l, r] 的和就是sum(l, r) = s[r] - s[l - 1]。差分差分数列定义为:B[1] = A[1], B[i] = A[i] - A[i - 1] (2<= i <= n)容易发现:差分序列B的前缀和就是原序列A,前缀和序列S的差分序列就是原序列A。二...原创 2019-02-20 19:04:03 · 268 阅读 · 2 评论 -
最小生成树之Kruskal算法
Kruskal算法的高效实现需要一种称作并查集的结构。我们在这里步介绍并查集,只介绍Kruskal算法的基本思想和证明,实现留在以后讨论。 Kruskal算法的过程: (1) 将全部边按照权值由小到大排序。(2) 按顺序(边权由小到大的顺序)考虑每条边,只要这条边和我们已经选择的边不构成圈,就保留这条边,否则放弃这条边。算法 成功选择(n-1)条边后,形成一个棵最小生成树,当然如果...原创 2018-10-22 16:53:05 · 341 阅读 · 0 评论 -
完全背包优化及模板
题目有N种物品和一个容量为V的背包,每种物品都有无限件可用。第i种物品的费用是c[i],价值是w[i]。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。思路:与01背包不同的是一个物品可以选无穷个,写出递推关系:dp[ 0 ] [ j ] =0,dp[ i+1 ] [ j ]=max{ dp[ i-k*w[i] ]+k*v[i] }(k>=0)...原创 2018-10-16 23:06:47 · 1092 阅读 · 0 评论 -
全排列解析【递归方法】
定义 从n个元素中取出m个元素进行排列,当n=m时这个排列被称为全排列。递归法 我们要对前n个数进行全排列,那么首先我们可以发现第一位数可以是1~n中的任意一位,枚举第一位数的n种可能,然后我们就可以再去求剩下n-1位,确定第二位后再递归剩下的n-2位,一直递归即可求解。步骤1.首先枚举全排列第一个位置的元素,即让其分别为1,2,3……n。...原创 2018-10-06 19:23:02 · 378 阅读 · 0 评论 -
C语言求大数的阶乘
我们都知道如何计算一个数的阶乘,可是,如果这个数很大呢,该如何计算?当一个数很大时,利用平常的方法是求不出来它的阶乘的,因为数据超出了范围。因此我们要用数组来求一个大数的阶乘,用数组的每位表示结果的每个位数。话不多说,直接上代码#include<stdio.h>#include<string.h>int main(){ int i,j,n,temp,d=1...原创 2018-05-06 15:18:57 · 9652 阅读 · 5 评论 -
筛法求素数
... 一般求素数都是暴力求解,这样效率不高,今天就总结一下筛法求素数,这是一种较高效的算法,具体如下:用筛法求素数的基本思想是:把从1开始的、某一范围内的正整数从小到大顺序排列, 1不是素数,首先把它筛掉。剩下的数中选择最小的数是素数,然后去掉它的倍数。依次类推,直到筛子为空时结束。用筛法求素数的基本思想是:把从1开始的、某一范围内的正整数从小到大顺序排列, 1不是素数,首先把它筛...原创 2018-06-09 15:07:26 · 5456 阅读 · 0 评论 -
康托展开与逆康托展开
康托展开原理:X=a[n]*(n-1)!+a[n-1]*(n-2)!+...+a[1]*0! 0<=a[i]<i(1<=i<=n)这就是康托展开的公式,其中a[i]为当前未出现的元素中是排在第几个(从0开始)。应用:康托展开一般应用于寻找全排列数在其排列中的位置。例如{1,2,3}的全排列从小到大为123,132,213,231,312,321我...原创 2018-07-03 09:56:29 · 495 阅读 · 0 评论 -
浅析时间复杂度与空间复杂度
时间复杂度1.定义算法的时间复杂度是一个函数,它定性描述了该算法的运行时间,时间复杂度是指执行算法所需要的计算工作量,简单来说,时间复杂度指的是语句执行次数。2.计算方法一般来说,用T(n)来描述语句具体执行次数,而用O(f(n))来描述时间复杂度。常见的有O(1),O(n),O(log2n),O(2^n), O(n^2),O(n^3) ,,, O(n^k)效率:О(1)&...原创 2018-07-03 16:43:19 · 192 阅读 · 0 评论 -
斯特林公式--取N阶乘近似值
斯特林公式(Stirling's approximation)是一条用来取n的阶乘的近似值的数学公式。一般来说,当n很大的时候,n阶乘的计算量十分大,所以斯特林公式十分好用,而且,即使在n很小的时候,斯特林公式的取值已经十分准确。 公式为: 其中pi=3.1415926 ...原创 2018-07-16 18:22:44 · 1531 阅读 · 0 评论 -
二分查找法(STL)详解
二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。二分查找要求:线性表是有序表,即表中结点按关键字有序,并且要用向量作为表的存储结构。不妨设有序表是递增有序的。查找过程:首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步...原创 2018-07-03 23:09:22 · 1096 阅读 · 0 评论 -
贪心算法
贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解。贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关。 思想贪心算法的基本思路是从问题的某一个初始解出发一步一步地进行,根据某个优化测...原创 2018-07-07 17:09:09 · 613 阅读 · 0 评论 -
KMP算法(推导方法及模板)
介绍 克努斯-莫里斯-普拉特算法Knuth-Morris-Pratt字符串查找算法(简称为KMP算法)可在一个主文本字符串S内查找一个词W的出现位置。此算法通过运用对这个词在不匹配时本身就包含足够的信息来确定下一个匹配将在哪里开始的发现,从而避免重新检查先前匹配的字符。 此算法可以在O(n+m)时间数量级上完成串的模式匹配操作,其改进在于:每当一趟匹配过程中...原创 2018-08-09 13:06:24 · 1089 阅读 · 0 评论 -
动态规划模板总结
动态规划:通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。动态规划常常适用于有重叠子问题和最优子结构性质的问题,动态规划方法所耗时间往往远少于朴素解法。试用情况:最优子结构性质。如果问题的最优解所包含的子问题的解也是最优的,我们就称该问题具有最优子结构性质(即满足最优化原理)。最优子结构性质为动态规划算法解决问题提供了重要线索。 无后效性。即子问题的解一旦确定,就不再...原创 2018-08-06 17:06:47 · 4865 阅读 · 0 评论 -
博弈论之巴什博弈
定义巴什博弈:只有一堆n个物品,两个人轮流从这堆物品中取物,规定每次至少取一个,最多取m个。最后取光者得胜。分析我们称先进行游戏的人为先手,另一个人为后手。1、如果n=m+1,那么由于一次最多只能取m个,所以,无论先手拿走多少个,后手都能够一次拿走剩余的物品,后者取胜。2、如果n=(m+1)∗r+s,(r为任意自然数,s≤m),先手要拿走s个物品,如果后手拿走k(k≤m)个,那么...原创 2018-08-16 15:35:21 · 704 阅读 · 0 评论 -
威佐夫博弈
简述威佐夫博弈(Wythoff Game):有两堆各若干个物品,两个人轮流从某一堆或同时从两堆中取同样多的物品,规定每次至少取一个,多者不限,最后取光者得胜。分析我们用(ak,bk)(ak≤bk,k=0,1,2,...,n)(ak≤bk,k=0,1,2,...,n)表示两堆物品的数量并称其为局势,如果甲面对(0,0),那么甲已经输了,这种局势我们称为奇异局势。前几个奇异局势是:(0,0...原创 2018-08-16 21:25:24 · 316 阅读 · 0 评论 -
尼姆博弈
简述有三堆各若干个物品,两个人轮流从某一堆取任意多的物品,规定每次至少取一个,多者不限,最后取光者得胜。分析用(A,B,C)来表示某一特定局势,同时规定A<=B<=C。奇异局势表示先手必败。显然(0,0,0)是奇异局势。 (0,n,n)是奇异局势,当先手拿走s个石子时,我们对应拿走s个石子,最终转化为(0,0,0)。 (1,2,3)也是奇异局势,无论先手如何取,我们...原创 2018-08-17 00:06:33 · 306 阅读 · 0 评论 -
排序算法总结(C++)
算法复杂度稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面。不稳定:如果a原本在b的前面,而a=b,排序之后 a 可能会出现在 b 的后面。时间复杂度:对排序数据的总的操作次数。反映当n变化时,操作次数呈现什么规律。空间复杂度:是指算法在计算机内执行时所需存储空间的度量,它也是数据规模n的函数。 一:冒泡排序经典的排序算法,通过依次比较相邻两个元素之间的大小...原创 2018-09-01 17:06:09 · 307 阅读 · 0 评论 -
最小生成树之prim算法
最小生成树的Prim算法也是贪心算法的一大经典应用。Prim算法的特点是时刻维护一棵树,算法不断加边,加的过程始终是一棵树。 Prim算法过程:一条边一条边地加, 维护一棵树。初始 E = {}空集合, V = {任意节点}循环(n – 1)次,每次选择一条边(v1,v2), 满足:v1属于V , v2不属于V。且(v1,v2)权值最小。E = E + (v1,v2)V = V...原创 2018-09-25 16:03:00 · 5895 阅读 · 0 评论 -
快速幂取模算法
在算法程序设计竞赛中,会经常碰到对某个数N进行求大数次幂并对1e9+7取模的运算的题目,一方面求大数次幂是一个时间复杂度很高的运算(容易超时),另一方面对1e9+7取模,暗示着结果是连long long都存不下(同余定理),所以这时候快速幂取模算法就派上用场了,我们先来求a^bmodc;算法1:直接设计,朴素int ans = 1;for(int i = 1;i<=b;i++)...原创 2018-07-20 14:56:32 · 1018 阅读 · 1 评论 -
C++读入输出优化【附模板(全)】
关闭同步、解除绑定ios::sync_with_stdio(false);注意:在使用后进行io操作时不能同时使用cin 与scanf。另外可以进一步加快执行效率。ios::sync_with_stdio(false);cin.tie(0);读入整数int read(){ int x = 0, w = 1; char ch = 0; ...原创 2019-04-19 13:46:24 · 1072 阅读 · 0 评论