• 海量数据/日志检索问题


    有1千万条短信,有重复,以文本文件的形式保存,一行一条,有重复。请用
    5分钟时间,找出重复出现最多的前10条。[中国某著名互联网公司2010年5月笔试题]

    解析:对于本题来说,某些面试者想用数据库的办法实现:首先将文本导入数据库,再
    利用select语句某些方法得出前10条短信。但是实际上用数据库是绝对满足不了5分钟解决这
    个条件的。这是因为1千万条短信即使1秒钟录入1万条(这已经算是很快的数据导入了)5分
    钟才3百万条。即便真的能在5分钟内录完1千万条,也必须先建索引,不然sql语句5分钟内
    肯定得不出结果。但对1千万条记录建索引即使在5分钟内都不能完成的。所以用数据库的办
    法不行。
    这种类型的题之所以会出现,这是因为互联网公司无时无刻都在需要处理由用户产生的
    海量数据/日志,所以海量数据的题现在很热,基本上互联网公司都会考。重点考察的是你
    的数据结构设计与算法基本功。类似题目是如何根据关键词搜索访问最多的前10个网站。
    答案:方法1:可以用哈希表的方法对1千万条分成若干组进行边扫描边建散列表。第
    一次扫描,取首字节,尾字节,中间随便两字节作为Hash Code,插入到hash table中。并记
    录其地址和信息长度和重复次数,1千万条信息,记录这几个信息还放得下。同hash code且
    等长就是疑似相同,比较一下。相同记录只加1次进hash table,但将重复次数加1。一次扫描
    以后,已经记录各自的重复次数,进行第二次hash table的处理。用线性时间选择可在O(n)的
    级别上完成前10条的寻找。分组后每份中的top 10必须保证各不相同,可hash来保证。也可
    直接按hash值的大小来分类。
    方法2:可以采用从小到大排序的办法,根据经验,除非是群发的过节短信,否则字数
    越少的短信出现重复的几率越高。建议从字数少的短信开始找起,比如一开始搜一个字的短
    信,找出重复出现的top10并分别记录出现次数,然后搜两个字的,依次类推。对于对相同
    字数的比较长的短信的搜索,除了hash之类的算法外,可以选择只抽取头、中和尾等几个位
    置的字符进行粗判,因为此种判断方式是为了加快查找速度但未必能得到真正期望的
    top10,因此需要做标记;如此搜索一遍后,可以从各次top10结果中找到备选的top10,如果
    这top10中有刚才做过标记的,则对其对应字数的所有短信进行精确搜索以找到真正的top10
    并再次比较。
    方法3:可以采用内存映射办法,首先,1千万条短信按现在的短信长度将不会超过1G
    空间,使用内存映射文件比较合适。可以一次映射(当然如果更大的数据量的话,可以采用
    分段映射),由于不需要频繁使用文件I/O和频繁分配小内存,这将大大提高数据的加载速
    度。其次,对每条短信的第i(i从0到70)个字母按ASCII码进行分组,其实也就是创建树。i
    是树的深度,也是短信第i个字母。
    该问题主要是解决两方面的内容,一是内容加载,二是短信内容比较。采用文件内存映
    射技术可以解决内容加载的性能问题(不仅仅不需要调用文件I/O函数,而且也不需要每读
    出一条短信都分配一小块内存),而使用树技术可以有效减少比较的次数。代码如下:

    ------------------------------------------------------------------------------------------------------

    扩展知识

    有1亿个浮点数,请找出其中最大的10000个。提示:假设每个浮点数占4个字节,1亿个浮点数就要占到相当大的空
    间,因此不能一次将全部读入内存进行排序。
    既然不可以一次读入内存,那可以使用如下方法:
    方法1:读出100万个数据,找出最大的1万个,如果这100万数据选择够理想,那么最小的这1万个数据里面最小的为
    基准,可以过滤掉1亿数据里面99%的数据,最后就再一次在剩下的100万(1%)里面找出最大的1万个。
    方法2:分块查找,比如100万一个块,找出最大1万个,一次下来就剩下100万数据需要找出1万个。
    找出100万个数据里面最大的1万个,可以采用快速排序的方法,分2堆,如果大的那堆个数N大于1万个,继续对大堆
    快速排序一次分成2堆,如果大堆个数N小于1万,就在小的那堆里面快速排序一次,找第10000-N大的数字;递归以上过
    程,就可以找到相关结果。

  • 相关阅读:
    一个用php抓取网页中电子邮箱的实例
    jQuery中ajax加载文本
    phantomjs介绍(js网页截屏、javascript网页解析渲染工具)
    delphi 如何获取大于2G的物理内存大小[delphi]
    DELPHI——过程与函数[delphi]
    Delphi初始化和析构 initialization和finalization
    Delphi执行DOS命令显示到文本框
    MYSQL基础集合函数(count,sun,avg,max,min)
    MYSQL基础链接查询(内连接查询,外连接查询)
    MYSQL基础合并查询结果(UNION)
  • 原文地址:https://www.cnblogs.com/yihujiu/p/6379279.html
Copyright © 2020-2023  润新知