大家还记得《编程之美》的寻找水贴王算法么?

ashen0316 2014-05-24 10:12:50
问题描述:”水王“发贴数超过所有帖子总数的一半,现有此论坛上所有帖子的列表,包含ID,如何快速找出这个水王?
里面的最优的算法的伪代码是:
Type find(Type * ID, int N)  
{
int nTimes = 0;
int i;
Type candidate;

for (i = 0; i < N; i++)
{
if (nTimes == 0)
{
candidate = ID[i];
nTimes++;
}
else
{
if (candidate == ID[i])
nTimes++;
else
nTimes--;
}
}

return candidate;
}



问题是!如果并不存在这个水贴王呢,意思是数组里面没有任何一个元素出现次数超过一半呢?这个算法并不满足啊!那怎么解?有没有高效点的方法呢?
...全文
333 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
yyfhz 2014-05-29
  • 打赏
  • 举报
回复
8L用Hash的其实也不是严格意义上的一次遍历搞定,仍然需要1次遍历+1次Hash元素遍历。 9L的其实不能真正求出有无水王,因为AAABBBCCC这样的记录会以为有水王其实没有。
snoowood 2014-05-28
  • 打赏
  • 举报
回复
bool find(Type * ID, int N, Type &candidate) { int nTimes = 0; int i; Type candidate; for (i = 0; i < N; i++) { if (nTimes <= 0) { candidate = ID[i]; nTimes++; } else { if (candidate == ID[i]) nTimes++; else nTimes--; } } return nTimes>0; } 返回true说明有水王,否则没有。这样是不是可以?
ashen0316 2014-05-27
  • 打赏
  • 举报
回复
引用 4 楼 yyfhz 的回复:
可以做两次啊,第1次求出“水王”,第2次判断他是不是真的够“水”
遍历两次。可以!但是有没有办法,遍历一次搞定啊?
ashen0316 2014-05-27
  • 打赏
  • 举报
回复
引用 3 楼 hbu_pig 的回复:
假设lz的问题是,问有没有水王?如果有,求出水王。 解: 用堆排或者快排,按id排序。。找出n/2位置的id的个数,如果大于n/2,则有,此id即是。否则,没有。
排序花费的时间太多了,感觉不是最优的。
欢乐的小猪 2014-05-27
  • 打赏
  • 举报
回复
如果空间允许。来个哈希表表。只存ID和数量倒是可以遍历一次就搞定
欢乐的小猪 2014-05-27
  • 打赏
  • 举报
回复
引用 6 楼 ashen0316 的回复:
遍历两次。可以!但是有没有办法,遍历一次搞定啊?
楼主厉害!能解释下怎么遍历两次就能搞定了吗?
yyfhz 2014-05-26
  • 打赏
  • 举报
回复
可以做两次啊,第1次求出“水王”,第2次判断他是不是真的够“水”
欢乐的小猪 2014-05-26
  • 打赏
  • 举报
回复
假设lz的问题是,问有没有水王?如果有,求出水王。 解: 用堆排或者快排,按id排序。。找出n/2位置的id的个数,如果大于n/2,则有,此id即是。否则,没有。
欢乐的小猪 2014-05-26
  • 打赏
  • 举报
回复
LZ你把已知条件换了。。那你的问题是什么?
ashen0316 2014-05-24
  • 打赏
  • 举报
回复
自己顶起来。。。

33,008

社区成员

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

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