摘要: 今天晚上做了一个在线测评,其中涉及到了一个海量数据处理的问题,下面是这个问题定义及我的解法,其中用到了Bloom Filter,这个东西乍一听让人摸不着头脑,仔细看看,感觉就是Hash+Bitmap的合体,综合了Hash散列定位和Bitmap用位存储的特点。问题:已存在20亿个URL,每个URL平均长度为64字节,在2G内存的环境中,设计一个较快的算法去判断一个新的URL是否在那20亿URL中,可以出现一定几率的误判。思路:使用Bloom Filter的方法,将这20亿个URL映射到内存中,该内存空间初始化为0,每个URL映射到一个bit位,遍历已有的20亿个URL,并将对应的bit位置为1, 阅读全文
posted @ 2013-10-08 22:36 铁甲小宝 阅读(383) 评论(0) 推荐(0)
摘要: 我在前面的随笔里已经写过关于处理海量数据的哈希表和Trie的方法了,本文提到的是常用方法之一:Bitmap,测试数据是100万条随机数。Bitmap是用于处理有限位数的整数,理论上,对于1GB的内存,处理的整数范围大约在0-8,000,000,000内,即一般处理10亿以内,同时也是10位数以内的数据,可实现的操作有存储,排序,查找,删除,查重而朴素的方法处理10亿的整数需要40GB以上的内存空间,所以,在int用32位表示的机器上,理论内存空间使用比例为1:32,我在下面的代码里用到的测试数据是100万条1亿以内的随机数,完成增删查排序功能。欢迎有共同学习兴趣的同学加好友探讨学习哦~~^_^ 阅读全文
posted @ 2013-10-01 17:31 铁甲小宝 阅读(407) 评论(0) 推荐(0)
摘要: 目前我所了解的海量数据处理的方法包括:哈希,树,归并排序,bitmap等,之前发过测试哈希表的随笔,这一篇则是针对第二种方法:树。我写了一个Trie树的简单实现,以摘自某网站上的超过100万条的URL为测试数据,算是个小型的海量数据了,检索其中一条记录所消耗的时间为0毫秒,实际是在1毫秒之内,也就是很快的意思。清空这个树需要DFS或者BFS,我暂时没有实现它,也就是说,下面的代码,没有主动完成释放内存空间的功能。欢迎有共同学习兴趣的同学和我沟通哦 ^_^上代码: 1 #include 2 #include 3 #include 4 #include 5 /** 6 * @a... 阅读全文
posted @ 2013-10-01 16:07 铁甲小宝 阅读(291) 评论(0) 推荐(0)
摘要: KMP算法的核心是提前根据模式串计算出来一张表,这张表中记录着什么情况下能够往后移的幅度大一些,以减少重复的匹配,理解步骤如下:首先,应知道什么是失配,就是模式串在和目标文本的遍历匹配过程中遇到了不匹配的字符。其次,失配无非两种情况:首字符失配,非首字符失配。首字符失配时,模式串后移一步,匹配后面的字符。非首字符失配时,这时有个有价值的信息,就是我们已经知道了失配的字符之前的那些没有失配的那些字符,那些字符有什么特点呢?怎么样才能帮助我们减少匹配次数呢?那些字符的特点是:是模式串的从头开始的一个子串!KMP算法的核心正是分析它的子串,从而减少匹配次数。这个特点看起来很简单,合理利用的话,可以大 阅读全文
posted @ 2013-09-30 05:46 铁甲小宝 阅读(515) 评论(0) 推荐(0)
摘要: 本来想用对和栈的空间分配方法去实现类似于sizeof的功能,结果各种问题,相同的代码VS出来24,VC出来8,更有malloc函数分配1字节内存时,相邻空间间隔在VS中为64字节,在VC中和VS不同,只好先看看内存到底是怎么分配的了:首先:基本常识:1 栈向低地址稳定增长,其空间在编译时确定,调用函数时分配,不能动态分配;堆中可动态分配空间,每一次分配都会优先分配低地址空间,如果低地址空间实在没有合适的可用空间,则在高地址空间分配。2 调用函数时的参数,是从右向左依次压入栈,换句话说,第一个参数,最后被压入栈,第一个弹出栈。3 测试了一下,栈底的存的是0xCCCCCCCC,大概就是传说中的安全 阅读全文
posted @ 2013-09-30 00:39 铁甲小宝 阅读(638) 评论(0) 推荐(0)
摘要: 练习代码,该说的都在代码和注释里: 1 #include 2 3 class BaseClass 4 { 5 private: 6 int pri; 7 protected: 8 int pro; 9 public: 10 int pub; 11 12 BaseClass() 13 { 14 printf("调用父类的构造函数!\n"); 15 to_string(); 16 } 17 18 // 将析构函数设置为虚函数,以便在应用多态特征的时候,能够调用子类的析构函数释放子类动... 阅读全文
posted @ 2013-09-28 00:24 铁甲小宝 阅读(316) 评论(0) 推荐(0)
摘要: 这个问题我目前只知道递归的解法,欢迎大家提出非递归的解法^_^ 1 #include 2 3 // 求某数组所有元素做加法或减法结果为某个值的问题递归解法,目前我不知道其他解法 4 void func(int* arr, int len, int sum, int i, int num, int* aux) 5 { 6 if(i == len) 7 { 8 if(sum == num) 9 {10 for(int j = 0; j > 求全部元素的加减运算结果为某个值的问题\n");46 func(arr, s... 阅读全文
posted @ 2013-09-27 00:34 铁甲小宝 阅读(584) 评论(0) 推荐(0)
摘要: 上代码,该说的都在代码及注释里: 1 #include 2 #include 3 #include 4 5 using namespace std; 6 7 class BaseClass 8 { 9 protected: 10 // 普通变量 11 int data; 12 13 // 地址不可变,但内容可变的常量 14 // 必须在初始值设定项列表中初始化 15 char* const name; 16 private: 17 18 // 内容不可变常量 19 // 必须初始值设定项列表中初始化 20 ... 阅读全文
posted @ 2013-09-27 00:32 铁甲小宝 阅读(739) 评论(0) 推荐(0)
摘要: 学习了一下动态规划算法,按正统的描述此类问题应该是具有“最优子结构”和“重叠子问题”的一大类问题,很多地方有非常规范的描述,这里不赘述。简单的说,我的理解就是:(1)大的思想是空间换时间(2)首先分析是否“有规律”,然后定义一个状态,即为一维或二维子结点的状态,这个状态,往往是问题的解,但是也可能是隐含了解的数据,比如,求最长子串时,这个状态就是当前最长子串长度(3)在定义状态的同时,也要分析转移方程,也叫递推公式,其实就是本结点和前面的那些已经处理过的结点之间,存在什么关系,往往是前面的结点中的最好的与当前结点存在非常特殊的关系。(4)最后是要分析如何回溯求解,这就要配合转移方程,一般是倒序 阅读全文
posted @ 2013-09-25 15:28 铁甲小宝 阅读(220) 评论(0) 推荐(0)
摘要: 直接上代码吧,哈希表的逻辑还是很简单的,目的是对比这几种方法的速度,重要的是参照代码,看输出结果: 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include 10 #include 11 #include 12 13 using namespace std; 14 15 static const int hashtable_length = 49157; 16 17 // 用于定位一个Bucket 18 ... 阅读全文
posted @ 2013-09-23 01:17 铁甲小宝 阅读(366) 评论(0) 推荐(1)