2019独角兽企业重金招聘Python工程师标准>>>

Tango是微软亚洲研究 院的一个试验项目。研究院的员工和实习生们都很喜欢在Tango上面交流灌水。传说,Tango有一大“水王”,他不但喜欢发贴,还会回复其他ID发的每 个帖子。坊间风闻该“水王”发帖数目超过了帖子总数的一半。如果你有一个当前论坛上所有帖子(包括回帖)的列表,其中帖子作者的ID也在表中,你能快速找 出这个传说中的Tango水王吗?
分析与解法

首先想到的是一个最直接的方法,我们可以对所有ID进行排序。然后再扫描一遍排好序的ID列表,统计各个ID出现的次数。如果某个ID出现的次数超过总数的一半,那么就输出这个ID。这个算法的时间复杂度为ON * log2N)。

如果ID列表已经是有序的,还需要扫描一遍整个列表来统计各个ID出现的次数吗?

如果一个ID出现的次数超过总数N的一半。那么,无论水王的ID是什么,这个有序的ID列表中的第N/2项(从0开始编号)一定会是这个ID(读者可以试着证明一下)。省去重新扫描一遍列表,可以节省一点算法耗费的时间。如果能够迅速定位到列表的某一项(比如使用数组来存储列表),除去排序的时间复杂度,后处理需要的时间为O(1)。

但上面两种方法都需要先对ID列表进行排序,时间复杂度方面没有本质的改进。能否避免排序呢?

如 果每次删除两个不同的ID(不管是否包含“水王”的ID),那么,在剩下的ID列表中,“水王”ID出现的次数仍然超过总数的一半。看到这一点之后,就可 以通过不断重复这个过程,把ID列表中的ID总数降低(转化为更小的问题),从而得到问题的答案。新的思路,避免了排序这个耗时的步骤,总的时间复杂度只 有ON),且只需要常数的额外内存。伪代码如下:

代码清单:

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;
}

在 这个题目中,有一个计算机科学中很普遍的思想,就是如何把一个问题转化为规模较小的若干个问题。分治、递推和贪心等都是基于这样的思路。在转化过程中,小 的问题跟原问题本质上一致。这样,我们可以通过同样的方式将小问题转化为更小的问题。因此,转化过程是很重要的。像上面这个题目,我们保证了问题的解在小 问题中仍然具有与原问题相同的性质:水王的ID在ID列表中的次数超过一半。转化本身计算的效率越高,转化之后问题规模缩小得越快,则整体算法的时间复杂 度越低。

扩展问题

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

参考上面的解法,思路如下:
如果每次删除四个不同的ID(不管是否包含发帖数目超过总数1/4的ID),那么,在剩下的ID列表中,原先发帖比例大于1/4的ID所占比例仍然大于1/4。可以通过不断重复这个过程,把ID列表中的ID总数降低(转化为更小的问题),从而得到问题的答案。

代码如下:

void Find(Type* ID, int N,Type candidate[3])
{Type ID_NULL;//定义一个不存在的IDint nTimes[3], i;nTimes[0]=nTimes[1]=nTimes[2]=0;candidate[0]=candidate[1]=candidate[2]=ID_NULL;for(i = 0; i < N; i++){if(ID[i]==candidate[0]){nTimes[0]++;}else if(ID[i]==candidate[1]){nTimes[1]++;}else if(ID[i]==candidate[2]){nTimes[2]++;}else if(nTimes[0]==0){nTimes[0]=1;candidate[0]=ID[i];}else if(nTimes[1]==0){nTimes[1]=1;candidate[1]=ID[i];}else if(nTimes[2]==0){nTimes[2]=1;candidate[2]=ID[i];}else{nTimes[0]--;nTimes[1]--;nTimes[2]--;}}return;
}

转载于:https://my.oschina.net/wizardpisces/blog/113280

编程之美之寻找发帖“水王” 的算法问题相关推荐

  1. 编程之美:寻找发帖水王 扩展

    1.问题描述 快速找出发帖超过一半的的ID 问题变型: 现在有一个数组,已知一个数出现的次数超过了一半,请用最小的复杂度的算法找出这个数. 问题扩展: 有三个发帖很多的ID,他们的发帖数目超过了帖子总 ...

  2. [编程之美] PSet2.3 寻找发帖“水王”

    问题描述: Tango是微软亚洲研究院的一个试验项目.研究院的员工和实习生们都很喜欢在Tango上面交流灌水.传说,Tango有一大"水王",他不但喜欢发贴,还会回复其他ID发的每 ...

  3. 编程之美2.3 寻找发帖水王

    这道题目由于不容易写测试用例,所以,可以把题目转换为:在一个数组中,有一个数字出现的次数超过了数组大小的一半,这和题目原意是一样的. 这道题目的思想是我们同时去掉数组中两个不一样的数字,那么,数组中原 ...

  4. 寻找发帖“水王“(分治法)

    问题描述: 有某一论坛,其中有一发帖水王,不但喜欢发帖,还会回复其他ID发的每个帖子."水王"发帖数目超过了帖子总数的一半.如果你有一个当前论坛上所有帖子(包括回帖)的列表,其中帖 ...

  5. 编程之美-寻找发帖“水王”方法整理

    [试题描述] 方法: 扩展问题:

  6. 编程之美-快速寻找满足条件的两个数方法整理

    [问题描述] 方法一:时间复杂度O(n^2) 方法二:时间复杂度O(n),空间复杂度O(n) 方法三:时间复杂度O(nlogn)

  7. 编程之美-2.3-寻找发帖“水王”

    题目:寻找一个ID列表中,有一个ID超过了总数的一半,找出这个ID 分析: 可以对ID进行排序,因为需要寻找的ID超过了一半,所以该ID列表ID[N]中,ID[N/2]一定是这个ID值.复杂度为O(N ...

  8. java 编程之美_《编程之美—微软技术面试心得》PDF 下载

    第1章 游戏之乐--游戏中碰到的题目 1.1 让CPU占用率曲线听你指挥 1.2 中国象棋将帅问题 1.3 一摞烙饼的排序 1.4 买书问题 1.5 快速找出故障机器 1.6 饮料供货 1.7 光影切 ...

  9. 编程之美 1.6 买饮料问题

    饮料供货 书中开始又是一堆看不懂的前述,感觉说了半天也没说清楚题目,看了解法一才看明白. 题目:假设STC共提供n中饮料,用(Si ,Vi,Ci,Hi,Bi )(对应的是饮料的名字,容量,可能的最大数 ...

  10. 编程之美 - 创作后记(部分)

    我应该算是最早知道将要编写<编程之美--微软技术面试指南>这本书的少数几个人之一.那时邹欣老师正在对<移山之道--VSTS开发指南>进行最后的润色,而我还在学校里上研究生课程, ...

最新文章

  1. “硅谷之父”传奇:拯救斯坦福大学、培养大批高科技人才、指导创立惠普
  2. umi搭建react+antd项目(一)环境配置
  3. day1---python的基础特性
  4. SAP Spartacus后台CMS Component和Angular Component的映射关系
  5. java 存储数据到文件中_本机速度文件支持的“纯” Java大数据存储
  6. 程序设计导引及在线实践_学院经纬计算学院程序设计基础与实验入选首批国家级一流本科课程...
  7. 使用idea导入文件夹作为项目时,在项目中的文件夹可能会被隐藏
  8. Android数据库框架-ORMLite
  9. 19 岁少年找 Bug 赚了 100 万美元
  10. sqlserver 查找某个字符在字符串中第N次出现的位置
  11. 桌面计算机图标变黑块,电脑桌面图标变成黑色方块该怎么解决?
  12. Win7通过CMD命令开启无线热点
  13. 敏涵控股集团成为2022第十二届公益节候选品牌
  14. 哪个牌子的投影仪更好?哪个品牌投影仪好
  15. 矩阵对角化(Diagonalizing a Matrix)
  16. TortoiseGit(乌龟)------安装教程
  17. Vue Mixin 与小程序 Mixins 应用
  18. C# /.NET6 实现语音转文字(科大讯飞语音转文字接口)
  19. zkSNARKs(零知识证明)简述
  20. 【转】初入NLP领域的一些小建议

热门文章

  1. Flutter - Stateful(有状态) 和 stateless(无状态) widgets
  2. spring-boot-starter-thymeleaf对没有结束符的HTML5标签解析出错
  3. leetcode:N-Queens 问题
  4. CentOS 安装nload(流量统计)
  5. 九度OnlineJudge之1001:A+B for Matrices
  6. 2011-8-4 今天完成了去掉上传文件(input type=file)的框框 哎 人家客户不要框框。...
  7. python中filter、map、reduce的区别
  8. Docker run centos 内部使用systemctl 启动服务的方法
  9. 深入浅出聊Unity3D项目优化:从Draw Calls到GC
  10. cloud 调用列表并返回数据操作代码