在海量数据中找到最大的前K个数(top K问题)

问题分析:数据是海量的,可能达到10亿或者100亿以上,只需要找最大的前100个数。所以将数据一次性排序然后取前100个是不太可取的操作。做了很多无用功,并且内存一次性也加载不了海量数据。

解决方案:

  1. 方案一:堆。一般说在很多数据中取前多少个数据,我们都会想到,这里我们使用堆来解决问题。首先取K个数建立一个小根堆(堆顶是堆中最小的元素),建堆的时间复杂度是O(KlgK),这个时间复杂度虽然是上界,但不是渐进紧确的,渐进紧确的上界为O(K),具体推导见《算法导论.第三版》P88。接着依次从海量数据(N个数)中拿出一个数据与堆顶元素进行比较,若小于堆顶元素则继续从海量数据中取下一个数,若取出的数比堆顶元素大,则替换堆顶元素,并维护堆的性质,维护堆的性质所需要的时间复杂度是O(lgK)。直到将(N-m)个数遍历完,堆中剩余的数就是N个数的最大前K个数。 故总时间复杂度为O(K+(N-m)lgK) => O(N·lgK)   【N为海量数据,K为要取的最大前K个数。】
  2. 方案二:分块。面对大量数据时,分块也是比较容易想到的解决方法。假设将海量数据分成1000块,然后在每块中找到最大的前K个数。然后再从1000·K个数中直到最大的前K个数。

你可能感兴趣的:(刷题)