
算法
文章平均质量分 60
不可不戒
这个作者很懒,什么都没留下…
展开
-
后缀数组
#include #include #define maxn 110 char c[maxn]; int s[maxn],sa[maxn]; int wa[maxn],wb[maxn],wv[maxn],ws[maxn];//辅助数组,意义不明 int cmp(int *s,int a,int b,int l){return s[a]==s[b]&&s[a+l]转载 2012-07-23 14:37:10 · 505 阅读 · 0 评论 -
二分图:最大独立集&最大匹配&最小顶点覆盖
最大独立集问题Given N sets of integers, remove some sets so that the remaining all sets are disjoint with one another. Find the optimal solution so that the number of sets remaining at the end is maxim转载 2013-08-10 10:16:26 · 4628 阅读 · 0 评论 -
网络流-最大流问题 ISAP 算法
ISAP 是图论求最大流的算法之一,它很好的平衡了运行时间和程序复杂度之间的关系,因此非常常用。约定我们使用邻接表来表示图,表示方法可以见文章带权最短路 Dijkstra, SPFA, Bellman-Ford, ASP, Floyd-Warshall 算法分析或二分图的最大匹配、完美匹配和匈牙利算法的开头(就不重复贴代码了)。在下文中,图的源点(source)表示为 s转载 2013-10-01 21:52:29 · 1556 阅读 · 0 评论 -
二分查找
有序数组,查找某个数据,二分法,时间复杂度O(log2n)int binary_sort(int arr[], int lenght, int value){ if (arr == NULL || lenght == 0) { return -1; } int start =0; int end = lenght -1; while(原创 2016-03-20 15:34:12 · 328 阅读 · 0 评论 -
冒泡排序
临近的数字两两进行比较,按照从小到大或者从大到小的顺序进行交换, 这样一趟过去后,最大或最小的数字被交换到了最后一位,然后再从头开始进行两两比较交换,直到倒数第二位时结束。时间复杂度O(n^2)int bubble_sort(int arr[], int lenght){ int flag = 1;//标记一次遍历没有发生移位,排序完毕 if (arr == NULL || len原创 2016-03-20 16:02:59 · 365 阅读 · 0 评论 -
直接插入排序
“1.基本思想 假设待排序的记录存放在数组 R[1..n]中。初始时,R[1]自成 1 个有序区,无序区为 R[2..n]。从 i=2 起直至 i=n 为止,依次将 R[i] 插入当前的有序区 R[1..i-1] 中,生成含 n 个记录的有序区。2.第 i-1 趟直接插入排序 通常将一个记录 R[i][i=2,3,…,n-1]插入到当前的有序区,使得插入后仍保证该区间里的记录是按关键字有序的操作原创 2016-03-20 18:23:36 · 348 阅读 · 0 评论 -
希尔排序
“基本思想: 先取一个小于 n 的整数 d1 作为第一个增量,把文件的全部记录分成 d1 个组。所有距离为 d1 的倍数的记录放在同一个组中。先在各组内进行直接插人排序;然后,取第二个增量 d2 < d1 重复上述的分组和排序,直至所取的增量 dt=1(dt < dt-1 < … < d2 < d1),即所有记录放在同一组中进行直接插入排序为止。”时间复杂度O(Nlog2N)void shellS原创 2016-03-20 19:00:51 · 323 阅读 · 0 评论 -
快速排序
算法思想1.分解: 在 R[low..high]中任选一个记录作为基准(Pivot),以此基准将当前无序区划分为左、右两个较小的子区间 R[low..pivotpos-1)和 R[pivotpos+1..high],并使左边子区间中所有记录的关键字均小于等于基准记录(不妨记为 pivot)的关键字 pivot.key,右边的子区间中所有记录的关键字均大于等于 pivot.key,而基准记录 piv原创 2016-03-20 20:02:34 · 383 阅读 · 0 评论 -
最长递增子序列
目的:我们期望在前i个元素中的所有长度为len的递增子序列中找到这样一个序列,它的最大元素比arr[i+1]小,而且长度要尽量的长,如此,我们只需记录len长度的递增子序列中最大元素的最小值就能使得将来的递增子序列尽量地长。方法:维护一个数组MaxV[i],记录长度为i的递增子序列中最大元素的最小值,并对于数组中的每个元素考察其是哪个子序列的最大元素,二分更新MaxV数组,最终i的值便是最长递增子序原创 2016-04-08 16:14:04 · 348 阅读 · 0 评论 -
归并排序
归并排序算法思想将已有序的子序列合并,得到完全有序的序列;设两个有序的子序列放在同一向量中相邻的位置上:a[low..m],a[m+1..high],先将它们合并到一个局部的暂存向量 a1中,待合并完成后将 a1 复制回 a[low..high]中。归并过程为:比较a[i]和a[j]的大小,若a[i]≤a[j],则将第一个有序表中的元素a[i]复制到r[k]中,并令i和k分别加上1;否则将第二个有序原创 2016-04-22 21:46:52 · 477 阅读 · 0 评论 -
二叉树遍历
#include <stdio.h>#include <stdlib.h>//二叉树结点typedef struct BiTreeNode{ int val; struct BiTreeNode *lchild; struct BiTreeNode *rchild;}BiTreeNode, *BiTree;//按先序序列构造二叉树void createBiTree(B原创 2016-04-24 00:53:49 · 509 阅读 · 0 评论 -
二叉排序树
#include <stdio.h>#include <stdlib.h>//二叉排序树结点typedef struct BSTreeNode { int val; struct BSTreeNode *lchild; struct BSTreeNode *rchild;} BSTreeNode, *BSTree;BSTree insert(BSTree root, in原创 2016-04-24 14:33:26 · 443 阅读 · 0 评论 -
双连通分量
[点连通度与边连通度] 在一个无向连通图中,如果有一个顶点集合,删除这个顶点集合,以及这个集合中所有顶点相关联的边以后,原图变成多个连通块,就称这个点集为割点集合。一个图的点连通度的定义为,最小割点集合中的顶点数。 类似的,如果有一个边集合,删除这个边集合以后,原图变成多个连通块,就称这个点集为割边集合。一个图的边连通度的定义为,最小割边集合中的转载 2013-09-12 11:01:50 · 691 阅读 · 0 评论 -
最长重复不重叠字串
把排序后的后缀分成若干组,其中每组的后缀之间的height 值都不小于k。例如,字符串为“aabaaaab”,当k=2 时,后缀分成了4 组,如图5所示。。然后对于每组后缀,只须判断每个后缀的sa 值的最大值和最小值之差是否不小于k。如果有一组满足,则说明存在,否则不存在。整个做法的时间复杂度为O(nlogn)。[cpp] v转载 2012-07-20 21:51:17 · 656 阅读 · 0 评论 -
有关N!
阶乘递归代码:(教材) C++代码 #include int f(int n); void main() { printf("%d\n",f(5)); } int f(int n) { if(n==0)return 1; return n*f(n-1); } ========转载 2012-07-27 09:34:17 · 955 阅读 · 0 评论 -
各种背包问题
问题有N件物品和一个容量为V的背包。第i件物品的费用是c[i],价值是w[i]。这些物品被划分为若干组,每组中的物品互相冲突,最多选一件。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。算法这个问题变成了每组物品有若干种策略:是选择本组的某一件,还是一件都不选。也就是说设f[k][v]表示前k组物品花费费用v能取得的最大权值,则有:f[k][v]=max转载 2013-07-24 11:30:24 · 4272 阅读 · 0 评论 -
博弈
有一种很有意思的游戏,就是有物体若干堆,可以是火柴棍或是围棋子等等均可。两个人轮流从堆中取物体若干,规定最后取光物体者取胜。这是我国民间很古老的一个游戏,别看这游戏极其简单,却蕴含着深刻的数学原理。下面我们来分析一下要如何才能够取胜。(一)巴什博奕(Bash Game):只有一堆n个物品,两个人轮流从这堆物品中取物,规定每次至少取一个,最多取m个。最后取光者得胜。转载 2013-07-17 15:25:52 · 889 阅读 · 0 评论 -
母函数
在数学中,某个序列的母函数是一种形式幂级数,其每一项的系数可以提供关于这个序列的信息。使用母函数解决问题的方法称为母函数方法。母函数可分为很多种,包括普通母函数、指数母函数、L级数、贝尔级数和狄利克雷级数。对每个序列都可以写出以上每个类型的一个母函数。构造母函数的目的一般是为了解决某个特定的问题,因此选用何种母函数视乎序列本身的特性和问题的类型。这里先给出两句话,不懂的转载 2013-07-17 16:23:32 · 700 阅读 · 0 评论 -
欧拉函数
在数论,对正整数n,欧拉函数是少于或等于n的数中与n互质的数的数目。此函数以其首名研究者欧拉命名,它又称为Euler's totient function、φ函数、欧拉商数等。 例如φ(8)=4,因为1,3,5,7均和8互质。 从欧拉函数引伸出来在环论方面的事实和拉格朗日定理构成了欧拉定理的证明。简介 φ函数的值 φ(1)=1(唯一和1互质的数就是1本身)。转载 2013-07-16 20:01:48 · 880 阅读 · 0 评论 -
如何判断一个图是否是二分图
问题描述:给定一个无向图G=,如何能够在O(V+E)时间内判断这个图是否是一个二分图(或者称为2着色)分析:如果这个无向图没有回路,那么它一定是可以二分的,我们直接就可以利用BFS来为二分图着色(根据当前节点的颜色,对其所有相邻节点涂另一个颜色)。 如果这个无向图有回路,如果回路的边数是偶偶数,那么它还是二分的,如果是奇数,那么它就不是二分的。如何判断回路的边数转载 2013-09-07 11:23:57 · 8445 阅读 · 0 评论 -
如何判断一个图中是否存在回路
问题描述:给一个图G=,问如何判断这个图中是否存在回路?请给出至少3中方法分析:方法1:利用减枝的方法,如果G为有向图: 1)首先删除入读为0的点,并且将对应的和该点相连的点的入读-1。(可以用一个数组表示节点被删除的状态) 2)重复过程1),直到没有入读为0的点,如果还有没被删除的节点,则该有向图一定存在回路 如果G为无向转载 2013-09-07 11:25:52 · 10612 阅读 · 2 评论 -
KM算法
引用1:KM算法是通过给每个顶点一个标号(叫做顶标)来把求最大权匹配的问题转化为求完备匹配的问题的。设顶点Xi的顶标为A[i],顶点Yi的顶标为B [i],顶点Xi与Yj之间的边权为w[i,j]。在算法执行过程中的任一时刻,对于任一条边(i,j),A[i]+B[j]>=w[i,j]始终 成立。KM算法的正确性基于以下定理: 若由二分图中所有满足A[i]+B[j]=w[i,j]的边(i,转载 2013-09-08 10:01:08 · 1132 阅读 · 0 评论 -
KMP算法
KMP字符串模式匹配详解来自优快云 A_B_C_ABC 网友KMP字符串模式匹配通俗点说就是一种在一个字符串中定位另一个串的高效算法。简单匹配算法的时间复杂度为O(m*n);KMP匹配算法。可以证明它的时间复杂度为O(m+n).。一. 简单匹配算法先来看一个简单匹配算法的函数:int Index_BF ( char S [ ], char T [ ], int po转载 2013-08-20 08:03:38 · 656 阅读 · 0 评论 -
最小表示法 (在解决判断“同构”一类问题中有很大作用)
最小表示法最小表示法在解决判断“同构”一类问题中有很大作用。循环同构问题:给出两个串:s1 = “babba”和s2 = “bbaba”,其中两者均看成环状的,即首尾是相接的,问:从s1的哪里断开可以得到和s2一样的串或者两者不会相同?本题就是从s1的第2个字符’a’后面断开,可以得到与s2一样的串。这个问题就是同构问题。1.朴素算法(O(nm)):即尝试s1的n个断开点,转载 2013-09-03 19:24:03 · 1217 阅读 · 0 评论 -
强连通分量Tarjan算法
说到以Tarjan命名的算法,我们经常提到的有3个,其中就包括本文所介绍的求强连通分量的Tarjan算法。而提出此算法的普林斯顿大学的Robert E Tarjan教授也是1986年的图灵奖获得者(具体原因请看本博“历届图灵奖得主”一文)。 首先明确几个概念。强连通图。在一个强连通图中,任意两个点都通过一定路径互相连通。比如图一是一个强连通图,而图二不是。因为没转载 2013-09-10 21:08:43 · 1246 阅读 · 0 评论 -
堆排序
1.堆 堆实际上是一棵完全二叉树,其任何一非叶节点满足性质: Key[i]<=key[2i+1]&&Key[i]<=key[2i+2]或者Key[i]>=Key[2i+1]&&key>=key[2i+2] 即任何一非叶节点的关键字不大于或者不小于其左右孩子节点的关键字。 堆分为大顶堆和小顶堆,满足Key[i]>=Key[2i+1]&&key>=key[2i+2]称为大顶堆,满原创 2016-08-18 20:09:07 · 318 阅读 · 0 评论