You are on page 1of 7

Heap Applications

 คิวลําดับความสําคัญ (Priority Queue)


o ดํ า เนิ น การเพิ่ ม /ลบข้ อ มู ล ในคิ ว ลํ า ดั บ ความสํ า คั ญ โดยใช้
HEAP APPLICATIONS ประโยชน์จากคุณสมบัติลําดับในฮีพ
02204231 Data Structures and Algorithms I  การจัดเรียงข้อมูล (Heap Sort)
o การจัดเรียงข้อมูล โดยใช้ประโยชน์จากคุณสมบัติลําดับในฮีพ
 การเข้ารหัสฮัฟฟ์แมน (Huffman coding)
o การประยุกต์ใช้ฮีพในการบีบอัดข้อมูล (data compression)
Computer Engineering, Kasetsart University Kamphaeng Sean Campus
2

Character Encoding Character Encoding


การเก็ บ ตั ว อั ก ษรในคอมพิ ว เตอร์ จะต้ อ งเข้ า รหั ส ตั ว อั ก ษรไปเป็ น  สมมุ ติ ว่ า ไฟล์ ที่ บั น ทึ ก และต้ อ งการส่ ง ผ่ า นเครื อ ข่ า ยมี จํ า นวน
เลขฐานสอง โดยการเข้ารหัสมาตรฐาน ได้แก่ ตัวอักษร 100,000 ตัวที่ ประกอบไปด้วยตัวอักษร a-e เท่านั้น
o ASCII code: 1 ตัวอักษร เข้ารหัสเป็นตัวเลขฐานสอง 8 บิต o การเก็บข้อมูลในไฟล์นี้ด้วย ASCII code คิดเป็นจํานวนบิต คือ
A  01000001
800,000 บิต (1 ตัวอักษร = 8 บิต)
a  01100001 เป็นการ
o Unicode (UTF-16) มีวิธีการลดจํานวน (1 char = 3 bit)
เข้ารหัสแบบ บิตของข้อมูลไหม??
Character Decimal Hex Bin
ความยาวคงที่ (บีบอัดฟล์) ดังนั้น จํานวนบิตที่ใช้จะลดลง
ก 3585 0E01 0000 1110 0000 0001
(Fix-length) เหลือ 300,000 บิต
3 4
Character Encoding Huffman Coding
 สมมุ ติ ว่ า ไฟล์ ที่ บั น ทึ ก และต้ อ งการส่ ง ผ่ า นเครื อ ข่ า ยมี จํ า นวน  รหัสฮัฟฟ์แมน เป็นรหัสแทนตัวอักษรที่แต่ละตัวอักษรมีความยาวของ
ตัวอักษร 100,000 ตัวที่ ประกอบไปด้วยตัวอักษร a-e เท่านั้น รหัสแตกต่างกัน (Variable length)
o หากลดจํานวนบิต ในการเข้ารหัสลงอีก เช่น o โดย ตัวอักษรที่ใช้บ่อยจะมีขนาดสั้น ตัวอักษรที่ใช้น้อย จะมีขนาดยาว
‘a’ 0 จะเห็นว่า จํานวนบิตที่ใช้จะลดลง ทั้งนี้เพื่อทําให้ข้อมูลมีขนาดเล็กลง ใช้ปริมาณพื้นที่เก็บข้อมูล
โดยรวมน้อยกว่าการเข้ารหัส
‘b’ 1 แต่อาจทําให้ถอดรหัสกลับมาไม่ถูกต้อง o การเข้ารหัสอาศัยต้นไม้ฮัฟฟ์แมน แบบคงที่
‘c’ 00
‘d’ 01 เช่น ข้อมูล 001010 สามารถเป็นได้ทั้ง (Huffman Tree) ในการแก้ปัญหาความหมายที่กาํ กวมของข้อมูล
‘e’ 10 aababa หรือ cbda
5 6

Huffman Coding Huffman Coding


Basic steps Example of Huffman Tree
1.0 โหนดก้าน (internal ตัวอักษร ความถี่
 อ่านข้อความและนับความถี่ของแต่ละตัวอักษรที่ปรากฎในข้อความ
node) แทนความถี่ a 0.05
0.35 0.65
 เรียงลําดับตัวอักษร ตามความถี่ในข้อความ (Number of occurrences) b 0.10
0.15 c d e c 0.20
 สร้างต้นไม้ฮัฟฟ์แมน ใช้ Priority Queue มาช่วย 0.20 0.31 0.34
a b d 0.31
 ท่องไปในต้นไม้ฮัฟฟ์แมน เพื่อกําหนดรหัสฮัฟฟ์แมนของแต่ละตัวอักษร
โหนดใบแทนตัวอักษรที่เข้ารหัส
0.05 0.10 e 0.34

 อ่านข้อความอีกครั้ง เพื่อเข้ารหัสตัวอักษรในข้อความตามรหัสฮัฟฟ์แมน
7 8
Huffman Coding Building a Huffman tree
A letter
Traversal of tree to determine all code words
 การสร้างต้นไม้ฮัฟฟ์แมน 7 freq
0
1.0
1
ท่องไปในต้นไม้ฮัฟฟ์แมน เพื่อกําหนดรหัสฮัฟฟ์แมน o Step 1: สร้างโหนดในต้นไม้ฮัฟฟ์แมน children
ของแต่ละตัวอักษร โดยกําหนดให้ กิ่งซ้ายมีค่า 0 แต่ละโหนดเก็บตัวอักษร และความถี่ของตัวอักษร(weight/frequency)
0.35 0.65
1 กิ่งขวามีค่า 1 o Step 2: เก็บโหนดทั้งหมดใน Priority Queue (สร้างโดยใช้ MinHeap)
0 1 0 ตัวอักษร ความถี่
0.15 c d e a 000 o Step 3: นําโหนดที่มีความถี่น้อยที่สุด 2 โหนด ออกจากคิว (Dequeue)
0 1
0.20 0.31 0.34 b 001 o Step 4: สร้างต้นไม้ย่อย โดยรวมโหนดทั้งสองเข้าด้วยกัน โหนดแม่เก็บค่าความถี่
a b รวมของโหนดทั้งสอง
0.05 0.10
Encode: “bead” c 01
d 10
o Step 5: นําต้นไม้ย่อยที่สร้างขึ้น ใส่กับเข้าไปในคิว (Enqueue)
 001 11 000 10
e 11 ทําซ้ํา step 3-5 ตราบเท่าที่จํานวนโหนดคิวมากกว่า 1
อัตราการบีบอัด: 10/(4*8) = 31.25%
9 10

Building a Huffman tree Building a Huffman tree


A letter  สร้างต้นไม้ย่อย โดยรวมโหนดทั้งสอง (Node 7 และ 9) เข้าด้วยกัน
 สร้างฮีพ MinHeap 7 7 freq -
children 16
9 11
 Enqueue ต้นไม้ย่อย (เพิ่มในฮีพ) 11
14 18 MinHeap A B 14 18
 Dequeue: ลบโหนดรากออกจากฮีพ (Node 7,9) 7 9
16
11 null null null null


9
A B
14 11 7 14 18 9
null null null null
18

11 12
Building a Huffman tree Building a Huffman tree
 Dequeue: ลบโหนดรากออกจากฮีพ (Node 11,14)  Dequeue: ลบโหนดรากออกจากฮีพ (Node 16,18)
14 -
25  สร้างต้นไม้ย่อย โดยรวมโหนดทั้ง -  สร้ า งต้ น ไม้ ย่ อ ย โดยรวมโหนดทั้ ง
16 18 34
สอง (Node 11 และ 14) เข้า สอง (Node 16 และ 18) เข้าด้วยกัน
C D
16
11 14 ด้วยกัน - E
 Enqueue ต้นไม้ย่อย (เพิ่มในฮีพ)
18 null null null null 16 18
null null
 Enqueue ต้นไม้ย่อย (เพิ่มในฮีพ)
16
A B
7 9
18 25 null null null null

13 14

Building a Huffman tree Building a Huffman tree


 Dequeue: ลบโหนดรากออกจากฮีพ (Node 25,34)
-  การสร้างต้นไม้ฮัฟฟ์แมน step 3-5
59  สร้ า งต้ น ไม้ ย่ อ ย โดยรวมโหนดทั้ ง
while (there are more than one tree in the priority queue) {
สอง (Node 25 และ 34) เข้าด้วยกัน Dequeue two trees t1 and t2;
- -
25 34 Create a tree t that contains t1 as its left subtree and t2 as its
 Enqueue ต้นไม้ย่อย (เพิ่มในฮีพ) right subtree;
C D 59
Set freq (t) = freq(t1) + freq(t2);
- E Enqueue insert t in its proper location in the priority queue;
11 14 16 18
nullnull nullnull }
null null
นําโหนดออกจากคิว จะได้
A B
7 9 ต้นไม้ฮัฟฟ์แมน
null null nullnull

15 16
Print code from Huffman tree Print code from Huffman tree
 การเข้ารหัสตัวอักษรจากต้นไม้ฮัฟฟ์แมน - printCodes(HeapNode t, array arr, top)
59 1. if t->left is not null
o ท่องไปในต้นไม้ จากโหนดราก จนถึงโหนดใบ 0 1
set arr[top]=0
- - printCodes(t->left, arr, top + 1)
o มีอาเรย์ใช้เก็บรหัสของแต่ละกิ่งในต้นไม้ที่ท่องผ่าน 25 34
0 1 0 2. if t->right is not null
 กิ่งซ้ายใส่ค่า 0 ในอาเรย์ C D
1
set arr[top]=1
- E
11 14
 กิ่งขวาใส่ค่า 1 ในอาเรย์ nullnull nullnull
16 18
null null
printCodes(t->right, arr, top + 1)
0 1
o ถ้าเป็นโหนดใบ ให้แสดงค่าโหนด และค่าในอาเรย์ A B
3. if t is Leaf
7 9 print t->letter
null null nullnull Loop for printing arr

17 18

Print code from Huffman tree Summary


-  การเข้ารหัสฮัฟฟ์แมน เป็นเทคนิคการบีบอัดข้อมูล ที่ไม่ทําให้ข้อมูล
59 C  00
0 1
D  01 เสียหาย
- -  ใช้ความถี่ของตัวอักษรในการเข้ารหัส ตัวอักษรที่พบมากจะมีรหัสที่สั้น
25 34 A 100
0 1 0
1 B 101  ประยุกต์ใช้โครงสร้างข้อมูลหลายๆ ประเภท
C D - E
11
nullnull
14
nullnull
16 18 E 11 o Binary Heap
null null
0 1 o Binary Tree
A B
7
null null
9
nullnull
o Linked List
19 20
#The
T ⑤

·
-

% ·
#
#ooooooo
M

4) : &7.5 Y
17 /( 5*

You might also like