WATTANAPONG SUTTAPAK SOFTWARE ENGINEERING, SCHOOL OF INFORMATION COMMUNICATION TECHNOLOGY, UNIVERSITY OF PHAYAO Chapter 9 Heap and Hash 1
จุดประสงค์บทเรียนที่ 9 2 มีความรู้ความเข้าใจเรื่อง Priority Queue มีความรู้ความเข้าใจเรื่อง Heap และคุณสมบัติของ Heap สามารถเพิ่ม ลบ ข้อมูล Heap ได้ สามารถแปลง binary tree ไปเป็น heap ได้ มีความรู้ความเข้าใจเรื่อง hash สามารถแก้ปัญหาการชนอินเด็กซ์ของ hash
Priority Queue 3 ตัวอย่างการเข้าคิวโรงพยาบาล ตามลำดับการรับคิว กรณีฉุกเฉินให้ความสำคัญก่อนคิวตามลำดับ ตัวอย่างเครื่องพิมพ์(printer) ตามลำดับคำสั่งก่อนหลัง ให้ความสำคัญกับคิวที่กำหนดความสำคัญ(priority)สูงกว่า
Priority Queue 4 Time Complexity MethodUnsorted ListSorted List size,isEmptyO(1) insertO(1)O(n) min,removeMinO(n)O(1)
Heap 5 efficient realization of priority queue from heap heap is binary tree The relational property of heap Heap-Order Property : Heap-Order Property : every node v > v’s parent(min heap) : or every node v < v’s parent(max heap)
Heap 6 efficient realization of priority queue from heap heap is binary tree The relational property of heap Complete Binary Tree: let h be the height of the heap for i = 0, …, h -1,there are 2 i nodes of depth i at depth h -1, the internal nodes are to the left of the external nodes
Heap 7 Complete Binary Tree: let h be the height of the heap for i = 0, …, h -1,there are 2 i nodes of depth i at depth h -1, the internal nodes are to the left of the external nodes depth
Heap 8 Heap-Order Property : every node v > v’s parent(min heap) Complete Binary Tree Property : heap is complete binary tree if 2 h-1 <= nodes <= 2 h -1 and fully node in h <=5<=74<=6<=7
Heap <=7<=7 4<=4< <7<8
function perculateDown(a,i) if a[i].data < a[i].L swap(a[i],a[i].L) a = perculateDown(a,indexof(a[i].L) ) end if if a[i].data <a[i].R swap(a[i],a[i].R) a = perculateDown(a,indexof(a[i].L) ) end if return a; end function Heap Restructuring 10 perculate Down Algorithm for i=n/2 to 1 a = perculateDown(a,i); end for n = 9 i = 4
function perculateDown(a,i) if a[i].data < a[i].L swap(a[i],a[i].L) a = perculateDown(a,indexof(a[i].L) ) end if if a[i].data <a[i].R swap(a[i],a[i].R) a = perculateDown(a,indexof(a[i].L) ) end if return a; end function Heap Restructuring 11 perculate Down Algorithm for i=n/2 to 1 a = perculateDown(a,i); end for i =
function perculateDown(a,i) if a[i].data < a[i].L swap(a[i],a[i].L) a = perculateDown(a,indexof(a[i].L) ) end if if a[i].data <a[i].R swap(a[i],a[i].R) a = perculateDown(a,indexof(a[i].L) ) end if return a; end function Heap Restructuring 12 perculate Down Algorithm for i=n/2 to 1 a = perculateDown(a,i); end for i =
function perculateDown(a,i) if a[i].data < a[i].L swap(a[i],a[i].L) a = perculateDown(a,indexof(a[i].L) ) end if if a[i].data <a[i].R swap(a[i],a[i].R) a = perculateDown(a,indexof(a[i].L) ) end if return a; end function Heap Restructuring 13 perculate Down Algorithm for i=n/2 to 1 a = perculateDown(a,i); end for i =
function perculateDown(a,i) if a[i].data < a[i].L swap(a[i],a[i].L) a = perculateDown(a,indexof(a[i].L) ) end if if a[i].data <a[i].R swap(a[i],a[i].R) a = perculateDown(a,indexof(a[i].L) ) end if return a; end function Heap Restructuring 14 perculate Down Algorithm for i=n/2 to 1 a = perculateDown(a,i); end for i =
function perculateDown(a,i) if a[i].data < a[i].L swap(a[i],a[i].L) a = perculateDown(a,indexof(a[i].L) ) end if if a[i].data <a[i].R swap(a[i],a[i].R) a = perculateDown(a,indexof(a[i].L) ) end if return a; end function Heap Restructuring 15 perculate Down Algorithm for i=n/2 to 1 a = perculateDown(a,i); end for i =
function perculateDown(a,i) if a[i].data < a[i].L swap(a[i],a[i].L) a = perculateDown(a,indexof(a[i].L) ) end if if a[i].data <a[i].R swap(a[i],a[i].R) a = perculateDown(a,indexof(a[i].L) ) end if return a; end function Heap Restructuring 16 perculate Down Algorithm for i=n/2 to 1 a = perculateDown(a,i); end for i =
function perculateDown(a,i) if a[i].data < a[i].L swap(a[i],a[i].L) a = perculateDown(a,indexof(a[i].L) ) end if if a[i].data <a[i].R swap(a[i],a[i].R) a = perculateDown(a,indexof(a[i].L) ) end if return a; end function Heap Restructuring 17 perculate Down Algorithm for i=n/2 to 1 a = perculateDown(a,i); end for i =
function perculateDown(a,i) if a[i].data < a[i].L swap(a[i],a[i].L) a = perculateDown(a,indexof(a[i].L) ) end if if a[i].data <a[i].R swap(a[i],a[i].R) a = perculateDown(a,indexof(a[i].L) ) end if return a; end function Heap Restructuring 18 perculate Down Algorithm for i=n/2 to 1 a = perculateDown(a,i); end for binary tree min heap
Insert Heap insert 50 26
Insert Heap insert 60 26
Insert Heap จะเห็นว่า สามารถเพิ่มได้เลย Average Case O(1) 26 ยกเว้นกรณีที่ข้อมูลตัวใหม่น้อยกว่า root
Insert Heap insert 25
Insert Heap จากนั้นใช้ algorithm perculate down เพื่อย้าย 25 ขึ้นไปด้านบนสุด Worst Case O(log n)
Insert Heap กรณี average case ถ้ามีการ insert n โหนด แต่ละโหนดมากกว่าหรือเท่ากับ root BigO คือ O(n) กรณี worst case ถ้ามีการ insert n โหนด แต่ละโหนดน้อยกว่า root BigO คือ O(n log n)
Remove Heap การลบโหนดใน Heap สามารถลบได้เฉพาะโหนด root เท่านั้น
Remove Heap การลบโหนดใน Heap สามารถลบได้เฉพาะโหนด root เท่านั้น จากนั้นแทนที่ด้วยโหนดสุดท้าย นั่นคือ โหนดเลเวลต่ำสุดขวาสุด
Remove Heap การลบโหนดใน Heap สามารถลบได้เฉพาะโหนด root เท่านั้น จากนั้นแทนที่ด้วยโหนดสุดท้าย นั่นคือ โหนดเลเวลต่ำสุดขวาสุด ทำการปรับโครงสร้างโดยใช้ perculate down algorithm
Remove Heap การลบโหนดใน Heap สามารถลบได้เฉพาะโหนด root เท่านั้น จากนั้นแทนที่ด้วยโหนดสุดท้าย นั่นคือ โหนดเลเวลต่ำสุดขวาสุด ทำการปรับโครงสร้างโดยใช้ perculate down algorithm
Heap 29 Time Complexity MethodAverage CaseWorst Case minO(1) insertO(1)O(log n) removeO(log n) build heapO(n)O(n log n)
30 Hash
31 การค้นหา O(log n) โดยไม่จำเป็นต้องเรียงลำดับข้อมูล ใช้การแปลงค่าข้อมูลด้วย Hash Function เพื่อแปลงข้อมูลเป็นแอดเดรส Hash Function ตัวอย่าง H(x) = x mod R x เป็นข้อมูลหรือค่าของคีย์ที่ต้องการแปลงเป็นแอดเดรส R เป็นตัวหารและเป็นขนาดของตารางแฮช(จำนวนเฉพาะ) H(x) เป็นข้อมูลที่ถูกแปลง
Hash 32 ตัวอย่าง hash table เท่ากับ 11 โดยมีข้อมูลเป็น valuehash value( mod 11 ) indexvalue
Hash 33 key collision valuehash value( mod 11 ) indexvalue ,
Hash 34 key collision Open Hashing(separate Chaining) Closed Hashing(Open Addressing) Linear Probing หาที่ว่างแอดเดรสใหม่ Double Hashing เพิ่มตารางใหม่
Open Hashing 35 เป็นวิธีที่นิยมใช้ ถ้าค่าซ้ำให้เก็บเป็น list ตัวต่อไป valuehash value( mod 10) indexvalue
Linear Hashing 36 ถ้าค่าซ้ำให้หา index ตัวต่อไปที่ว่าง แล้วแทนที่ลงไป valuehash value( mod 10) indexvalue indexvalue
Linear Hashing 37 ถ้าค่าซ้ำให้ใช้ค่า index = hash + double hash valuehash value( mod 10)double(7 – value mod 7)index indexvalue