zoukankan      html  css  js  c++  java
  • TOPK问题

    描述

    如从海量数字中寻找最大的 k 个,这类问题我们称为 TOPK 问题

    例子

    现有列表 [1, 2, 0, 3, 5], 求前 2 个大的元素。

    如传入列表和 k = 2,输出 [3, 5]

    算最大用冒泡,算最小用选择。

    底层算法

    Arrays.sort并不是单一的排序,而是插入排序,快速排序,归并排序三种排序的组合,为此我画了个流程图:

    数量非常小的情况下(就像上面说到的,少于47的),插入排序等可能会比快速排序更快。 所以数组少于47的会进入插入排序。

    快排数据越无序越快(加入随机化后基本不会退化),平均常数最小,不需要额外空间,不稳定排序。

    归排速度稳定,常数比快排略大,需要额外空间,稳定排序。

    所以大于或等于47或少于286会进入快排,而在大于或等于286后,会有个小动作:“// Check if the array is nearly sorted”。这里第一个作用是先梳理一下数据方便后续的归并排序,第二个作用就是即便大于286,但在降序组太多[超过67]的时候(被判断为没有结构的数据,The array is not highly structured,use Quicksort instead of merge sort.),要转回快速排序。

    这里主要作用是看他数组具不具备结构:实际逻辑是分组排序,每降序为一个组,像1,9,8,7,6,8。9到6是降序,为一个组,然后把降序的一组排成升序:1,6,7,8,9,8。然后最后的8后面继续往后面找。

    每遇到这样一个降序组,++count,当count大于MAX_RUN_COUNT(67),被判断为这个数组不具备结构(也就是这数据时而升时而降),然后送给之前的sort(里面的快速排序)的方法(The array is not highly structured,use Quicksort instead of merge sort.)

    如果count少于MAX_RUN_COUNT(67)的,说明这个数组还有点结构,就继续往下走下面的归并排序。

  • 相关阅读:
    HDU_1709 The Balence (生成函数)
    Ural_1003 Parity(并查集)
    HDU_1171 Big Event in HDU(生成函数)
    Ural_1306. Sequence Median(堆)
    POJ_2823 Sliding Window(单调队列)
    HDU_2065 "红色病毒"问题(指数型生成函数)
    HDU_2082 找单词 (生成函数)
    最长上升子序列问题(LCS)
    HDU_1284 钱币兑换问题(生成函数)
    HDU_2152 Fruit(生成函数)
  • 原文地址:https://www.cnblogs.com/xhyouyou/p/12465592.html
Copyright © 2011-2022 走看看