- 浏览: 914977 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (537)
- Java SE (114)
- Struts (18)
- Hibernate (25)
- Spring (3)
- Page_Tech (41)
- Others (87)
- Database (29)
- Server (24)
- OpenSource_Tools (15)
- IDE_Tool (22)
- Algorithm (28)
- Interview (22)
- Test (28)
- Hardware (1)
- Mainframe (25)
- Web application (4)
- Linux (3)
- PHP (17)
- Android (1)
- Perl (6)
- ubuntu (1)
- Java EE (9)
- Web Analysis (5)
- Node.js (2)
- javascript (2)
最新评论
-
一键注册:
request.getRequestURL()和request.getRequestURI() -
SuperCustomer:
...
SED的暂存空间和模式空间 -
juyo_ch:
讲得挺好理解的,学习了
java 死锁及解决 -
chinaalex:
最后一题答案正确,但是分析有误.按照如下过程,上一行为瓶,下一 ...
zz智力题 -
liaowuxukong:
多谢博主啦,弱弱的了解了一点。
C++/Java 实现多态的方法(C++)
1. 给定a、b两个文件,各存放50亿个url,每个url各占64字节,内存限制是4G,让你找出a、b文件共同的url? 方案1:可以估计每个文件安的大小为50G×64=320G,远远大于内存限制的4G。所以不可能将其完全加载到内存中处理。考虑采取分而治之的方法。 方案2:如果允许有一定的错误率,可以使用Bloom filter,4G内存大概可以表示340亿bit。将其中一个文件中的url使用Bloom filter映射为这340亿bit,然后挨个读取另外一个文件的url,检查是否与Bloom filter,如果是,那么该url应该是共同的url(注意会有一定的错误率)。 读者反馈@crowgns: 2. 有10个文件,每个文件1G,每个文件的每一行存放的都是用户的query,每个文件的query都可能重复。要求你按照query的频度排序。 方案1: 方案2: 一般query的总量是有限的,只是重复的次数比较多而已,可能对于所有的query,一次性就可以加入到内存了。这样,我们就可以采用trie树/hash_map等直接来统计每个query出现的次数,然后按出现次数做快速/堆/归并排序就可以了 (读者反馈@店小二:原文第二个例子中:“找一台内存在2G左右的机器,依次对用hash_map(query, query_count)来统计每个query出现的次数。”由于query会重复,作为key的话,应该使用hash_multimap 。hash_map 不允许key重复。@hywangw:店小二所述的肯定是错的,hash_map(query,query_count)是用来统计每个query的出现次数 又不是存储他们的值 出现一次 把count+1 就行了 用multimap干什么?多谢hywangw)。 方案3: 与方案1类似,但在做完hash,分成多个文件后,可以交给多个文件来处理,采用分布式的架构来处理(比如MapReduce),最后再进行合并。 3. 有一个1G大小的一个文件,里面每一行是一个词,词的大小不超过16字节,内存限制大小是1M。返回频数最高的100个词。 方案1:顺序读文件中,对于每个词x,取,然后按照该值存到5000个小文件(记为)中。这样每个文件大概是200k左右。如果其中的有的文件超过了1M大小,还可以按照类似的方法继续往下分,直到分解得到的小文件的大小都不超过1M。对每个小文件,统计每个文件中出现的词以及相应的频率(可以采用trie树/hash_map等),并取出出现频率最大的100个词(可以用含100个结点的最小堆),并把100词及相应的频率存入文件,这样又得到了5000个文件。下一步就是把这5000个文件进行归并(类似与归并排序)的过程了。 4. 海量日志数据,提取出某日访问百度次数最多的那个IP。 方案1:首先是这一天,并且是访问百度的日志中的IP取出来,逐个写入到一个大文件中。注意到IP是32位的,最多有2^32个IP。同样可以采用映射的方法,比如模1000,把整个大文件映射为1000个小文件,再找出每个小文中出现频率最大的IP(可以采用hash_map进行频率统计,然后再找出频率最大的几个)及相应的频率。然后再在这1000个最大的IP中,找出那个频率最大的IP,即为所求。 5. 在2.5亿个整数中找出不重复的整数,内存不足以容纳这2.5亿个整数。 方案1:采用2-Bitmap(每个数分配2bit,00表示不存在,01表示出现一次,10表示多次,11无意义)进行,共需内存2^32*2bit=1GB内存,还可以接受。然后扫描这2.5亿个整数,查看Bitmap中相对应位,如果是00变01,01变10,10保持不变。所描完事后,查看bitmap,把对应位是01的整数输出即可。 方案2:也可采用上题类似的方法,进行划分小文件的方法。然后在小文件中找出不重复的整数,并排序。然后再进行归并,注意去除重复的元素。 6. 海量数据分布在100台电脑中,想个办法高效统计出这批数据的TOP10。 方案1: (更多可以参考:第三章、寻找最小的k个数,以及第三章续、Top K算法问题的实现) 读者反馈@QinLeopard: 第6题的方法中,是不是不能保证每个电脑上的前十条,肯定包含最后频率最高的前十条呢? @July:我想,这位读者可能没有明确提议。本题目中的TOP10是指最大的10个数,而不是指出现频率最多的10个数。但如果说,现在有另外一提,要你求频率最多的 10个,相当于求访问次数最多的10个IP地址那道题,即是本文中上面的第4题。特此说明。 7. 怎么在海量数据中找出重复次数最多的一个? 方案1:先做hash,然后求模映射为小文件,求出每个小文件中重复次数最多的一个,并记录重复次数。然后找出上一步求出的数据中重复次数最多的一个就是所求(具体参考前面的题)。 8. 上千万或上亿数据(有重复),统计其中出现次数最多的钱N个数据。 方案1:上千万或上亿的数据,现在的机器的内存应该能存下。所以考虑采用hash_map/搜索二叉树/红黑树等来进行统计次数。然后就是取出前N个出现次数最多的数据了,可以用第6题提到的堆机制完成。 9. 1000万字符串,其中有些是重复的,需要把重复的全部去掉,保留没有重复的字符串。请怎么设计和实现? 方案1:这题用trie树比较合适,hash_map也应该能行。 10. 一个文本文件,大约有一万行,每行一个词,要求统计出其中最频繁出现的前10个词,请给出思想,给出时间复杂度分析。 方案1:这题是考虑时间效率。用trie树统计每个词出现的次数,时间复杂度是O(n*le)(le表示单词的平准长度)。然后是找出出现最频繁的前10个词,可以用堆来实现,前面的题中已经讲到了,时间复杂度是O(n*lg10)。所以总的时间复杂度,是O(n*le)与O(n*lg10)中较大的哪一个。 11. 一个文本文件,找出前10个经常出现的词,但这次文件比较长,说是上亿行或十亿行,总之无法一次读入内存,问最优解。 方案1:首先根据用hash并求模,将文件分解为多个小文件,对于单个文件利用上题的方法求出每个文件件中10个最常出现的词。然后再进行归并处理,找出最终的10个最常出现的词。 12. 100w个数中找出最大的100个数。 13. 寻找热门查询: 搜索引擎会通过日志文件把用户每次检索使用的所有检索串都记录下来,每个查询串的长度为1-255字节。假设目前有一千万个记录,这些查询串的重复读比较高,虽然总数是1千万,但是如果去除重复和,不超过3百万个。一个查询串的重复度越高,说明查询它的用户越多,也就越热门。请你统计最热门的10个查询串,要求使用的内存不能超过1G。 (1) 请描述你解决这个问题的思路; (2) 请给出主要的处理流程,算法,以及算法的复杂度。 方案1:采用trie树,关键字域存该查询串出现的次数,没有出现为0。最后用10个元素的最小推来对出现频率进行排序。 关于此问题的详细解答,请参考此文的第3.1节:第三章续、Top K算法问题的实现。 14. 一共有N个机器,每个机器上有N个数。每个机器最多存O(N)个数并对它们操作。如何找到N^2个数中的中数? 方案1:先大体估计一下这些数的范围,比如这里假设这些数都是32位无符号整数(共有2^32个)。我们把0到2^32-1的整数划分为N个范围段,每个段包含(2^32)/N个整数。比如,第一个段位0到2^32/N-1,第二段为(2^32)/N到(2^32)/N-1,…,第N个段为(2^32)(N-1)/N到2^32-1。然后,扫描每个机器上的N个数,把属于第一个区段的数放到第一个机器上,属于第二个区段的数放到第二个机器上,…,属于第N个区段的数放到第N个机器上。注意这个过程每个机器上存储的数应该是O(N)的。下面我们依次统计每个机器上数的个数,一次累加,直到找到第k个机器,在该机器上累加的数大于或等于(N^2)/2,而在第k-1个机器上的累加数小于(N^2)/2,并把这个数记为x。那么我们要找的中位数在第k个机器中,排在第(N^2)/2-x位。然后我们对第k个机器的数排序,并找出第(N^2)/2-x个数,即为所求的中位数的复杂度是O(N^2)的。 方案2:先对每台机器上的数进行排序。排好序后,我们采用归并排序的思想,将这N个机器上的数归并起来得到最终的排序。找到第(N^2)/2个便是所求。复杂度是O(N^2*lgN^2)的。 15. 最大间隙问题 给定n个实数,求着n个实数在实轴上向量2个数之间的最大差值,要求线性的时间算法。 方案1:最先想到的方法就是先对这n个数据进行排序,然后一遍扫描即可确定相邻的最大间隙。但该方法不能满足线性时间的要求。故采取如下方法: 16. 将多个集合合并成没有交集的集合 给定一个字符串的集合,格式如:。要求将其中交集不为空的集合合并,要求合并完成的集合之间无交集,例如上例应输出。 (1) 请描述你解决这个问题的思路; (2) 给出主要的处理流程,算法,以及算法的复杂度; (3) 请描述可能的改进。 方案1:采用并查集。首先所有的字符串都在单独的并查集中。然后依扫描每个集合,顺序合并将两个相邻元素合并。例如,对于,首先查看aaa和bbb是否在同一个并查集中,如果不在,那么把它们所在的并查集合并,然后再看bbb和ccc是否在同一个并查集中,如果不在,那么也把它们所在的并查集合并。接下来再扫描其他的集合,当所有的集合都扫描完了,并查集代表的集合便是所求。复杂度应该是O(NlgN)的。改进的话,首先可以记录每个节点的根结点,改进查询。合并的时候,可以把大的和小的进行合,这样也减少复杂度。 17. 最大子序列与最大子矩阵问题 数组的最大子序列问题:给定一个数组,其中元素有正,也有负,找出其中一个连续子序列,使和最大。 方案1:这个问题可以动态规划的思想解决。设b[i]表示以第i个元素a[i]结尾的最大子序列,那么显然。基于这一点可以很快用代码实现。 最大子矩阵问题:给定一个矩阵(二维数组),其中数据有大有小,请找一个子矩阵,使得子矩阵的和最大,并输出这个和。 方案2:可以采用与最大子序列类似的思想来解决。如果我们确定了选择第i列和第j列之间的元素,那么在这个范围内,其实就是一个最大子序列问题。如何确定第i列和第j列可以词用暴搜的方法进行。 Bloom Filter已在上一篇文章海量数据处理之Bloom Filter详解中予以详细阐述,本文接下来着重阐述Bit-map。有任何问题,欢迎不吝指正。 所谓的Bit-map就是用一个bit位来标记某个元素对应的Value, 而Key即是该元素。由于采用了Bit为单位来存储数据,因此在存储空间方面,可以大大节省。 如果说了这么多还没明白什么是Bit-map,那么我们来看一个具体的例子,假设我们要对0-7内的5个元素(4,7,2,5,3)排序(这里假设这些元素没有重复)。那么我们就可以采用Bit-map的方法来达到排序的目的。要表示8个数,我们就只需要8个Bit(1Bytes),首先我们开辟1Byte的空间,将这些空间的所有Bit位都置为0(如下图:) 然后遍历这5个元素,首先第一个元素是4,那么就把4对应的位置为1(可以这样操作 p+(i/8)|(0×01<<(i%8)) 当然了这里的操作涉及到Big-ending和Little-ending的情况,这里默认为Big-ending),因为是从零开始的,所以要把第五位置为一(如下图): 然后再处理第二个元素7,将第八位置为1,,接着再处理第三个元素,一直到最后处理完所有的元素,将相应的位置为1,这时候的内存的Bit位的状态如下: 然后我们现在遍历一遍Bit区域,将该位是一的位的编号输出(2,3,4,5,7),这样就达到了排序的目的。下面的代码给出了一个BitMap的用法:排序。 可进行数据的快速查找,判重,删除,一般来说数据范围是int的10倍以下 使用bit数组来表示某些元素是否存在,比如8位电话号码 Bloom filter可以看做是对bit-map的扩展(关于Bloom filter,请参见:海量数据处理之Bloom filter详解)。 1)已知某个文件内包含一些电话号码,每个号码为8位数字,统计不同号码的个数。 8位最多99 999 999,大概需要99m个bit,大概10几m字节的内存即可。 (可以理解为从0-99 999 999的数字,每个数字对应一个Bit位,所以只需要99M个Bit==1.2MBytes,这样,就用了小小的1.2M左右的内存表示了所有的8位数的电话) 2)2.5亿个整数中找出不重复的整数的个数,内存空间不足以容纳这2.5亿个整数。 将bit-map扩展一下,用2bit表示一个数即可,0表示未出现,1表示出现一次,2表示出现2次及以上,在遍历这些数的时候,如果对应位置的值是0,则将其置为1;如果是1,将其置为2;如果是2,则保持不变。或者我们不用2bit来进行表示,我们用两个bit-map即可模拟实现这个2bit-map,都是一样的道理。 参考: 完。第一部分、十五道海量数据处理面试题
比如说第一个文件中:A(4), B(5), C(6), D(3)
第二个文件中:A(4),B(5),C(3),D(6)
第三个文件中: A(6), B(5), C(4), D(3)
如果要选Top(1), 选出来的结果是A,但结果应该是B。
第二部分、海量数据处理之Bti-map详解
什么是Bit-map
基本原理及要点
扩展
问题实例
发表评论
-
不使用/,%,+和*,如何判断一个数能否被3整除
2012-05-30 14:28 1788如果n的二进制末位为0,那么n和n>>1同时被 ... -
一些数学知识
2012-03-31 20:12 858zz:http://hi.baidu.com/imak ... -
高阶幂的求余的方法
2012-03-31 16:41 2784通常会有如下问法: 有两个数,A和B,A的范围 ... -
从N个变量中找出一个错误变量的方法
2012-03-31 12:17 863假设有N包咖啡,里面有一包咖啡是掺和了沙子的,可以将咖啡放到水 ... -
链表的一些常见笔试面试问题总结及代码
2010-10-27 13:39 1095先什么也不说,假设链 ... -
Trie Tree
2010-10-26 11:34 1478给你100000个长 ... -
字典树(trie tree)
2010-10-26 11:19 1390今天AC了两题tri ... -
高度为n的平衡二叉树最少需要多少个节点
2010-10-24 13:42 9445递推关系 A(1)=1 A(2)=2 A ... -
如何判断两个单向链表是否有相交,并找出交点
2010-10-24 13:37 1708题比较简单,单向链表有交点意思就是交点后的节点都是 ... -
大数据排序或取重或去重相关问题解决方案
2010-10-21 16:13 2777Q:TC群里有人发消息说在10亿个数据中找出所有的重复数,内存 ... -
分配排序(桶排序..)
2010-10-21 13:39 1888分配排序的基本思想:排序过程无须比较关键字,而是通过&qu ... -
Rete(3)
2010-10-21 09:59 9794.6 连接节点(Join node) ... -
Rete(2)
2010-10-21 09:57 1183使用RETE算法的模块系统 ... -
Rete(1)
2010-10-21 09:53 1065一、 rete概述Rete算法是一种前向规则快速匹配算法,其匹 ... -
[转]海量数据处理面试题
2010-10-20 15:15 10311. 给定a、b两个文件,各存放50亿个url,每个url各占 ... -
用JDBC实现数据的分页
2010-10-20 11:23 1229数据分页主要用到了resultSet的absolute()方法 ... -
如何求N的阶乘所得的数字末尾含有多少个0
2010-10-19 13:13 2190原题是这样: 给定 ... -
数据库笔试题(经典SELECT语句用法)
2010-10-18 22:49 2117问题描述: 为管理岗位业务培训信息,建立3个表: S ... -
Java分页实现
2010-10-18 22:11 1509Java代码 public interf ... -
Linux下大文件的排序和去重复
2010-10-15 10:02 2137Linux下我们用 sort 与 uniq 的命令来实现去重复 ...
相关推荐
这些方法可以用来解决大数据量的问题,例如数据字典、判重、集合求交集等问题。 Bloom Filter Bloom filter 是一种空间效率高、查询效率高的数据结构,可以用来实现数据字典、判重、集合求交集等操作。其原理是...
然而,当数据量急剧增加至数万乃至更大时,排序所需的时间成本会以几何级数增长。因此,对于大规模数据集来说,优化排序算法变得尤为重要。 #### 二、排序算法简介 1. **冒泡排序**:通过不断比较相邻两个元素并...
### 无预设类别数的大数据量聚类算法研究 #### 背景与意义 随着信息技术的迅速发展,特别是互联网技术的普及与深化,人类社会正经历着前所未有的数据爆炸时代。各种行业和领域积累的数据量呈指数级增长,这不仅...
例如,一些算法无法与数据量的增长保持线性关系,另一些算法则受限于计算机内存空间,难以进行大规模数据集的处理。 针对这一挑战,研究者提出了高效的数据挖掘算法来提升大规模数据集挖掘的效率和质量。例如,...
海量数据 大数据量 处理的算法和数据结构 对面试IT公司的人非常有用!
在编程领域,数据结构与算法是核心组成部分,它们直接影响到程序的效率和性能。Java作为广泛应用的编程语言,其在实现数据结构和算法时有着丰富的库支持和优秀的可读性。下面将对标题和描述中提到的一些关键知识点...
在现代工业生产中,随着生产规模的不断扩大以及自动化程度的日益提高,对于数据采集和处理的需求急剧...随着数据量的不断增长和数据处理技术的不断进步,自适应加权数据融合算法将在数据处理领域发挥越来越重要的作用。
随着信息技术的快速发展,数据量呈现出爆炸式的增长趋势。如何有效地管理和利用这些庞大的数据成为了一个亟待解决的问题。数据压缩技术作为数据管理的重要手段之一,在减少数据存储空间需求、降低数据传输成本方面...
随着数据量的激增,数据存储和处理的成本和复杂性也在增加,这对数据中心提出了更高的要求。 数据中心的能耗问题日益受到关注,因为在不同的时间段内,数据中心的节点和数据访问呈现波动态势,且在空转状态下服务器...
大数据的“大”不仅仅是数据量的庞大,更体现在数据种类和生成速度的快速增长,这种增长使得数据分析和处理变得愈发困难。如何从庞杂的数据中提取有用信息,形成有效的知识,成为大数据时代亟待解决的关键问题。多维...
随机算法通过随机函数处理部分数据来近似整体结果,减少计算量;外存算法用于处理内存限制情况,确保大数据分析的可行性;并行算法如MapReduce,通过多处理器并行处理大量数据,提高效率。 关联规则挖掘算法是一种...
学习数据挖掘必须知道的10大经典算法,包括C4.5, Apriori, SVM, k-means等10个算法,里面这个算法的介绍,和现在的状况,未来的发展发向,介绍的很具体,现在被大量论文引用,所以说学习数据挖掘算法,必须先看这篇...
比如,GPU并行计算加速了大规模点云数据的处理,深度学习方法则在点云分类和语义理解方面展现出强大的潜力。同时,这些技术也广泛应用于3D打印、城市规划、灾害监测、考古发掘等多个领域。 总结来说,点云数据处理...
大数据量的问题是很多面试笔试中经常出现的问题,比如百度,谷歌,腾讯这样的一些涉及到海量数据的公司经常会问到。 本文的一些问题基本直接来源于公司的面试笔试题目。包括Bloom filter,Hashing,bit-map,双层桶...
数据量可能是万亿级文档,数据类型可能从文档转换为索引,而访问模式可能以批量写入为主,随机读取为辅。这些特性要求数据挖掘系统具备高效的数据处理能力和快速响应能力,以满足用户的搜索需求。 搜索引擎架构是...
本篇论文《面向水资源数据分析的大数据挖掘算法》深入探讨了如何应用先进的数据挖掘算法来优化水资源管理,特别是对水资源监测数据的分析。 文章首先指出了传统的遗传算法在收敛速度和避免局部最优解方面的不足,并...
线程池 5天不再惧怕多线程——第四天 信号量 5天不再惧怕多线程——第三天 互斥体 5天不再惧怕多线程——第二天 锁机制 5天不再惧怕多线程——第一天 尝试Thread 经典算法专题(21)经典算法题每日演练——第二十一题 ...
同时,由于数据量大且可能存在短暂性异常,这对于物联网系统的处理速度和反馈速度提出了挑战。本文提出了一种基于长短记忆网络的时空数据处理算法,即EPLSN(Exception Processing Long and Short Memory Network)...