Python 第(前)K大(小)數問題

2021-10-05 17:26:27 字數 3676 閱讀 4072

指的是在長度為n(n>=k)的亂序陣列中找出從大到小順序的第(前)k個數的問題。

假設陣列長度為n,首先取前k個數,構建最小堆

將剩餘n-k個元素,依次與堆頂元素進行比較,若大於堆頂元素,則替換,並重新為最小堆。

# 構建最小堆

def min_heap(self, parent, heap):

child = 2 * parent + 1

while child < len(heap):

if child+1 < len(heap) and heap[child+1] < heap[child]:

child = child+1

if heap[parent] <= heap[child]:

break

heap[parent],heap[child] = heap[child],heap[parent]

parent, child = child, 2 * child + 1

return heap

# 找到前k大數

def find_max_kth(self):

if self.k > len(self.array):

return none

heap = self.array[:self.k]

for i in range(self.k, -1, -1):

self.min_heap(i, heap)

for j in range (self.k, len(self.array)):

if self.array[j] > heap[0]:

heap[0] = self.array[j]

self.min_heap(0,heap)

return heap[0]

指的是在長度為n(n>=k)的亂序陣列中找出從小到大順序的第(前)k個數的問題。

假設陣列長度為n,首先取前k個數,構建最大堆

將剩餘n-k個元素,依次與堆頂元素進行比較,若小於堆頂元素,則替換,並重新為最大堆。

# 構建最大堆

def max_heap(self, parent, heap):

child = 2 * parent + 1

while child < len(heap):

if child+1 < len(heap) and heap[child+1] > heap[child]:

child = child+1

if heap[parent] >= heap[child]:

break

heap[parent],heap[child] = heap[child],heap[parent]

parent, child = child, 2 * child + 1

return heap

# 找到前k小數

def find_min_kth(self):

if self.k > len(self.array):

return none

heap = self.array[:self.k]

for i in range(self.k, -1, -1):

self.max_heap(i, heap)

for j in range (self.k, len(self.array)):

if self.array[j] < heap[0]:

heap[0] = self.array[j]

self.max_heap(0,heap)

return heap[0]

class find_kth(object):

def __init__(self, k, array):

self.k = k

self.array = array

# 構建最小堆

def min_heap(self, parent, heap):

child = 2 * parent + 1

while child < len(heap):

if child+1 < len(heap) and heap[child+1] < heap[child]:

child = child+1

if heap[parent] <= heap[child]:

break

heap[parent],heap[child] = heap[child],heap[parent]

parent, child = child, 2 * child + 1

return heap

# 構建最大堆

def max_heap(self, parent, heap):

child = 2 * parent + 1

while child < len(heap):

if child+1 < len(heap) and heap[child+1] > heap[child]:

child = child+1

if heap[parent] >= heap[child]:

break

heap[parent],heap[child] = heap[child],heap[parent]

parent, child = child, 2 * child + 1

return heap

def find_max_kth(self):

if self.k > len(self.array):

return none

heap = self.array[:self.k]

for i in range(self.k, -1, -1):

self.min_heap(i, heap)

for j in range (self.k, len(self.array)):

if self.array[j] > heap[0]:

heap[0] = self.array[j]

self.min_heap(0,heap)

return heap[0]

def find_min_kth(self):

if self.k > len(self.array):

return none

heap = self.array[:self.k]

for i in range(self.k, -1, -1):

self.max_heap(i, heap)

for j in range (self.k, len(self.array)):

if self.array[j] < heap[0]:

heap[0] = self.array[j]

self.max_heap(0,heap)

return heap[0]

def main():

orignal_list =[12,4,6,33,54,9,3]

k = 4

obj = find_kth(k, orignal_list)

print("第k大數為:", obj.find_max_kth())

print("第k小數為:", obj.find_min_kth())

if __name__ == "__main__":

main()

區間第k小數問題

原題鏈結 我們在 值域 上建立線段樹。每個節點維護一段值域區間 l,r 並記錄序列中數值落在這段值域區間 l,r 內的點有多少個,記為cnt。先不考慮下標區間 l,r 的限制。對於詢問整個序列a1 an中的第k小數,我們執行線段樹的查詢操作,對於每個線段樹上的節點,只需比較k與左兒子 其值域區間為 ...

第 前 k大數問題

4.在實際應用中,還有乙個 精確度 的問題。我們可能並不需要返回嚴格意義上的最大的k個元素,在邊界位置允許出現一些誤差。當使用者輸入乙個query的時候,對於每乙個文件d來說,它跟這個query之間都有乙個相關性衡量權重f query,d 搜尋引擎需要返回給使用者的就是相關性權重最大的k個網頁。如果...

第 前 k大數問題

所謂 第 前 k大數問題 指的是在長度為n n k 的亂序陣列中s找出從大到小順序的第 前 k個數的問題。解法1 我們可以對這個亂序陣列按照從大到小先行排序,然後取出前k大,總的時間複雜度為o n logn k 4.在實際應用中,還有乙個 精確度 的問題。我們可能並不需要返回嚴格意義上的最大的k個元...