2.3 寻找发帖“水王”
来源:互联网 发布:java api pdf 编辑:程序博客网 时间:2024/05/29 19:01
水王发帖超过数目超过帖子总数的一半,你有一个当前论坛上所有帖子的列表,其中帖子作者ID也在表中,快速找到这个水王、
一、对所以的ID排序,然后扫描一遍排好序的ID列表,统计各个ID出现的次数。如果某个ID出现的次数超过总数的一半,那么就输出这个ID。这个算法的时间复杂度为O(N*log N +N)。
如果ID列表已经是有序的,还需要扫描一遍整个列表来统计各个ID出现的次数吗?
二、如果一个ID出现的次数超过总数N的一半。那么无论水王的ID是什么,这个有序的ID列表中的第N/2项(从0开始编号)一定会是这个ID。不必再次扫描列表。如果能够迅速定位到列表的某一项(比如使用数组来存储列表),除去排序的时间复杂度,后处理需要的时间为O(1).
三、如果每次删除两个不同的ID(不管是否包含“水王”的ID),那么剩下的ID列表中,“水王”ID出现的次数仍然超过总数的一半。可以通过不断重复这个过程,把ID列表中的ID总数降低(转化为更小的问题),从而得到答案。新的思路,避免了排序这个耗时的步骤,总的时间复杂度只有O(N),且只需要常数的额外内存。
Type Find(Type *ID,int N) {Type candidate;int nTimes,i;for(i=nTimes=0;i<N;i++){if(nTimes==0) {candidate=ID[i],nTimes=1;}else {if(candidate == ID[i])nTimes++;elsenTimes--;}}return candidate;}
扩展问题:
现在有3个发帖很多的ID,他们的发帖数目都超过了帖子总数目N的1/4,你能从发帖ID列表中快速找出他们的ID吗?
思路与本题一样用抵消法,每次删除 4 个不同的ID即可。
Type candidate[3];void Find1(Type *ID, int N){ int nTimes[3] = {0}, i; for(i = 0; i < N; ++i){ if(nTimes[0] == 0){ candidate[0] = ID[i], nTimes[0] = 1; }else if(nTimes[1] == 0){ candidate[1] = ID[i], nTimes[1] = 1; }else if(nTimes[2] == 0){ candidate[2] = ID[i], nTimes[2] = 1; }else{ if(candidate[0] == ID[i]) nTimes[0]++; else if(candidate[1] == ID[i]) nTimes[1]++; else if(candidate[2] == ID[i]) nTimes[2]++; else{ nTimes[0]--; nTimes[1]--; nTimes[2]--; } } }}
【编程之美学习笔记】2.3寻找发帖水王
寻找发帖“水王”
阅读全文
0 0
- 2.3 寻找发帖“水王”
- 2.3 寻找发帖"水王"
- 编程之美2.3 寻找发帖“水王”
- 编程之美-2.3-寻找发帖“水王”
- 编程之美-2.3-寻找发帖“水王”
- 编程之美 2.3 寻找发帖“水王”
- 编程之美2.3 寻找发帖“水王”
- 编程之美2.3 寻找发帖"水王"
- 编程之美 2.3 寻找发帖“水王”
- 编程之美2.3寻找发帖"水王"
- 编程之美2.3 寻找发帖“水王”
- 寻找发帖“水王”
- 寻找发帖“水王”
- 寻找发帖“水王”
- 寻找发帖“水王”
- 寻找发帖“水王”
- 寻找发帖“水王”
- 寻找“发帖”水王
- Java
- 高并发静态页面化解决方案
- Android-AutoCompleteTextView实现历史搜索记录显示
- 用dep代替 go get 来获取私有库
- python之获取本地文件名称
- 2.3 寻找发帖“水王”
- jquery中使用eval()函数
- 分析redis的RDB和AOF两种持久化机制的工作原理
- VB 学习整理3 输入和输出
- Android Framework--PackageManagerService
- [协同过滤]:交替最小二乘法
- Vue v-if条件渲染
- 鼠标滑过旋转360
- 怎样才能赚到钱系列(五)