Có thể biến đổi tự bản thảo sơ bộ mã một loại
Cất chứa
0Hữu dụng +1
0
HuffmanMã hóa (Huffman Coding), lại xưng Hoffmann mã hóa, là một loại mã hóa phương thức, Huffman mã hóa là có thể biến đổiTự trườngMã hóa (VLC) một loại. Huffman với 1952 năm đưa ra một loại mã hóa phương pháp, nên phương pháp hoàn toàn căn cứTự phùXuất hiện xác suất tới cấu tạo dị tự đầu bình quân chiều dài ngắn nhất gõ chữ, có khi xưng là tốt nhất mã hóa, giống nhau liền kêu làm Huffman mã hóa ( có khi cũng xưng là Hoffmann mã hóa ).
Tiếng Trung danh
Huffman mã hóa
Ngoại văn danh
Huffman Coding
Phát biểu người
David.A.Huffman
Phát biểu thời gian
1952 năm
Loại đừng
Trình tự thuật toán

Phát triển lịch sử

Bá báo
Biên tập
1951 năm, Huffman cùng hắn ở MITLý thuyết thông tinĐồng học yêu cầu lựa chọn là hoàn thành học kỳ báo cáo vẫn là cuối kỳ khảo thí. Đạo sư Robert M. Fano cho bọn hắn học kỳ báo cáo đề mục là, tìm kiếm nhất hữu hiệuCơ số hai mã hóa.Bởi vì vô pháp chứng minh cái nào đã có mã hóa là nhất hữu hiệu, Huffman từ bỏ đối đã có mã hóa nghiên cứu, chuyển hướng tân thăm dò, cuối cùng phát hiện căn cứ vào có tự tần suấtNhị xoa thụMã hóa ý tưởng, cũng thực mau chứng minh rồi phương pháp này là nhất hữu hiệu. Bởi vì cái này thuật toán, học sinh rốt cuộc trò giỏi hơn thầy, vượt qua hắn kia đã từng cùng lý thuyết thông tin sáng lập giảHương nôngCộng đồng nghiên cứu quá cùng loại mã hóa đạo sư. Huffman sử dụng tự đế hướng về phía trước phương pháp xây dựng nhị xoa thụ, tránh cho thứ ưu thuật toán Shannon-Fano mã hóa lớn nhất tệ đoan ── tự đỉnh xuống phía dưới xây dựng thụ.
1952 năm,David A. HuffmanMITRa sức học hành tiến sĩ khi phát biểu 《 một loại xây dựng cực tiểu dư thừa mã hóa phương pháp 》 ( A Method for the Construction of Minimum-Redundancy Codes ) một văn, nó giống nhau liền kêu làm Huffman mã hóa.[1]
Huffman ở 1952 cuối năm theo hương nông ( Shannon ) ở 1948 năm cùng phạm nếu ( Fano ) ở 1949 năm trình bày loại này mã hóa tư tưởng đưa ra một loại không chừng bản thảo sơ bộ mã phương pháp, cũng xưngHoffmann( Huffman ) mã hóa.Hoffmann mã hóaCơ bản phương pháp là trước đối hình ảnh số liệu rà quét một lần, tính toán ra các loại độ phân giải xuất hiện xác suất, ấn xác suất lớn nhỏ chỉ định bất đồng chiều dài duy nhất gõ chữ, bởi vậy được đến một trương nên hình ảnh Hoffmann mã biểu. Mã hóa sau hình ảnh số liệu ký lục chính là mỗi cái độ phân giải gõ chữ, mà gõ chữ cùng thực tế độ phân giải giá trị đối ứng quan hệ ký lục ở mã biểu trung.
Hách phu mạnMã hóa là có thể biến đổiTự trườngMã hóa (VLC) một loại. Huffman với 1952 năm đưa ra một loại mã hóa phương pháp, nên phương pháp hoàn toàn căn cứTự phùXuất hiện xác suất tới cấu tạo dị tự đầu bình quân trường độ ngắn nhất gõ chữ, có khi xưng là tốt nhất mã hóa, giống nhau liền xưng Huffman mã hóa. Phía dưới dẫn chứng một cái định lý, nên định lý bảo đảm ấn tự phù xuất hiện xác suất phân phối mã trường, có thể làm cho bình quân mã trường ngắn nhất.

Nguyên lý

Bá báo
Biên tập
Đồ 1 hách phu mạn mã hóa nguyên lý
Thiết mỗ tin nguyên sinh ra có năm loại ký hiệu u1, u2, u3, u4 cùng u5, đối ứng xác suất P1=0.4, P2=0.1, P3=P4=0.2, P5=0.1. Đầu tiên, đem ký hiệu dựa theo xác suất từ lớn đến tiểu xếp hàng, như đồ 1 sở kỳ. Mã hóa khi, từ nhỏ nhất xác suất hai cái ký hiệu bắt đầu, nhưng tuyển trong đó một cái chi lộ vì 0, một khác chi lộ vì 1. Nơi này, chúng ta tuyển thượng chi lộ vì 0, hạ chi lộ vì 1. Lại đem đã mã hóa hai chi lộ xác suất xác nhập, cũng một lần nữa xếp hàng. Nhiều lần lặp lại sử dụng kể trên phương pháp cho đến xác nhập xác suất về nhất thời mới thôi. Từ đồ 1 trung ( a ) cùng ( b ) có thể thấy được, hai người tuy bình quân mã diện mạo chờ, nhưng cùng ký hiệu có thể có bất đồng mã trường, tức mã hóa phương pháp cũng không duy nhất, này nguyên nhân là hai chi lộ xác suất xác nhập sau một lần nữa xếp hàng khi, khả năng xuất hiện mấy cái chi lộ xác suất bằng nhau, tạo thành xếp hàng phương pháp không duy nhất. Giống nhau, nếu đem tân xác nhập sau chi lộ bài đến chờ xác suất nhất thượng chi lộ, đem có lợi cho ngắn lại mã hình chữ nhật kém, thả biên ra mã càng tiếp cận với chờ trường mã. Nơi này đồ 1 trung ( a ) mã hóa so ( b ) hảo.
Hách phu mạn mã gõ chữ ( các ký hiệu số hiệu ) là dị trước trí gõ chữ, tức nhậm một gõ chữ không phải là một khác gõ chữ phía trước bộ phận, này sử các gõ chữ có thể liền ở bên nhau truyền tống, trung gian không cần khác thêm cách ly ký hiệu, chỉ cần truyền tống khi không làm lỗi, thu đoan vẫn nhưng chia lìa các gõ chữ, bất trí lẫn lộn.
Thực tế ứng dụng trung, trừ chọn dùng đúng giờ rửa sạch lấy tiêu trừ khác biệt khuếch tán cùng chọn dùng giảm xóc tồn trữ để giải quyết tốc độ xứng đôi bên ngoài, chủ yếu vấn đề là giải quyết tiểu ký hiệu tập hợp thống kê xứng đôi, tỷ như hắc ( 1 ), bạch ( 0 ) vẽ truyền thần tin nguyên thống kê xứng đôi, chọn dùng 0 cùng 1 bất đồng chiều dài đường bơi tạo thành mở rộng ký hiệu tập hợp tin nguyên. Đường bơi, chỉ tương đồng mã nguyên chiều dài ( như nhị tiến mã trung liên tục một chuỗi 0 hoặc một chuỗi 1 chiều dài hoặc cái số ). Dựa theoCCITTTiêu chuẩn, yêu cầu thống kê 2×1728 loại đường bơi ( chiều dài ), như vậy, thực hiện khi tồn trữ lượng quá lớn. Trên thực tế trường đường bơi xác suất rất nhỏ, cố CCITT còn quy định: Nếu l tỏ vẻ đường bơi chiều dài, tắc l=64q+r. Trong đó q xưng chủ mã, r làm cơ sở mã. Mã hóa khi, không nhỏ với 64 đường bơi chiều dài từ chủ mã cùng cơ mã tạo thành. Mà đương l vì 64 số nguyên lần khi, chỉ dùng chủ mã số hiệu, đã không tồn tại cơ mã số hiệu.
Trường đường bơi chủ mã cùng cơ mã đều dùng hách phu mạn quy tắc tiến hành mã hóa, này xưng là tu chỉnh hách phu mạn mã, này kết quả có biểu nhưng tra. Nên phương pháp đã rộng khắp ứng dụng vớiVăn kiện máy faxTrung.

Định lý

Bá báo
Biên tập
Ở biếnTự trườngMã hóa trung, nếu gõ chữ chiều dài nghiêm khắc dựa theo đối ứng ký hiệu xuất hiện xác suất lớn nhỏ nghịch tự sắp hàng, tắc này bình free size tự chiều dài vì nhỏ nhất.
Hiện tại thông qua một cái ví dụ thực tế tới thuyết minh kể trên định lý thực hiện quá trình. Thiết đem tin nguyên ký hiệu ấn xuất hiện xác suất lớn nhỏ trình tự sắp hàng vì:
U: ( a1 a2 a3 a4 a5 a6 a7 ) [1]
0.20 0.19 0.18 0.17 0.15 0.10 0.01
Cấp xác suất nhỏ nhất hai cái ký hiệu a6 cùng a7 phân biệt chỉ định vì “1” cùng “0”, sau đó đem chúng nó xác suất tương thêm lại cùng nguyên lai a1~a5 tổ hợp cũng một lần nữa bài tự thành tân nguyên vì:
U′: ( a1 a2 a3 a4 a5 a6′ )
0.20 0.19 0.18 0.17 0.15 0.11
Đối a5 cùng a′6 phân biệt chỉ định “1” cùng “0” sau, lại làm xác suất tương thêm cũng một lần nữa ấn xác suất bài tự đến
U″: ( 0.26 0.20 0.19 0.18 0.17 )…
Thẳng đến cuối cùng đến U″″: ( 0.61 0.39 )
HáchPhu mạnMã hóa cụ thể phương pháp: Trước ấn xuất hiện xác suất lớn nhỏ xếp hàng, đem hai cái nhỏ nhất xác suất tương thêm, làm tân xác suất cùng còn thừa xác suất một lần nữa xếp hàng, lại đem nhỏ nhất hai cái xác suất tương thêm, lại một lần nữa xếp hàng, thẳng đến cuối cùng biến thành 1. Mỗi lần tương thêm khi đều đem “0” cùng “1” phú cùng tương thêm hai cái xác suất, đọc ra khi từ nên ký hiệu bắt đầu vẫn luôn đi đến cuối cùng “1”, đem lộ tuyến thượng sở gặp được “0” cùng “1” ấn thấp nhất vị đến tối cao vị trình tự lập, chính là nên ký hiệuHách phu mạnMã hóa.
Tỷ như a7 từ trái sang phải, từ U đến U″″, này gõ chữ vì 1000;
a6 ấn lộ tuyến đem sở gặp được “0” cùng “1” ấn thấp nhất vị đến tối cao vị trình tự lập, này gõ chữ vì 1001…
Dùng hách phu mạn mã hóa đoạt được bình quânSo đặc suấtVì: Σ mã trường × xuất hiện xác suất
Thượng lệ vì: 0.2×2+0.19×2+0.18×3+0.17×3+0.15×3+0.1×4+0.01×4=2.72 bit
Có thể tính ra bổn lệ tin nguyên entropy vì 2.61bit, hai người đã là thực tiếp cận.

Loại hình

Bá báo
Biên tập

Trạng thái tĩnh Huffman mã hóa

Huffman mã hóa là trước thế kỷ 50 niên đại từ Huffman giáo thụ nghiên cứu chế tạo khai phá, nó mượn dùngSố liệu kết cấuGiữa thụ hình kết cấu, ởHuffman thuật toánDuy trì hạ cấu tạo ra một câyTối ưu nhị xoa thụ,Chúng ta đem loại này thụ mệnh danh là Huffman thụ. Bởi vậy, chính xác ra, Huffman mã hóa là ở Huffman thụ cơ sở phía trên cấu tạo ra tới một loại mã hóa hình thức, nó bản thân có phi thường rộng khắp ứng dụng. Như vậy, Huffman mã hóa là như thế nào thực hiện số liệuÁp súcCùngGiải áp súcĐâu?
Mọi người đều biết, ở máy tính giữa, số liệu tồn trữ cùng gia công đều là lấyByteLàm cơ bản đơn vị, một cái tây văn tự phù muốn thông qua một chữ tiết tới biểu đạt, mà một cái chữ Hán liền phải dùng hai chữ tiết, chúng ta đem loại này mỗi một chữ phù đều thông qua tương đồng byte số tới biểu đạt mã hóa hình thức xưng là định bản thảo sơ bộ mã. Lấy tây văn vì lệ, tỷ như chúng ta muốn ở máy tính giữa tồn trữ như vậy một câu:I am a teacher. Liền yêu cầu 15 cái byte, cũng chính là 120 cái cơ số hai vị số liệu tới thực hiện. Cùng loại này định bản thảo sơ bộ mã bất đồng chính là, Huffman mã hóa là một loại biến bản thảo sơ bộ mã. Nó căn cứ tự phù xuất hiện xác suất tới cấu tạo bình quân chiều dài ngắn nhất mã hóa. Nói cách khác nếu một chữ phù ở một đoạn hồ sơ giữa xuất hiện số lần nhiều, nó mã hóa liền tương ứng đoản, nếu một chữ phù ở một đoạn hồ sơ giữa xuất hiện số lần thiếu, nó mã hóa liền tương ứng trường. Đương mã hóa trung, các gõ chữ chiều dài nghiêm khắc dựa theo đối ứng ký hiệu xuất hiện xác suất lớn nhỏ tiến hành nghịch tự sắp hàng khi, tắc mã hóa bình quân chiều dài là nhỏ nhất. Đây là Huffman mã hóa thực hiện số liệu áp súc cơ bản nguyên lý. Nếu muốn được đến một đoạn số liệu Huffman mã hóa, yêu cầu dùng đến ba cái bước đi: Bước đầu tiên: Rà quét cần mã hóa số liệu, thống kê nguyên số liệu trung các tự phù xuất hiện xác suất. Bước thứ hai: Lợi dụng được đến xác suất giá trị sáng tạo Huffman thụ. Bước thứ ba: Đối Huffman thụ tiến hành mã hóa, cũng đem mã hóa sau được đến gõ chữ tồn trữ lên.
Bởi vì định bản thảo sơ bộ mã đã dùng tương đồng vị số điều kiện này bảo đảm nhậm một chữ phù mã hóa đều sẽ không trở thành cái khác mã hóa tiền tố, cho nên loại tình huống này chỉ biết xuất hiện ở biến bản thảo sơ bộ mã giữa, nếu muốn tránh cho loại tình huống này, chúng ta liền cần thiết dùng một điều kiện tới chế ước định bản thảo sơ bộ mã, điều kiện này chính là nếu muốn trở thành áp súc mã hóa, biến bản thảo sơ bộ mã liền cần thiết là tiền tố mã hóa. Cái gì làTiền tố mã hóaĐâu? Cái gọi là tiền tố mã hóa chính là bất luận cái gì một chữ phù mã hóa đều không thể là một cái khác tự phù mã hóa tiền tố.
Như vậy Huffman mã hóa hay không là tiền tố mã hóa đâu? Quan sát a, b, c, d cấu thành mã hóa thụ, có thể phát hiện b sở dĩ trở thành c tiền tố, là bởi vì tại đây cây thượng,b trở thành c phụ giao điểm, từ ở Huffman thụ giữa, nguyên văn đương trung số liệu tự phù tất cả đều phân bố tại đây cây Huffman thụ lá cây vị trí, do đó bảo đảm Huffman mã hóa giữa bất luận cái gì một chữ phù mã hóa đều không thể là một cái khác tự phù mã hóa tiền tố. Nói cách khác Huffman mã hóa là một loại tiền tố mã hóa, cũng liền bảo đảm hiểu biết áp súc quá trình giữaDịch mãChuẩn xác tính. Huffman mã hóa giải áp súc quá trình cũng tương đối đơn giản, chính là đem mã hóa nghiêm khắc dựa theo Huffman thụ tiến hành phiên dịch là được, tỷ như gặp được 000, liền có thể theo Huffman thụ tìm được I, gặp được 101 liền có thể theo Huffman thụ tìm được không cách, lấy này loại suy, chúng ta liền có thể thực thuận lợi tìm được nguyên lai sở hữu tự phù. Huffman mã hóa là một loại nhất trí tính mã hóa, có phi thường rộng khắp ứng dụng, tỷ như ởJPEGVăn kiện trung, liền ứng dụng Huffman mã hóa tới thực hiện cuối cùng một bước áp súc; ởCon số TVPhát triển mạnh hôm nay, Huffman mã hóa trở thành video tín hiệu chủ yếu áp súc phương thức. Hẳn là nói, Huffman mã hóa xuất hiện, kết thúc entropy mã hóa không thể thực hiện ngắn nhất mã hóa lịch sử, cũng sử Huffman mã hóa trở thành một loại trọng yếu phi thường không tổn hao gì mã hóa.[2]
Trạng thái tĩnh Huffman phương pháp lớn nhất khuyết điểm chính là nó yêu cầu đối nguyên thủy số liệu tiến hành hai lần rà quét: Đệ nhất biến thống kê nguyên thủy số liệu trung các tự phù xuất hiện tần suất, lợi dụng được đến tần suất giá trị sáng tạo Huffman thụ cũng đem thụ có quan hệ tin tức bảo tồn lên, dễ bề giải áp khi sử dụng; lần thứ hai tắc căn cứ phía trước được đến Huffman thụ đối nguyên thủy số liệu tiến hành mã hóa, cũng đem mã hóa tin tức tồn trữ lên. Như vậy nếu dùng cho internet thông tín trung, sẽ khiến cho trọng đại duyên khi; đối với văn kiện áp súc như vậy ứng dụng trường hợp, thêm vào ổ đĩa từ phóng gian sẽ hạ thấp nên thuật toán số liệu áp súc tốc độ.[3]

Động thái Huffman mã hóa

Đồ 2
Faller đám người đưa ra động thái Huffman mã hóa phương pháp, nó đốiSố liệu mã hóaCăn cứ là động thái biến hóa Huffman thụ, nói cách khác, đối đệ t+1 cái tự phù mã hóa là căn cứNguyên thủy số liệuTrung trước t cái tự phù được đến Huffman thụ tới tiến hành. Áp súc giải hòa áp tử trình tự có tương đồng khởi động lại thụ, mỗi xử lý xong một chữ phù, áp súc giải hòa áp phương sử dụng tương đồng tính pháp tu sửa Huffman thụ, cho nên nên phương pháp không cần vì giải áp mà bảo tồn thụ có quan hệ tin tức. Áp súc giải hòa áp một chữ phù sở cần thời gian cùng nên tự phù mã hóa chiều dài có quan hệ trực tiếp, cho nên nên quá trình có thể thật khi tiến hành.
Đồ 4
Chúng ta phân hai bước tới tiến hành. Bước đầu tiên chúng ta đem trước t cái tự phù Huffman thụ thay đổi thành nó một loại khác hình thức, ở nên thụ trung chỉ cần ở bước thứ hai trung đơn giản mà đem từ căn đến diệp giao điểm alol đường nhỏ thượng sở hữu giao điểm trọng lượng thêm 1, liền có thể biến thành trước t+1 cái tự phù Huffman thụ. Quá trình của nó chính là lấy diệp giao điểm a(it+1) vì mới bắt đầu trước mặt giao điểm, lặp lại mà đem trước mặt giao điểm cùng có đồng dạng trọng lượng tự hào lớn nhất giao điểm tiến hành trao đổi, cũng khiến cho người sau phụ giao điểm trở thành tân trước mặt giao điểm, thẳng đến gặp được căn giao điểm mới thôi. Lấy đồ 2 vì lệ, giao điểm 2 không cần tiến hành trao đổi, cho nên giao điểm 4 trở thành tân trước mặt giao điểm, giao điểm 4 cùng giao điểm 5 trao đổi, giao điểm 8 liền trở thành trước mặtGiao điểm,Cuối cùng giao điểm 8 cùng giao điểm 9 tiến hành trao đổi, giao điểm n trở thành trước mặt giao điểm, kết thúc nên tuần hoàn. Dừng ở đây, bước đầu tiên đã hoàn thành, này kết quả như đồ 2 sở kỳ, dễ dàng nghiệm chứng nó cũng là trước t cái tự phù một loại Huffman thụ hình thức, bởi vì trao đổi chỉ là ở cùng trọng lượng giao điểm chi gian tiến hành. Bước thứ hai thông qua đem căn đến diệp giao điểm a(it+1) đường nhỏ thượng sở hữu giao điểm trọng lượng thêm 1, nên thụ liền biến thành trước t+1 cái tự phù Huffman thụ. Một cái tương đối hoàn chỉnh động thái Huffman mã hóa ví dụ thực tế như đồ 4 sở kỳ.[3]

Ứng dụng nêu ví dụ

Bá báo
Biên tập
Ha phất mạn mã hóa ở lý thuyết thông tin trung ứng dụng nêu ví dụ
Huffman thụ─ tức tối ưuNhị xoa thụ,Mang quyền đường nhỏ chiều dài nhỏ nhất nhị xoa thụ, thường xuyên ứng dụng vớiSố liệu áp súc.Ở máy tính tin tức xử lý trung, “HuffmanMã hóa” là một loại nhất trí tính mã hóa pháp ( lại xưng “Entropy mã hóa pháp”), dùng cho số liệu không có hao tổn áp súc. Này một thuật ngữ là chỉ sử dụng một trương đặc thù mã hóa biểu đem nguyên tự phù ( tỷ như mỗ văn kiện trung một cái ký hiệu ) tiến hành mã hóa. Này trương mã hóa biểu đặc thù chỗ ở chỗ, nó là căn cứ mỗi một cái nguyênTự phùXuất hiện tính ra xác suất mà thành lập lên ( xuất hiện xác suất cao tự phù sử dụng so đoản mã hóa, phản chi xuất hiện xác suất thấp tắc sử dụng so lớn lên mã hóa, này liền sử mã hóa lúc sau tự phù xuyến bình quân kỳ vọng chiều dài hạ thấp, do đó đạt tớiKhông tổn hao gì áp súcSố liệu mục đích ). Loại này phương pháp là từ David.A.Huffman phát triển lên. Tỷ như, ở tiếng Anh trung, e xuất hiện xác suất rất cao, mà z xuất hiện xác suất tắc thấp nhất. Đương lợi dụng Huffman mã hóa đối một thiên tiếng Anh tiến hành áp súc khi, e vô cùng có khả năng dùng một cái vị (bit) tới tỏ vẻ, mà z tắc khả năng hoa đi 25 hàng đơn vị ( không phải 26 ). Dùng bình thường tỏ vẻ phương pháp khi, mỗi cái tiếng Anh chữ cái đều chiếm dụng một chữ tiết ( byte ), tức 8 hàng đơn vị. Hai người so sánh với, e sử dụng giống nhau mã hóa 1/8 chiều dài, z tắc sử dụng 3 lần nhiều. Nếu có thể thực hiện đối với tiếng Anh trung các chữ cái xuất hiện xác suất so chuẩn xác tính ra, liền có thể đại biên độ đề caoKhông tổn hao gì áp súcTỉ lệ.[1]
Ha phất mạn mã hóa ở lý thuyết thông tin trung ứng dụng nêu ví dụ[4]

Áp súc thực hiện

Bá báo
Biên tập

Tốc độ yêu cầu

Vì làm nó (huffman.cpp) nhanh chóng vận hành, đồng thời không sử dụng bất luận cái gì động thái kho, tỷ như STL hoặc là MFC. Nó áp súc 1M số liệu thiếu với 100ms ( P3 xử lý khí, chủ tần 1G ).[5]

Áp súc quá trình

Áp súc số hiệu phi thường đơn giản, đầu tiên dùng ASCII giá trị khởi động lại 511 cáiHuffmanTiết điểm:
CHuffmanNode nodes[511]; for(int nCount = 0; nCount < 256; nCount++) nodes[nCount].byAscii = nCount;
Tiếp theo, tính toán ở đưa vào giảm xóc khu số liệu trung, mỗi cái ASCII mã xuất hiện tần suất:
for(nCount = 0; nCount < nSrcLen; nCount++) nodes[pSrc[nCount]].nFrequency++;
Sau đó, căn cứ tần suất tiến hành bài tự:
qsort(nodes, 256, sizeof(CHuffmanNode), frequencyCompare);
Huffman thụ,Thu hoạch mỗi cái ASCII mã đối ứng vị danh sách:
[5]
int nNodeCount = GetHuffmanTree(nodes);

Cấu tạo Huffman thụ

Cấu tạoHuffman thụPhi thường đơn giản, đem sở hữu tiết điểm phóng tới một cái đội ngũ trung, dùng một cái tiết điểm thay đổi hai cái tần suất thấp nhất tiết điểm, tân tiết điểm tần suất chính là này hai cái tiết điểm tần suất chi cùng. Như vậy, tân tiết điểm chính là hai cái bị thay đổi tiết điểm phụ tiết điểm. Như thế tuần hoàn, thẳng đến đội ngũ trung chỉ còn một cái tiết điểm ( rễ cây ).
[5]
// parent node pNode = &nodes[nParentNode++]; // pop first child pNode->pLeft = PopNode(pNodes, nBackNode--, false); // pop second child pNode->pRight = PopNode(pNodes, nBackNode--, true); // adjust parent of the two poped nodes pNode->pLeft->pParent = pNode->pRight->pParent = pNode; // adjust parent frequency pNode->nFrequency = pNode->pLeft->nFrequency + pNode->pRight->nFrequency;

Những việc cần chú ý

Có một cái tốt bí quyết tới tránh cho sử dụng bất luận cái gì đội ngũ lắp ráp. ASCII mã chỉ có 256 cái, nhưng thực tế phân phối 511 cái (CHuffmanNode nodes[511]), trước 255 cái ký lục ASCII mã, mà dùng sau 255 cái ký lụcHuffman thụTrung phụ tiết điểm. Hơn nữa ở cấu tạo thụ thời điểm chỉ sử dụng một cáiKim đồng hồ số tổ(ChuffmanNode *pNodes[256]) tới chỉ hướng này đó tiết điểm. Đồng dạng sử dụng hai cái lượng biến đổi tới thao tác đội ngũ hướng dẫn tra cứu (int nParentNode = nNodeCount;nBackNode = nNodeCount –1).
Tiếp theo, áp súc cuối cùng một bước là đem mỗi cáiASCII mã hóaViết nhập phát ra giảm xóc khu trung:
int nDesIndex = 0; // loop to write codes for(nCount = 0; nCount < nSrcLen; nCount++) { *(DWORD*)(pDesPtr+(nDesIndex>>3)) |= nodes[pSrc[nCount]].dwCode << (nDesIndex&7); nDesIndex += nodes[pSrc[nCount]].nCodeLength; } (nDesIndex>>3): >>3 lấy 8 vị vì giới hạn hữu di sau tới bên phải byte phía trước (nDesIndex&7): &7 được đến tối cao vị.
Ngoài ra, ở áp súc giảm xóc khu trung, cần thiết bảo tồnHuffman thụTiết điểm cùng với vị danh sách, như vậy mới có thể ởGiải áp súcKhi một lần nữa cấu tạo Huffman thụ ( chỉ cần bảo tồn ASCII giá trị cùng đối ứng vị danh sách ).[5]

Giải áp súc

Giải áp súcSo cấu tạoHuffman thụMuốn đơn giản nhiều, đem đưa vào giảm xóc khu trung mỗi cái mã hóa dùng đối ứng ASCII mã từng cái thay đổi là được. Chỉ cần nhớ kỹ, nơi này đưa vào giảm xóc khu là một cái bao hàm mỗi cái ASCII giá trị mã hóa vị lưu. Bởi vậy, vì dùng ASCII giá trị thay đổi mã hóa, chúng ta cần thiết dùng vị lưu tìm tòi Huffman thụ, thẳng đến phát hiện một cái diệp tiết điểm, sau đó đem nó ASCII giá trị tăng thêm đến phát ra giảm xóc khu trung:
[5]
int nDesIndex = 0; DWORD nCode; while(nDesIndex < nDesLen) { nCode = (*(DWORD*)(pSrc+(nSrcIndex>>3)))>>(nSrcIndex&7); pNode = pRoot; while(pNode->pLeft) { pNode = (nCode&1)? pNode->pRight: pNode->pLeft; nCode >>= 1; nSrcIndex++; } pDes[nDesIndex++] = pNode->byAscii; }

Trình tự thực hiện

Bá báo
Biên tập

Phí nặc mã hóa

[6]
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <math.h> #define M 100 typedef struct Fano_Node { char ch; float weight; }FanoNode[M]; typedef struct node { int start; int end; struct node *next; }LinkQueueNode; typedef struct { LinkQueueNode *front; LinkQueueNode *rear; }LinkQueue; // thành lập đội ngũ void EnterQueue(LinkQueue *q,int s,int e) { LinkQueueNode *NewNode; // sinh thành tân tiết điểm NewNode=(LinkQueueNode*)malloc(sizeof( LinkQueueNode )); if(NewNode!=NULL) { NewNode->start=s; NewNode->end=e; NewNode->next=NULL; q->rear->next=NewNode; q->rear=NewNode; } else { printf( "Error!" ); exit(-1); } } // ấn quyền phân tổ void Divide(FanoNode f,int s,int *m,int e) { int i; float sum,sum1; sum=0; for(i=s;i<=e;i++) sum+=f[i].weight;// *m=s; sum1=0; for(i=s;i<e;i++) { sum1+=f[i].weight; *m=fabs(sum-2*sum1)>fabs(sum-2*sum1-2*f[i+1].weight)?(i+1):*m; if(*m==i) break; } } void main() { int i,j,n,max,m,h[M]; int sta,end; float w; char c,fc[M][M]; FanoNode FN; LinkQueueNode *p; LinkQueue *Q; // khởi động lại đội Q Q=(LinkQueue *)malloc(sizeof(LinkQueue)); Q->front=(LinkQueueNode*)malloc(sizeof(LinkQueueNode)); Q->rear=Q->front; Q->front->next=NULL; printf( "\t***FanoCoding***\n" ); printf( "Please input the number of node:" ); // đưa vào tin tức scanf( "%d",&n); // vượt qua định nghĩa M, rời khỏi if(n>=M) { printf( ">=%d",M); exit(-1); } i=1; // từ cái thứ hai nguyên tố bắt đầu ghi vào while(i<=n) { printf( "%d weight and node:",i); scanf( "%f %c",&FN[i].weight,&FN[i].ch); for(j=1;j<i;j++) { if(FN[i].ch==FN[j].ch)// tra tìm lặp lại { printf( "Same node!!!\n" ); break; } } if(i==j) i++; } // bài tự ( hàng tự ) for(i=1;i<=n;i++) { max=i+1; for(j=max;j<=n;j++) max=FN[max].weight<FN[j].weight?j:max; if(FN[i].weight<FN[max].weight) { w=FN[i].weight; FN[i].weight=FN[max].weight; FN[max].weight=w; c=FN[i].ch; FN[i].ch=FN[max].ch; FN[max].ch=c; } } for(i=1;i<=n;i++) // khởi động lại h h[i]=0; EnterQueue(Q,1,n); //1 cùng n tiến đội while(Q->front->next!=NULL) { p=Q->front->next; // ra đội Q->front->next=p->next; if(p==Q->rear) Q->rear=Q->front; sta=p->start; end=p->end; free(p); Divide(FN,sta,&m,end); /* ấn quyền phân tổ */ for(i=sta;i<=m;i++) { fc[i][h[i]]='0'; ++h[i]; } if(sta!=m) EnterQueue(Q,sta,m); else fc[sta][h[sta]]='\0'; for(i=m+1;i<=end;i++) { fc[i][h[i]]='1'; ++h[i]; } if(m==sta&&(m+1)==end) // nếu phân tổ sau này nguyên tố hạ tiêu cùng trung gian nguyên tố bằng nhau, // hơn nữa cùng cuối cùng nguyên tố hạ tiêu kém vì 1, tắc mã hóa gõ chữ tự phù xuyến kết thúc { fc[m][h[m]]='\0'; fc[end][h[end]]='\0'; } else EnterQueue(Q,m+1,end); } for(i=1;i<=n;i++) /* đóng dấu mã hóa tin tức */ { printf( "%c:",FN[i].ch); printf( "%s\n",fc[i]); } system( "pause" ); }

Mã hóa giải mã

[7]
#include <stdio.h> #include <stdlib.h> #include <string.h> #define N 100 #define M 2*N-1 typedef char * HuffmanCode[2*M];//haffman mã hóa typedef struct { int weight;// quyền giá trị int parent;// phụ kế tiếp điểm int LChild;// tả tử tiết điểm int RChild;// hữu tử tiết điểm }HTNode,Huffman[M+1];//huffman thụ typedef struct Node { int weight; // lá cây giao điểm quyền giá trị char c; // lá cây giao điểm int num; // lá cây giao điểm cơ số hai mã chiều dài }WNode,WeightNode[N]; /*** sinh ra lá cây giao điểm tự phù cùng quyền giá trị ***/ void CreateWeight(char ch[],int *s,WeightNode CW,int *p) { int i,j,k; int tag; *p=0;// lá cây tiết điểm cái số // thống kê tự phù xuất hiện cái số, để vào CW for(i=0;ch[i]!='\0';i++) { tag=1; for(j=0;j<i;j++) if(ch[j]==ch[i]) { tag=0; break; } if(tag) { CW[++*p].c=ch[i]; CW[*p].weight=1; for(k=i+1;ch[k]!='\0';k++) if(ch[i]==ch[k]) CW[*p].weight++;// quyền giá trị mệt thêm } } *s=i;// tự phù xuyến chiều dài } /******** sáng tạo HuffmanTree********/ void CreateHuffmanTree(Huffman ht,WeightNode w,int n) { int i,j; int s1,s2; // khởi động lại Huffman thụ for(i=1;i<=n;i++) { ht[i].weight =w[i].weight; ht[i].parent=0; ht[i].LChild=0; ht[i].RChild=0; } for(i=n+1;i<=2*n-1;i++) { ht[i].weight=0; ht[i].parent=0; ht[i].LChild=0; ht[i].RChild=0; } for(i=n+1;i<=2*n-1;i++) { for(j=1;j<=i-1;j++) if(!ht[j].parent) break; s1=j; // tìm được cái thứ nhất song thân bằng không giao điểm for(;j<=i-1;j++) if(!ht[j].parent) s1=ht[s1].weight>ht[j].weight?j:s1; ht[s1].parent=i; ht[i].LChild=s1; for(j=1;j<=i-1;j++) if(!ht[j].parent) break; s2=j; // tìm được cái thứ hai song thân bằng không giao điểm for(;j<=i-1;j++) if(!ht[j].parent) s2=ht[s2].weight>ht[j].weight?j:s2; ht[s2].parent=i; ht[i].RChild=s2; ht[i].weight=ht[s1].weight+ht[s2].weight;// quyền giá trị mệt thêm } } /*********** lá cây giao điểm mã hóa ***********/ void CrtHuffmanNodeCode(Huffman ht,char ch[],HuffmanCode h,WeightNode weight,int m,int n) { int i,c,p,start; char *cd; cd=(char *)malloc(n*sizeof(char)); cd[n-1]='\0';// cuối cùng trí 0 for(i=1;i<=n;i++) { start=n-1; //cd xuyến mỗi lần từ cuối cùng bắt đầu c=i; p=ht[i].parent;//p ở n+1 đến 2n-1 while(p) // duyên phụ thân phương hướng biến lịch, thẳng đến vì 0 { start--;// theo thứ tự về phía trước trí giá trị if(ht[p].LChild==c)// cùng tả tử tương đồng, trí 0 cd[start]='0'; else // nếu không trí 1 cd[start]='1'; c=p; p=ht[p].parent; } weight[i].num=n-start; // cơ số hai mã chiều dài ( bao hàm cuối cùng 0) h[i]=(char *)malloc((n-start)*sizeof(char)); strcpy(h[i],&cd[start]);// đem cơ số hai tự phù xuyến copy đến kim đồng hồ số tổ h trung } free(cd);// phóng thích cd nội tồn system( "pause" ); } /********* sở hữu tự phù mã hóa *********/ void CrtHuffmanCode(char ch[],HuffmanCode h,HuffmanCode hc,WeightNode weight,int n,int m) { int i,k; for(i=0;i<m;i++) { for(k=1;k<=n;k++) /* từ weight[k].c trung tra tìm cùng ch[i] bằng nhau hạ tiêu K*/ if(ch[i]==weight[k].c) break; hc[i]=(char *)malloc((weight[k].num)*sizeof(char)); strcpy(hc[i],h[k]); // copy cơ số hai mã hóa } } /***** giải mã *****/ void TrsHuffmanTree(Huffman ht,WeightNode w,HuffmanCode hc,int n,int m) { int i=0,j,p; printf( "***StringInformation***\n" ); while(i<m) { p=2*n-1;// từ phụ thân tiết điểm xuống phía dưới biến lịch thẳng đến lá cây tiết điểm for(j=0;hc[i][j]!='\0';j++) { if(hc[i][j]=='0') p=ht[p].LChild; else p=ht[p].RChild; } printf( "%c",w[p].c); /* đóng dấu nguyên tin tức */ i++; } } /***** phóng thích huffman mã hóa nội tồn *****/ void FreeHuffmanCode(HuffmanCode h,HuffmanCode hc,int n,int m) { int i; for(i=1;i<=n;i++)// phóng thích lá cây giao điểm mã hóa free(h[i]); for(i=0;i<m;i++) // phóng thích sở hữu giao điểm mã hóa free(hc[i]); } void main() { int i,n=0; /*n vì lá cây giao điểm cái số */ int m=0; /*m vì tự phù xuyến ch[] chiều dài */ char ch[N]; /*ch[N] gửi đưa vào tự phù xuyến */ Huffman ht; /*Huffman nhị xoa số */ HuffmanCode h,hc; /*h gửi lá cây giao điểm mã hóa, hc gửi sở hữu giao điểm mã hóa */ WeightNode weight; /* gửi lá cây giao điểm tin tức */ printf( "\t***HuffmanCoding***\n" ); printf( "please input information:" ); gets(ch); /* đưa vào tự phù xuyến */ CreateWeight(ch,&m,weight,&n); /* sinh ra lá cây giao điểm tin tức, m vì tự phù xuyến ch[] chiều dài */ printf( "***WeightInformation***\n Node" ); for(i=1;i<=n;i++) /* phát ra lá cây giao điểm tự phù cùng quyền giá trị */ printf( "%c",weight[i].c); printf( "\nWeight" ); for(i=1;i<=n;i++) printf( "%d",weight[i].weight); CreateHuffmanTree(ht,weight,n); /* sinh ra Huffman thụ */ printf( "\n***HuffamnTreeInformation***\n" ); printf( "\ti\tweight\tparent\tLChild\tRChild\n" ); for(i=1;i<=2*n-1;i++) /* đóng dấu Huffman thụ tin tức */ printf( "\t%d\t%d\t%d\t%d\t%d\n",i,ht[i].weight,ht[i].parent,ht[i].LChild,ht[i].RChild); CrtHuffmanNodeCode(ht,ch,h,weight,m,n); /* lá cây giao điểm mã hóa */ printf( "***NodeCode***\n" ); /* đóng dấu lá cây giao điểm mã hóa */ for(i=1;i<=n;i++) { printf( "\t%c:",weight[i].c); printf( "%s\n",h[i]); } CrtHuffmanCode(ch,h,hc,weight,n,m); /* sở hữu tự phù mã hóa */ printf( "***StringCode***\n" ); /* đóng dấu tự phù xuyến mã hóa */ for(i=0;i<m;i++) printf( "%s",hc[i]); system( "pause" ); TrsHuffmanTree(ht,weight,hc,n,m); /* giải mã */ FreeHuffmanCode(h,hc,n,m); system( "pause" ); }

Matlab thực hiện

[8]
Matlab trung giản dị thực hiện Huffman biên dịch mã: n=input('Please input the total number: '); hf=zeros(2*n-1,5); hq=[]; for ki=1:n hf(ki,1)=ki; hf(ki,2)=input('Please input the frequency: '); hq=[hq,hf(ki,2)]; end for ki=n+1:2*n-1 hf(ki,1)=ki; mhq1=min(hq); m=size(hq); m=m(:,2); k=1; while k<=m%del min1 if hq(:,k)==mhq1 hq=[hq(:,1:(k-1)) hq(:,(k+1):m)]; m=m-1; break else k=k+1; end end k=1; while hf(k,2)~=mhq1|hf(k,5)==1%find min1 location k=k+1; end hf(k,5)=1; k1=k; mhq2=min(hq); k=1; while k<=m%del min2 if hq(:,k)==mhq2 hq=[hq(:,1:(k-1)) hq(:,(k+1):m)]; m=m-1; break else k=k+1; end end k=1; while hf(k,2)~=mhq2|hf(k,5)==1%find min2 location k=k+1; end hf(k,5)=1; k2=k; hf(ki,2)=mhq1+mhq2; hf(ki,3)=k1; hf(ki,4)=k2; hq=[hq hf(ki,2)]; end clc choose=input('Please choose what you want:\n1: Encoding\n2: Decoding\n3:.Exit\n'); while choose==1|choose==2 if choose==1 a=input('Please input the letter you want to Encoding: '); k=1; while hf(k,2)~=a k=k+1; if k>=n display('Error! You did not input this number.'); break end end if k>=n break end r=[]; while hf(k,5)==1 kc=n+1; while hf(kc,3)~=k&hf(kc,4)~=k kc=kc+1; end if hf(kc,3)==k r=[0 r]; else r=[1 r]; end k=kc; end r else a=input('Please input the metrix you want to Decoding: '); sa=size(a); sa=sa(:,2); k=2*n-1; while sa~=0 if a(:,1)==0 k=hf(k,3); else k=hf(k,4); end a=a(:,2:sa); sa=sa-1; if k==0 display('Error! The metrix you entered is a wrong one.'); break end end if k==0 break end r=hf(k,2); end choose=input('Choose what you want:\n1: Encoding\n2: Decoding\n3:.Exit\n'); clc; end if choose~=1&choose~=2 clc; end