一、题目要求
三人行设计了一个灌水论坛。信息学院的学生都喜欢在上面交流灌水,传说在论坛上有一个“水王”,他不但喜欢发帖,还会回复其他ID发的每个帖子。坊间风闻该“水王”发帖数目超过了帖子数目的一半。
如果你有一张当前论坛的帖子(包括回帖)列表,其中帖子的作者的ID也在其中,你能快速的找到这个传说中的水王吗?
要求将设计思想、代码实现、实现截图、个人总结以博文的形式发表。(截止日期2015-4-22晚18:00)
二、设计思想
上课时用排序算法将ID表排成有序的,根据水王ID超过总贴数一半,则在有序表中的N/2项一定是水王的ID这一思路可以求出水王iD,此时算法的复杂度为O(n*n),但是老师要求时间复杂度为O(n),因此可以遍历ID表,两两相邻的ID进行比较,若不同则删掉,那么在剩余的ID表中水王的ID号仍然超过总数的一半,不断重复这个过程,把列表中ID总数降低,最后剩下的肯定是水王的ID,这些无序ID号可以用数组arr表示。
三、代码
#include<iostream.h> void main() { int arr[11]={1,2,2,3,4,2,2,5,3,2,2};//假设的ID号 int shuiwang = 0; int count=0; //标记 for(int i=0;i<11;i++) { if(count == 0) { shuiwang = arr[i]; count = 1; } else { if(shuiwang == arr[i]) count ++; else count --; } } cout<<"水王的ID是"<<shuiwang<<endl; }
四、截图
五、总结
这次实验题目有个条件就是水王发帖的ID号超过所以ID号一半以上,因此这就是这题的突破点,对于时间复杂度,好的设计思路可以大大降低时间复杂度,比如这题就可以将时间复杂度从O(N*N)降低到O(N)。