最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python heapq堆操作全解析

 更新時(shí)間:2026年03月22日 09:40:24   作者:老師好,我是劉同學(xué)  
本文主要介紹了Python heapq堆操作全解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

1. heapq 庫概述

Python 的 heapq 庫是基于堆數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)的標(biāo)準(zhǔn)庫模塊,它提供了對小頂堆(min-heap)的高效操作支持。堆是一種特殊的完全二叉樹結(jié)構(gòu),其中父節(jié)點(diǎn)的值總是小于或等于其所有子節(jié)點(diǎn)的值(小頂堆特性)。該庫的時(shí)間復(fù)雜度為 O(log n),在需要頻繁插入和刪除最小元素的場景下表現(xiàn)出色。

2. 核心函數(shù)詳解

2.1 基礎(chǔ)堆操作函數(shù)

函數(shù)名功能描述時(shí)間復(fù)雜度使用場景
heapify(x)將列表 x 轉(zhuǎn)換為堆結(jié)構(gòu)O(n)列表初始化堆
heappush(heap, item)向堆中插入新元素O(log n)動(dòng)態(tài)添加元素
heappop(heap)彈出并返回最小元素O(log n)獲取最小元素
heapreplace(heap, item)彈出最小元素并插入新元素O(log n)替換堆頂元素
heappushpop(heap, item)先插入再彈出最小元素O(log n)高效插入彈出

代碼示例:基礎(chǔ)堆操作

import heapq
# 初始化列表
data = [3, 1, 4, 1, 5, 9, 2, 6]
# 將列表轉(zhuǎn)換為堆(原地操作)
heapq.heapify(data)
print(f"堆化后的列表: {data}")  # 輸出: [1, 1, 2, 3, 5, 9, 4, 6]
# 向堆中插入元素
heapq.heappush(data, 0)
print(f"插入0后的堆: {data}")  # 輸出: [0, 1, 2, 1, 5, 9, 4, 6, 3]
# 彈出最小元素
min_element = heapq.heappop(data)
print(f"彈出的最小元素: {min_element}")  # 輸出: 0
print(f"彈出后的堆: {data}")  # 輸出: [1, 1, 2, 3, 5, 9, 4, 6]

2.2 批量查詢函數(shù)

函數(shù)名功能描述時(shí)間復(fù)雜度適用場景
nlargest(n, iterable)返回前n個(gè)最大元素O(n log k)Top-K 最大元素
nsmallest(n, iterable)返回前n個(gè)最小元素O(n log k)Top-K 最小元素

代碼示例:Top-K 問題解決

import heapq
import random

# 生成測試數(shù)據(jù)
numbers = [random.randint(1, 1000) for _ in range(100)]

# 獲取最大的5個(gè)元素
largest_5 = heapq.nlargest(5, numbers)
print(f"最大的5個(gè)元素: {largest_5}")

# 獲取最小的5個(gè)元素
smallest_5 = heapq.nsmallest(5, numbers)
print(f"最小的5個(gè)元素: {smallest_5}")

# 使用key參數(shù)進(jìn)行自定義比較
words = ['apple', 'banana', 'cherry', 'date', 'elderberry']
longest_3 = heapq.nlargest(3, words, key=len)
print(f"最長的3個(gè)單詞: {longest_3}")  # 輸出: ['elderberry', 'banana', 'cherry']

2.3 高級操作函數(shù)

heapq.merge(*iterables) 函數(shù)用于合并多個(gè)已排序的輸入序列,返回一個(gè)排序后的迭代器。

import heapq

# 合并多個(gè)有序序列
list1 = [1, 3, 5, 7]
list2 = [2, 4, 6, 8]
list3 = [0, 9, 10]

merged = list(heapq.merge(list1, list2, list3))
print(f"合并后的有序列表: {merged}")  # 輸出: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

3. 實(shí)戰(zhàn)應(yīng)用場景

3.1 優(yōu)先級隊(duì)列實(shí)現(xiàn)

import heapq

class PriorityQueue:
    def __init__(self):
        self._heap = []
        self._index = 0  # 用于處理優(yōu)先級相同的情況
    
    def push(self, item, priority):
        """添加元素到優(yōu)先級隊(duì)列"""
        heapq.heappush(self._heap, (priority, self._index, item))
        self._index += 1
    
    def pop(self):
        """彈出優(yōu)先級最高的元素"""
        if self._heap:
            return heapq.heappop(self._heap)[-1]
        raise IndexError("優(yōu)先級隊(duì)列為空")
    
    def is_empty(self):
        return len(self._heap) == 0

# 使用示例
pq = PriorityQueue()
pq.push("任務(wù)A", 3)
pq.push("任務(wù)B", 1)  # 最高優(yōu)先級
pq.push("任務(wù)C", 2)

while not pq.is_empty():
    print(f"執(zhí)行: {pq.pop()}")
# 輸出: 執(zhí)行: 任務(wù)B → 執(zhí)行: 任務(wù)C → 執(zhí)行: 任務(wù)A

3.2 實(shí)時(shí)數(shù)據(jù)流的中位數(shù)查找

import heapq

class MedianFinder:
    def __init__(self):
        # 最大堆(使用負(fù)數(shù)模擬)和最小堆
        self.max_heap = []  # 存儲(chǔ)較小的一半
        self.min_heap = []  # 存儲(chǔ)較大的一半
    
    def add_num(self, num):
        if not self.max_heap or num <= -self.max_heap[0]:
            heapq.heappush(self.max_heap, -num)
        else:
            heapq.heappush(self.min_heap, num)
        
        # 平衡兩個(gè)堆
        if len(self.max_heap) > len(self.min_heap) + 1:
            heapq.heappush(self.min_heap, -heapq.heappop(self.max_heap))
        elif len(self.min_heap) > len(self.max_heap):
            heapq.heappush(self.max_heap, -heapq.heappop(self.min_heap))
    
    def find_median(self):
        if len(self.max_heap) == len(self.min_heap):
            return (-self.max_heap[0] + self.min_heap[0]) / 2
        else:
            return -self.max_heap[0]

# 使用示例
finder = MedianFinder()
for num in [1, 3, 2, 6, 4, 5]:
    finder.add_num(num)
    print(f"當(dāng)前中位數(shù): {finder.find_median()}")

3.3 堆排序算法

import heapq

def heap_sort(iterable):
    """使用堆排序算法對可迭代對象進(jìn)行排序"""
    heap = list(iterable)
    heapq.heapify(heap)  # 構(gòu)建最小堆
    return [heapq.heappop(heap) for _ in range(len(heap))]

# 排序示例
unsorted_data = [9, 2, 7, 5, 1, 8, 3, 6, 4]
sorted_data = heap_sort(unsorted_data)
print(f"堆排序結(jié)果: {sorted_data}")  # 輸出: [1, 2, 3, 4, 5, 6, 7, 8, 9]

4. 高級技巧與性能優(yōu)化

4.1 實(shí)現(xiàn)最大堆

由于 heapq 默認(rèn)實(shí)現(xiàn)的是最小堆,可以通過存儲(chǔ)負(fù)值來模擬最大堆:

import heapq

class MaxHeap:
    def __init__(self):
        self._heap = []
    
    def push(self, item):
        heapq.heappush(self._heap, -item)
    
    def pop(self):
        return -heapq.heappop(self._heap)
    
    def peek(self):
        return -self._heap[0] if self._heap else None

# 最大堆使用示例
max_heap = MaxHeap()
for num in [3, 1, 4, 1, 5]:
    max_heap.push(num)

print("最大堆元素彈出順序:")
while max_heap._heap:
    print(max_heap.pop())
# 輸出: 5, 4, 3, 1, 1

4.2 自定義對象堆操作

import heapq

class Task:
    def __init__(self, name, priority, duration):
        self.name = name
        self.priority = priority
        self.duration = duration
    
    def __lt__(self, other):
        # 定義比較規(guī)則:優(yōu)先級高的在前,相同優(yōu)先級時(shí)持續(xù)時(shí)間短的在前
        if self.priority == other.priority:
            return self.duration < other.duration
        return self.priority > other.priority
    
    def __repr__(self):
        return f"Task({self.name}, priority:{self.priority}, duration:{self.duration})"

# 自定義對象堆操作
tasks = [
    Task("緊急任務(wù)", 3, 2),
    Task("普通任務(wù)", 1, 5),
    Task("重要任務(wù)", 2, 3)
]

heap = []
for task in tasks:
    heapq.heappush(heap, task)

print("任務(wù)執(zhí)行順序:")
while heap:
    print(heapq.heappop(heap))

5. 性能對比與最佳實(shí)踐

5.1 不同場景下的性能選擇

操作場景推薦方法時(shí)間復(fù)雜度優(yōu)勢
一次性獲取Top-Knlargest()/nsmallest()O(n log k)代碼簡潔
持續(xù)插入和彈出heappush() + heappop()O(log n)動(dòng)態(tài)高效
多個(gè)有序序列合并heapq.merge()O(n log k)內(nèi)存友好

5.2 內(nèi)存優(yōu)化技巧

import heapq

# 流式處理大數(shù)據(jù)集
def process_large_dataset(data_stream, top_n=10):
    """使用堆處理大數(shù)據(jù)流,只維護(hù)Top-N元素"""
    heap = []
    
    for item in data_stream:
        if len(heap) < top_n:
            heapq.heappush(heap, item)
        elif item > heap[0]:  # 對于最大Top-N,使用最小堆
            heapq.heapreplace(heap, item)
    
    return sorted(heap, reverse=True)

# 模擬大數(shù)據(jù)流處理
import random
data_stream = (random.randint(1, 10000) for _ in range(100000))
top_10 = process_large_dataset(data_stream, 10)
print(f"大數(shù)據(jù)流中的Top-10: {top_10}")

Python 的 heapq 庫通過提供高效的堆操作函數(shù),在算法優(yōu)化、數(shù)據(jù)處理和系統(tǒng)設(shè)計(jì)等多個(gè)領(lǐng)域發(fā)揮著重要作用。掌握這些函數(shù)的正確使用方法和適用場景,能夠顯著提升程序的性能和代碼的可維護(hù)性。

到此這篇關(guān)于Python heapq堆操作全解析的文章就介紹到這了,更多相關(guān)Python heapq堆操作內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • python發(fā)送json參數(shù)的實(shí)例代碼

    python發(fā)送json參數(shù)的實(shí)例代碼

    在寫腳本的過程中,除了發(fā)送form表單參數(shù)之外,我們還會(huì)發(fā)送json格式的參數(shù)。那么碰見json格式要怎么發(fā)送呢,這篇我們來解決這個(gè)問題,需要的朋友可以參考下
    2019-10-10
  • django之狀態(tài)保持-使用redis存儲(chǔ)session的例子

    django之狀態(tài)保持-使用redis存儲(chǔ)session的例子

    今天小編就為大家分享一篇django之狀態(tài)保持-使用redis存儲(chǔ)session的例子,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-07-07
  • Python Pandas中的shift()函數(shù)實(shí)現(xiàn)數(shù)據(jù)完美平移應(yīng)用場景探究

    Python Pandas中的shift()函數(shù)實(shí)現(xiàn)數(shù)據(jù)完美平移應(yīng)用場景探究

    shift()?是 Pandas 中一個(gè)常用的數(shù)據(jù)處理函數(shù),它用于對數(shù)據(jù)進(jìn)行移動(dòng)或偏移操作,常用于時(shí)間序列數(shù)據(jù)或需要計(jì)算前后差值的情況,本文將詳細(xì)介紹?shift()?函數(shù)的用法,包括語法、參數(shù)、示例以及常見應(yīng)用場景
    2024-01-01
  • Python自定義模塊的創(chuàng)建與使用

    Python自定義模塊的創(chuàng)建與使用

    這篇文章主要給大家介紹了關(guān)于Python自定義模塊創(chuàng)建與使用的相關(guān)資料,文中還給大家分享了python打包用戶自定義模塊的方法,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-05-05
  • python sitk.show()與imageJ結(jié)合使用常見的問題

    python sitk.show()與imageJ結(jié)合使用常見的問題

    這篇文章主要介紹了python sitk.show()與imageJ結(jié)合使用常見的問題,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • python調(diào)用fortran模塊

    python調(diào)用fortran模塊

    本文給大家介紹的是在Python中調(diào)用fortran代碼,主要是用到了f2py這個(gè)程序,十分的實(shí)用,有需要的小伙伴可以參考下
    2016-04-04
  • Python使用try except處理程序異常的三種常用方法分析

    Python使用try except處理程序異常的三種常用方法分析

    這篇文章主要介紹了Python使用try except處理程序異常的三種常用方法,結(jié)合實(shí)例形式分析了Python基于try except語句針對異常的捕獲、查看、回溯等相關(guān)操作技巧,需要的朋友可以參考下
    2018-09-09
  • python實(shí)現(xiàn)批量監(jiān)控網(wǎng)站

    python實(shí)現(xiàn)批量監(jiān)控網(wǎng)站

    本文給大家分享的是一個(gè)非常實(shí)用的,python實(shí)現(xiàn)多網(wǎng)站的可用性監(jiān)控的腳本,并附上核心點(diǎn)解釋,有相同需求的小伙伴可以參考下
    2016-09-09
  • Python基于PycURL實(shí)現(xiàn)POST的方法

    Python基于PycURL實(shí)現(xiàn)POST的方法

    這篇文章主要介紹了Python基于PycURL實(shí)現(xiàn)POST的方法,涉及Python實(shí)現(xiàn)curl傳遞post數(shù)據(jù)的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-07-07
  • 完美解決matplotlib子圖坐標(biāo)軸重疊問題

    完美解決matplotlib子圖坐標(biāo)軸重疊問題

    這篇文章主要介紹了完美解決matplotlib子圖坐標(biāo)軸重疊問題,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04

最新評論

孝昌县| 兴海县| 梅河口市| 武冈市| 刚察县| 安福县| 班玛县| 寻甸| 邹平县| 卢氏县| 海宁市| 灵宝市| 临夏市| 重庆市| 堆龙德庆县| 阿巴嘎旗| 宝清县| 驻马店市| 溆浦县| 涞源县| 故城县| 通州市| 怀宁县| 福建省| 蓝山县| 龙江县| 永寿县| 临澧县| 毕节市| 三台县| 准格尔旗| 清涧县| 隆德县| 武邑县| 汉中市| 金华市| 新兴县| 新化县| 扬中市| 正镶白旗| 兴业县|