Richard14
V2EX  ›  问与答

排序算法问题,如何快速筛选出数组前 N 位的位置?

  •  
  •   Richard14 · Jun 16, 2022 · 2671 views
    This topic created in 1603 days ago, the information mentioned may be changed or developed.

    生产中需要用到相关实现算法,感觉比较像一道算法题,但我想了想没有什么太好的办法,来请教一下万能的 v 友。

    现有一自然数 N ,假定取值范围 1-100.

    有一数组,储存双精度浮点数,数组长度为 N-100000.求筛选数组中最大(或最小)前 N 位数所在的位置。

    为传统算法基本上都是为全排序设计的,不存在说只取前 N 位最大即可。还有一个问题是排序大多数直接操作数据而不是操作指针,给我整不会了。。

    需要时间复杂度最优,不在意空间复杂度。。

    12 replies  •  2022-06-17 11:13:01 +08:00
    vance123
    vance123
    Jun 16, 2022 via Android
    1
    关键词 heap
    ipwx
    ipwx
    Jun 16, 2022❤️1
    2
    快速选择,做一半的快速排序,期望复杂度 O(n)

    先做一次快速排序,若轴枢元素是第 K 大。

    * 如果 K < N 则对右侧做 N-K 的快速划分。
    * 如果 K > N 则对左侧做 N 的快速划分。
    per
    per
    Jun 16, 2022 via iPhone
    3
    最大(小)堆排序
    ipwx
    ipwx
    Jun 16, 2022
    4
    哦最大最小堆也挺好,可以处理在线情况。

    换个几号吧,如果你的全数组长度是 M ,用最小堆找最大的前 N 个元素,那么时间复杂度就是 O(M log N)。
    反之用最大堆可以找最小的 N 个元素。
    ynyounuo
    ynyounuo
    Jun 16, 2022 via iPhone
    5
    经典 topk 算法不是全网各处都有
    dbsquirrel
    dbsquirrel
    Jun 16, 2022 via iPhone
    6
    Quick Select?
    sunjourney
    sunjourney
    Jun 17, 2022
    7
    大顶堆不就是吗,最常见的算法
    msg7086
    msg7086
    Jun 17, 2022
    8
    容量 N 的大顶堆。要带位置的话元素里加上位置信息即可。
    rabbbit
    rabbbit
    Jun 17, 2022❤️1
    9
    堆排序
    NotFounder
    NotFounder
    Jun 17, 2022
    10
    堆排序和快排,快排不稳定,最差情况 O(N^2)
    anonymousar
    anonymousar
    Jun 17, 2022❤️1
    11
    明显 bfptr 更好 一堆说 heap 是啥意思
    Erroad
    Erroad
    Jun 17, 2022
    12
    @anonymousar #10 没学过呗,我也第一次听说
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   1532 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 50ms · UTC 23:36 · PVG 07:36 · LAX 15:36 · JFK 18:36
    ♥ Do have faith in what you're doing.