博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
《编程之美》——寻找发帖“水王”学习与扩展 转surymj博客
阅读量:6095 次
发布时间:2019-06-20

本文共 1821 字,大约阅读时间需要 6 分钟。

《编程之美》——寻找发帖“水王”学习与扩展


问题描述(难度 ):

传说,Tango有一大“水王”,他不但喜欢发贴,还会回复其他ID发的每个帖子。坊间风闻该“水王”发帖数目超过了帖子总数的一半。如果你有一个当前论坛上所有帖子(包括回帖)的列表,其中帖子作者的ID也在表中,你能快速找出这个传说中的Tango水王吗?

方法一:

先对ID列表进行排序,由于“水王ID”出现次数超过总次数的一半,则有序ID列表的第N/2项(从0开始编号)一定是“水王”的ID。算法复杂度为排序的复杂度O(N*log2N)。

方法二:

避免排序。每次去掉两个不同的ID,不断缩小问题规模,而又可以保证水王的ID保持占总数的1/2以上,时间复杂度仅为O(N)。代码的写法也有技巧,并不是真正删除列表中的ID,而是使用一个计数器nTimes和一个Candidate记录ID来实现。在遍历一次列表的过程中,如果遇到和candidate相同的元素,则nTimes+1;如果遇到和candiate不同的元素,则计数器-1;如果计数器的值=0,则把下一个a[i]赋给candidate,相当于把之前的所有元素都删除了,这些元素是两两不同的;最后留下的candidate的值就是水王的ID。书中附的伪代码如下:

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++; else nTimes--; } } return candidate; }

扩展问题

随着Tango的发展,管理员发现,“超级水王”没有了。统计结果表明,有3个发帖很多的ID,他们的发帖数目都超过了帖子总数目N的1/4。你能从发帖ID列表中快速找出他们的ID吗?

同样采取方法2的思想,实现代码(C++)如下:

#include 
using namespace std;/*扩展问题:假如有3个发帖很多的ID,他们的发帖总数都超过看1/4,快速找出他们的ID。思路:分别用三个计数器(T1,T2,T3)记录3个Candidate(C1,C2,C3),如果出现相同元素,则对应的计数器+1,如果元素与三个Candidate都不相同,则三个计数器均-1;当计数器为0时,则将i++后的a[i]值赋给相应的Candidate,这样就相当于去掉了4(或4的整数倍)个不同的ID,使问题规模缩小,而3个Candidate所占的比例仍然超过1/4,遍历一遍后则可得到所求的3个ID。*/int main(int argc, char const *argv[]){int T1,T2,T3; //设置3个计时器int C1,C2,C3; //3个candidateint i;int const N = 20; //总帖子数T1 = 0,T2 = 0,T3 = 0;int a[N] = {1,1,4,3,1,1,2,2,3,3,4,1,2,1,2,3,3,3,2,2};for(i = 0; i < N; i++){if(T1 == 0 || C1 == a[i]) //计时器=0时,C1 = a[i],计数器+1;或者计数器不为0,C1 == a[i]时,前一句相当于没有改变,计数器+1{ C1 = a[i];T1++;}else if(T2 == 0 || C2 == a[i]){C2 = a[i];T2++;}else if(T3 == 0 || C3 == a[i]){C3 = a[i];T3++;}else //如果与三个candidate都不相同,三个计数器均-1{ T1--;T2--;T3--;}}cout<<"C1 :"<
<
<<"C2 :"<
<
<<"C3 :"<
<

转载于:https://www.cnblogs.com/dragyu/p/7684750.html

你可能感兴趣的文章
[物理学与PDEs]第3章习题1 只有一个非零分量的磁场
查看>>
深入浅出NodeJS——数据通信,NET模块运行机制
查看>>
onInterceptTouchEvent和onTouchEvent调用时序
查看>>
android防止内存溢出浅析
查看>>
4.3.3版本之引擎bug
查看>>
SQL Server表分区详解
查看>>
使用FMDB最新v2.3版本教程
查看>>
SSIS从理论到实战,再到应用(3)----SSIS包的变量,约束,常用容器
查看>>
STM32启动过程--启动文件--分析
查看>>
垂死挣扎还是涅槃重生 -- Delphi XE5 公布会归来感想
查看>>
腰围2尺1,2,3,4,5,6,7,8寸各自等于是多少厘米/英寸(对比表)
查看>>
kFreeBsd 国内开源镜像站汇总
查看>>
用PYTHON实现将电脑里的所有文件按大小排序,便于清理
查看>>
网页动态切换母版页(MasterPage)
查看>>
几种常见模式识别算法整理和总结
查看>>
iOS开发UI篇—Quartz2D使用(矩阵操作)
查看>>
设计模式初学者笔记:Abstract Factory模式
查看>>
Hrbust1328 相等的最小公倍数 (筛素数,素因子分解)
查看>>
推荐一个内容滚动jquery插件
查看>>
淘宝的几个架构图
查看>>