100000个数找出最小或最大的10个

  • 大体思路:
    1. 首先一点,对于海量数据处理,思路基本上是确定的,必须分块处理,然后再合并起来。
    2. 对于每一块必须找出10个最大的数,因为第一块中10个最大数中的最小的,可能比第二块中10最大数中的最大的还要大。
    3. 分块处理,再合并。也就是Google MapReduce 的基本思想。Google有很多的服务器,每个服务器又有很多的CPU,因此,100亿个数分成100块,每个服务器处理一块,1亿个数分成100块,每个CPU处理一块。然后再从下往上合并。注意:分块的时候,要保证块与块之间独立,没有依赖关系,否则不能完全并行处理,线程之间要互斥。另外一点,分块处理过程中,不要有副作用,也就是不要修改原数据,否则下次计算结果就不一样了。
    4. 上面讲了,对于海量数据,使用多个服务器,多个CPU可以并行,显著提高效率。对于单个服务器,单个CPU有没有意义呢?
        也有很大的意义。如果不分块,相当于对100亿个数字遍历,作比较。这中间存在大量的没有必要的比较。可以举个例子说明,全校高一有100个班,我想找出全校前10名的同学,很傻的办法就是,把高一100个班的同学成绩都取出来,作比较,这个比较数据量太大了。应该很容易想到,班里的第11名,不可能是全校的前10名。也就是说,不是班里的前10名,就不可能是全校的前10名。因此,只需要把每个班里的前10取出来,作比较就行了,这样比较的数据量就大大地减少了。
  • 对每个分块怎么处理:
    1. 如果是找到最大的10个元素,则用大小为10的最小堆,先将10个元素放入其中,之后从第11个元素开始,如果比根元素小,就丢弃,如果比根元素大,那么就丢弃根元素,将新元素加入。
    2. 如果是找到最小的10个元素,同理。
    3. 最后将每一块再进行合并。

你可能感兴趣的:(算法)