查找未排序列表的第N项而不排序列表

oob*_*boo 20 python arrays sorting

嘿.我有一个非常大的数组,我想找到第N个最大的值.平凡我可以对数组进行排序,然后取第N个元素,但我只对一个元素感兴趣,所以可能有一个比排序整个数组更好的方法...

Fog*_*ird 21

堆是这个操作的最佳数据结构,Python有一个很好的内置库来做这个,叫做heapq.

import heapq

def nth_largest(n, iter):
    return heapq.nlargest(n, iter)[-1]
Run Code Online (Sandbox Code Playgroud)

用法示例:

>>> import random
>>> iter = [random.randint(0,1000) for i in range(100)]
>>> n = 10
>>> nth_largest(n, iter)
920
Run Code Online (Sandbox Code Playgroud)

通过排序确认结果:

>>> list(sorted(iter))[-10]
920
Run Code Online (Sandbox Code Playgroud)

  • 如果你想要第n个最大或最小的项目,其中n是常数,这很有效(线性时间).如果n是列表长度的一半(即你想要中位数),那么这仍然是O(nlogn)时间. (3认同)

Dar*_*rio 18

排序至少需要O(nlogn)运行时间 - 有非常有效的选择算法可以在线性时间内解决您的问题.

Partition-based selection(有时Quick select),这是基于快速排序(递归分区)的想法,是一个很好的解决方案(参见伪代码的链接+ 另一个例子).

  • 不幸的是,链接"另一个例子"现在导致麻省理工学院受保护的网页,你必须有权访问. (10认同)