Xây dựng cây Human | Bài giảng Hệ điều hành

Xây dựng bảng thống kê tần số xuất hiện của các ký tự cần mã hóa. Mỗi phần tử được xem như là đỉnh của một cây. Lặp cho đến lúc chỉ còn một cây. Bài giảng giúp bạn tham khảo, củng cố kiến thức và ôn tập đạt kết quả cao

Giới thiệu
Cây huffman
1
Nội dung trình bày
Mô hình mã hóa huffman
Cây huffman
Xác định mã, mã hóa, giải mã
Triển cây huffman trên mảng
2
Nén với mã huffman
Nén huffman không mất thông tin
Nén không mất thông tin
Dựa trên thống kê tần số: những ký tự xuất hiện
nhiều lần, sử dụng ký mã mới ít bit hơn
Thuật toán hiệu quả sử dụng: nén jpg, …
Thuật toán hiệu quả sử dụng: nén jpg, …
3
Nén với mã huffman
Ý tưởng
Xây dựng bộ mã huffman
Đọc ký tự, chuyển sang dãy bit mới
Gửi đến nơi nhận
Đọc dãy bit, nhận dạng ký tự chuyển về ký tự
Đọc dãy bit, nhận dạng ký tự chuyển về ký tự
4
Xây dựng mã huffman
Ý tưởng
Xây dựng bảng thống kê tần số xuất hiện của các ký
tự cần mã hóa
Mỗi phần tử được xem như là đỉnh của một cây
Lặp cho đến lúc chỉ còn một cây
Lặp cho đến lúc chỉ còn một cây
Chọn 2 cây có trọng số bé nhất ghép thành một cây mới
Từ đỉnh duyệt cây
Nếu về bên trái chọn bit 0
Về phải chọn bit 1
Đến lá thì dãy bit đã duyệt chính là mã mới của ký tự
5
Xây dựng mã huffman
Ví dụ
A B C D E
0.10 0.15 0.30 0.16 0.29
6
Xây dựng mã huffman
Ví dụ
7
Xây dựng mã huffman
Ví dụ
8
Xây dựng mã huffman
Ví dụ
9
A B C D E
010 011 11 00 10
Triển khai thực tiễn
Mô hình sử dụng cây
Xây dựng cấu trúc cây kiểu sử dụng con trỏ trái, phải
Sau đó sử dụng mảng lưu các cây (rừng)
Mỗi bước mảng giảm đi một phần tử cuối cùng sẽ
có cây
có cây
10
Triển khai thực tiễn
Mô hình sử dụng mảng
Nếu có cây khi duyệt bit có thể sử dụng chiến lược
duyệt từ duyệt từ lá lên đỉnh và đảo ngược xâu bit
Việc xây dựng cây có thể chỉ cần xây dựng từ lá, con
chỉ lên cha của
chỉ lên cha của
Vì thế thay vì chọn một nút hai con có thể thực
hiện việc một con chỉ một link đến cha
11
Triển khai thực tiễn
Mô hình sử dụng mảng
Nếu có cây khi duyệt bit có thể sử dụng chiến lược
duyệt từ duyệt từ lá lên đỉnh và đảo ngược xâu bit
Việc xây dựng cây có thể chỉ cần xây dựng từ lá, con
chỉ lên cha của
chỉ lên cha của
Vì thế thay vì chọn một nút hai con có thể thực
hiện việc một con chỉ một link đến cha
Vì dùng mảng như là một nút
Mỗi bước thực hiện ghép hai đỉnh sẽ sinh một đỉnh
mới vì thế cần 2*n-1 đỉnh.
12
Triển khai thực tiễn
Mô hình sử dụng mảng (t)
Vì một đỉnh có thể bị dịch chuyển nên nếu lưu giá trị
vào đỉnh sẽ không n đúng về tham chiếu
Sẽ dùng một mảng để lưu đỉnh các cây mới
Dùng mảng chỉ số để lưu trữ các rừng
Dùng mảng chỉ số để lưu trữ các rừng
13
Thuật toán
Thuật toán tính cây huffman
Input: a[]: ký tự, b[]: tần suất, n
Ouput: p[]:mảng tả cây
For(i=0;i<2n;i++)
For(i=0;i<n;i++)
T[i]=i;//
SortbybDesc(t,n);//sắp xếp chỉ số liên kết của t đến
giá trị b[], giảm dần
14
Thuật toán
Thuật toán tính cây huffman (t)
C=n;//Số đỉnh trong rừng
Cc=n-1;//Số y còn lại trong rừng
While(cc>0)
b[c]=b[t[cc]]+b[t[cc
-
1]]
b[c]=b[t[cc]]+b[t[cc
-
1]]
P[t[cc]]=-c;//trái
P[t[cc-]]=c;//phải
Cc--;
T[cc]=c;
C++;
Insert(t,cc);//thực hiện thuật toán cho đổi chỗ phần tử ở
cuối vào vị trí thích hợp của nó, đảm bảo không tăng
15
Thuật toán
Thuật toán tính cây huffman (t)
For(i=0;i<n;i++)
Cr=i;
t=‘’
Whiel(P[cr]!=cr)
Whiel(P[cr]!=cr)
If(p[cr]<0)
» T=t+’0’
Else
» T=t+’1’
Cr=abs(p[cr])
Code[i]=invert(t);//đảo thứ tự các bit
16
Bài tập trên lớp
Triển khai thuật toán với cây huffman
17
Bài tập
- Triển khai thuật toán mã hóa và giải mã huffman
18
| 1/18

Preview text:

Giới thiệu Cây huffman 1 Nội dung trình bày • Mô hình mã hóa huffman Cây huffman
Xác định mã, mã hóa, giải mã
• Triển cây huffman trên mảng 2 Nén với mã huffman
• Nén huffman không mất thông tin Nén không mất thông tin
Dựa trên thống kê tần số: những ký tự xuất hiện
nhiều lần, sử dụng ký mã mới ít bit hơn Thu h ậ u t t to t án n hi h ệ i u ệ u qu q ả u sử s ử dụ d n ụ g n : :né n n é n jpg p , ,… 3 Nén với mã huffman • Ý tưởng Xây dựng bộ mã huffman
Đọc ký tự, chuyển sang dãy bit mới Gửi đến nơi nhận Đọc d ã d y y bi b t i , t ,nh n ậ h n n dạ d ng n ký k ý tự t ự chu h y u ể y n ể n về v ề ký k ý tự t ự cũ 4 Xây dựng mã huffman • Ý tưởng
Xây dựng bảng thống kê tần số xuất hiện của các ký tự cần mã hóa
Mỗi phần tử được xem như là đỉnh của một cây Lặp p c ho h đến ế n lú l c ú chỉ h ỉcòn n mộ m t t cây
• Chọn 2 cây có trọng số bé nhất ghép thành một cây mới Từ đỉnh duyệt cây
• Nếu về bên trái chọn bit 0 • Về phải chọn bit 1
• Đến lá thì dãy bit đã duyệt chính là mã mới của ký tự 5 Xây dựng mã huffman • Ví dụ A B C D E 0.10 0.15 0.30 0.16 0.29 6 Xây dựng mã huffman • Ví dụ 7 Xây dựng mã huffman • Ví dụ 8 Xây dựng mã huffman • Ví dụ A B C D E 010 011 11 00 10 9 Triển khai thực tiễn • Mô hình sử dụng cây
Xây dựng cấu trúc cây kiểu sử dụng con trỏ trái, phải
Sau đó sử dụng mảng lưu các cây (rừng)
Mỗi bước mảng giảm đi một phần tử cuối cùng sẽ có c ây 10 Triển khai thực tiễn
• Mô hình sử dụng mảng
Nếu có cây khi duyệt bit có thể sử dụng chiến lược
duyệt từ duyệt từ lá lên đỉnh và đảo ngược xâu bit
Việc xây dựng cây có thể chỉ cần xây dựng từ lá, con chỉ h ỉlê l n ê n cha h của ủ nó n
Vì thế thay vì chọn một nút có hai con có thể thực
hiện việc một con chỉ một link đến cha 11 Triển khai thực tiễn
• Mô hình sử dụng mảng
Nếu có cây khi duyệt bit có thể sử dụng chiến lược
duyệt từ duyệt từ lá lên đỉnh và đảo ngược xâu bit
Việc xây dựng cây có thể chỉ cần xây dựng từ lá, con chỉ h ỉlê l n ê n cha h của ủ nó n
Vì thế thay vì chọn một nút có hai con có thể thực
hiện việc một con chỉ một link đến cha
Vì dùng mảng như là một nút
Mỗi bước thực hiện ghép hai đỉnh sẽ sinh một đỉnh
mới vì thế cần 2*n-1 đỉnh. 12 Triển khai thực tiễn
• Mô hình sử dụng mảng (t)
Vì một đỉnh có thể bị dịch chuyển nên nếu lưu giá trị
vào đỉnh sẽ không còn đúng về tham chiếu
Sẽ dùng một mảng để lưu đỉnh các cây mới Dù D n ù g n mả m ng n chỉ h ỉsố s để ể lư l u ư u tr t ữ r ữ các rừ r n ừ g n 13 Thuật toán
• Thuật toán tính cây huffman
Input: a[]: ký tự, b[]: tần suất, n
Ouput: p[]:mảng mô tả cây For(i=0;i<2n;i++) • P[ P i [ ]= ] i;// / khô / ng khô ng quy đ ị đ nh tự nh tr ỏ For(i=0;i• T[i]=i;//
SortbybDesc(t,n);//sắp xếp chỉ số liên kết của t đến giá trị b[], giảm dần 14 Thuật toán
• Thuật toán tính cây huffman (t)
C=n;//Số đỉnh trong rừng
Cc=n-1;//Số cây còn lại trong rừng While(cc>0) • b[c b[ ]= ] b[t[ b[ c t[ c]] ] + ] b[t[ b[ c t[ c-1 - ] 1 ] ] • P[t[cc]]=-c;//trái • P[t[cc-]]=c;//phải • Cc--; • T[cc]=c; • C++;
• Insert(t,cc);//thực hiện thuật toán cho đổi chỗ phần tử ở
cuối vào vị trí thích hợp của nó, đảm bảo không tăng 15 Thuật toán
• Thuật toán tính cây huffman (t) For(i=0;i• Cr=i; • t=‘’ • Whiel(P[ P c [ r]! ] = ! cr) – If(p[cr]<0) » T=t+’0’ – Else » T=t+’1’ – Cr=abs(p[cr])
• Code[i]=invert(t);//đảo thứ tự các bit 16 Bài tập trên lớp
• Triển khai thuật toán với cây huffman 17 Bài tập -
Triển khai thuật toán mã hóa và giải mã huffman 18