飘过的小牛

I'm growing!~~

寻找主元素

如果一个数组A[1..n]中超过半数的元素都相同时,该数组被称为含有主元素。 算法思想: 利用快速排序的思想,如果这个数组存在主元素,则它一定为排序后的中位数。但问题是,我们要设计O(n)算法,我们知道,排序的最优时间复杂度是O(nlogn),所以我们需要借助其他的方法来完成这个问题。...

2012-03-09 09:00:24

阅读数:4210

评论数:4

快速排序

快速排序是分治策略的一个应用。 算法思想就是基准元素的划分,这点可以参考书上的分析。 主要给出快速排序算法的分析: 快速排序算法的时间主要耗费在划分操作上,并与划分是否平衡密切相关。对于长度为n的待排序序列,一次划分算法Partition需要堆整个待排序序列扫描一遍,其所需要的计算时间显然为...

2012-02-23 10:26:14

阅读数:1912

评论数:3

堆排序

参考文章有很多,推荐:http://www.wutianqi.com/?p=1820 注:堆排序不是一种稳定排序。 堆排序方法对记录数较稍等文件并不值得提倡,但对n较大的文件还是很有效的。因为其运行时间主要耗费在建初始堆和调整建新堆时进行的反复“筛选”上。对深度为k的堆,筛选算法中进行...

2012-02-22 18:22:54

阅读数:1602

评论数:0

Kuhn-Munkres算法

死磕了2天的KM,总算理解了七八分了。。。。 下面是网上各种东西的杂糅+自己的说明,死磕应该能看懂。 KM算法是通过给每个顶点一个标号(叫做顶标)来把求最大权匹配的问题转化为求完备匹配的问题的。 设顶点Xi的顶标为A[i],顶点Yi的顶标为B[i],顶点Xi与Yj之间的边权为w[i,j]。 ...

2012-01-02 22:53:02

阅读数:12383

评论数:8

归并排序

一个归并排序的例子:对一个随机点的链表进行排序 归并排序(Merge sort)是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。算法时间复杂度位O(nlogn). 归并操作: 归并操作(merge),也叫归并算法...

2011-12-14 17:23:59

阅读数:1118

评论数:1

二分图最大匹配的König定理-最小点集覆盖【Matrix67】

König定理是一个二分图中很重要的定理,它的意思是,一个二分图中的最大匹配数等于这个图中的最小点覆盖数。如果你还不知道什么是最小点覆盖,我也在这里说一下:假如选了一个点就相当于覆盖了以它为端点的所有边,你需要选择最少的点来覆盖所有的边。比如,下面这个图中的最大匹配和最小点覆盖已分别用蓝色和红色标...

2011-12-03 10:04:21

阅读数:2562

评论数:0

二分图最大匹配—匈牙利算法

二分图:又叫二部图,图G中顶点集V可以分成互不相交的子集(X,Y),并且图中的每一条边所关联的点分别属于两个不同的顶点集,则图G叫二分图。(不含奇环) 二分图的匹配:给定一个二分图G的子图M,M的边集中任意两条边都不依附于同一个顶点(点单独配对),则称M是一个匹配。 二分图的最大匹配:...

2011-11-29 13:33:50

阅读数:1979

评论数:0

AC自动机算法

AC自动机简介:  首先简要介绍一下AC自动机:Aho-Corasick automation,该算法在1975年产生于贝尔实验室,是著名的多模匹配算法之一。一个常见的例子就是给出n个单词,再给出一段包含m个字符的文章,让你找出有多少个单词在文章里出现过。要搞懂AC自动机,先得有字典树Trie和...

2011-11-23 09:04:50

阅读数:77489

评论数:5

高效素数打表

大家所知的素数打表时间复杂度几乎都是n2。 就是这种: void init_prime() { int i, j; for(i = 2;i <= sqrt(1000002.0); ++i) { if(!prime[i]) for(j = i * i; j < 1...

2011-11-15 15:07:29

阅读数:12786

评论数:3

KMP算法详讲

一.  简单匹配算法 先来看一个简单匹配算法的函数: int Index_BF ( char S [ ], char T [ ], int pos ) { /* 若串 S 中从第pos(S 的下标0≤pos<StrLength(S))个字符 起存在和串 T 相同的子串,则称匹配成功,返回...

2011-11-11 19:50:15

阅读数:3151

评论数:4

拓扑排序

什么是拓扑排序?简单的说,就是由某个集合上的一个偏序序列得到该集合上的一个全序序列,这个操作称之为拓扑排序。 那么,我们首先来回顾一下离散数学中的关于偏序和全序的定义: 若集合X上的关系R是自反的,反对称的和传递的,则称R是集合X上的偏序关系。 设R是集合X上的pain徐,如果对每个x,y输...

2011-10-31 13:07:32

阅读数:1841

评论数:1

Dijkstra+Heap+前向星存图

一切尽在代码中。。。。。。。。 /* dijkstra + heap,时间复杂度: O((n + e)log(n)). 对于稠密图来说,仍然是dij+heap快,而且越稠密越快! 用前向星来存图,空间复杂度为: O(m). 更新时间: 2011.09.22 *...

2011-09-22 21:30:01

阅读数:3061

评论数:2

Bellman-Ford算法详讲

Dijkstra算法是处理单源最短路径的有效算法,但它局限于边的权值非负的情况,若图中出现权值为负的边,Dijkstra算法就会失效,求出的最短路径就可能是错的。 这时候,就需要使用其他的算法来求解最短路径,Bellman-Ford算法就是其中最常用的一个。该算法由美国数学家理查德•贝尔曼(Ric...

2011-09-19 21:56:40

阅读数:54544

评论数:9

Floyd算法详讲

正如我们所知道的,Floyd算法用于求最短路径。Floyd算法可以说是Warshall算法的扩展,三个for循环就可以解决问题,所以它的时间复杂度为O(n^3)。 Floyd算法的基本思想如下:从任意节点A到任意节点B的最短路径不外乎2种可能,1是直接从A到B,2是从A经过若干个节点X到B。所以...

2011-09-13 21:54:13

阅读数:13318

评论数:3

字典树

字典树,顾名思义,就是一种对字母等字符串进行处理的一种特殊数据结构。说白了,就是二十六叉树。定义一个头指针,每次从头指针开始操作。 有两种常用的操作: 1.查询某个字符串的出现次数。 每个节点的count置为0,直到这个字符串结束,在末尾处count++.这样,就记录了该字符串的出现次数。 ...

2011-08-17 17:06:20

阅读数:1531

评论数:0

Prime算法

普利姆(Prime)算法(只与顶点相关)   算法描述: 普利姆算法求最小生成树时候,和边数无关,只和定点的数量相关,所以适合求稠密网的最小生成树,时间复杂度为O(n*n)。 算法过程: 1.将一个图的顶点分为两部分,一部分是最小生成树中的结点(A集合),另一部分是未...

2011-08-15 18:05:10

阅读数:11302

评论数:3

Kruskal算法

克鲁斯卡尔(Kruskal)算法(只与边相关) 算法描述:克鲁斯卡尔算法需要对图的边进行访问,所以克鲁斯卡尔算法的时间复杂度只和边又关系,可以证明其时间复杂度为O(eloge)。 算法过程: 1.将图各边按照权值进行排序 2.将图遍历一次,找出权值最小的边,(条...

2011-08-15 17:59:21

阅读数:31831

评论数:11

链栈实现括号匹配

//括号匹配 //利用栈的操作思想,实现括号匹配的检验。如输入3*{2+[2*5/(2+9)]},则括号匹配 //正确,但如果输入3*(2+6/[2*9)],则括号匹配失败。 //优先级说明: //()优先级最高,里面不能嵌套任何其他括号(包括小括号); //[]优先级其次,里面只能嵌套小括号 /...

2011-08-09 16:45:28

阅读数:3492

评论数:1

超有爱的并查集~

例子就是杭电上的畅通工程: http://acm.hdu.edu.cn/showproblem.php?pid=1232 首先在地图上给你若干个城镇,这些城镇都可以看作点,然后告诉你哪些对城镇之间是有道路直接相连的。最后要解决的是整幅图的连通性问题。比如随意给你两个点,让你判断它们是否连通...

2011-08-05 13:55:34

阅读数:5580

评论数:17

RMQ (Range Minimum/Maximum Query)算法

1. 概述 RMQ(Range Minimum/Maximum Query),即区间最值查询,是指这样一个问题:对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j当然,该问题也可以用线段树(也叫区间树)解决,算法复杂度为:O(N)~O(logN),这里我们暂不介绍。 ...

2011-07-22 08:24:26

阅读数:10278

评论数:5

提示
确定要删除当前文章?
取消 删除
关闭
关闭