Leftist Heap

Leftist Heap

วิธีการนับ null path length (npl) ก็คือ โหนดไหนไม่มีลูก หรือ มีลูกแค่ 1 ตัว เราให้ npl = 0 ส่วนโหนดมีลูกครบ 2 ตัว เราให้ npl = 1 ตัวอย่างการหาค่า npl ของ Heap ต่อไปนี้
เมื่อนับค่า npl ได้แล้ว เราจะตัดสินใจว่า Heap ไหนเป็น Leftist Heap โดยใช้กฏว่า ทุกๆโหนดใน Heap ลูกด้านซ้ายต้องมีค่า npl มากกว่าหรือเท่ากับ ลูกด้านขวาเสมอ ถ้ามีโหนดใน Heap ฝืนกฏนี้ถือว่า Heap นั้นทั้งตัวไม่เป็น Leftist Heap
ตัวอย่างของ Heap ที่เป็น Leftist และที่ไม่เป็น ดังภาพต่อไปนี้
ในภาพข้างบนนี้เป็น Leftist Heap เนื่องจากทุกๆโหนดใน Heap มีค่า npl ของลูกด้านซ้ายมากกว่าหรือเท่ากับลูกด้านขวาทั้งหมด (คือไม่ 1-0 ก็ 0-0 ถือว่าใช้ได้ แต่ถ้าเจอ 0-1 ถือว่าผิดกฏ)
ภาพนี้ Heap ไม่เป็น Leftist เพราะมีโหนดที่ฝืนกฏ โดยมี npl ของลูกด้านซ้ายเป็น 0 และ npl ลูกด้านขวาเป็น 1 ดังนั้นทั้ง Heap นี้ไม่เป็น Leftist

Merge Leftist Heap

เนื่องจาก Leftist Heap ทำมาไว้เพื่อให้การจับ Heap 2 ตัวมารวมกัน ทำได้ง่าย โดยใช้หลักการดังนี้
สมมุติว่ามี Leftist Heap 2 ตัว คือ H1 และ H2
o    ให้ Root ของ H1 น้อย Root ของ H2
o    ค้นเข้าไปใน H1 ด้านขวา หาว่ามีโหนดไหนที่มากกว่า Root ของ H2
o    หยิบโหนดที่มากกว่านั้นทั้งยวง (ทั้ง subtree) มาต่อเป็นลูกขวาของ H2
o    เอา H2 ไปต่อเป็นลูกด้านขวาของ H1
o    สลับลูกของ H1 ซ้ายไปอยู่ขวา และ ขวามาอยู่ซ้าย
o    จะได้ต้น H1 ที่เป็น Leftist และ Merge เข้ากับ H2 แล้ว
ตัวอย่างเช่นถ้าเรามี H1 กับ H2 เป็น Leftist Heap ดังภาพต่อไปนี้
สแกนด้านขวาของ H1 พบว่า 8 มีค่ามากกว่า 6 ดังนั้นหยุดไว้ที่ 8 ดังนี้
สแกนด้านขวาของ H2 พบว่า 7 มีลูกทั้ง 2 ตัวที่มากกว่า 8 ดังนั้นหยุดไว้ที่ 7 ดังนี้
นำลูกด้านขวาของ 7 ไปต่อเป็นลูกด้านขวาของ 8 ดังนี้
นำลูกด้านซ้ายของ 7 สลับมาเป็นลูกด้านขวา
นำโหนด 8 ที่หยุดไว้ที่ H1 ยกมาทั้งยวง มาเป็นลูกด้านขวาของ 7 ดังนี้
นำโหนด 6 (คือต้น H2 ทั้งต้น) ไปเป็นลูกด้านขวาของต้น H1 ดังนี้
เมื่อตรวจสอบจะพบว่าตอนนี้ ต้นที่รวมเข้าด้วยกันไม่เป็น Leftist แล้วเนื่องจากขวาหนักกว่าซ้าย ดังนั้น เราจะสลับแขนขวา และ แขนซ้าย สับเปลี่ยนกัน จะทำให้กลายเป็น Leftist เหมือนเดิมดังนี้
เมื่อสับเปลี่ยน ซ้าย-ขวา เรียบร้อยแล้ว ตรวจสอบอีกครั้งว่ายังคงมีสภาพเป็น Leftist Heap หรือไม่
ซึ่งพบว่ายังเป็น Leftist อยู่ และเราจะได้ต้น Heap ที่รวมระหว่าง H1 กับ H2

ความคิดเห็น

โพสต์ยอดนิยมจากบล็อกนี้

การจัดเรียงแบบ Quick Sort

กราฟอัลกอริธึม

Huffman's Code