gpt4 book ai didi

python - 了解递归函数 - 快速选择 - 在线性时间内查找中值

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:06:37 27 4
gpt4 key购买 nike

我正在尝试实现此算法(来自此站点:https://sarielhp.org/research/CG/applets/linear_prog/median.html)。

FindKMedian( A, K )//返回 A 中第 K 个大小的数字。

  1. 从 A = {a1, ..., an} 中随机选择一个数 a。
  2. 将 n 个数字分成两组:
    • S - 所有小于a的数
    • B - 所有大于a的数字
  3. 如果|S| = K-1 然后 a 是所需的 K 中位数。返回一个
  4. 如果|S| < K-1 则 K 中值位于 B 中的某处。递归调用 FindKMedian( B, K - |S| - 1 )
  5. 否则,递归调用 FindKMedian( S, K )。

@mikake 回答后,我在代码末尾使用参数调用函数时出错。

import random


def quick_select(A, k, s, d):
r = random.choice(range(s, d))
pivot = partition(A, r, s, d)
if pivot == k:
return A[pivot]
elif k < pivot:
return quick_select(A, k, s, pivot-1)
else:
return quick_select(A, k, pivot + 1, d)


def partition(A, r, s, d):
j = s-1
assert s <= r
assert r <= d
temp = A[d]
A[d] = A[r]
A[r] = temp
for i in range(s, d):
if A[i] <= A[d]:
j = j+1
temp = A[j]
A[j] = A[i]
A[i] = temp
j = j+1
temp = A[j]
A[j] = A[d]
A[d] = temp
return j


random.seed(0)
A = [4, 7, 7, 2, 2, 0, 9, 8, 1, 8]
print(quick_select(A, 5, 0, 9))

我希望数字 7 从 quickselect 的返回中出来(所以 quick_select(A, 5, 0, 9) 的意思是“一旦子数组 A[0,...,5] 是,就找到 A[5]排序或一旦 A[5,...,9] 被排序")。我可能没有理解这段代码的语义。

谢谢

最佳答案

您忘记在“else”分支中添加return 语句:

def quick_select(A, k, s, d):
r = random.choice(range(s, d))
pivot = partition(A, r, s, d)
if pivot == k:
return A[pivot]
elif k < pivot:
return quick_select(A, k, s, pivot-1)
else:
return quick_select(A, k, pivot + 1, d)

关于python - 了解递归函数 - 快速选择 - 在线性时间内查找中值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56424740/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com