• 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 note 30 断点续传
    python note 29 线程创建
    python note 28 socketserver
    python note 27 粘包
    python note 26 socket
    python note 25 约束
    Sed 用法
    python note 24 反射
    python note 23 组合
    python note 22 面向对象成员
  • 原文地址:https://www.cnblogs.com/feng9exe/p/10002787.html
Copyright © 2020-2023  润新知