Python heapq LeetCode 692. Top K Frequent Words

本文深入探讨了Python中heapq模块的使用方法,包括如何利用heapq.heappush和heapq.heappop进行堆操作,以及如何通过heapq.heapify将列表转换为堆。此外,还介绍了一个LeetCode题目示例,展示了如何自定义类并实现比较方法以满足特定需求。

默认最小在最前,这个和sorted一样,没有reverse,但是可以用tuple来玩

heapq是module(文件),所以import

heapq.heappush是直接调用这个module最外层的函数

import heapq
h1 = []

heapq.heappush(h1, (5, 'write code'))
heapq.heappush(h1, (7, 'release product'))
heapq.heappush(h1, (1, 'write spec'))
heapq.heappush(h1, (3, 'create tests'))
print(heapq.heappop(h1))
#(1, 'write spec')

h2 = [(7,'7'),(6,'6'),(5,'5'),(4,'4'),(3,'3'),(2,'2'),(1,'1')]
heapq.heapify(h2)
print(h2)
#[(1, '1'), (3, '3'), (2, '2'), (4, '4'), (6, '6'), (7, '7'), (5, '5')]

------------------------- 

来个LeetCode题目玩一玩,涉及到Python的重载:

from collections import Counter
import heapq

class FreqWord:
    def __init__(self, word, freq):
        self.word, self.freq = word, freq

    def __lt__(self, other):
        if (self.freq != other.freq):
            return self.freq < other.freq
        else:
            return self.word > other.word

class Solution:
    def topKFrequent(self, words: List[str], k: int) -> List[str]:
        cw = Counter(words)
        heap = []
        for word, freq in cw.items():
            heapq.heappush(heap, FreqWord(word, freq))
            if len(heap) > k:
                retire = heapq.heappop(heap)
        heap.sort(reverse=True)
        return [x.word for x in heap]

 

<think>嗯,用户想了解Pythonheapq模块的heappush函数的用法和示例。首先,我需要回忆一下heapq模块的基本知识。记得heapqPython标准库中的一个模块,用于实现堆队列算法,也就是优先队列。heappush函数的作用是将元素添加到堆中,同时保持堆的不变性。用户可能已经知道堆是什么,但可能需要确认一下。堆是一种特殊的树形数据结构,每个父节点的值都小于或等于其子节点(最小堆)。heappush函数应该会把元素插入到合适的位置,以保持堆的属性。我需要解释清楚这一点。接下来,我应该考虑如何展示heappush的基本用法。可能需要一个简单的例子,比如创建一个空列表,然后多次调用heappush添加元素,最后展示堆的结构。同时,要注意在Python中,堆通常是通过列表来实现的,但需要确保列表符合堆的结构,所以每次操作后都要保持堆属性。 用户可能还会想知道如何处理自定义对象或者复杂数据结构的情况。这时候可能需要用到元组,其中第一个元素是优先级,第二个元素是实际的数据。比如,处理任务队列时,优先级高的任务先被处理。这时候需要展示如何将这样的元组插入堆中,并确保堆按照优先级排序。 另外,用户可能会遇到错误,比如直接插入非数字类型的数据,或者忘记维护堆的结构。这时候需要指出常见的错误情况,并给出解决方法。例如,当插入自定义对象时,如果没有定义比较方法,会导致TypeError,这时候应该使用元组来包装优先级和对象。 还需要考虑时间复杂度的部分。heappush的时间复杂度是O(logn),因为每次插入后可能需要向上调整堆结构,这个过程和树的高度有关,而树的高度是logn。这部分可以作为性能分析的参考。可能的相关问题包括如何从堆中弹出元素,如何将列表转换为堆,或者heapq的其他函数如heappop、heapify等的用法。还有可能涉及堆的应用场景,比如Dijkstra算法、优先任务调度等。需要确保回答的结构清晰,分步骤说明用法,示例代码正确,并且解释清楚每个部分的作用。同时,引用相关的知识,比如时间复杂度时,可以引用之前提到的公式,但要注意是否符合用户的需求。此外,确认用户是否了解标准库和第三方库的区别,但根据用户的问题,heapq属于标准库,所以不需要担心第三方库的问题。 最后,生成的相关问题要围绕heapq的其他函数、应用场景、性能优化等展开,帮助用户进一步学习。</think>### Python heapq.heappush 使用详解 #### 一、基础概念 堆(heap)是一种特殊的完全二叉树结构,满足父节点总是小于等于子节点(最小堆)或大于等于子节点(最大堆)。Python的`heapq`模块默认实现最小堆,`heappush`函数用于将元素插入堆并保持堆特性,时间复杂度为$O(\log n)$[^1]。 #### 二、核心用法 ```python import heapq heap = [] heapq.heappush(heap, 3) # 插入数字 heapq.heappush(heap, 1) heapq.heappush(heap, 4) print(heap) # 输出 [1, 3, 4] ``` #### 三、进阶应用 1. **元组排序**:按第一个元素排序 ```python tasks = [] heapq.heappush(tasks, (2, "write report")) heapq.heappush(tasks, (1, "debug code")) print(heapq.heappop(tasks)) # 输出 (1, 'debug code') ``` 2. **自定义对象排序**: ```python class Task: def __init__(self, priority, desc): self.priority = priority self.desc = desc def __lt__(self, other): return self.priority < other.priority heap = [] heapq.heappush(heap, Task(3, "test")) heapq.heappush(heap, Task(1, "deploy")) ``` #### 四、常见错误 1. **类型不匹配**:试图比较不同类型元素时会报错 ```python heapq.heappush([None], 5) # TypeError: '<' not supported between instances of 'int' and 'NoneType' ``` 2. **堆特性破坏**:直接修改列表会破坏堆结构 ```python heap = [1,3,4] heap[0] = 5 # 破坏堆特性 # 正确做法应使用heapq函数操作 ``` #### 五、性能特征 $O(\log n)$时间复杂度来源于堆的高度特性,插入操作最多需要$\log_2 n$次比较[^1]。对于包含$10^6$个元素的堆,插入操作最多需要20次比较。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值