Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

Heap Queue (heapq) ใน Python คืออะไร?

Heap queue (คิวแบบฮีป) เป็นโครงสร้างข้อมูลต้นไม้พิเศษที่แต่ละโหนดผู้ปกครองมีค่าน้อยกว่าหรือเท่ากับโหนดลูกของมัน ใน Python ถูกนำไปใช้ผ่านโมดูล heapq โครงสร้างนี้มีประโยชน์มากสำหรับการสร้าง Priority Queue (คิวลำดับความสำคัญ) ที่รายการที่มีน้ำหนักสูงกว่าจะได้รับการประมวลผลก่อน

การสร้างฮีป (Create a Heap)

ฮีปคิวถูกสร้างโดยใช้ไลบรารีที่มาพร้อมกับ Python ชื่อ heapq ไลบรารีนี้มีฟังก์ชันต่างๆ สำหรับจัดการโครงสร้างข้อมูลฮีป ดังนี้:

  • heapify – แปลงลิสต์ทั่วไปให้กลายเป็นฮีป ในฮีปที่ได้ โหนดที่มีค่าน้อยที่สุดจะถูกวางที่ตำแหน่งดัชนี 0 ส่วนข้อมูลอื่นๆ ไม่ได้เรียงลำดับจำเป็น
  • heappush – เพิ่มองค์ประกอบเข้าไปในฮีปโดยไม่เปลี่ยนแปลงโครงสร้างฮีปปัจจุบัน
  • heappop – นำค่าที่น้อยที่สุดออกจากฮีปและคืนค่ากลับมา
  • heapreplace – แทนที่ค่าที่น้อยที่สุดด้วยค่าใหม่ที่ระบุ

ตัวอย่างการสร้างฮีป

ฮีปถูกสร้างโดยการนำลิสต์องค์ประกอบมาผ่านฟังก์ชัน heapify ซึ่งจะจัดเรียงใหม่โดยนำค่าที่น้อยที่สุดไปวางที่ตำแหน่งแรก

โค้ดตัวอย่าง

import heapq
H = [21, 1, 45, 78, 3, 5]
# ใช้ heapify จัดเรียงองค์ประกอบ
heapq.heapify(H)
print(H)

ผลลัพธ์

[1, 3, 5, 78, 21, 45]

การเพิ่มข้อมูลเข้าไปในฮีป (Inserting into Heap)

การเพิ่มข้อมูลจะวางองค์ประกอบใหม่ที่ตำแหน่งสุดท้ายของลิสต์ แต่สามารถใช้ heapify อีกครั้งเพื่อย้ายค่านั้นไปตำแหน่งแรกได้ หากค่านั้นน้อยที่สุด

โค้ดตัวอย่าง

import heapq
H = [21, 1, 45, 78, 3, 5]
heapq.heapify(H)
print(H)
# เพิ่มค่า 8
heapq.heappush(H, 8)
print(H)

ผลลัพธ์

[1, 3, 5, 78, 21, 45]
[1, 3, 5, 78, 21, 45, 8]

การนำข้อมูลออกจากฮีป (Removing from Heap)

ใช้ heappop เพื่อนำองค์ประกอบที่อยู่ตำแหน่งแรก (ค่าน้อยที่สุด) ออกจากฮีป

โค้ดตัวอย่าง

import heapq
H = [21, 1, 45, 78, 3, 5]
heapq.heapify(H)
print(H)
heapq.heappop(H)
print(H)

ผลลัพธ์

[1, 3, 5, 78, 21, 45]
[3, 21, 5, 78, 45]

การแทนที่ค่าในฮีป (Replacing in a Heap)

ฟังก์ชัน heapreplace จะนำค่าที่น้อยที่สุดออกและแทรกค่าใหม่เข้าไปในตำแหน่งที่เหมาะสมตามกฎฮีป

โค้ดตัวอย่าง

import heapq
H = [21, 1, 45, 78, 3, 5]
heapq.heapify(H)
print(H)
heapq.heapreplace(H, 6)
print(H)

ผลลัพธ์

[1, 3, 5, 78, 21, 45]
[3, 6, 5, 78, 21, 45]