1. 程式人生 > 其它 >leetcode-692 前K個高頻單詞 Python優先佇列的使用

leetcode-692 前K個高頻單詞 Python優先佇列的使用

leetcode-692 前K個高頻單詞 Python優先佇列的使用

解題思路

  1. hash+sort
    統計每個單詞出現的頻率,然後對字典進行自定義排序,自定義排序操作
sorted(word_dict.items(),key=functools.cmp_to_key(comp))
  1. hash+priorityqueue
    統計每個單詞出現的頻率,使用優先佇列來進行排序
    題中出現前K大,或者前K小都可以通過優先佇列實現logn複雜度的計算,堆排序在堆頂取出元素的複雜度是\(O(1)\),堆排序的過程時間複雜度是\(O(logn)\)

python中優先佇列的使用

  • heapq

    heapq是二叉堆,用普通列表實現,可以獲取和插入最小值,只提供最小堆,因此必須新增額外步驟保證排序穩定性
import heapq
q = []

heapq.heappush(q, (2, 'a'))
heapq.heappush(q, (1, 'b'))
heapq.heappush(q, (3, 'c'))

while q:
    next_item = heapq.heappop(q)
    print(next_item)
  • PriorityQueue

    PriorityQueue是通過heapq實現的,時間複雜度同heapq相同,添加了同步機制
    優先佇列排序時,預設是小頂堆,預設按照第一個值的大小排列,如果第一個值相同,預設按照第二個值的升序排列
from queue import PriorityQueue
q = PriorityQueue()

q.put((2, 'a'))
q.put((1, 'b'))
q.put((3, 'c'))

while not q.empty():
    next_item = q.get()
    print(next_item)

程式碼

  • hash+priorityqueue
from queue import PriorityQueue
class Solution:
    def topKFrequent(self, words, k: int):
        q=PriorityQueue()
        word_dict={}
        for item in words:
            if item in word_dict:
                word_dict[item]+=1
            else:
                word_dict[item]=1
        for item in word_dict.items():
            q.put((-item[1],item[0]))
        res=[]
        for i in range(k):
            res.append(q.get()[1])
        return res
  • hash+sort
import functools
class Solution:
    def topKFrequent(self, words, k: int):
        word_dict={}
        for item in words:
            if item in word_dict:
                word_dict[item]+=1
            else:
                word_dict[item]=1
        def comp(x,y):
            if x[1]>y[1]:
                return -1
            elif x[1]==y[1]:
                if x[0]<y[0]:
                    return -1
                else:
                    return 1
            else:
                return 1
        res=sorted(word_dict.items(),key=functools.cmp_to_key(comp))
        return  [item[0] for item in res[:k]]