c15105754a98185a72843c8197fa0b46.ppt
- Количество слайдов: 82
คออะไร ? คอ queue ท access element ตามความสำคญของตว element นน n เชนคนปวยขาหกกบหลงห ก ถงคนหลงหกมาทหลงกค n
Priority โดยทวไป คานอยถอวาสำคญกวาคา มาก (ม priority สงกวานนเอง ( n ถาสองตวมคาเทากน กนาจะใหตวทอยในควม านานกวาไดไป n การเปรยบเทยบคา เราใช n
Comparator interface n เหมอน Comparable เพยงแตม int compare(Object o 1, Object o 2) ตองเปน class เดยวกน หรอ เปน subclass กน ไม งน throw Cast. Exception
ตว interface // Postcondition: ร เทรน จำนวนสมาชกใน priority // Postcondition: ร เทรน true ถา prior queue น //ไม งน กร เทรน false // Postcondition: element จะถกเตมลงใน priority queue
// Precondition: ตองไมเปนควทวาง // No. Such. Element. Exception // Postcondition: ร เทร นออบเจคต ไม งน จะ throw ตวทสำคญทสดใน // Precondition: ตองไมเปนควทวาง ไม งน จะ throw // No. Such. Element. Exception // Postcondition: เอาออบเจคต ตวทสำคญทสดใน Priority. Queue น // ออกจากควและร เทร นออบเจคต นเปนคำตอบขอ งเมธอดดวย
วธการ implement มหลายวธ ใชควธรรมดา จะไมได prioriry n อารเรยของคว กไมไดเพราะ priority อาจเยอะมาก n ใช Array. List เรยงสมาชก n n n จะเปน constant time add กบ remove. Min จะใช linear time ซงยงชาไป get. Min
วธการ (ตอ ( n implement ใช Linked. List get. Min กบ remove. Min เปน constant time n add จะเปน linear time n n Ok รบได ลองทำด
ใช Comparable โดย default
ทำไม ?
ทำไมตอง previous? ถาเราม 1, 2, 4, 5 และตองการ add 3 n Loop จะหยดเมอ itr. next() เปน 4 n แตตว iterator ไดเลอนไปท 5 ซะแลว n
protected int compare (Object elem 1, Object elem 2) { return (comparator==null ? ((Comparable)elem 1). compare. To(elem 2) : comparator. compare (elem 1, elem 2)); } // method compare ถา comparator = null, return elem 1. compare. To (elem 2); ถาไม elem 2); งน return comparator. compare (elem 1,
คราวนใชเซตบาง n ดแผนถดไป
public void add (Object element) { set. add (element); } // method add public Object get. Min ( ) { return set. first( ); } // method get. Min public Object remove. Min ( ) { Object temp = set. first( ); set. remove (set. first( )); return temp; } // method remove. Min ทง 3 method นม worst. Time(n) เปน LOGARITHMIC ของ n.
อก วธนง คราวนใช Heap ppublic class Heap implements Priority. Queue { ยงไมอยใน JA COLLECTIONS FRAMEWORK
Complete Binary tree ยงจำไดหรอไม
Heap tree คอ complete binary ซงเปน empty tree หรอ n สมาชกใน root มคานอยทสด (เรยกวา min. Heap) และ n left กบ right subtree กเปน heap ดวย n )ไมใช binary search tree n
Complete binary tree เอาใสอารเรยได 26 40 31 48 50 85 36 107 48 55 57 88 งายตอการหา child, parent
กอนอนดการใช Heap priority( (GPA นอยสดถอวา highest
// ม constructor ทรบ string เปน input และกมเมธอด to. String ดวย เวลาทำอยาลม // Postcondition: ร เทรน จำนวนเตมท < 0, = 0, หรอ > 0 ขนอยกบวา GPA ของ //this Student ออบเจคต นนนอยกวา เทากน หรอมากกวา GPA ของ o 1
คราวนด Heap เลย
index ของลกไดแบบน
index ของพอไดแบบน
ด method ใน Heap
// Postcondition: element ถาเตมอารเรย ถกเตมเปนสมาชกของ heap กขยาย ขนกบเวลา percolate. Up //เวลา worst case = O(n) // สวนเวลาเฉลยเปนคาคงท //เตมลงไปทายอารเรย //แลวคอยปรบเลอนตำแหน งขนมา
สมมตวาเราจะเต ม 30 ลงไป 30
Percolate up คอ. . . สลบท 30 กบพอของเขาเร อยๆจนกวาตวพอ จะนอยกวา
// Postcondition: จด heap โดยเลอนตวทายสดขนตนไม protected void percolate. Up() { เวลาทแยทสดจะเปน //O(log n ( int parent; สวนเวลาเฉลยจะเปนคาคงท ความสงของตนไม int child = size-1; เพราะเวลาแยสดเก Object temp; while (child>0) { ดตอนทตองเลอ parent = (child-1)/2; นจนถงยอด if(compare(heap[parent], heap[child]) <=0) break; temp = heap[parent]; heap[parent] = heap[child]; heap[child] = temp; child = parent; } // while } // method percolate. Up
Average time -percolate. Up กตองใหครงหนงของ สมาชกทงหมดมคามากก วาตวใหม n แตครงทมากกเปนใบ แนๆ n ฉะนนในการสลบทขน n
public Object get. Min() { if (size == 0) throw new No. Such. Element. Exception(“Empty”); return heap[0]; } // method get. Min
remove. Min() ถาไมระวง 4 4 5 8 5 6 6 เสยความเปน binary tree งน 8 ทำไงด complete ? ?
// Precondition: ตองไมเปนควทวาง ไม งน จะ throw // No. Such. Element. Exception // Postcondition: percolate. Down เอาออบเจคต ตวทสำคญทสดใน ขนกบ Priority. Queue น // ออกจากควและร เทร นออบเจคต นเปนคำตอบขอ งเมธอดดวย //เวลาทแยทสดจะเปน O(log n( //เอาทายอารเรยใสท root //แลวคอยปรบเลอนต ำแหนง
26 30 31 32 50 85 36 107 48 เมอ remove. Min( ) ถกเรยก 48 จะถกสลบกบ 26 สวน size กจะถกลดไปหนง
Percolate. Down คอ สลบ 48 กบลกทนอยท สด ทำจนกวาจะสลบไม
// Postcondition: จด heap โดยเลอนตวบนสดลงตนไม //เวลาทแยทสด และเวลาเฉลยจะเปน O(log n (ทงค protected void percolate. Down(int start) { int parent = start; ตอนแรกให childเปนลกซายไวกอน int child = 2*parent+1; หามเปนตวสดทาย Object temp; เพราะจะไมมพนองทางขวาใหเท while (child<size) { ยบ if(child<size-1&&compare(heap[child], heap[child+1]) >0) กปรบ child child; ++ ถาลกขวานอยกวา ใหเปนลกขวา if (compare(heap[parent], heap[child]) <=0( break; temp = heap[child]; heap[child] = heap[parent]; heap[parent] = temp; parent = child; child= 2*parent+1; } // while } // method percolate. Down
ลองทำด
มาดปญหา จะ compress file โดยไมใหเสยขอมลไปเลยได อยางไร n ให M เปน ขอมลทเราตองการ compress สมมตวามนมขนาด 100000 character โดยประกอบไปดวย a n
มาดปญหา (ตอ ( n n n โดยปกต 1 character จะใช 16 bit ฉะนน 100000 character -_-’’ กคณเขา ไปด ตองหาทางลดจำนวน bit
ลองทำด จำนวน bit กจะเหลอ 3 แสน
ลดไดอกไหม ? จำนวน bit กจะนอยกวา แต 001010 อาจเปนไดทง aababa หรอ cbda กได 3
แลวจะใหไมมว ไดไง ใช prefix-free encoding n โดยสราง binary tree n กงซายถอเปน 0 n กงขวาถอเปน 1 n ให character อยทใบ n
จะไมม character ทอย path เดยวกนจากราก a = 010 b = 11 c = 00 d = 10 e = 011
ทำไดอกแบบ นะเนย แลวแบบไหนด ? ขนกบวา character นนเกดบอยไหม bit เยอะไมควรเกดบอย
สราง Huffman tree ซงกคอ binary tree ของรหสนแหละ แตวาสรางโดยดจากความถ ในการเกดของแตละ character n เพอใหตวอกษรทมคว ามถมากในขอความของเรา ใชจำนวน bit นอยทสด n
สมมตมความถแบบน n n n aม bม cม dม eม 5000 10000 20000 31000 34000
เอาค (character, ความถ )ใส Priority Q ทใช ใหถอวาความถตำอยบนสด n แตละ node ของ priority Q กม left, right, parent ของมนเอง n ตอนแรก ควของเราจะเปน (a: 5000) (b: 10000) (c: 20000) (d: 31000) (e: 34000( n ตอไป สราง Huffman tree ละ n
เอาสองตวทนอยสดออกจา กคว ตวแรกเอามาเปนกงซาย ตวทสองมาเปนกงขวา 15000 สวนผลบวกของความถเราเอา 0 1 มาเปนราก b a n จากนนกเอาผลใสกลบลงใ น priority Q ซงจะกลายเปน n : 15000) (c: 20000) (d: 31000) (e: (
n เอาสองตวทนอยสดออกจา กคว ทำเหมอนเดม 35000 0 1 1 c b a n เมอเอาตนไมนกลบเข า priority Q ตวควจะกลายเปน (d: 31000) (e: 34000) ( : 35000(
n เอาสองตวทนอยสดออกจา กคว ทำเหมอนเดม 65000 0 1 e d n นกลายเปนอก tree หนงเลย n เมอเอาตนไมนกลบเข า priority Q ตวควจะกลายเปน
n เอาสองตวสดทายออกจากคว ทำเหมอนเดม 100000 0 1 35000 0 1 15000 c 0 1 a b n 65000 0 1 d e priority Q จะกลายเปน 100000( (:
ลองทำด
Huffman เปน Greedy Algorithm เราเลอกสงทดทส ดในระบบยอย ในทนคอเอา min ออกจาก tree • มผลตอระบบใหญ ทำใหได optimal solution ไปดวย •
Huffman class จะเปลยน input ทไดใหเปนรหส Huffman n กอนอนด Entry กอนละกน n
ตอไปกทำอารเรยของใบ เพอให access ไดเรว
ตวอยางเชน นคอหนง c ม in
// Postcondition: ‘This’ Huffman object ถก initialize // Postcondition: ไฟล ทถกกำหนดโดย s ถกจดการเรย // Postcondition: priority queue ถกสรางจากขอมลของ input //file โดยเวลาworst case = O(n(
// Postcondition: สราง huffman tree เวลา worst case นนค // Postcondition: คำนวณ huffman code ของแตละตวอกษร //เวลา worst case นนคงท // Postcondition: Huffman codesและขอความทแปลงแลวถกจ // เวลา worst case นน = O (n).
Fields ใน Huffman class n n n Gui priority queue file reader file writer input file name เกบเพอใหเปดไฟลได ท n n n คำนวณความถ encode ตวขอมล boolean บอกวากำลงอานไฟลไหนอย 2
Method process. Input สราง priority Q n สราง Huffman tree n สรางตวรหส n เกบรหสและตวขอความท แปลงแลวลงไฟล n
Method create. PQ สราง leaf. Entries n update freq field ของแตละ Entry n หลงจากนนกสราง priority queue จากการด freq n
Method create. Huffman. Tree Loop จนกวา size ของ priority queue จะเหลอ 1 n ทำเหมอนทบอกไปแลว เปะๆ n
Method calculate. Huffman. Codes Loop บน leaf. Entries n แตละ Entry นน n มตวแปรซงเปน empty string nด parent แลว เตมเลขทกำกบ parent ลงไปขางหนาของ string เรอยๆ (ภาษาองกฤษเรยก prepend) ไลดไปจนถง root n
ตวอยางการสรางรหส ถามตนไม แบบซายมอน ดหนาถดไป
รหสของ f ลปบนทกยอนจากใบ ตนไม f มคา int เปน 102 ดงนนเราจง set คา leaf. Entries[102]. code = “ 1010 ; ”
Method save. To. File n Loop บน leaf. Entries n n สง character กบ code ของมนไปทไฟล แลวกอาน n input file อกท รหสของ input จะถกสรางขน ไวในไฟล และ save
ด web เพมได
ถาม output file มา ลองสราง Huffman tree ดและบอกขอความทแทจรง
จบเรอง priority queue
c15105754a98185a72843c8197fa0b46.ppt