今天面试的一道算法题,求解

LAST_MAN 2012-06-08 12:38:57
有10G 的日志文件 存储格式为 [cmd:from:abc@163.com,to:123@qq.com]
设计一个算法,求出由163域发出的邮件,接受最多的前50个域
如 abc@163.com 发到 123@qq.com 如果QQ邮箱接受是前50多的,则显示出来,并且显示有多少条是从163到QQ的

我想到的是用multimap容器来存储信息~~

求解答
...全文
424 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
BinaryTreeEx 2012-06-21
  • 打赏
  • 举报
回复
这种题目没什么水准吧
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

接着 gogdizzy(天下第一好大人) 说:
也可以不对哈希表里所有的value排序,维护一个含有50个元素的最小堆,堆的元素就是value。每个value值同堆的第一个元素比较,若小于堆的第一个元素,继续下一个,若大于,替换堆的第一个元素。最后堆的50个元素就是前50多。如果要求有序,再对前50多排序
[/Quote]

我忘了只需要前50了。

可以用partial qsort。
nosort 2012-06-10
  • 打赏
  • 举报
回复
if (DictOfDomain.ContainsKey("key")) 这个应该是if (DictOfDomain.ContainsKey(key))

如果没有理解错误,题目应该不难做。不要被10G吓到了。
nosort 2012-06-10
  • 打赏
  • 举报
回复
不知道我理解对不对,题目是求前50个出现最多的收件人邮件域,即类似@XXX.com
那么我们可以假设,日志文件中的所有邮件域不是一个很大的数据,也许不超过一两万;

这样,你只要建立一个以邮件域为key,接收邮件次数为Value的dictionary


然后打开日志,一行一行地读这个文件,如果发件人是@163.com就处理,否则下一行;

将符合上述条件的收件人邮件域累计到dictionary中即可。
示例:

Dictionary<string, long> DictOfDomain=new Dictionary<string, long>();
//do(file!=eof)
string key = "@qq.com";//经过确认是163发出的收件人邮件域
if (DictOfDomain.ContainsKey("key")) { DictOfDomain[key] += 1; } else { DictOfDomain.Add(key, 1); }
//end do


最后对dictionary的value进行排序,就可以得到前50邮件域


AndyZhang 2012-06-10
  • 打赏
  • 举报
回复
读文件 + hash
bulver 2012-06-09
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]

引用 6 楼 的回复:
关注一下,10G的数据量还是很大的,lz的面的什么公司?

一个小公司……但是出的题很有水准%……
在校实习生的职位,我晕
[/Quote]

噢…多面面是好的…
freud.wy 2012-06-09
  • 打赏
  • 举报
回复
首先把由163发出的所有目的域记录下来,然后按照hash值划分成若干个文件,这样相同的必定在同一个文件中,再把每个小文件以此读入内存统计每个目的域的出现次数再排序。
LAST_MAN 2012-06-08
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]
关注一下,10G的数据量还是很大的,lz的面的什么公司?
[/Quote]
一个小公司……但是出的题很有水准%……
在校实习生的职位,我晕
bulver 2012-06-08
  • 打赏
  • 举报
回复
关注一下,10G的数据量还是很大的,lz的面的什么公司?
iamzhaiwei 2012-06-08
  • 打赏
  • 举报
回复
接着 gogdizzy(天下第一好大人) 说:
也可以不对哈希表里所有的value排序,维护一个含有50个元素的最小堆,堆的元素就是value。每个value值同堆的第一个元素比较,若小于堆的第一个元素,继续下一个,若大于,替换堆的第一个元素。最后堆的50个元素就是前50多。如果要求有序,再对前50多排序
  • 打赏
  • 举报
回复
hashmap<string,int> domain_count;
统计从163发出的邮件,目的地作为key,每次将value+1
最后对哈希表里所有的value排序。
hnu_0720 2012-06-08
  • 打赏
  • 举报
回复
开10个线程 ,每个线程处理一部分数据,然后将数据汇总。然后在扫描一遍汇总数据,可以不?
IranCyberArmy 2012-06-08
  • 打赏
  • 举报
回复
前50多的啊,所有知名的邮箱域也想不出来50个,就把所有知名的邮箱写出来就行了。
baidu20008 2012-06-08
  • 打赏
  • 举报
回复
这样啊行?
10G文件先分成若干小于机器内存的文件,然后逐个读取一遍 判断那些由163发出的邮件 记下目的域
可以使用hash表存储 条数信息

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧