指的是在長度為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個元...