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

1. 简述

    原题:简略的说,就是一个ID列表,其中每个ID都可能重复出现,其中一个ID的重复出现个数超过了列表长度的一半。要求快速找到这个ID。

    扩展:ID列表中,有三个ID,这三个ID重复出现的次数,都超过了列表长度的1/4。要求快速找到这个ID。

2. 思路

    原题的思路还是编程之美上面的方法,扩展题目的方法是参考中的一篇文章中讲过。

    原题的思路是保存一个ID和该ID的计数,然后遍历ID列表,如果当前没有保存的ID(即ID对应次数为0),那么保存遇到的ID,并且计数设置为1;如果遇到的ID刚好是保存的ID,那么计数加1;如果遇到的ID是一个新的ID,那么ID的计数减1。这样遍历之后,保存的ID必然就是所求ID。因为所求的ID占ID列表长度一半以上,并且只有不同的两个ID才会消减,所以,无论消减顺序如何,最后超过一半以上的ID一定是不会被消减掉的,也是唯一一个不会被消减掉的。

   扩展题目的思路是,保存三个ID和对应三个计数,然后遍历ID列表,如果当前有没有保存的ID(即有ID对应次数为0),那么保存这个ID,并且将对应的计数设置为1;如果遇到的ID是一个已经保存的ID,那么将对应ID的计数加1;如果遇到的ID是一个新的ID,而且此时已经保存了三个ID了,那么这三个ID的计数分别减1。由于N次遍历,最多消减N/4个ID,而要求的三个ID次数都大于N/4,因此这三个ID肯定不会被消掉,而最后只保存了三个ID,要求的三个ID又不会被消掉,那么必然说明保存的三个ID就是要求的这三个ID。

   基本上很容易扩展到K个ID,其中每个ID出现的次数都超过N/(K+1)次的情况,其中,N为ID列表长度。

3. 代码

    这个略了吧。

4. 参考

    编程之美-2.3-寻找发帖“水王”
    寻找发帖“水王”--《编程之美》笔记

posted @ 2011-09-24 22:56  xiaodongrush  阅读(520)  评论(0编辑  收藏  举报