
Algorithm
Switchvov
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
最小生成树
#include #include #include using namespace std;const int INF = 50000; //极大值int V; //顶点数const int MAX_V = 10000;int mincost[MAX_V]; //从集合X出发的边到每个顶点的最小权值bool used[MAX_V]; //顶点i是否在X集合中int c原创 2015-10-19 19:46:10 · 5685 阅读 · 0 评论 -
字符串匹配——BMH算法
字符串匹配——BMH算法给定主串T和模式串P,返回P在T中首次出现的位置,如果P不存在于T中,返回-1。这样的问题就是字符串匹配问题,这里给出BMH算法的思想。设主串T的长度为n,模式串P的长度为m。BMH(Boyer-Moore-Horspool)算法是BM(Boyer-Moore)算法的一种优化,根据《一种基于BMH算法的模式匹配算法》的分析,BMH算法要优于BM算法,BM算法的思想可以参考字符原创 2016-07-07 22:45:54 · 8501 阅读 · 1 评论 -
字符串匹配——KMP算法
字符串匹配——KMP算法给定主串T和模式串P,返回P在T中首次出现的位置,如果P不存在于T中,返回-1。这样的问题就是字符串匹配问题,这里给出KMP算法的思想。设主串T的长度为n,模式串P的长度为m。最大相同前缀后缀数组写法先根据前缀后缀,求出前缀数组prefix,再通过前缀数组,快速迭代扫描主串,并找到首次匹配的位置,找不到则返回-1。前缀数组prefix的求法将prefix[0]初始化为0,设m原创 2016-07-05 22:34:39 · 2649 阅读 · 0 评论 -
字符串匹配——RabinKarp算法
字符串匹配——RabinKarp算法给定主串T和模式串P,返回P在T中首次出现的位置,如果P不存在于T中,返回-1。这样的问题就是字符串匹配问题,这里给出RabinKarp算法的思想。设主串T的长度为n,模式串P的长度为m。主串匹配起始位置s从0到n-m,计算出T[s..s+m-1]的对应值,与P[0…m-1]的对应值进行比较,如果相同,则匹配成功。不同,则s右移一位,也就是计算出T[s+1…s+m原创 2016-06-14 17:12:36 · 1252 阅读 · 0 评论 -
字符串匹配——枚举法
字符串匹配——枚举法给定主串T和模式串P,返回P在T中首次出现的位置,如果P不存在于T中,返回-1。这样的问题就是字符串匹配问题,这里先给出枚举法的思想。设主串T的长度为n,模式串P的长度为m。主串从0到n-m,每次选取连续的m个字符,跟模式串P的m个字符进行一一比较。伪代码BruteForce(T, P)01 for s <- 0 to n - m02 j <- 003 // check原创 2016-06-14 13:34:07 · 3591 阅读 · 0 评论 -
搜索策略
搜索策略 搜索是由初始状态到目标状态的求解过程,就搜索结果分类,分为可行解搜索1和最优解搜索2。搜索策略是在求解过程中使用的方法。搜索往往是通过树的形式来描述。搜索方式广度优先搜索(BFS)构造由根组成的队列QIf Q 的第一个元素x是目标节点 Then 停止从Q 中删除x,把x的所有子节点加入Q的末尾If Q空 Then 失败 Else goto 2深度优先搜索(DFS)构造一个原创 2016-06-13 18:30:53 · 7969 阅读 · 0 评论 -
贪心法——基本思想
贪心法——基本思想贪心法,顾名思义表示总是选择当前最优的,以期望达到整体最优。贪心法一般用于求解最优化问题。采用贪心法求最优化问题的算法,一般都包含一系列步骤,每一步都有一组选择,每次都选择当前最优的选择,希望通过局部最优的选择达到全局最优的选择。贪心法不一定总能产生最优解,可能产生近似解甚至完全不正确的答案,故想使用贪心法,最好是能够能够符合贪心法产生优化解的条件。贪心法产生优化解的条件原创 2016-06-03 18:12:57 · 7840 阅读 · 0 评论 -
二分查找求上界和下界
二分查找求上界和下界假设序列有序,其区间为[left,right)[left, right),设middlemiddle为区间中间值,现在需要获得首个出现元素vv的位置,如果不存在,返回一个位置,在此插入vv,序列仍然有序,则可以通过以下方式求出:if middle位置的值 = v:至少已经找到一个,左边可能还有,则区间变为[left,middle][left, middle]。if middl原创 2016-05-30 12:21:13 · 5432 阅读 · 1 评论 -
二分查找
二分查找二分查找在有序表里面,是非常常用的查找元素方式,其时间复杂度为log2nlog_2n,该算法也可以用分治法进行表示。突然发现一问题,常见区间范围一般都是以[x,y)[x, y)左闭右开这个的形式来进行表示的,个人写的却是[x,y][x, y]闭区间。这是一个问题,希望以后能够以前一种范围来考虑问题。分治三步骤划分问题:将有序表划尽可能划分为相等的两部分[left,middle)[left原创 2016-05-30 11:44:23 · 862 阅读 · 0 评论 -
分治算法主定理
分治算法主定理分治算法通常遵守一种通用模式:即:在解决规模为nn的问题时,总是先递归地求解aa个规模为nb\frac{n}{b}的子问题,然后在O(nd)O(n^d)时间内将子问题的解合并起来,其中a,b,d>0a,b,d > 0是一些特定的整数。分治算法的运行时间可以通过公式:T(n)=aT(⌈nb⌉)+O(nd)T(n) = aT(\lceil \frac{n}{b} \rceil) + O(n原创 2016-05-29 21:01:20 · 8201 阅读 · 0 评论 -
算法竞赛——快速排序
算法竞赛——快速排序快速排序算法和归并排序算法都可以用分治法的思想来解决,其区别是归并排序是等份左右划分,而快速排序则是按标兵进行划分,也不需要合并。分治三步骤划分问题:按标兵元素,将序列分成左右两部分,左边序列全小于等于标兵元素,右边序列全大于等于标兵元素。递归求解:把左右两部分分别排序。合并问题:不用合并,因为容器内元素已然有序。算法实现// 快速排序算法void qSort(int *原创 2016-05-29 18:57:06 · 937 阅读 · 0 评论 -
算法竞赛——归并排序算法
算法竞赛——归并排序算法分治法划分问题:把序列分成元素个数尽量相等的两半递归求解:把两半元素分别排序合并问题:把两个有序表合并成一个借鉴RuJia的精妙的合并过程void merges2(int *a, int lef, int righ) { // 递归边界 if(lef == righ) { return ; } // 取中值 int原创 2016-05-29 14:36:07 · 668 阅读 · 0 评论 -
算法竞赛中的时间复杂度选择——以最大连续和问题为例
最大连续和问题 最大连续和问题。给出一个长度为nn的序列 A1,A2,…,AnA1, A2,…, An,求最大连续和。换句话说,要求找到1≤i≤j≤n1≤i≤j≤n,使得Ai+Ai+1+...+AjA_i+A_{i+1}+...+A_j尽量大。时间复杂度为n3n^3的算法LL maxConSumN3(LL *a, LL n) { tot = 0; conSum = -INF;原创 2016-05-28 22:18:32 · 4103 阅读 · 0 评论 -
迭代加深搜索
埃及分数问题。在古埃及,人们使用单位分数的和(即1/a,a是自然数)表示一切有理数。例如,2/3=1/2+1/6,但不允许2/3=1/3+1/3,因为在加数中不允许有相同的。对于一个分数a/b,表示方法有很多种,其中加数少的比加数多的好,如果加数个数相同,则最小的分数越大越好。例如,19/45=1/5+1/6+1/18是最优方案。 输入整数a,b(0<a<b<500)a,b(0<a<b<5原创 2016-05-28 17:08:29 · 1556 阅读 · 0 评论 -
八数码——路径寻找问题
#include <cstdio>#include <cstring>#include <set>using namespace std;// 状态类型,每一个状态都对应9个数typedef int State[9];const int maxState = 1000000;// 状态数组State st[maxState], goal;// 距离数组int dist[maxStat原创 2016-05-25 19:26:28 · 1643 阅读 · 0 评论 -
子集生成
#include <iostream>using namespace std;// 增量构造法void print_set(int *A, int n , int cur) { // 打印当前集合 for(int i = 0; i < cur; i++) { cout << A[i] << " "; } cout << endl; // 确定当原创 2016-05-22 16:11:21 · 439 阅读 · 0 评论 -
10129 - Play on Words
Play on WordsSome of the secret doors contain a very interesting word puzzle. The team of archaeologists has to solve it to open that doors. Because there is no other way to open the doors, the puzzle原创 2016-05-19 20:37:31 · 525 阅读 · 0 评论 -
字符串匹配——Sunday算法
字符串匹配——Sunday算法基本思想及举例Sunday算法由Daniel M.Sunday在1990年提出,它的思想跟BM算法很相似:1只不过Sunday算法是从前往后匹配,在匹配失败时关注的是主串中参加匹配的最末位字符的下一位字符。如果该字符没有在模式串中出现则直接跳过,即移动位数 = 模式串长度 + 1;否则,其移动位数 = 模式串长度 - 该字符最右出现的位置(以0开始) = 模式串中该原创 2016-07-08 13:03:34 · 38330 阅读 · 25 评论 -
POJ 3259 Wormholes
POJ 3259 WormholesTime Limit: 2000MS Memory Limit: 65536K Total Submissions: 43643 Accepted: 16027DescriptionWhile exploring his many farms, Farmer John has discovered a number of amazing原创 2016-07-28 23:03:48 · 854 阅读 · 0 评论 -
最短路径路径还原
#include #include #include #include #include using namespace std;struct edge{ //边 int from; //起点 int to; //终点 int cost; //花费};const int MAX_E = 10000; //最大边数const in原创 2015-10-15 18:28:04 · 3616 阅读 · 0 评论 -
任意两点间的最短路径
#include using namespace std;const int INF = 100000; //极大值const int MAX_V = 10000; //最大顶点数int d[MAX_V][MAX_V];//距离矩阵,d[u][v]表示e=(u,v)的权值(不存在的时候为INF,d[i][i]=0)int V; //顶点数//算法思想://DP方原创 2015-10-15 17:53:50 · 4039 阅读 · 0 评论 -
单源最短路径算法
#include #include #include #include using namespace std;struct edge{ //边 int from; //起点 int to; //终点 int cost; //花费};const int MAX_E = 10000; //最大边数const int MAX_V =原创 2015-10-15 17:31:54 · 2619 阅读 · 0 评论 -
算法分析--数量级比较
一些程序片段的数量级及其所花时间的比较,极大程度的反应了算法优化程度越高,算法越优秀#include using namespace std;__int64 agorithm1(__int64 N) //第一个数量级为T(N)=O(N){ __int64 sum = 0; for(__int64 i = 0; i < N; i++) sum++原创 2015-07-25 23:57:48 · 4474 阅读 · 0 评论 -
KMP算法(待优化)--2015年7月25日14:04:25V1.0版
#include #include #include using namespace std;void makenext(const string str,int next[]) //next数组{ next[0] = 0; int maxs; //最大前缀后缀相等数目 for(int i = 1,maxs = 0;i < str.length(); i++原创 2015-07-25 14:31:31 · 1572 阅读 · 0 评论 -
各种排序算法比较--2015年7月23日22:33:43v1.0版
#include #include #include #include using namespace std;void BubbleSort(int *a,int n) //冒泡排序{ for(int i = 0;i < n-1;i++) { for(int j = 0;j < n-1;j++) { if原创 2015-07-23 22:34:29 · 1628 阅读 · 0 评论 -
集合幂集
备忘用#include #include using namespace std;const int MAX_LENGTH = 100;/*求幂积最简单的算法思想就是从最后一个元素倒着来遍历所有元素,比如说最后一个就是自己"c" ;倒数第二个:首先把自己和幂积里面已有的所有元素做乘积("bc"),然后加到幂积里,此时为{c,bc};最后再加上自己"b",{b,c,bc}倒数第转载 2015-08-08 19:44:45 · 2794 阅读 · 0 评论 -
布尔(bool)全排列
1、算法思路真值组合是全排列问题,能用递归的思想解决,关键是怎么写出递归的程序 由全排列思想可知,n个bool变量可以转化为后i个bool固定的值和前n-i个bool变量的全排列,例如:第n个为真,前面n-1个bool变量的全排列。由此递推,如果能解决n-1个bool变量的全排列问题,那么就能解决n个bool变量的全排列问题。2、源代码#include原创 2015-08-08 17:06:53 · 3222 阅读 · 0 评论 -
三种全排序算法详解
1、全排列的非去重递归算法算法思路:全排列可以看做固定前i位,对第i+1位之后的再进行全排列,比如固定第一位,后面跟着n-1位的全排列。那么解决n-1位元素的全排列就能解决n位元素的全排列了,这样的设计很容易就能用递归实现。附代码段:void permutation1(char* str,int sbegin,int send) //全排列的非去重递归算法{ if(原创 2015-08-08 16:06:28 · 7292 阅读 · 0 评论 -
各种搜索算法比较--2015年7月26日16:42:45V1.0版
1、顺序查找int SequenceSearch(int a[],int n,int key) //顺序查找{ for(int i = 0; i < n; i++) { if(key == a[i]) return i; } return -1;}2、二分查找int BinarySearch(int原创 2015-07-26 16:42:26 · 1407 阅读 · 0 评论 -
最大子序列和的四种求解算法及其时间比较
1、T(N)=O(N^3)__int64 algorithm1(__int64 a[],__int64 n) //T(N)=O(N^3){ __int64 MaxSum = 0; __int64 ThisSum; for(__int64 i = 0; i < n; i++) //i从零开始到最后一个数字 { for(__int64 j原创 2015-07-26 15:02:22 · 2451 阅读 · 0 评论 -
分治法——基本思想
分治法——基本思想设计过程划分问题:整个问题划分成多个无关联的子问题递归求解:求解各个子问题 递归调用正设计的算法 合并问题:合并子问题的解,形成原始问题的解分析过程建立递归方程求解递归方程递归方程的建立方法设输入大小为nn,T(n)T(n)为时间复杂性当n<cn<c,T(n)=θ(1)T(n)=\theta(1)划分阶段的时间复杂性 划分问题为a个子问题。每个子问题大小为原创 2016-07-14 14:13:03 · 1531 阅读 · 0 评论 -
动态规划——基本思想
动态规划——基本思想动态规划的特点把原始问题划分为一系列子问题求解每个子问题仅一次,并将其结果保存在一个表中,以后用到时到时直接存取,不重复计算,节省计算时间自底向上地计算使用范围一类优化问题:可分为多个相关子问题,子问题的解被重复使用使用动态规划的条件优化子结构 当一个问题的优化解包含了子问题的优化解时,这个问题具有优化子结构。缩小子问题集合,只需那些优化问题中包含的子问题,降低原创 2016-07-14 15:08:10 · 13736 阅读 · 0 评论 -
动态规划——01背包问题
动态规划——01背包问题 0-1背包问题。有nn种物品,每种只有一个。第ii种物品的体积为ViV_i,重量为WiW_i。选一些物品装到一个容量为CC的背包,使得背包内物品在总体积不超过CC的前提下重量尽量大。1≤n≤1001≤n≤100,1≤Vi≤C≤100001≤V_i≤C≤10000,1≤Wi≤1061≤W_i≤10^6。状态两个对等状态 dp(i,j)dp(i,j)表示把前ii个物品原创 2016-07-14 18:52:09 · 1070 阅读 · 0 评论 -
poj 1258 Agri-Net
poj 1258 Agri-Net Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 51094 Accepted: 21275 DescriptionFarmer John has been elected mayor of his town! One of his campaign promises原创 2016-07-26 10:23:17 · 885 阅读 · 0 评论 -
poj 3159 Candies
poj 3159 Candies Time Limit: 1500MS Memory Limit: 131072K Total Submissions: 28461 Accepted: 7868 DescriptionDuring the kindergarten days, flymouse was the monitor of his class. Occasion原创 2016-07-27 22:10:18 · 927 阅读 · 0 评论 -
快速选择问题
快速选择问题 快速选择问题。输入nn个整数和一个正整数k(1≤k≤n)k(1≤k≤n),输出这些整数从小到大排序后的第kk个(例如,k=1k=1就是最小值)。n≤107n≤10^7。从题目上看,其n的的取值范围为[1,107][1, 10^7],由之前的那张算法时间复杂度选择表,可以看出,使用O(nlog2n)O(nlog_2n)及以上时间复杂度超时的可能性非常大,这时候最好的选取O(n)O(原创 2016-05-29 20:25:25 · 2552 阅读 · 5 评论