簡體   English   中英

數組中的k-最小值按排序順序排列

[英]k-smallest values in array in a sorted order

給定大小為n的數組,問題是按排序順序返回前k最小元素。 我的想法是更新QuickSort算法,首先找到第一個k元素然后再遞歸更新問題以找到k-1最大元素。 找不到我的錯誤。

    def partition(a, left, right):
      pivot = a[left]
      p = left
      q = right
      while(p < q):
        while(a[q] > pivot and p < q):
          q-=1
        while(a[p] <= pivot and p < q):
          p+=1
        a[p] , a[q] = a[q] , a[p]
      a[left],a[p]=a[p],a[left]
      return p


    def kthSmallest(a, left, right, k,c=0):
      if left>=right:
        return a[c:]
      else:
        curr = partition(a, left, right)
        if curr - left == k - 1:
          return kthSmallest(a, left,curr-left-1,k-1,c+1)
        if(curr - left > k - 1):
          return kthSmallest(a, left, curr-1, k,c)
        return kthSmallest(a, curr+1, right, k - (curr - left + 1),c)

temp=[8,5,2,1,6,7,4,9,0]

print(kthSmallest(a,0,len(temp)-1,2))

你的遞歸對我來說並沒有多大意義。 你應該主要想要遵循quicksort的常規算法,你可以避免排序你不關心的數組部分(保證超過k的值)。

這是我怎么做的。 您總是在左側分區上遞歸,如果樞軸索引curr小於k ,則遞歸到右側分區。 如果curr更大,您可以跳過第二次遞歸,因為我們不需要任何這些值。 我正在將切片拆分為非遞歸函數,因此我們不需要在每次遞歸調用時都這樣做。

def partial_sort(a, left, right, k):
  if left >= right: # base case, do nothing
    return
  curr = partition(a, left, right)
  partial_sort(a, left, curr-1)  # always recurse on the left partition
  if curr < k:     # we only sometimes need to recurse twice
    partial_sort(a, curr+1, right)

def kthSmallest(a, k):
  partial_sort(a, 0, len(a)-1, k)
  return a[:k]

我還要注意,有一種稍微更有效的算法來解決這個精確的計算,並且它在Python標准庫中有一個實現。 heapq.nsmallest函數使用二進制最大堆來非常優雅地解決這個問題。 我強烈建議您查看它

如果我的問題得到解決,你可以使用:

 min_k_values = np.sort(x, axis = None)[:k]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM