
Algorithm
orzlzro
这个作者很懒,什么都没留下…
展开
-
后缀数组
后缀数组就是要计算一个数组sa,sa[i]表示排名第i的后缀。可以直接按照后缀做一个快速排序就可以得到sa,但是时间复杂度会是O(nlogn * n)。 (因为要做nlogn次比较,每次比较都是比较两个后缀的大小,需要O(n))可以利用一个性质:我们让运算符“≤”表示两个串按照字典序比较,然后定义运算符“≤h”表示两个串的前h个字符按照字典序比较(=h、”等等依然成立)所以,先根据每个后缀的前h个字符排序,然后根据排序的结果,根据每个后缀的前(h=2h)个字符排序。直到h>=n#include #inc原创 2011-05-12 09:22:00 · 561 阅读 · 0 评论 -
二叉树的非递归前序、中序以及后序遍历C++模版类实现
#include using namespace std; /////////////////////////////////////////////////////////////////////// //stack template class Stack{ public: Stack(int size = 50); ~Stack(); void push(T* data);转载 2012-06-11 09:28:54 · 976 阅读 · 0 评论 -
正确实现二分查找
写二分的时候经常要测试好久边界问题。有人给出了一个一般使用的方法 http://blog.youkuaiyun.com/v_july_v/article/details/7093204 //right=n-1 => while(left right=middle-1; //right=n => while(left right=middle; int binary_search(转载 2012-02-16 15:36:49 · 812 阅读 · 0 评论 -
面试题精选:找出数组中只出现一次的3个数
<br /><br />题目描述:<br />Given an array of n integers, such that each number in the array appears exactly twice, except for three numbers (say a, b and c) which appear exactly once.<br /><br />In O(n) time and O(1) space find a,b and c.<br />分析:<br />先看这样一道题转载 2011-05-04 16:31:00 · 1391 阅读 · 0 评论 -
从两个文件(各含50亿个url)中找出共同的url
给定a、b两个文件,各存放50亿个url,每个url各占用64字节,内存限制是4G,如何找出a、b文件共同的url?可以估计每个文件的大小为5G*64=300G,远大于4G。所以不可能将其完全加载到内存中处理。考虑采取分而治之的方法。 遍历文件a,对每个url求取hash(url)%1000,然后根据所得值将url分别存储到1000个小文件(设为a0,a1,...a999)当中。这样每个小文件的大小约为300M。遍历文件b,采取和a相同的方法将url分别存储到1000个小文件(b0,b1....b999)中转载 2011-05-13 18:20:00 · 1234 阅读 · 1 评论 -
Bloom Filter概念和原理
Bloom Filter概念和原理焦萌 2007年1月27日Bloom Filter是一种空间效率很高的随机数据结构,它利用位数组很简洁地表示一个集合,并能判断一个元素是否属于这个集合。Bloom Filter的这种高效是有一定代价的:在判断一个元素是否属于某个集合时,有可能会把不属于这个集合的元素误认为属于这个集合(false positive)。因此,Bloom Filter不适合那些“零错误”的应用场合。而在能容忍低错误率的应用场合下,Bloom Filter通过极少的错误换取了存储空间的极大节省。集转载 2011-05-15 22:58:00 · 488 阅读 · 0 评论 -
kmp
假设要在字符串t中寻找s,那么next[i]=j 表示,如果s[i]与t[k]匹配失败,下次就让s[j]跟t[k]匹配。也就是说,其实在s中,s[i-1]==s[j-1], s[i-2]==s[j-2]。。。 这样,在计算next时,先找到与s[i]相等的那个位置j。然后,i++,j++,让next[i]=j。 void computeNext(char* s) { int i=0,原创 2012-05-23 15:56:25 · 588 阅读 · 0 评论