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
    來源:简书
    简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
  • 相关阅读:
    转载:PHP的session过期设置
    转载:php实现记住密码自动登录
    jQuery方法大全
    转载: IE、FF、Safari、OP不同浏览器兼容报告
    div布局的小心得
    PHP MVC模式在网站架构中的实现分析
    梳理一下 html 中的一些基本概念
    DNN学习笔记代码学习:Null 荣
    DNN学习笔记:DNN类中的ProviderType字段 荣
    在苏州 荣
  • 原文地址:https://www.cnblogs.com/feng9exe/p/10002787.html
Copyright © 2011-2022 走看看