V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
ballshapesdsd
V2EX  ›  问与答

怎么在线性时间内求 n 个数(可能有重复)内第 k 大的数

  •  
  •   ballshapesdsd · 2017-10-21 14:46:19 +08:00 · 1895 次点击
    这是一个创建于 2589 天前的主题,其中的信息可能已经有所发展或是发生改变。
    在网上搜到了 BFPRT 算法的实现,发现如果 n 个数如果有重复就会变的很慢,自己研究了下算法没太看懂为什么。。有没有大神讲讲。。
    16 条回复    2017-10-22 01:02:28 +08:00
    ballshapesdsd
        1
    ballshapesdsd  
    OP
       2017-10-21 17:03:55 +08:00
    有人没
    crazybug
        2
    crazybug  
       2017-10-21 17:16:06 +08:00 via Android
    不是大神瞎扯句。去重,排序。
    cabbage
        3
    cabbage  
       2017-10-21 17:19:52 +08:00 via Android
    不是大神随便说说,hash 表
    Shura
        4
    Shura  
       2017-10-21 17:24:37 +08:00 via Android
    大根堆,不考虑建堆时间
    Shura
        5
    Shura  
       2017-10-21 17:25:35 +08:00 via Android
    @Shura 眼瞎,看成前 k 大数了
    ballshapesdsd
        6
    ballshapesdsd  
    OP
       2017-10-21 17:30:55 +08:00
    @Shura 其实就是求前 k 大的数所在的位置。。之前用 python 的 heapq.nlargest,很慢,刚才发现 numpy 自带的 sort 和 c++的 BFPRT 算法效率差不多,甚至还更快。。所以就愉快的用 numpy 的 sort 了
    geelaw
        7
    geelaw  
       2017-10-21 17:38:47 +08:00 via iPhone
    那你可以特判一下有很多相等的情况……原因和 naive 快排有相等元素可能变慢一样。

    另一个方法是让两者强行不想等,比如额外记录原来的位置。但这样牺牲比较大。
    victor97
        9
    victor97  
       2017-10-21 19:01:14 +08:00 via Android   ❤️ 1
    基于快排的思路。
    根据快排基准数的位置大于还是小于 k,决定是在前半部分还是后半部分继续找。
    由于每次只看一边,所以时间复杂度是 O(n)。
    churchmice
        10
    churchmice  
       2017-10-21 19:10:18 +08:00 via Android
    有种数据结构叫最大 /最小堆
    ballshapesdsd
        11
    ballshapesdsd  
    OP
       2017-10-21 19:11:12 +08:00
    @victor97 这个算法的基准数不是随机选的,比较复杂
    zzj0311
        12
    zzj0311  
       2017-10-21 19:20:00 +08:00 via Android
    @ballshapesdsd 随不随机都是可以的~
    srlp
        13
    srlp  
       2017-10-21 19:41:34 +08:00 via iPhone
    日常 quickselect 够用了,平均 n,最差 n^2
    liuminghao233
        14
    liuminghao233  
       2017-10-21 19:48:47 +08:00 via iPhone
    无论如何也要排序吧
    On 是不可能 On 的除非已经排好的数
    一般快排或堆排
    bumz
        15
    bumz  
       2017-10-21 19:52:15 +08:00
    分而治之
    lengyihan
        16
    lengyihan  
       2017-10-22 01:02:28 +08:00 via Android
    楼主是学生吧,在学算法,
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2805 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 12:58 · PVG 20:58 · LAX 04:58 · JFK 07:58
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.