算法总结
文章平均质量分 78
zamac1993
这个作者很懒,什么都没留下…
展开
-
多路归并排序
我们有如下一个问题:对于若干个长度相同的序列,将其合并成一个有序的序列。暴力的方法显然是不可取的,这里可以利用优先队列来处理这个问题。首先从简单的开始,对于2路归并排序,设两个序列为{A},{B},将{A},{B}排序,有A1B1建立一个优先队列,队列中首先存入元素(A1,0),(B1,1),其中标志0,1分别表示元素中的值属于第一个序列还是第二个序列,那么第一次从原创 2013-11-07 17:39:02 · 708 阅读 · 0 评论 -
浅谈树状数组和RMQ问题
有这样一个问题:给定一个n个元素的数组{A},你的任务是设计一个数据结构,支持一下操作:ADD(x,d):让Ax增加dQuery(L,R)求A[L]+A[L+1]+...+A[R]的和很显然这可以用线段树求解,但这里说的不是这种数据结构,我们要讨论的是树状数组,一个利用位运算来进行操作的数据结构,相对于上述问题,树状数组速度略微会快一点,而且写起来也简单一些,当然线段树的用处更原创 2013-11-07 20:56:07 · 1294 阅读 · 0 评论 -
浅谈线段树标志下放
线段树不仅支持点修改,还可以支持区间更新,是一个非常实用的数据结构,关于点修改,基本不会涉及到标志下放的问题,这里不予讨论,而且这一类线段树问题一般来说也很简单,而涉及到区间操作往往会有标志下放的问题,而这个问题之前一直很困扰我,于是写一遍博客来警示自己。首先举例一个问题:有序列{A},有以下三个操作:(1):add(L,R,v),A[L]....A[R]每一个加v(2):原创 2013-11-07 22:00:58 · 611 阅读 · 0 评论 -
AC自动机算法
首先介绍Trie(前缀树)这种数据结构。举例来说比较简单如图所示就是表示字符串集合{inn,int,tca,ten,to}的前缀树,建树的代码为C++代码:struct Trie{ int ch[maxnnode][sigma_size];//节点i的字符标号为j的那个子节点的编号 int val[maxnode];//记录字符串的值,通常为其标号原创 2013-11-08 10:57:33 · 426 阅读 · 0 评论 -
高斯消元
高斯消元的步骤相信大家都很清楚,就是从上到下处理矩阵的每一行,处理完后Aii之前的全为0,Aii非零,代码如下:typedef double Matrix[maxn][maxn];void gauss(Matrix A,int n){ for(int i=0;i<n;i++){ int r=i; for(int j=i+1;j<n;j++){原创 2013-11-09 20:09:55 · 447 阅读 · 0 评论 -
排序二叉树和treap
排序二叉树:它是这样的一棵树,根的左儿子的键值小于根节点的键值,右儿子的键值大于根节点的键值,并且他的子树也满足这样的性质。为什么会叫它排序二叉树呢,因为如果按照中序排序,那么结果是一个递增的序列。可以证明的是,在一颗排序二叉树中查找、插入和删除的算法复杂度都是树的高度,但是由于排序二叉树的建树和建树过程中选择的序列顺序有关,那么建树的好坏会直接影响其结构的效率,理论上数学期望为O(logn),最原创 2013-11-09 21:39:00 · 659 阅读 · 0 评论