【问题标题】:Select the K largest elements with QuickSelect - Python使用 QuickSelect - Python 选择最大的 K 个元素
【发布时间】:2021-08-29 14:14:40
【问题描述】:

我是 Python 新手,正在练习编写代码,但遇到了一些麻烦。

我正在尝试实现一个基于 QuickSelect 的算法,在该算法中可以提取 K 个最大的元素

所以,在我实现QuickSelect 算法并使用它找到数组A 中第K 个最大元素之前。然​​后使用函数k_largest_quickselect(A, K) 我扫描数组A 以收集K 个元素大于等于QuickSelect找到的第K个元素最后对收集到的元素进行排序。

这是我的实现代码:

def partition(A, left, right): 
    pivot = random.choice(A)  # pick a random number as pivot
    i = left - 1
    for j in range(left, right): 
        if A[j] <= pivot: 
            i = 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): # Array, K-th element
    if left == right:
        return A[left]
    q = partition(A, left, right)
    i = q - left + 1
    if K == i:
        return A[i]
    if K < i:
        return QuickSelect(A, K, left, q - 1)
    else:
        return QuickSelect(A, K - i, q + 1, right)
    
def k_largest_quickselect(A, K):
    B = [i for i in A if i >= QuickSelect(A = A, K = K, left = 0, right = len(a)-1)] # elements >= the K-th element found with QuickSelect
    B.sort(reverse = True)
    return B

我尝试测试算法

a = get_random_array(10, 10)
print("Array a = " + str(a))
print(sorted(a)[-3:])
print(sorted(k_largest_quickselect(a, 3))) # from array a select the 3 highest number

得到这个结果

Array a = [0, 3, 0, 6, 2, 5, 1, 8, 1, 9]
[6, 8, 9]
[2, 5, 6, 6, 9, 9]

如你所见,通过使用函数k_largest_quickselect(A = a, K = 3),我没有得到数组中最大的3个元素。

请问,您能帮我解决这个问题吗?非常感谢!

【问题讨论】:

    标签: python arrays algorithm quickselect


    【解决方案1】:

    这是您算法的另一种方法:

    def kSelect(a, k):
        largestElements = []
        
        for interation in range(0,k):
            largestElementInArray = max(a)
            largestElements.append(largestElementInArray)
            a.remove(largestElementInArray)
    
        return largestElements
    

    不确定这是否是您想要实现的目标..?

    【讨论】:

      猜你喜欢
      • 2021-08-29
      • 1970-01-01
      • 2018-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-06
      • 2021-06-04
      • 1970-01-01
      相关资源
      最近更新 更多