You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
hello-algo/zh-hant/codes/python/chapter_heap/heap.py

72 lines
1.9 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

"""
File: heap.py
Created Time: 2023-02-23
Author: krahets (krahets@163.com)
"""
import sys
from pathlib import Path
sys.path.append(str(Path(__file__).parent.parent))
from modules import print_heap
import heapq
def test_push(heap: list, val: int, flag: int = 1):
heapq.heappush(heap, flag * val) # 元素入堆積
print(f"\n元素 {val} 入堆積後")
print_heap([flag * val for val in heap])
def test_pop(heap: list, flag: int = 1):
val = flag * heapq.heappop(heap) # 堆積頂元素出堆積
print(f"\n堆積頂元素 {val} 出堆積後")
print_heap([flag * val for val in heap])
"""Driver Code"""
if __name__ == "__main__":
# 初始化小頂堆積
min_heap, flag = [], 1
# 初始化大頂堆積
max_heap, flag = [], -1
print("\n以下測試樣例為大頂堆積")
# Python 的 heapq 模組預設實現小頂堆積
# 考慮將“元素取負”後再入堆積,這樣就可以將大小關係顛倒,從而實現大頂堆積
# 在本示例中flag = 1 時對應小頂堆積flag = -1 時對應大頂堆積
# 元素入堆積
test_push(max_heap, 1, flag)
test_push(max_heap, 3, flag)
test_push(max_heap, 2, flag)
test_push(max_heap, 5, flag)
test_push(max_heap, 4, flag)
# 獲取堆積頂元素
peek: int = flag * max_heap[0]
print(f"\n堆積頂元素為 {peek}")
# 堆積頂元素出堆積
test_pop(max_heap, flag)
test_pop(max_heap, flag)
test_pop(max_heap, flag)
test_pop(max_heap, flag)
test_pop(max_heap, flag)
# 獲取堆積大小
size: int = len(max_heap)
print(f"\n堆積元素數量為 {size}")
# 判斷堆積是否為空
is_empty: bool = not max_heap
print(f"\n堆積是否為空 {is_empty}")
# 輸入串列並建堆積
# 時間複雜度為 O(n) ,而非 O(nlogn)
min_heap = [1, 3, 2, 5, 4]
heapq.heapify(min_heap)
print("\n輸入串列並建立小頂堆積後")
print_heap(min_heap)