论坛首页 招聘求职论坛

昨天的一个面试题:如何从存放在A和B中的一亿条URL中找出A中有而B中没有的URL

浏览 28272 次
精华帖 (0) :: 良好帖 (2) :: 隐藏帖 (0)
作者 正文
   发表时间:2010-09-29  
xiangkun 写道
放数据库,最快的!




     要计算放到 数据库中成本,,如果能很方便整理成 sqlload ,或者 insert ,这些数据对于性能好点的的 oracle 来说,不算 什么,,

    但 我看这道题的本意应该不是这个,,是考察数据结构的熟练程度,,,
    但是实际的项目中,我肯定会用成本最低的和 最方便的,而不是搞一个牛逼无比的算法出来,,,
0 请登录后投票
   发表时间:2010-09-29   最后修改:2010-09-29

按照4G内存的大小,是有320亿个Bit位的,因此可以考虑把A的URI用一个Hash函数映射到对应的Bit位,然后遍历B的URI,用同样的Hash函数得到hash值,然后判断该位上的值是否为1,如果为1,说明B中的URL也在A中出现过。

算法时间复杂度为O(n),因此在时间复杂度上来讲,这是最好的算法了。其实就是个BitMap算法。

这里有相关Bit-map的介绍:http://blog.redfox66.com/post/mass-data-4-bitmap.aspx

0 请登录后投票
   发表时间:2010-09-29   最后修改:2010-09-30

[quote="aws"]先把A的记录压入一个trie树 然后用B的记录来做命中 没有命中的URL就是不重复的 [/quote]

Trie树的构建是相当耗时的。。。 而且Trie数的空间复杂度要高一些,因此这个题的最好的数据结构还是Bit-Map或者是BloomFilter。BitMap的空间消耗要别BloomFilter小3-8倍。

http://blog.redfox66.com/post/mass-data-4-bitmap.aspx

http://blog.redfox66.com/post/mass-data-topic-2-bloom-filter.aspx

0 请登录后投票
   发表时间:2010-09-29  
有个想法,使用全文检索!只是建立索引的过程耗费时间,但是之后查找会很快!
0 请登录后投票
   发表时间:2010-09-29  
ling凌yue月 写道
olylakers 写道
刚和一个朋友聊了下,觉得还有一个思路

把B的URL存成3层N叉树,然后依次遍历A中URL,将其到存放B的URL的3层N叉树种去查找,如果存在的话,最多三次就可以找到。

不明白为什么是3层?求解答


不一定是要3层的。。。
0 请登录后投票
   发表时间:2010-09-29  
西门吹牛 写道
不是说可以是存在数据库中吗?如果是oracle我会这么做
   select url from a
   minus
   select url from b



这个不错。
0 请登录后投票
   发表时间:2010-09-29  
maincoolbo 写道
xiangkun 写道
放数据库,最快的!




     要计算放到 数据库中成本,,如果能很方便整理成 sqlload ,或者 insert ,这些数据对于性能好点的的 oracle 来说,不算 什么,,

    但 我看这道题的本意应该不是这个,,是考察数据结构的熟练程度,,,
    但是实际的项目中,我肯定会用成本最低的和 最方便的,而不是搞一个牛逼无比的算法出来,,,



原来如此
0 请登录后投票
   发表时间:2010-09-29  
可以考虑使用java中的map~~~
0 请登录后投票
   发表时间:2010-09-29  
如何找出A中有而B中没有的URL。

标准sql:

select A.* from A
where not exists (select 1 from B where B.url = A.url)
0 请登录后投票
   发表时间:2010-09-29  
用数据库就悲剧了。
0 请登录后投票
论坛首页 招聘求职版

跳转论坛:
Global site tag (gtag.js) - Google Analytics