数据结构 - 最小堆最大堆
生活随笔
收集整理的這篇文章主要介紹了
数据结构 - 最小堆最大堆
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
- 可以在O(nlogn)的時間復雜度內完成排序
- 典型的用法是,尋找 第k個/前k個 最大/最小元素,k個有序序列合并
1.合并K個升序鏈表(最小堆實現)
或許可以改進成每次堆只存放K個元素?
# Definition for singly-linked list. # class ListNode(object): # def __init__(self, val=0, next=None): # self.val = val # self.next = next class Solution(object):def mergeKLists(self, lists):""":type lists: List[ListNode]:rtype: ListNode"""# 最小堆:根節點最小dummy = ListNode(-1)node = dummyheap = MinHeap()# 加入最小堆for ptr_l in lists:ptr = ptr_lwhile ptr is not None:heap.insert_node(ptr.val)ptr = ptr.nextwhile len(heap.array) > 1:temp_val = heap.delete_node()temp_node = ListNode(temp_val)node.next = temp_nodenode = temp_nodereturn dummy.nextclass MinHeap:def __init__(self):self.array = [-1]def insert_node(self, val):self.array.append(val)index = len(self.array) - 1while (index // 2 != 0):father = index // 2if self.array[father] > self.array[index]:temp = self.array[index]self.array[index] = self.array[father]self.array[father] = tempindex = fathercontinue# 未發生交換,完成插入breakdef delete_node(self):res = self.array[1]self.array[1] = self.array[-1]self.array = self.array[:-1]index = 1length = len(self.array)while (True):# 具有兩個子節點if 2*index+1 <= length-1:left = self.array[index*2]right = self.array[index*2+1]if left < right:if self.array[index] > left:temp = self.array[index]self.array[index] = self.array[index*2]self.array[index*2] = tempindex = index * 2continueelse:breakelse:if self.array[index] > right:temp = self.array[index]self.array[index] = self.array[index*2+1]self.array[index*2+1] = tempindex = index * 2 + 1continueelse:break# 一個子節點elif 2*index <= length-1:if self.array[index] > self.array[index*2]:temp = self.array[index]self.array[index] = self.array[index*2]self.array[index*2] = tempindex = index * 2continueelse:break# 沒有子節點else:breakreturn res2.前K個高頻元素
題目要求復雜度必須低于O(nlogn)。要尋找最大的K個值,可以用最小堆,并限制堆的大小為K
小于頂端的數被直接跳過,大于頂端的數則替換。這樣的時間復雜度是O(nlogk)
總結
以上是生活随笔為你收集整理的数据结构 - 最小堆最大堆的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 荣耀 100 / Pro 手机发布:搭载
- 下一篇: 后端学习 - Java基础