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

คิว Heap (หรือ heapq) ใน Python คืออะไร


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

สร้างฮีป

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

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

การสร้างฮีป

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

ตัวอย่าง

import heapq

H = [21,1,45,78,3,5]
# Use heapify to rearrange the elements
heapq.heapify(H)
print(H)

ผลลัพธ์

เมื่อโค้ดด้านบนถูกรัน มันจะให้ผลลัพธ์ดังต่อไปนี้ -

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

การแทรกลงในฮีป

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

ตัวอย่าง

import heapq
H = [21,1,45,78,3,5]
# Covert to a heap
heapq.heapify(H)
print(H)
# Add element
heapq.heappush(H,8)
print(H)

ผลลัพธ์

เมื่อโค้ดด้านบนถูกรัน มันจะให้ผลลัพธ์ดังต่อไปนี้ -

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

การนำออกจากฮีป

คุณสามารถลบองค์ประกอบที่ดัชนีแรกได้โดยใช้ฟังก์ชันนี้ ในตัวอย่างด้านล่าง ฟังก์ชันจะลบองค์ประกอบที่ตำแหน่งดัชนี 1 เสมอ

ตัวอย่าง

import heapq

H = [21,1,45,78,3,5]
# Create the heap

heapq.heapify(H)
print(H)

# Remove element from the heap
heapq.heappop(H)

print(H)

ผลลัพธ์

เมื่อโค้ดด้านบนถูกรัน มันจะให้ผลลัพธ์ดังต่อไปนี้ -

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

การแทนที่ในกอง

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

ตัวอย่าง

import heapq

H = [21,1,45,78,3,5]
# Create the heap

heapq.heapify(H)
print(H)

# Replace an element
heapq.heapreplace(H,6)
print(H)

ผลลัพธ์

เมื่อโค้ดด้านบนถูกรัน มันจะให้ผลลัพธ์ดังต่อไปนี้ -

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