快速排序算法与归并排序很像,都是分治的思想。不同点在于归并排序算法是通过位置下区分两个区间,而快速排序算法是用值来区分两个区间。所以归并排序算法还需要合并的操作,而快速排序则不需要。 快速排序算法最核心的地方在于:在区间中选择一个值pivot,让大于pivot的都在它的一边,而让小于pivot的都在另一边
近期学习《算法设计与分析基础 第二版》,学习到了分治法,被课后习题吸引了,即Trimino拼图问题。想了好久,都没有想到如何去分而治之。然后就是Google到了相关的PPT。一看就明白了。自己就用代码实现了下。理解思想后,代码实现挺容易的。 这个谜题实际上可以做成一个小益智游戏。 &
<由于本文从word中粘贴过来,故排版比较乱,可下载附件中的pdf版>引言在许多的信息检索应用中,很多地方都需要以前缀匹配的方式来检索输入的字符串。比如:编译器的词法分析、目录检索、拼写检查、中文分词的词库等自然语言处理相关的应用。为了提高检索的效率,我们通常把字符串构建成Trie树的形式。Trie树的每个结点是一个数组,数组中存储着下一个结点的索引信息。如对K=set{baby,ba
在博客上发表了求最短路的Dijkstra算法后,有很多同学对路径比较感兴趣。也就是说,他们不仅想知道最后的结果,也想知道结果是怎么来的。想想也是自己的坏习惯所致,浅尝辄止。重新把Dijkstra算法的思路整理一遍,正好也温故而知新。 首先从图的遍历方式说起。在数据结构中,树的遍历方式有三种:先序遍历、中序遍历、后序遍历。图比树更为灵活,但是图的
刚开始学dijkstra算法的时候,写过一篇关于dijkstra算法的博客,留下的QQ,结果很多人来询问。 后来,发现那个代码写得实在是太难看了,于是把代码重新整理了一下,贴上来吧。数据还是http://sbp810050504.blog.51cto.com/2799422/690803 里面的数据。 import java.util.Array
感觉大概已经了解到KMP算法了,就去搜索POJ上面的水题来练习一下,找找感觉!一找就发现问题了!我对KMP算法还没有领悟进入! 我开始的代码是这样写的: #include<stdio.h> #include<string.h> #define MT 1000005
前段时间学习了KMP算法,感觉略懂略懂!但算法这个东西理解一定要深入,不是略懂略懂就能敷衍过去的!真真做题的时候,才发现仅仅套模板是根本没用的,必须自己写得来代码,这样的话才能从细节,从根本上了解KMP算法的实现过程! 既然这样的话,就只好再把KMP算法弄出来好好学习一翻了! 很简单的一个例子:有I am xia
记得暑假的时候看《亚洲区预选赛真题题解》的时候,看到树状数组那道题,只是勉强看懂思路了!树状数组的结节根本就没有掌握。时隔四个月,再回头看这道题,感觉轻松多了! 对于hdu2492这道题,用树状数组是非常好的选择,代码短,结构简单,不易出错! 其核心的思路在于:假如有a1 a
以前都学过树状数组,但是已经差不多忘记了!不过看一看后,马上就都回忆起来了!而且感觉经过这么久的学习,对树状数组有了更深一层的领悟!个人觉得树状数组在本质上与线段树是没有区别的!都是管理区间,只不过树状数组管理区间的方式不一样罢了! 经过了解后就学习着解决hdu1754那道水题吧!我在网上看到的代码多半是用线段树解决的!这里把用色树状数组的
学习如何用线段树来统计矩形的并面积后,接下来我学习一下如何用线段树来统计矩形周长的并!尽管其基本思路跟统计矩形的面积差不多,但估计是因为没有完全明白线段树的思想,我还是没有想出如何用线段树统计线段树的面积! 在学习的过程中参考了以下两个博客的代码,最终以博客二的代码作为研究对象! 博客一:http://www.notonlysuccess.
研究了线段树计算矩形面积的水题poj1151的实现过程,我又好好研究了用线段树来解决另一道稍微难一点的题:hdu3265,这是09年宁波赛区的一道题,只是在poj1151的基础上更巧妙了一点! 由于题目给出的矩形是回字形,所以我把把一个回字拆开就可以了,也就是说,hdu3265中插入一个poster,相当于插入了四个矩形(也可能只有三个)!
线段树果然是一个超级灵活的数据结构!其用法,其复杂度,没有认认真真,一步一步地踏踏实实里走过来,其实什么也学不到! 这里记录一个线段树的博客:http://www.notonlysuccess.com/index.php/segment-tree-complete/ &n
线段树是一种灵活的具有区间管理功能的数据结构,其用途跨越离散和线性思想! 我们最常用到的线段树就是区间求和: /* * InterverTree.cpp * * Created on: 2012-11-1 * &nbs
把前面的倍增算法的内容看懂大概后,由于时间问题,就直接跳到calHeight()方法的研究中去! 在实际应用,仅有sa数组是不够的,为了快速求解,还需要一个height数组!height数组的定义很容易理解:height[i]=suffix(sa[i-1])与suffix(sa[i])的最长公共前缀,也就是排名相邻的
需要说的都已经在源代码中注明了! #include<stdio.h> #include<string.h> #include<algorithm> using namespace std; int cmp(int *r,int
以前看基数排序,觉得挺容易懂的,也就没太注意!谁知道,过了一段时间之后已经忘记了!前几天学习后缀数组的时候,用到了基数排序!就再复习了一下! 基数排序的过程是这样的: 最低位优先(Least Significant Digit first)法,简称LSD法 第一步:建立10
在前面的博文里面分析了SA数组和rank数组的实现过程,实际上也就是倍增算法的思想分析!虽然思想上面懂了,但是代码实现还是很难理解的!因为代码里面做了太多的优化。 整个代码的实现可以分成两部分:1、对所有后缀的第一次排序!运用第一次排序的结果来推算后面的排序! 一、对所有后缀的第一次排序: for (i = 0;&nbs
由于后缀的数组的构造过程比较精妙,代码也经过了很多的优化,一下子不怎么容易看懂,我就把它化整为零,一点一点来做! 首先还是倍增算法的思想: 综合许大牛与罗大牛的论文,应该是很容易懂的!倍增其实就是排序的一种策略、这种策略要求对基数排序的思想有所理解!如果不懂基数排序,我觉得不用急着去学习后缀数组了!
去年的时候弄了一阵子的后缀数组,当时一直都没有弄懂!今年再看后缀数组,似懂非懂!其实还是没懂!但比去年的完全不懂,还是有进步的! 下来把思路理了理,要看明白后缀数组,是需要一些知识储备的! 1、基数排序要会,快速排序会更好! 2、最好学习了一些字
今天刚刚把Trie图的模板弄到了,并且解决一个简单的多模匹配的问题HDU2222,想到上次做福州赛区的那道题,今天就套模板做了一下,很快乐地就AC了! 呵呵……其实也没那么顺利! 第一次提交超空间了!主要是我傻呼呼的把子串反过来插入Trie图中,后来看书上,原来是把母串反转,然后再查一次就OK了!
学习字典树有段日子了!上次去做福州赛区2010年的试题的时候,里面有一道题:字符串的多串匹配!当时就觉得应该是字典树的题,但是分析了一下后数据量太大了!就没做它!下来翻书一看,果然跟字典树有关,但不是字典树!如果用字典树肯定会超时,而不是超空间! 不管怎么样,还是基础的数据结构和算法都没有学全,没有进行系统的学习啊!很多时候感叹,如果有老师能
看KMP算法好几天了!今天有所感悟,就把感悟记录下来吧!这篇文章不讨论KMP算法的细节,因为对于这么一个经典的算法,有很多作者写得相当之深刻与清晰! 比如:July的博客(http://blog.csdn.net/v_JULY_v/article/details/6111565) 在这里向这位大牛致敬!也感谢提供这个博客给我的朋友(张钊)
今天开始了系统了解一下字符串相关的算法,学习到KMP算法感觉走不动了!看来这个算法难还真不虚啊! 我学习算法还是沿袭老传统,通过ACM的题来实战!找到HDU上最朴素的查找子串问题,在网上搜索到了两种算法(KMP算法和BM算法)的源代码: KMP(http://hi.baidu.com/nouxizqtzubcstd/item/
本来准备学习Hash的,结果看PPT讲的第一个算法竟然是跟字符串处理相关的,本来Hash中也有一块专门讲字符串Hash的,就按照《算法导论》中的分类,把这个分到“字符串处理”中去吧! Rabin-Karp算法的思想超级简单:把有d个不同字母的字符串转化为一个d进制数。如果得到的这个数字太多可以模一个质数,但这样要进行一
在前面代码的基础上,我增加一些操作! /* * splayModel.cpp * 本程序是在从网上搜索到的源代码经过理解、分析过后,在原有功能的基础上, * 进行一定的优化及功能的添加,将作为我自己关于 伸展树(SplayTree)
这一篇写了伸展树的学习就想告一段落了!毕竟也纠结这么久了!本来觉得自己已经理解得差不多了,就不想总结了,但想到“好记性不如烂笔头",就还是都写下来吧! 在《运用伸展树解决数列维护问题》里已经对“怎么在伸展树中表示任意区间"这一问题说得很清楚了,只是没有说到具体的操作实现。 &nbs
前面讲解了插入结点的操作过程,本文就分析一下程序是如何删除一个结点呢? 伸展树的删除图解: 假如伸展树结构如下图,而我们要删除结点6(根结点),操作的过程是怎么样的呢?(这里的图有一点错误:tail的父亲应该是:10,而不是1) 第一步:首先把结点6旋转到根结点(select操作)这样删除结点6的操作就变成了删除根结点的操作了。
前面讲解了伸展树的原始姿态:二叉搜索树!这篇文章呢就讲解一下伸展树的两种操作:右旋(zag)和左旋(zig)操作: 伸展树右旋的图示:(旋转的结果就是:使结点t的位置向上移动:人往高处走嘛)
上一篇里把源代码贴出来了!这里就一点点来分析! 首先第一步建树: #define INF ~0u>>1 #define NIL SPLAY #define MN 200005 using namespace std
Copyright © 2005-2024 51CTO.COM 版权所有 京ICP证060544号