讨论一个面试很常问的TOPK的问题

面试里面TopK是很常问的问题,通常解决方法都答先将大数据集分成多个小份,然后用hash表统计频率,再维护一个小顶堆统计得出TOPK个数据,最后将多个小份分的TOPK进行合并。

那么我有一个困惑,假设我们求top10个值,那么如果在每个小份数据集中,某一个词都排在第11个,如果合并每个小份数据集的TOP11的话,这个词是可以进入总的TOP10的,那么怎么解决这个问题呢?
还是我哪个步骤错了?

PS:很多人没听懂,我举个例子吧,假设有一本非常非常大的书,一共有10000册,你没办法用一台计算机去处理它,我们要求这本书出现最多的10个单词,那么按分治法,我们把1-100册放到机器1进行hash表统计词的频率,维护一个大小为10的小顶堆,我们用100台机器维护100个小顶堆,并在最后对这100个小顶堆进行排序,得出TOP 10的单词。。但是如果每一台机器的第十一个词都是kitty,那么很可能kitty也应该进入top10。那这样的情况应该怎么处理,是哪个步骤出了问题?是不是分词的时候不能直接按册分,要遍历这10000册,对每个单词进行hash?感觉不是太好啊。。求教
不知道我表达清楚没。。
全部评论
没听太懂 小组内的第11名会是总排名的10名内吗?
点赞 回复 分享
发布于 2017-08-22 10:43
hash后这个词不就只在一个文件里了么。
点赞 回复 分享
发布于 2017-08-22 10:42
哪有你这样hash的,比如一个字符串str肯定在同一个文件里,不可能几个文件同时出现相同str
点赞 回复 分享
发布于 2017-08-22 11:35
一个词只能出现在一个小份中,你应该是分小份有问题。相同的词肯定在一个小份中
点赞 回复 分享
发布于 2017-08-22 10:53
统计频率的时候,相同key被映射到相同的桶,不存在你说的情况 统计topK 最大值的时候,获取每个桶的topK就可获得全部数据的topK
点赞 回复 分享
发布于 2017-08-22 10:52
hash的结果要保证每个小文件中不包含相同的词
点赞 回复 分享
发布于 2017-08-22 10:46

相关推荐

全程一小时左右,写了15分钟代码 ,第二天中午打电话约二面算法:- 快排找第K大的数- 判断是不是完全二叉树写完面试官说只写一个就行了八股文:上来先问的接不接受转语言,部门主要用golang1. 项目拷打,各种细节问题2. 数据库索引,数据库连接池怎么设置,(以为是线程池,说了N+1 2N,不过面试官也顺着说下去了,问N是什么) 后续提示应该根据请求来设置3. 数据库表怎么设计的,字段用什么类型,金额为什么用BigDecimal4. 数据库用户密码怎么存的,用的什么加密5. 索引,索引失效,隐式类型转换,最左匹配原则6. 登录注册的全部流程说一遍,jwt是什么7. 事务,哪里用到了事务8. 慢sql, 深分页怎么解决, 索引优化,覆盖索引 分表9. 数据库id怎么生成的, 主键自增,有没有了解过分布式id  雪花算法,时钟回退怎么解决10. redis单线程为什么快,工作原理是什么11. redis缓存三件套 如何解决12. 内核态转换, 为什么要有内核态转换  什么是系统中断, 软中断和硬中断(到这里人已经快麻了,八股文轰炸)13. 进程和线程的区别是什么  为什么要有线程,线程共享的资源有哪些,独享的资源有哪些 怎么向进程发送信号14. http 1.0 1.1的区别 长连接 time_wait过多是什么原因 可能有哪些危害15. 了解中间件吗 说了rabbitmq了解过 简单介绍一下反问环节:询问部门主要做什么 回答是基础架构,k8s容器中间件等等发面经积累好运气
作业帮二面27人在聊 查看18道真题和解析
点赞 评论 收藏
分享
评论
点赞
20
分享

创作者周榜

更多
牛客网
牛客企业服务