
算法
wyjvip333
这个作者很懒,什么都没留下…
展开
-
堆排序
1,"堆"定义n个关键字序列Kl,K2,…,Kn称为堆(heap).当且仅当该序列满足如下性质(简称为堆性质):ki≤K2i且ki≤K2i+1 或(2)Ki≥K2i且ki≥K2i+1(1≤i≤ n)2,若将此序列所存储的向量R[1..n]看做是一棵完全二叉树的存储结构,则堆实质上是满足如下性质的完全二叉树:树中任一非叶结点的关键字均不大于(或不小于)其左右孩子(若存在)结点的关...2010-03-23 10:48:55 · 89 阅读 · 0 评论 -
求大数阶层
1,思想类似于大数的加减乘法.数组的每个元素维护一个4位数.2,实例代码:[code="cpp"]#includeusing namespace std;int a[10000];//保存结果int m=0;//保存位数void factorial(int n){ memset(a,0,sizeof(a)); a[0]=1; ...2010-05-04 16:40:17 · 139 阅读 · 0 评论 -
归并排序
1,归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。2,归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。 3.算法分析(1)稳定性 归并排序是一种稳定的排序。(2)时间复杂度...2010-05-04 16:47:08 · 89 阅读 · 0 评论 -
计数排序
1,计数排序是一个非基于比较的线性时间排序算法。它对输入的数据有附加的限制条件:(1)、输入的线性表的元素属于有限偏序集S;(2)、设输入的线性表的长度为n,|S|=k(表示集合S中元素的总数目为k),则 k=O(n)。在这两个条件下,计数排序的复杂性为O(n)。 2,计数排序算法的基本思想是对于给定的输入序列中的每一个元素x,确定该序列中值小于x的元素的个数。一旦有了这...2010-05-04 16:59:35 · 100 阅读 · 0 评论 -
并查集
[b]1,什么是并查集?[/b]并查集,就是Union-Find Set,也称不相交集合 (Disjoint Set),用于处理一些不相交集合(Disjoint Sets)的合并及查询问题,如其求无向图的连通分量个数等.最完美的应用当属:实现Kruskar算法求最小生成树.[b]2,并查集的主要操作有:[/b](1)makeSet(x):把每一个元素初始化为一个集合初始化后...原创 2010-02-07 15:05:49 · 92 阅读 · 0 评论 -
一个简易的大数处理程序
1,核心:数组的每一个元素保留四位数代码:[code="cpp"]#include using namespace std;const int maxL=250;struct big_num{ int a[maxL];public: void init() { memset(a,0,sizeof(a)); ...2010-02-24 11:41:24 · 118 阅读 · 0 评论 -
快速模取幂算法
1,乘法模运算规则:(a * b) % n = (a % n * b % n) % n 2,模取幂运算a^b mod c:b如果比较大,可以利用所谓的二分法,b=b0+b1*2^1+b2*2^2+...+bn*2^n从最低位b0开始,由右至左逐位扫描.3,实例代码:[code="cpp"]#include using namespace std;//计算a^...2010-02-24 14:08:44 · 120 阅读 · 0 评论 -
网络最大流_Ford-Fulkerson算法
1,第一个数表示容量cij,第二个数表示流量fij2,可行流与最大流在运输网络的实际问题中,我们可以看出,对于流有两个显然的要求:一是每个弧上的流量不能超过该弧的最大通过能力(即弧的容量);二是中间点的流量为0,源点的净流出量和汇点的净流入量必相等且为这个方案的总输送量。因此有:(1)容量约束:0≤fij≤cij,(vi,vj)∈E,(2)守恒条件3,可增广路径所谓可增...2010-02-25 12:00:06 · 821 阅读 · 1 评论 -
最近公共祖先LCA:RMQ转化
1,最近公共祖先(LCA):对于有根树T的两个结点u、v,最近公共祖先LCA(T,u,v)表示一个结点x,满足x是u、v的祖先且x的深度尽可能大。2,LCA问题向RMQ问题的转化方法:(RMQ返回最值的下标)对树进行深度优先遍历,每当“进入”或回溯到某个结点时,将这个结点的深度存入数组dfsNum最后一位。同时记录结点i在数组中第一次出现的位置(事实上就是进入结点i时记录的位置),记做...2010-02-27 14:43:39 · 133 阅读 · 0 评论 -
寻找凸包的graham 扫描法
1,点集Q的凸包(convex hull)是指一个最小凸多边形,满足Q中的点或者在多边形边上或者在其内。2,凸包最常用的凸包算法是Graham扫描法和Jarvis步进法。3,Graham扫描法:首先,找到所有点中最左边的(y坐标最小的),如果y坐标相同,找x坐标最小的.以这个点为基准求所有点的极角(atan2(y-y0,x-x0)),并按照极角对这些点排序,前述基准点在最前面,设这...原创 2010-02-27 21:39:41 · 200 阅读 · 0 评论 -
最近公共祖先LCA:Tarjan算法
1,并查集+dfs对整个树进行深度优先遍历,并在遍历的过程中不断地把一些目前可能查询到的并且结果相同的节点用并查集合并.2,分类,使每个结点都落到某个类中,到时候只要执行集合查询,就可以知道结点的LCA了。对于一个结点u.类别有:以u为根的子树、除类一以外的以f(u)为根的子树、除前两类以外的以f(f(u))为根的子树、除前三类以外的以f(f(f(u)))为根的子树……...2010-02-28 15:25:14 · 144 阅读 · 0 评论 -
求有向图的强连通分量(scc):Tarjan算法
1,在有向图G中,如果两个顶点间至少存在一条路径,称两个顶点强连通(strongly connected)。如果有向图G的每两个顶点都强连通,称G是一个强连通图。非强连通图有向图的极大强连通子图,称为强连通分量(strongly connected component)。2,下图中,子图{1,2,3,4}为一个强连通分量,因为顶点1,2,3,4两两可达。{5},{6}也分别是两个强连通分量。...原创 2010-02-28 15:41:11 · 309 阅读 · 0 评论 -
改进的线性筛法_寻找素数
1,实例代码:[code="cpp"]#include using namespace std;const int MAX=100;bool isPrime[MAX+1];int total;//计数int prime[MAX+1];//线性筛法寻找素数void makePrime(){ memset(isPrime,true,sizeof...2010-03-03 10:41:16 · 90 阅读 · 0 评论 -
优先级队列
1,优先级队列是不同于先进先出队列的另一种队列。最大优先级队列,是这样的一种队列结构,它的内部存放着一系列的元素,每个元素都对应着一个最优级,最大优先级队列不管各元素的入队顺序,在出队时,总是对应优先级最大的元素出队。2,优先队列是0个或多个元素的集合,每个元素都有一个优先权或值.对优先队列执行的操作有1) 查找;2) 插入一个新元素;3) 删除.在最小优先队列(min p...原创 2010-06-17 23:15:43 · 121 阅读 · 0 评论 -
为什么堆排比快排慢
[节选][url]http://mindhacks.cn/2008/06/13/why-is-quicksort-so-quick/[/url]1,排序的本质可以这样来表述:一组未排序的N个数字,它们一共有N!种重排,其中只有一种排列是满足题意的(譬如从大到小排列)。换句话说,排序问题的可能性一共有N!种。任何基于比较的排序的基本操作单元都是“比较a和b”,这就相当于猜数字游戏里面的一个问...原创 2010-12-16 15:25:28 · 261 阅读 · 0 评论 -
BM算法.
1,BM算法是Boyer-Moore算法的简称,由Boyer 和Moore提出.2,BM算法也是一种快速串匹配算法,BM算法与KMP算法的主要区别是匹配操作的方向不同。虽然BM算法仅把匹配操作的字符比较顺序改为从右向左,但匹配发生失败时,模式T右移的计算方法却发生了较大的变化.3,滑动距离函数:为方便讨论,BM算法的关键是,对给定的模式T="t0t1…tm"定义一个从字符到正整...原创 2010-07-02 10:53:46 · 329 阅读 · 0 评论 -
Sunday算法
1,Sunday算法是Daniel M.Sunday于1990年提出的一种比BM算法搜索速度更快的算法。2,Sunday算法其实思想跟BM算法很相似,只不过Sunday算法是从前往后匹配,在匹配失败时关注的是文本串中参加匹配的最末位字符的下一位字符。如果该字符没有在匹配串中出现则直接跳过,即移动步长= 匹配串长度+ 1;否则,同BM算法一样其移动步长=匹配串中最右端的该字符到末尾的距离+1...原创 2010-07-02 11:38:44 · 240 阅读 · 0 评论 -
斐波那契堆
学习的地方:[url]http://en.wikipedia.org/wiki/Talk:Fibonacci_heap[/url][url]http://jicheng.ycool.com/post.2380567.html[/url]1,先贴个代码:[code="cpp"]#include using namespace std;#include #inc...原创 2010-07-04 11:36:17 · 103 阅读 · 0 评论 -
基数排序
详细解释参考:[url]http://en.wikipedia.org/wiki/Radix_sort[/url]1,"基数排序法"(radix sort)则是属于"分配式排序"(distribution sort),基数排序法又称"桶子法"(bucket sort)或bin sort.它是透过键值的部份资讯,将要排序的元素分配至某些"桶"中,藉以达到排序的作用.复杂度分析:基...2010-05-03 16:45:48 · 83 阅读 · 0 评论 -
求两个数组的中位数
1,题目有两个数组,均已经按升序排列好,编程序计算这两个数组的中位数要求:要求时间复杂度O(lgn) 空间复杂度O(1)例子:数组A:{1,4,6,7,9} B{2,3,5,8} 两数组合并后{1,2,3,4,5,6,7,8,9} 中位数就是中间的那个数: 52,方法:对两个数组分别二分找解对每个元素可以O(1)判断它在另外一个数组应该所在的位置...2010-05-02 12:08:06 · 259 阅读 · 0 评论 -
imba的bit向量
1,先给出一个模板.[code="cpp"]#include using namespace std ;class BitVector{public: enum{ BITSPERWORD=32, SHIFT=5, MASK=0x1f}; void set(int i) { //除以32的整数部分 0到31其中的1位...2010-04-22 17:30:34 · 108 阅读 · 0 评论 -
md5算法
Message Digest Algorithm MD5(中文名为消息摘要算法第五版)为计算机安全领域广泛使用的一种散列函数,用以提供消息的完整性保护。(1)概述:MD5以512位分组来处理输入的信息,且每一分组又被划分为16个32位子分组,经过了一系列的处理后,算法的输出由四个32位分组组成,将这四个32 位分组级联后将生成一个128位散列值。(2)算法流程: [img]ht...2010-03-31 10:35:39 · 342 阅读 · 0 评论 -
找出带环单链表入口点
找出一个带环单链表的环开始的结点 一个n方复杂度的算法:[code="c++"]#include using namespace std;//定义数据结构struct Node{ Node(int i):data(i),next(0){} int data; Node* next;};//释放带环的节点void ...原创 2009-12-21 10:57:45 · 85 阅读 · 0 评论 -
字符串匹配,Rabin-Karp算法
朴素的字符串匹配算法为什么慢? 因为它太健忘了,前一次匹配的信息其实可以有部分可以应用到后一次匹配中的,而朴素的字符串匹配算法只是简单的把这个信息扔掉,从头再来,因此,浪费了时间。好好的利用这些信息,自然可以提高运行速度。[b][size=large]1.问题描述[/size][/b]给定目标字符串 T[0..n-1] (基于 0 的数组,数组长度为 n ),和模式串 P[0..m...2009-12-22 11:00:29 · 187 阅读 · 0 评论 -
字符串匹配,KMP算法
[b]1,算法简介[/b]KMP算法是模式匹配算法的一种改进算法,是D.E.Knuth与V.R.Pratt和J.H.Morris同时发现的,因此人们称它为克努特-莫里斯- 普拉特操作(简称KMP算法)。[b]2,算法核心[/b]对字串进行预处理.依靠get_next函数计算出子串中每个字符对应的next[j]的值,从而减少子串回溯的距离,减[b]少时间复杂度。3,算法性能[/b...2009-12-22 18:03:28 · 82 阅读 · 0 评论 -
Two Professors
[b]1,题目大意:[/b]给n条线段,要求划分成尽可能少的子集,使得在同一个子集中的线段两两不重叠.同时限定线段1和线段2不能在同一子集中. [b]2,问题分析:[/b](1)记每条线段为[Li,Ri], 每个子集的最右端为Bi. 记线段1和2中,L较小的那个为X,另一个为Y.(2) 如果没有那个限定,容易想到贪心的方法:将所有线段按L从小到大排序.然后...原创 2009-12-25 10:48:00 · 142 阅读 · 0 评论 -
Tire树
[b]Tire树:[/b]先简单解释一下Trie。“Trie”这个单词来自于"retrieve",可见它的用途主要是字符串查询。Trie不发tree的音,而发try的音。[b]应用[/b]题目大意:统计子串出现的次数,规定子串的长度不超过8.[url]http://acm.scs.bupt.cn/onlinejudge/showproblem.php?problem_id=...原创 2009-12-25 11:36:40 · 89 阅读 · 0 评论 -
红黑树
[b]二叉排序树[/b]1,二叉排序树(Binary Sort Tree)又称二叉查找树。2,它或者是一棵空树;或者是具有下列性质的二叉树:(1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值;(2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值;(3)左、右子树也分别为二叉排序树;[b]平衡二叉树[/b]1,平衡二叉树,又称AVL树。2,它...原创 2009-12-28 13:21:43 · 101 阅读 · 0 评论 -
后缀树(Suffix Tree)
1,后缀树(Suffix tree)是一种数据结构,能快速解决很多关于字符串的问题。后缀树提出的目的是用来支持有效的字符串匹配和查询。简单点说,后缀树就是将一个给定字符串的所有后缀全部压入一个Trie,然后将只有单个叶子的节点压缩,从而形成的一棵树.2,后缀树的用途,总结起来大概有如下几种(1). 查找字符串o是否在字符串S中。方案:用S构造后缀树,按在trie中搜索字串的方法...原创 2009-12-28 17:10:46 · 288 阅读 · 0 评论 -
后缀数组
好难,慢慢学.1,定义:(1)约定一个字符集Σ和一个字符串 S,设 len(S)=n,且 S[n]='$',也就是说 S 以一个特殊字符'$'结尾,并且'$'小于Σ中的任何一个字符。除了 S[n]之外,S 中的其他字符都属于Σ。对于约定的字符串 S,从位置 i 开头的后缀直接写成 Suffix(i)。例如:S=mississippi+'$'(2)后缀数组 后缀数组SA...原创 2009-12-30 10:53:48 · 87 阅读 · 0 评论 -
间接排序
什么是间接排序?复制/移动元素代价很高时,另外设置一个数组,其中每个元素是指向原数组元素的指针,针对这个指针数组进行交换等操作.举例:最常见的就是索引数组排序前: 索引数组:0 1 2 3 4待排数组:4 3 1 2 5排序后:索引数组:2 3 1 0 4待排数组:4 3 1 2 5 ...原创 2009-12-30 10:56:03 · 334 阅读 · 0 评论 -
树状数组
[b]1,用途[/b]树状数组是一种非常优雅的数据结构.当要频繁的对数组元素进行修改,同时又要频繁的查询数组内任一区间元素之和的时候,可以考虑使用树状数组.换句话说,树状数组最基本的应用:对于一个数组,如果有多次操作,每次的操作有两种:1、修改数组中某一元素的值,2、求和,求数组元素a[1]+a[2]+…a[num]的和。[b]2,复杂度[/b]最直接的算法可以在O(1)时间内...原创 2010-01-04 15:23:51 · 155 阅读 · 0 评论 -
伸展树
伸展树(Splay Tree)是一种二叉排序树,它能在O(log n)内完成插入、查找和删除操作。它由Daniel Sleator和Robert Tarjan创造。它的优势在于不需要记录用于平衡树的冗余信息。在伸展树上的一般操作都基于伸展操作。[b]为什么需要伸展树(Splay Tree)[/b]各种查找树存在不足。比如:对于一个有n个节点的平衡树,虽然最坏情况下每次查找的时间复杂度不...原创 2010-01-10 15:59:36 · 204 阅读 · 0 评论 -
快速排序
1,给出一个实现实例.[code="cpp"]#include using namespace std;void QuickSort(int data[], int l, int u){ if (l >= u) return; int val = data[l]; int i = l; int j = u; ...2010-04-01 13:50:22 · 73 阅读 · 0 评论 -
各式各样的排序算法
[b]1,选择排序.[/b]核心思想:n个数,两重for循环,第一重n-1次,第k次选出第k小的数的下标index,交换下标index和k-1的值.[code="cpp"]#include using namespace std;void SelectSort(int r[ ], int n){ int m=0; int i; int ...2010-01-13 21:15:43 · 74 阅读 · 0 评论 -
编写自己的malloc
1,如果一个程序大量调用malloc,程序的很多时间将会消耗在malloc函数的调用上.2,编写自己的malloc.给出一段模板代码:[code="cpp"]#define NODESIZE 8#define NODEGROUP 100int nodeleft=0;char* freenode;void* myMalloc(int size){ v...2010-04-19 17:03:03 · 270 阅读 · 0 评论 -
RMQ问题
RMQ (Range Minimum/Maximum Query)问题是指:对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j原创 2010-01-20 16:27:29 · 215 阅读 · 0 评论 -
线段树
[b]线段树的构造思想 [/b]线段树是一棵二叉树,树中的每一个结点表示了一个[b]区间[/b][a,b]。每一个叶子节点表示了一个单位区间。对于每一个非叶结点所表示的结点[a,b],其左儿子表示的区间为[a,(a+b)/2],右儿子表示的区间为[(a+b)/2,b]。 例如:[img]http://dl.iteye.com/upload/attachment/196564/edeb7...原创 2010-01-21 14:43:14 · 78 阅读 · 0 评论 -
使用map和hash_map的效率问题
1,选择map容器,是为了更快的从关键字查找到相关的对象。与使用list这样的线性表容器相比,一可以简化查找的算法,二可以使任意的关键字做索引,并与目标对象配对,优化查找算法。在C++的STL中map是使用树来做查找算法,这种算法差不多相当与list线性容器的折半查找的效率一样,都是 O(log2N),而list就没有map这样易定制和操作了。 2,相比map,hash_map使用...原创 2010-12-09 19:49:03 · 227 阅读 · 0 评论