
数据结构与算法
文章平均质量分 79
Aiphis7
这个作者很懒,什么都没留下…
展开
-
后缀树系列二:线性时间内构建后缀树(包含代码实现)
上一篇文章已经介绍了后缀树的前前后后的知识,并且采用各种技巧逼近线性时间了,至于具体怎么操作大家看完之后应该多多少少有点想法了。而之所以将本文跟上一篇文章分开,主要考虑有三:第一,和在一起文章就会太长了,看的头疼。第二,理论跟实现本来就有差异,本文中一些具体实现并没有严格遵守上文中的条条框框。当然了,主题思想是一样的。第三,本文会从具体实现的角度,在实现过程中进一步阐述上文中的原理。换个角转载 2015-09-09 11:50:51 · 2342 阅读 · 0 评论 -
后缀数组(罗穗骞):笔记
LINK : http://www.cnblogs.com/cssystem/archive/2013/03/08/2950662.html首先吐槽一句:大神就是大神,写的东西我理解了三个月终于沾到边了!进入正题:http://wenku.baidu.com/view/ed1be61e10a6f524ccbf85fd.html建议跟pdf一起看转载 2015-10-21 20:46:11 · 802 阅读 · 0 评论 -
后缀数组倍增算法模版
LINK : http://bbezxcy.iteye.com/blog/1403297 首先献上模版 Cpp代码 #include #include #include using namespace std; const int Max = 20001; int num[Max]; int s转载 2015-10-21 20:45:31 · 418 阅读 · 0 评论 -
数据结构之后缀数组
1. 概述后缀数组是一种解决字符串问题的有力工具。相比于后缀树,它更易于实现且占用内存更少。在实际应用中,后缀数组经常用于解决字符串有关的复杂问题。本文大部分内容摘自参考资料[1][2]。2. 后缀数组2.1 几个概念(1)后缀数组SA 是一个一维数组,它保存1..n 的某个排列SA[1],SA[2],……,SA[n],并且保证Suffix(SA转载 2015-10-08 09:52:10 · 365 阅读 · 0 评论 -
数据结构之Treap
1. 概述同splay tree一样,treap也是一个平衡二叉树,不过Treap会记录一个额外的数据,即优先级。Treap在以关键码构成二叉搜索树的同时,还按优先级来满足堆的性质。因而,Treap=tree+heap。这里需要注意的是,Treap并不是二叉堆,二叉堆必须是完全二叉树,而Treap可以并不一定是。2. Treap基本操作为了使Treap 中的节点同时转载 2015-10-08 10:04:53 · 480 阅读 · 0 评论 -
数据结构之线段树
1、概述线段树,也叫区间树,是一个完全二叉树,它在各个节点保存一条线段(即“子数组”),因而常用于解决数列维护问题,它基本能保证每个操作的复杂度为O(lgN)。2、线段树基本操作线段树的基本操作主要包括构造线段树,区间查询和区间修改。(1) 线段树构造首先介绍构造线段树的方法:让根节点表示区间[0,N-1],即所有N个数所组成的一个区间,然后,转载 2015-10-08 10:04:03 · 363 阅读 · 0 评论 -
字符串:KMP Eentend-Kmp 自动机 trie图 trie树 后缀树 后缀数组
涉及到字符串的问题,无外乎这样一些算法和数据结构:自动机 KMP算法 Extend-KMP 后缀树 后缀数组 trie树 trie图及其应用。当然这些都是比较高级的数据结构和算法,而这里面最常用和最熟悉的大概是kmp,即使如此还是有相当一部分人也不理解kmp,更别说其他的了。当然一般的字符串问题中,我们只要用简单的暴力算法就可以解决了,然后如果暴力效率太低,就用个hash。当然hash也是一个面试转载 2015-10-08 12:58:34 · 412 阅读 · 0 评论 -
KMP算法的C语言实现
//******************************************************************************************************************************// KMP算法的C语言代码实现////核心思想:匹配过程中匹配不等时,不需回溯i指针,而是利用已经得到的“转载 2015-10-22 14:02:25 · 1206 阅读 · 0 评论 -
A*路径搜寻算法
原文链接:http://blog.youkuaiyun.com/luckyxiaoqiang/article/details/6996963A*搜寻算法,俗称A星算法。这是一种在图形平面上,有多个节点的路径,求出最低通过成本的算法。常用于游戏中的NPC(Non-Player-ControlledCharacter)的移动计算,或线上游戏的BOT(ROBOT)的移动计算上。该算法像Dijks转载 2015-09-18 16:10:08 · 731 阅读 · 1 评论 -
轻松搞定面试中的二叉树题目
版权所有,转载请注明出处,谢谢!http://blog.youkuaiyun.com/walkinginthewind/article/details/7518888树是一种比较重要的数据结构,尤其是二叉树。二叉树是一种特殊的树,在二叉树中每个节点最多有两个子节点,一般称为左子节点和右子节点(或左孩子和右孩子),并且二叉树的子树有左右之分,其次序不能任意颠倒。二叉树是递归定义的,因此,与二叉树转载 2015-09-19 15:59:49 · 303 阅读 · 0 评论 -
后缀数组
LINK : http://www.cppblog.com/MatoNo1/archive/2011/10/23/158926.html【后缀数组真难懂啊啊……就20+行的代码搞了几天才理解……不知是不是我太沙茶了】【1】一些定义:字符串:广义的字符串是指“元素类型有序,且元素值有一定范围的序列”,其元素不一定非要是字符,可以是数字等,因此整数、二进制数等也是字符串;字转载 2015-10-21 20:44:38 · 499 阅读 · 0 评论 -
实现一个比较高级的字符匹配算法,即一串很长的字符,要求找到符合要求字符的字符串
一个小的算法题,题目如题。什么意思呢?就是一个很长的模式串例如“432A5234B5664C3243454”,再给一个目标串“ABC”,只要模式串中某一个字符串同事包含目标串中的每一个元素即可!要求很低!很明显的用暴力匹配很容易就做出来了,但是暴力匹配算法的时间复杂度很低,是乘方级的(O(n^m))!KMP算法很难处理这种模糊的匹配。如何才能提高效率呢,利用hash表就很容转载 2015-09-18 09:13:47 · 1083 阅读 · 0 评论 -
Trie树(压缩Trie树及Double-Array Trie)
又称字典树或者前缀树,一种用于快速检索的多叉树结构;英文字母的Trie树为26叉树,数字的Trie树为10叉树;All the descendants of a node have a common prefix of the sequence associated with that node, and the root is associated with the empty sequen转载 2015-09-07 18:30:03 · 3465 阅读 · 0 评论 -
后缀树的构造方法-Ukkonen详解
最近在学习后缀树的构造,在网上找了好久发觉国内详解它的构造的文章胜少,在苦苦寻觅了许久,终于发现了一个网友翻译的一篇文章,很好,于是我转帖出来,希望能有更多的人受益,也希望国内多一些英文高手多翻译一些国外的技术文章,好让我们这些英文很烂的人受益,呵呵!后缀树Fast String Searching With Suffix Trees 原著Mark转载 2015-07-28 15:20:29 · 803 阅读 · 0 评论 -
后缀数组学习笔记——罗穗骞倍增算法代码
LINK: http://www.cnblogs.com/staginner/archive/2012/02/02/2335600.html 一开始看“小罗”写的论文和模板真的云里雾里,理解起来十分困难,后来结合一个百度贴吧里面的学习笔记总算是把倍增算法的代码的意思搞懂了,于是后面自己也写了一份对“小罗”倍增算法代码的注释,希望能对各位正在学习后缀数组的同僚带来一点帮助。转载 2015-10-17 09:05:05 · 809 阅读 · 0 评论 -
维护100亿个URL(Radix TRee)
http://s.sousb.com/2011/04/19/%E7%BB%B4%E6%8A%A4100%E4%BA%BF%E4%B8%AAurl/题目:url地址 比如http://www.baidu.com/s?wd=baidu 的属性,包括定长属性(比如其被系统发现的时间)和不定长属性(比如其描述)实现一个系统a.储存和维护100亿个url及其属性。b.实现url及转载 2015-09-16 09:55:42 · 1140 阅读 · 0 评论 -
红黑树c源码实现与剖析
作者:July 、那谁 时间:二零一一年一月三日-------------------------前言: 红黑树作为一种经典而高级的数据结构,相信,已经被不少人实现过,但不是因为程序不够完善而无法运行,就是因为程序完全没有注释,初学者根本就看不懂。 此份红黑树的c源码最初从linux-lib-rbtree.c而来,后经一网友那谁用c写了出来。在此,向原作转载 2015-09-16 17:14:24 · 519 阅读 · 0 评论 -
《黑书》后缀数组学习笔记.
LINK: http://www.cnblogs.com/ziyi--caolu/archive/2013/06/02/3114448.html最近看黑书看到数据结构之后缀数组了,以前没有搞过后缀数组,初学起来感觉比较难,网上参考了两种后缀数组学习笔记,以及罗穗骞倍增算法代码,这里附上链接:http://tieba.baidu.com/f?kz=754580296h转载 2015-10-20 16:50:01 · 617 阅读 · 0 评论 -
从最大似然到EM算法浅解
link : http://blog.youkuaiyun.com/zouxy09/article/details/8537620从最大似然到EM算法浅解zouxy09@qq.comhttp://blog.youkuaiyun.com/zouxy09 机器学习十大算法之一:EM算法。能评得上十大之一,让人听起来觉得挺NB的。什么是NB啊,我们一般说某个人转载 2015-09-16 16:33:36 · 442 阅读 · 0 评论 -
深入浅出K-Means算法
摘要:在数据挖掘中,K-Means算法是一种 cluster analysis 的算法,其主要是来计算数据聚集的算法,主要通过不断地取离种子点最近均值的算法。在数据挖掘中,K-Means算法是一种cluster analysis的算法,其主要是来计算数据聚集的算法,主要通过不断地取离种子点最近均值的算法。问题K-Means算法主要解决的问题如下图所示。我们可以看到,在图的左转载 2015-09-16 16:34:10 · 223 阅读 · 0 评论 -
Ukkonen后缀树算法的真·清晰解释
本站有个翻译的文章,名字叫Ukkonen 的后缀树算法的清晰解释。这篇文章写得不错,但是还是犯了错误的。我按照这篇文章的说明实现了所谓的Ukkonen算法,但是在测试时出现了错误,事后,进行了大量的排查(因为我一开始认为肯定不是文章的问题是我的问题,花了2天没解决,最后抛开“文章正确”的观点才解决)下面,是我重新整理后的Ukkonen算法,采用的例子还是"abcabxabcd"转载 2015-09-16 09:54:04 · 4545 阅读 · 1 评论 -
KMP和扩展KMP
原文转自:http://www.cppblog.com/MatoNo1/archive/2011/04/17/144390.aspxKMP:给出两个字符串A(称为模板串)和B(称为子串),长度分别为lenA和lenB,要求在线性时间内,对于每个A[i](0【算法】设next[i]为满足B[i-z+1..i]==B[0..z-1]的最大的z值(也就是B的自身匹配)。设目前next[0转载 2015-09-18 16:06:58 · 319 阅读 · 0 评论 -
STL中的map容器的一点总结
一、关于map的介绍map是STL的一个容器,和set一样,map也是一种关联式容器。它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力,由于这个特性,有助于我们处理一对一数据。这里说下map内部数据的组织,map内部是自建一颗红黑树(一种非严格意义上的平衡二叉树),这颗树具有对数据自动排序的功能,所以在map内部所有的数据转载 2015-09-18 16:09:28 · 449 阅读 · 0 评论 -
关于数组TOP K算法(快排及最小堆方式C代码)
TOP K即返回给定集合最大的K个元素,这个集合有可能很大,十亿,有可能万亿,所以对算法的要求比较高。以下是我的总结:一、采用快速排序的分治算法思想进行求解:快速排序的思想是使用一个标志点将数组分为两个部分,小于该点的数据移动到该点的左侧,大于该点的数据移动到该点的右侧,然后进行递归,最后达到有序。同理我们也可以使用该思想求数组的TOP K。也是使用第一个元素左右标志,小于该点的元转载 2015-10-22 14:01:33 · 1295 阅读 · 0 评论 -
图说Rabin-Karp字符串查找算法
原文链接:Computer Algorithms: Rabin-Karp String Searching简介暴力字符串匹配(brute force string matching)是子串匹配算法中最基本的一种,它确实有自己的优点,比如它并不需要对文本(text)或模式串(pattern)进行预处理。然而它最大的问题就是运行速度太慢,所以在很多场合下暴力字符串匹配算法并不是那么有用转载 2015-09-23 08:18:03 · 1405 阅读 · 0 评论 -
后缀自动机学习总结
LINK: http://blog.sina.com.cn/s/blog_70811e1a01014dkz.html星期五的时候,在网上看别人的总结看了很久也没有什么收获,不过星期六看了clj原汁原味的论文,终于明白了(网上的总结只写了大致做法,比较难理解).后缀自动机实质上是字母树,记录的字符串是某个字符串s的所有后缀.这里以字符串ACADD为例:转载 2015-10-28 09:18:05 · 680 阅读 · 0 评论 -
后缀自动机 例题
LINK:http://www.cnblogs.com/Lyush/archive/2013/08/25/3281546.html后缀自动机也是解决字符串问题的常用工具,犀利在O(N)的空间复杂度下存在给定串的后缀以及子串,而且支持在线的操作。POJ-1509 Glass Beads题意:求一个字符串的最小表示的开始下标。分析:其实有一个O(转载 2015-10-28 09:48:03 · 640 阅读 · 0 评论 -
后缀自动机构造过程演示
LINK:http://www.cnblogs.com/GBRgbr/p/3236451.html昨天跟后缀自动机死磕了一下午,也没搞明白怎么回事。今天又把网上找到的资料重新看了一遍,顿时觉得一道大闪电从后脑劈过——好像突然有点明白了orz……不过只能说目前勉强明白了后缀自动机是如何构建的,对于它的很多性质和用法,还有待学习。本人弱菜一只,如有错误,欢迎指正~转载 2015-10-29 08:49:16 · 1502 阅读 · 0 评论 -
后缀数组的应用:最长重复(or回文)子串
Link:http://blog.chinaunix.net/uid-26448049-id-3054641.html问题:比如 weksabcdjklabcdll 最长重复字串为"abcd"解析://blog.youkuaiyun.com/zdl1016/article/details/4731875后缀数组举例 如下目标字符串: bananas 其长度转载 2015-10-15 10:47:09 · 628 阅读 · 0 评论 -
后缀数组
LINK : http://www.nocow.cn/index.php/后缀数组后缀数组是字符串处理的一个重要工具。它由原字符串的所有后缀的字典排序而得,具有较高的检索效率。字符串aaabaaab的所有后缀目录 [隐藏] 1 基本概念2 倍增算法3 线性时间复杂度算法3.1 KS033转载 2015-10-15 10:51:48 · 518 阅读 · 0 评论 -
后缀数组 DA(倍增)算法求 SA[N] 与 Rank[N] (时间O(NlogN),空间O(N))
LINK: http://www.cnblogs.com/yefeng1627/archive/2013/08/02/3233611.htmlsa[i] : 表示 排在第i位的后缀 起始下标rank[i] : 表示后缀 suffix(i)排在第几height[i] : 表示 sa[i-1] 与 sa[i] 的LCP 值h[i]: 表示 suffix(i)转载 2015-10-15 10:48:54 · 502 阅读 · 0 评论 -
后缀数组小结
LINK: http://blog.youkuaiyun.com/xymscau/article/details/8798046后缀数组号称字符串处理神器,不过发现好多人都只会用模板,其实这不是我们学算法的本质,我们学习算法的本质应该理解其实现原理,并加以实现,特别是算法,更讲究的是一种思想。一年前的我也是只会用别人的模板,最近却静下心来,研究了一下后缀数组,自己写了一份自己的模板。转载 2015-10-15 10:51:02 · 352 阅读 · 0 评论 -
双数组后缀树 Double-Array Trie(DAT)
LINK:http://blog.youkuaiyun.com/zzran/article/details/8462002自己对树是情有独钟,故在元旦放假的时候,翻译了an efficient implementation of trie structures。作者及来源就不叙述了。英文水平有限,但是尽量还原此文章的灵魂。如果有什么不对的地方,敬请各位给予指点。(http://blog.csdn.转载 2015-11-01 09:02:00 · 2131 阅读 · 1 评论 -
KR ,Karp Rabin 算法
原文链接:http://blog.youkuaiyun.com/onezeros/article/details/5531354Karp Rabin 算法是利用hash函数的特性进行字符串匹配的。KR算法对模式串和循环中每一次要匹配的子串按一定的hash函数求值,如果hash值相同,才进一步比较这两个串是否真正相等也许你会有这样的疑问,在Brute force暴力匹配中,每一次都把模式转载 2015-09-23 08:16:33 · 2275 阅读 · 0 评论 -
BOM字符串匹配算法
Backward Oracle Matching algorithmLINK :http://igm.univ-mlv.fr/~lecroq/string/bom.htmlTHE C CODEOnly the external transitions of the oracle are stored in link lists (one per state). The转载 2015-10-27 09:18:52 · 2015 阅读 · 0 评论 -
二叉树的深度优先遍历
原文链接:http://blog.youkuaiyun.com/zhonghua18517/article/details/28238261二叉树的深度优先遍历和先序遍历结果一样的。 思想是采用栈, 首先将根结点压入栈,如果栈不为空,而后出栈并输出当前结点中值,而后先把右子树压入栈,再把左子树压入栈,再判断栈是否为空,循环.....步骤如下:(1) 树的根结点入栈(转载 2015-09-21 10:23:42 · 348 阅读 · 0 评论 -
判断二叉树是否平衡、是否完全二叉树、是否二叉排序树
1.判断二叉树是否平衡//求树的高度int TreeDepth(Node* t){ int hl,hr,h; if(t != NULL) { hl = TreeDepth(t->left); hr = TreeDepth(t->right); h = hl>hr? hl:hr; return h转载 2015-09-21 15:13:59 · 617 阅读 · 0 评论 -
Hash Table哈希表和Hash List哈希链表的知识汇总
本文分为三个部分:一 Hash Table概论二 Linux源代码中的Hash List三 Linux源代码中的Hash Table一 Hash Table概论字符串的算法一般大公司都会考到,我们首先要想到高效的hash。如百度查找一组字符串是否出现在某个文本中,这个不是考什么kmp,他们想听到的是hash。趋势科技考的是从某个文本中删除一组字符串,我想也是要hash吧。转载 2015-10-10 15:24:34 · 1273 阅读 · 0 评论 -
shift-And / shift-Or 算法
原文链接:http://www.cnblogs.com/longdouhzt/archive/2011/09/25/2190550.htmlShift-And算法思想较之KMP算法很简单,设模式字符串为P,它主要通过保存一个集合D(D中记录了P中所有与当前已读text的某个后缀相匹配的前缀),每当text有新的字符读入,算法利用位并行机制来更新这个集合D。 设P长度为转载 2015-09-23 08:19:52 · 3055 阅读 · 0 评论 -
字符串匹配算法之SimHash算法
SimHash算法 由于实验室和互联网基本没啥关系,也就从来没有关注过数据挖掘相关的东西。在实际工作中,第一次接触到匹配和聚类等工作,虽然用一些简单的匹配算法可以做小数据的聚类,但数据量达到一定的时候就束手无策了。 所以,趁着周末把这方面的东西看了看,做个笔记。来历 google的论文“detecting near-duplicates for web转载 2015-10-10 15:39:01 · 615 阅读 · 0 评论