【发布时间】: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]
我有时得到正确结果,有时却没有的原因是什么?这三个函数中的哪一个可能是错误的?
【问题讨论】: