【问题标题】:Find K largest elements in a list查找列表中的 K 个最大元素
【发布时间】:2021-08-29 22:12:42
【问题描述】:

我正在尝试基于QuickSelect 的结果实现一个算法,其中,鉴于QuickSelect 找到的第 K 个最大元素,我想获得 K 个最大元素

这是QuickSelect的实现:

def partition(A, left, right): 
    pivotindex = random.randint(left, right) 
    pivot = A[pivotindex] # get random pivot
    i = left - 1
    for j in range(left, right): 
        if A[j] < pivot:
            i += 1 
            A[i], A[j] = A[j], A[i]
    A[i+1], A[right] = A[right], A[i+1] 
    return i + 1

def QuickSelect(A, K, left, right):
    if left == right:
        return A[left]
    q = partition(A, left, right) 
    i = q - left + 1
    if K == i:
        return A[q]  # this is the element you want to return
    if K < i:
        return QuickSelect(A, K, left, q - 1)
    else:
        return QuickSelect(A, K - i, q + 1, right)

def k_largest(A, K):
    q = QuickSelect(A = A, K = K, left = 0, right = len(a)-1)
    B = [i for i in A if i >= q]
    return B

所以,我想用函数 k_largest_(A, K) 得到一个新数组 B,其中存在 K 个最大元素 直到第 K 个元素.

通过在随机数组上实现,我希望 re 结果与函数sorted(a)[-10:] 相同:

a = get_random_array(100, 100)

print(sorted(a)[-10:]) # largest 10 elements, I expect the same result of that array
print(sorted(k_largest(a, 10)))

结果:

[91, 91, 92, 94, 95, 95, 98, 98, 99, 99]
[91, 91, 91, 92, 94, 95, 95, 98, 98, 99, 99]

但是,有时我得到相同的结果,有时没有。就像,在下一次尝试中结果是正确的

a = get_random_array(100, 100)

print(sorted(a)[-10:]) # largest 10 elements, I expect the same result of that array
print(sorted(k_largest(a, 10)))

[92, 93, 94, 95, 95, 96, 97, 98, 99, 99]
[92, 93, 94, 95, 95, 96, 97, 98, 99, 99]

我有时得到正确结果,有时却没有的原因是什么?这三个函数中的哪一个可能是错误的?

【问题讨论】:

    标签: python algorithm sorting


    【解决方案1】:

    我的猜测是最后一种方法,k_largest。 更准确地说是行

    B = [i for i in A if i &gt;= q]

    如果我理解正确,q 是第 10 个(或第 k 个)最大数字的值。这里的问题是,如果有多个值与q 具有相同的值,它们都会被包括在内。

    因此,根据随机生成,如果有许多第 10(或第 k)个最大值,它们都将被包括在内。

    如何纠正?

    选择 B 的最后 10 个元素并不能保证,因为它们可能不是有序的。排序然后这样做会起作用,但这可能与您的想法背道而驰(我的意思是,它会在整个阵列上起作用,但也许在较小的阵列上更快)。 所以也许你可以检查B的长度,当长度大于10时,弹出最小值。

    我不确定这是否是最佳方法,但我猜错误可能出在代码的那部分。

    【讨论】:

      【解决方案2】:

      我认为问题出在 B = [i for i in A if i &gt;= q] 这一行。 假设您的最后 12 个元素是 99。这将返回 [99, 99, ..., 99](12 个元素)。您在这里缺少要返回最大 K 个元素的条件。有时当第十一个元素小于十分之一时结果是正确的,有时当第十一个元素等于第十个时结果是错误的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-04
        • 2013-02-11
        • 2019-08-20
        • 2014-07-21
        • 1970-01-01
        相关资源
        最近更新 更多