日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

数据结构 - 最小堆最大堆

發布時間:2023/12/4 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据结构 - 最小堆最大堆 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
  • 可以在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 res

2.前K個高頻元素

題目要求復雜度必須低于O(nlogn)。要尋找最大的K個值,可以用最小堆,并限制堆的大小為K
小于頂端的數被直接跳過,大于頂端的數則替換。這樣的時間復雜度是O(nlogk)

class Solution(object):def topKFrequent(self, nums, k):""":type nums: List[int]:type k: int:rtype: List[int]"""# 遍歷存入字典->按頻率排序最小堆抽出前k個 O(nlogn)"""topk (前k大)用小根堆,維護堆大小不超過 k 即可。每次壓入堆前和堆頂元素比較,如果比堆頂元素還小,直接扔掉,否則壓入堆。檢查堆大小是否超過 k,如果超過,彈出堆頂。復雜度是 nlogk"""hash_dict = dict()for num in nums:if hash_dict.has_key(num):hash_dict[num] += 1else:hash_dict[num] = 1# 最小堆求最大的k個元素heap = MinHeap()res = []for key, val in hash_dict.items():if len(heap.array) < k + 1:heap.insert_node(val)res.append((key, val))elif val > heap.array[1]:val_to_delete = heap.delete_node()for i in range(k):if res[i][1] == val_to_delete:res.pop(i)breakheap.insert_node(val)res.append((key, val))for i in range(k):res[i] = res[i][0]return res

總結

以上是生活随笔為你收集整理的数据结构 - 最小堆最大堆的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。