已为quickSelect算法提供了以下伪代码。我对几件事有些困惑,当我调用quickSelect方法时,我要发送的是“ k”。另外,由于我需要在方法开始时声明count = 0,因此在quickSelect的递归调用中它将始终设置为0,这不是我所需要的。感谢您的帮助,我提供了Pseudo -代码以及下面的我的代码;

Function quickSelect(aList, k):
If aList is not empty:
    pivot <- Choose the element at position (len(alist)//2)
    smallerList <- All elements of aList smaller than pivot
    largerList <- All elements of aList larger than pivot
    count <- the number of occurences of pivot value in aList
    m <- the size of smallerList
    if k >= m and k < m + count then:
        return pivot
    if m > k:
        return quickSelect(smallerList,k)
    else:
        return quickSelect(largerlist, k-m-count)


这是我想出的:

def quickSelect(aList, k):
   pivot = aList[len(aList)//2]
   smallerList = aList[:pivot]
   largerList = aList[pivot:]
   m = len(smallerList)
   count = 0

   for i in aList:
      if i == pivot:
        count = count + 1

   if k >= m and k < m + count:
      return pivot
   if m > k:
      return quickSelect(smallerList, k)
   else:
      return quickSelect(largerList, k-m-count)

最佳答案

首先,您要让smallerListlargerList根据其索引而不是其值从数据透视表的任一侧获取内容。 Pivot应该将数字除以索引的内容,而不是索引的位置(例如,如果索引为5,则所有小于数字5的条目都需要分配给smallerList,而所有较大的数字都需要分配给largerList分配给大于5的smallerList

这可以通过一个简单的for循环来完成:

if len(aList)!=0:
pivot=aList[(len(aList)//2)]
smallerList = []
for i in aList:
    if i<pivot:
        smallerList.append(i)
largerList=[]
for i in aList:
    if i>pivot:
        largerList.append(i)
m=len(smallerList)
count=len(aList)-len(smallerList)-len(largerList)


largerListsmallerList将/不/包括数据透视表,因此计数(数据透视表发生的次数)将是主列表的长度减去较小列表和较大列表的组合长度。

现在,如果k(第k个最小的数字)大于或等于m,则表示较小列表的长度,并且k小于较小列表的长度+数据透视的计数,您需要返回数据透视,因为您要查找的第k个最小数字。

if k >= m and k<m + count:
    return pivot


或者,如果较小列表的长度大于k,则仅使用而不是完整列表再次运行快速选择。

elif m > k:
    return quickSelect(smallerList,k)


否则,请使用较大的列表而不是完整列表再次运行快速选择,然后查找k-较小列表的长度-枢轴数

else:
    return quickSelect(largerList, k - m - count)


此函数将反复运行(比线性排序要快得多),并且一旦满足您的要求,就会为您提供返回值。在这种情况下,枢轴为中位数。

希望这可以帮助!

关于python - 快速选择Python中的硬件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12920508/

10-10 16:57