zoukankan      html  css  js  c++  java
  • Top K问题-BFPRT算法、Parition算法

    BFPRT算法原理

    在BFPTR算法中,仅仅是改变了快速排序Partion中的pivot值的选取,在快速排序中,我们始终选择第一个元素或者最后一个元素作为pivot,而在BFPTR算法中,每次选择五分中位数的中位数作为pivot,这样做的目的就是使得划分比较合理,从而避免了最坏情况的发生。算法步骤如下

    1. 将 n 个元素划为 lfloor n/5
floor 组,每组5个,至多只有一组由 nmod5 个元素组成。 
    2. 寻找这 lceil n/5
ceil 个组中每一个组的中位数,这个过程可以用插入排序。 
    3. 对步骤2中的 lceil n/5
ceil 个中位数,重复步骤1和步骤2,递归下去,直到剩下一个数字。 4. 最终剩下的数字即为pivot,把大于它的数全放左边,小于等于它的数全放右边。 
    5. 判断pivot的位置与k的大小,有选择的对左边或右边递归。

    求第 k 大就是求第 n-k+1 小,这两者等价。

    基于Partition算法

    • 选择一个Position(称为基准),基于该算法的Top k算法,非常受Position好坏的影响,所谓的坏,有可能使时间复杂度达到O(n*n)。
    • 然后利用Partition算法进行划分,如果Partition得到的p小于K,则继续划分p的右边,如果p大于K,则继续划分p的左边,如果p等于K,则算法结束。


    作者:远o_O
    链接:https://www.jianshu.com/p/495e5019669c
    來源:简书
    简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
  • 相关阅读:
    老齐python-基础7(文件操作、迭代)
    老齐python-基础6(循环 if while for)
    老齐python-基础5(运算符、语句)
    老齐python-基础4(元祖、字典、集合)
    老齐python-基础3(列表)
    老齐python-基础2(字符串)
    Jupyter notebook 的安装、入门
    pycharm 激活码
    VMware无法连接 MKS:套接字连接尝试次数太多正在放弃
    Numpy基本用法简介
  • 原文地址:https://www.cnblogs.com/feng9exe/p/10002787.html
Copyright © 2011-2022 走看看