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

Python heapq堆操作全解析

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

1. heapq 庫概述

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

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

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

函數(shù)名功能描述時間復(fù)雜度使用場景
heapify(x)將列表 x 轉(zhuǎn)換為堆結(jié)構(gòu)O(n)列表初始化堆
heappush(heap, item)向堆中插入新元素O(log n)動態(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ù)名功能描述時間復(fù)雜度適用場景
nlargest(n, iterable)返回前n個最大元素O(n log k)Top-K 最大元素
nsmallest(n, iterable)返回前n個最小元素O(n log k)Top-K 最小元素

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

import heapq
import random

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

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

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

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

2.3 高級操作函數(shù)

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

import heapq

# 合并多個有序序列
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. 實戰(zhàn)應(yīng)用場景

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

import heapq

class PriorityQueue:
    def __init__(self):
        self._heap = []
        self._index = 0  # 用于處理優(yōu)先級相同的情況
    
    def push(self, item, priority):
        """添加元素到優(yōu)先級隊列"""
        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)先級隊列為空")
    
    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ù)據(jù)流的中位數(shù)查找

import heapq

class MedianFinder:
    def __init__(self):
        # 最大堆(使用負數(shù)模擬)和最小堆
        self.max_heap = []  # 存儲較小的一半
        self.min_heap = []  # 存儲較大的一半
    
    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)
        
        # 平衡兩個堆
        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"當前中位數(shù): {finder.find_median()}")

3.3 堆排序算法

import heapq

def heap_sort(iterable):
    """使用堆排序算法對可迭代對象進行排序"""
    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 實現(xiàn)最大堆

由于 heapq 默認實現(xiàn)的是最小堆,可以通過存儲負值來模擬最大堆:

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)先級時持續(xù)時間短的在前
        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. 性能對比與最佳實踐

5.1 不同場景下的性能選擇

操作場景推薦方法時間復(fù)雜度優(yōu)勢
一次性獲取Top-Knlargest()/nsmallest()O(n log k)代碼簡潔
持續(xù)插入和彈出heappush() + heappop()O(log n)動態(tài)高效
多個有序序列合并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ù)流,只維護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è)計等多個領(lǐng)域發(fā)揮著重要作用。掌握這些函數(shù)的正確使用方法和適用場景,能夠顯著提升程序的性能和代碼的可維護性。

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

相關(guān)文章

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

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

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

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

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

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

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

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

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

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

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

    python調(diào)用fortran模塊

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

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

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

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

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

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

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

    完美解決matplotlib子圖坐標軸重疊問題

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

最新評論

田阳县| 柳江县| 开江县| 八宿县| 芮城县| 长治县| 本溪市| 阿巴嘎旗| 凤阳县| 定远县| 九台市| 定兴县| 海兴县| 疏勒县| 三原县| 壤塘县| 衡山县| 额济纳旗| 亳州市| 北票市| 东光县| 璧山县| 无为县| 清水县| 宁远县| 隆化县| 常德市| 本溪| 九龙坡区| 盖州市| 西林县| 肃南| 乳山市| 兴隆县| 平阳县| 永仁县| 福清市| 勃利县| 灵山县| 新和县| 敖汉旗|