Huffman рдХрдореНрдкреНрд░реЗрд╕рди рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо

рдкрд╛рдареНрдпрдХреНрд░рдо рд╕реБрд░реБ рд╣реБрдиреБ рдЕрдШрд┐ "рд╡рд┐рдХрд╛рд╕рдХрд░реНрддрд╛рд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рдПрд▓реНрдЧреЛрд░рд┐рджрдорд╣рд░реВ" рддрдкрд╛рдЗрдБрдХреЛ рд▓рд╛рдЧрд┐ рдЕрд░реНрдХреЛ рдЙрдкрдпреЛрдЧреА рд╕рд╛рдордЧреНрд░реАрдХреЛ рдЕрдиреБрд╡рд╛рдж рддрдпрд╛рд░ рдЫред

рд╣рдлрдореНрдпрд╛рди рдХреЛрдбрд┐рдЩ рдПрдХ рдбрд╛рдЯрд╛ рдХрдореНрдкреНрд░реЗрд╕рди рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рд╣реЛ рдЬрд╕рд▓реЗ рдлрд╛рдЗрд▓ рдХрдореНрдкреНрд░реЗрд╕рдирдХреЛ рдЖрдзрд╛рд░рднреВрдд рд╡рд┐рдЪрд╛рд░рд▓рд╛рдИ рдмрдирд╛рдЙрдБрдЫред рдпрд╕ рд▓реЗрдЦрдорд╛, рд╣рд╛рдореА рдирд┐рд╢реНрдЪрд┐рдд рд░ рдЪрд░ рд▓рдореНрдмрд╛рдЗрдХреЛ рдЗрдиреНрдХреЛрдбрд┐рдЩ, рд╡рд┐рд╢рд┐рд╖реНрдЯ рд░реВрдкрдорд╛ рдбрд┐рдХреЛрдбреЗрдмрд▓ рдХреЛрдбрд╣рд░реВ, рдЙрдкрд╕рд░реНрдЧ рдирд┐рдпрдорд╣рд░реВ, рд░ рд╣рдлрдореНрдпрд╛рди рд░реВрдЦ рдирд┐рд░реНрдорд╛рдг рдЧрд░реНрдиреЗ рдмрд╛рд░реЗ рдХреБрд░рд╛ рдЧрд░реНрдиреЗрдЫреМрдВред

рд╣рд╛рдореАрд▓рд╛рдИ рдерд╛рд╣рд╛ рдЫ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдХреНрдпрд╛рд░реЗрдХреНрдЯрд░ 0's рд░ 1's рдХреЛ рдЕрдиреБрдХреНрд░рдордХреЛ рд░реВрдкрдорд╛ рднрдгреНрдбрд╛рд░ рдЧрд░рд┐рдПрдХреЛ рдЫ рд░ 8 рдмрд┐рдЯ рд▓рд┐рдиреНрдЫред рдпрд╕рд▓рд╛рдИ рдирд┐рд╢реНрдЪрд┐рдд рд▓рдореНрдмрд╛рдЗ рдЗрдиреНрдХреЛрдбрд┐рдЩ рднрдирд┐рдиреНрдЫ рдХрд┐рдирднрдиреЗ рдкреНрд░рддреНрдпреЗрдХ рдХреНрдпрд╛рд░реЗрдХреНрдЯрд░рд▓реЗ рднрдгреНрдбрд╛рд░ рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐ рд╕рдорд╛рди рдирд┐рд╢реНрдЪрд┐рдд рд╕рдВрдЦреНрдпрд╛рдХреЛ рдмрд┐рдЯрд╣рд░реВ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрджрдЫред

рд╣рд╛рдореАрд╕рдБрдЧ рдПрдЙрдЯрд╛ рдкрд╛рда рдЫ рднрдиреМрдВред рд╣рд╛рдореА рдХрд╕рд░реА рдПрдХрд▓ рдХреНрдпрд╛рд░реЗрдХреНрдЯрд░ рднрдгреНрдбрд╛рд░рдг рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдард╛рдЙрдБрдХреЛ рдорд╛рддреНрд░рд╛ рдШрдЯрд╛рдЙрди рд╕рдХреНрдЫреМрдВ?

рдореБрдЦреНрдп рд╡рд┐рдЪрд╛рд░ рдЪрд░ рд▓рдореНрдмрд╛рдИ рдПрдиреНрдХреЛрдбрд┐рдЩ рд╣реЛред рд╣рд╛рдореА рдпреЛ рддрдереНрдп рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рд╕рдХреНрдЫреМрдВ рдХрд┐ рдкрд╛рдардорд╛ рдХреЗрд╣реА рдХреНрдпрд╛рд░реЗрдХреНрдЯрд░рд╣рд░реВ рдЕрд░реВрд╣рд░реВ рднрдиреНрджрд╛ рдзреЗрд░реИ рдкрдЯрдХ рджреЗрдЦрд╛ рдкрд░реНрджрдЫ (рдпрд╣рд╛рдБ рд╣реЗрд░реНрдиреБрд╣реЛрд╕реН) рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рд╡рд┐рдХрд╛рд╕ рдЧрд░реНрди рдЬрд╕рд▓реЗ рдХрдо рдмрд┐рдЯреНрд╕рдорд╛ рдХреНрдпрд╛рд░реЗрдХреНрдЯрд░рд╣рд░реВрдХреЛ рд╕рдорд╛рди рдЕрдиреБрдХреНрд░рдо рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдЧрд░реНрджрдЫред рдЪрд░ рд▓рдореНрдмрд╛рдЗ рдЗрдиреНрдХреЛрдбрд┐рдЩрдорд╛, рд╣рд╛рдореА рд╡рд░реНрдгрд╣рд░реВрд▓рд╛рдИ рдмрд┐рдЯреНрд╕рдХреЛ рдЪрд░ рд╕рдВрдЦреНрдпрд╛ рддреЛрдХреНрдЫреМрдВ, рддрд┐рдиреАрд╣рд░реВ рджрд┐рдЗрдПрдХреЛ рдкрд╛рдардорд╛ рдХрддрд┐ рдкрдЯрдХ рджреЗрдЦрд╛ рдкрд░реНрджрдЫрдиреН рднрдиреНрдиреЗ рдЖрдзрд╛рд░рдорд╛ред рдЕрдиреНрддрддрдГ, рдХреЗрд╣рд┐ рдХреНрдпрд╛рд░реЗрдХреНрдЯрд░рд╣рд░реВрд▓реЗ 1 рдмрд┐рдЯ рдЬрддрд┐ рдереЛрд░реИ рд▓рд┐рди рд╕рдХреНрдЫ, рдЬрдмрдХрд┐ рдЕрд░реВрд▓реЗ 2 рдмрд┐рдЯ, 3 рд╡рд╛ рдмрдвреА рд▓рд┐рди рд╕рдХреНрдЫред рдЪрд░ рд▓рдореНрдмрд╛рдЗ рд╕рдЩреНрдХреЗрддрдирдХреЛ рд╕рдорд╕реНрдпрд╛ рдЕрдиреБрдХреНрд░рдордХреЛ рдкрдЫрд┐рд▓реНрд▓реЛ рдбрд┐рдХреЛрдбрд┐рдЩ рдорд╛рддреНрд░ рд╣реЛред

рдХрд╕рд░реА, рдмрд┐рдЯрд╣рд░реВрдХреЛ рдЕрдиреБрдХреНрд░рдо рдерд╛рд╣рд╛ рдкрд╛рдЙрдБрджрд╛, рдпрд╕рд▓рд╛рдИ рд╕реНрдкрд╖реНрдЯ рд░реВрдкрдорд╛ рдбрд┐рдХреЛрдб рдЧрд░реНрдиреЗ?

рд░реЗрдЦрд╛рд▓рд╛рдИ рд╡рд┐рдЪрд╛рд░ рдЧрд░реНрдиреБрд╣реЛрд╕реН "abacdab"ред рдпрд╕рдорд╛ 8 рдХреНрдпрд╛рд░реЗрдХреНрдЯрд░рд╣рд░реВ рдЫрдиреН, рд░ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд▓рдореНрдмрд╛рдЗ рдЗрдиреНрдХреЛрдбрд┐рдЩ рдЧрд░реНрджрд╛, рдпрд╕рд▓рд╛рдИ рднрдгреНрдбрд╛рд░рдг рдЧрд░реНрди 64 рдмрд┐рдЯрд╣рд░реВ рдЖрд╡рд╢реНрдпрдХ рдкрд░реНрджрдЫред рдпрд╛рдж рдЧрд░реНрдиреБрд╣реЛрд╕реН рдХрд┐ рдкреНрд░рддреАрдХ рдЖрд╡реГрддреНрддрд┐ "рдП рдмреА рд╕реА" ╨╕ "рдбреА" рдХреНрд░рдорд╢рдГ рек, реи, рез, рез рдмрд░рд╛рдмрд░ рд╣реБрдиреНрдЫред рдХрд▓реНрдкрдирд╛ рдЧрд░реНрдиреЗ рдкреНрд░рдпрд╛рд╕ рдЧрд░реМрдВ "abacdab" рдХрдо рдмрд┐рдЯ, рддрдереНрдп рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ "to" рднрдиреНрджрд╛ рдзреЗрд░реИ рдкрдЯрдХ рд╣реБрдиреНрдЫ "рдмреА"рд░ "рдмреА" рднрдиреНрджрд╛ рдзреЗрд░реИ рдкрдЯрдХ рд╣реБрдиреНрдЫ "рдЧ" ╨╕ "рдбреА"ред рдХреЛрдбрд┐рдЩ рдЧрд░реЗрд░ рд╕реБрд░реБ рдЧрд░реМрдВ "to" рдПрдХ рдмрд┐рдЯ рдмрд░рд╛рдмрд░ реж рд╕рдВрдЧ, "рдмреА" рд╣рд╛рдореА рджреБрдИ-рдмрд┐рдЯ рдХреЛрдб 11 рдЕрд╕рд╛рдЗрди рдЧрд░реНрдиреЗрдЫреМрдВ, рд░ рддреАрди рдмрд┐рдЯреНрд╕ 100 рд░ 011 рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рд╣рд╛рдореА рдЗрдирдХреЛрдб рдЧрд░реНрдиреЗрдЫреМрдВред "рдЧ" ╨╕ "рдбреА".

рдирддрд┐рдЬрд╛рдХреЛ рд░реВрдкрдорд╛, рд╣рд╛рдореА рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрдиреЗрдЫреМрдВ:

a
0

b
11

c
100

d
011

рддреНрдпрд╕реИрд▓реЗ рд▓рд╛рдЗрди "abacdab" рд╣рд╛рдореА рдХреЛ рд░реВрдкрдорд╛ рдПрдиреНрдХреЛрдб рдЧрд░реНрдиреЗрдЫреМрдВ 00110100011011 (0|0|11|0|100|011|0|11)рдорд╛рдерд┐рдХрд╛ рдХреЛрдбрд╣рд░реВ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ред рдпрджреНрдпрдкрд┐, рдореБрдЦреНрдп рд╕рдорд╕реНрдпрд╛ рдбрд┐рдХреЛрдбрд┐рдЩрдорд╛ рд╣реБрдиреЗрдЫред рдЬрдм рд╣рд╛рдореА рд╕реНрдЯреНрд░рд┐рдЩ рдбрд┐рдХреЛрдб рдЧрд░реНрдиреЗ рдкреНрд░рдпрд╛рд╕ рдЧрд░реНрдЫреМрдВ 00110100011011, рд╣рд╛рдореА рдПрдХ рдЕрд╕реНрдкрд╖реНрдЯ рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрдиреЗрдЫреМрдВ, рдХрд┐рдирдХрд┐ рдпрд╕рд▓рд╛рдИ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫ:

0|011|0|100|011|0|11    adacdab
0|0|11|0|100|0|11|011   aabacabd
0|011|0|100|0|11|0|11   adacabab 

...
рд░ рдпрддрд┐ред

рдпреЛ рдЕрд╕реНрдкрд╖реНрдЯрддрд╛рдмрд╛рдЯ рдмрдЪреНрдирдХреЛ рд▓рд╛рдЧрд┐, рд╣рд╛рдореАрд▓реЗ рдпреЛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдЧрд░реНрдиреБрдкрд░реНрджрдЫ рдХрд┐ рд╣рд╛рдореНрд░реЛ рдПрдиреНрдХреЛрдбрд┐рдЩрд▓реЗ рдпрд╕реНрддреЛ рдЕрд╡рдзрд╛рд░рдгрд╛рд▓рд╛рдИ рд╕рдиреНрддреБрд╖реНрдЯ рдЧрд░реНрджрдЫ рдЙрдкрд╕рд░реНрдЧ рдирд┐рдпрдо, рдЬрд╕рд▓реЗ рдмрд╛рд░реАрдорд╛ рд╕рдВрдХреЗрдд рдЧрд░реНрджрдЫ рдХрд┐ рдХреЛрдбрд╣рд░реВ рдХреЗрд╡рд▓ рдПрдХ рдЕрджреНрд╡рд┐рддреАрдп рддрд░рд┐рдХрд╛рдорд╛ рдбрд┐рдХреЛрдб рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫред рдЙрдкрд╕рд░реНрдЧ рдирд┐рдпрдорд▓реЗ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдЧрд░реНрджрдЫ рдХрд┐ рдХреБрдиреИ рдкрдирд┐ рдХреЛрдб рдЕрд░реНрдХреЛрдХреЛ рдЙрдкрд╕рд░реНрдЧ рд╣реЛрдЗрдиред рдХреЛрдб рджреНрд╡рд╛рд░рд╛, рд╣рд╛рдореНрд░реЛ рдорддрд▓рдм рдмрд┐рдЯреНрд╕ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдХреНрдпрд╛рд░реЗрдХреНрдЯрд░ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдЧрд░реНрди рдкреНрд░рдпреЛрдЧ рдЧрд░рд┐рдиреНрдЫред рдорд╛рдерд┐рдХреЛ рдЙрджрд╛рд╣рд░рдгрдорд╛ 0 рдЙрдкрд╕рд░реНрдЧ рд╣реЛ 011, рдЬрд╕рд▓реЗ рдЙрдкрд╕рд░реНрдЧ рдирд┐рдпрдо рдЙрд▓реНрд▓рдЩреНрдШрди рдЧрд░реНрджрдЫред рддреНрдпрд╕реЛрднрдП, рдпрджрд┐ рд╣рд╛рдореНрд░рд╛ рдХреЛрдбрд╣рд░реВрд▓реЗ рдЙрдкрд╕рд░реНрдЧ рдирд┐рдпрдорд▓рд╛рдИ рдкреВрд░рд╛ рдЧрд░реНрдЫ рднрдиреЗ, рддреНрдпрд╕рдкрдЫрд┐ рд╣рд╛рдореА рдЕрджреНрд╡рд┐рддреАрдп рд░реВрдкрдорд╛ рдбрд┐рдХреЛрдб рдЧрд░реНрди рд╕рдХреНрдЫреМрдВ (рд░ рдпрд╕рдХреЛ рд╡рд┐рдкрд░рд┐рдд)ред

рдорд╛рдерд┐рдХреЛ рдЙрджрд╛рд╣рд░рдгрд▓рд╛рдИ рдлреЗрд░рд┐ рд╣реЗрд░реМрдВред рдпрд╕ рдкрдЯрдХ рд╣рд╛рдореА рдкреНрд░рддреАрдХрд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рдирд┐рдпреБрдХреНрдд рдЧрд░реНрдиреЗрдЫреМрдВ "рдП рдмреА рд╕реА" ╨╕ "рдбреА" рдЙрдкрд╕рд░реНрдЧ рдирд┐рдпрдо рдкреВрд░рд╛ рдЧрд░реНрдиреЗ рдХреЛрдбрд╣рд░реВред

a
0

b
10

c
110

d
111

рдпреЛ рдПрдиреНрдХреЛрдбрд┐рдЩ рд╕рдВрдЧ, рд╕реНрдЯреНрд░рд┐рдЩ "abacdab" рдХреЛ рд░реВрдкрдорд╛ рдЗрдиреНрдХреЛрдб рдЧрд░рд┐рдиреЗрдЫ 00100100011010 (0|0|10|0|100|011|0|10)ред рд░ рдпрд╣рд╛рдБ 00100100011010 рд╣рд╛рдореА рдкрд╣рд┐рд▓реЗ рдиреИ рд╕реНрдкрд╖реНрдЯ рд░реВрдкрдорд╛ рдбрд┐рдХреЛрдб рдЧрд░реНрди рд░ рд╣рд╛рдореНрд░реЛ рдореВрд▓ рд╕реНрдЯреНрд░рд┐рдЩрдорд╛ рдлрд░реНрдХрди рд╕рдХреНрд╖рдо рд╣реБрдиреЗрдЫреМрдВ "abacdab".

Huffman рдХреЛрдбрд┐рдЩ

рдЕрдм рд╣рд╛рдореАрд▓реЗ рдЪрд░ рд▓рдореНрдмрд╛рдИ рдПрдиреНрдХреЛрдбрд┐рдЩ рд░ рдЙрдкрд╕рд░реНрдЧ рдирд┐рдпрдорд╕рдБрдЧ рд╡реНрдпрд╡рд╣рд╛рд░ рдЧрд░реЗрдХрд╛ рдЫреМрдВ, рд╣рдлрдореНрдпрд╛рди рдПрдиреНрдХреЛрдбрд┐рдЩрдХреЛ рдмрд╛рд░реЗрдорд╛ рдХреБрд░рд╛ рдЧрд░реМрдВред

рд╡рд┐рдзрд┐ рдмрд╛рдЗрдирд░реА рд░реВрдЦрд╣рд░реВрдХреЛ рд╕рд┐рд░реНрдЬрдирд╛рдорд╛ тАЛтАЛрдЖрдзрд╛рд░рд┐рдд рдЫред рдпрд╕рдорд╛, рдиреЛрдб рдпрд╛ рдд рдЕрдиреНрддрд┐рдо рд╡рд╛ рдЖрдиреНрддрд░рд┐рдХ рд╣реБрди рд╕рдХреНрдЫред рдкреНрд░рд╛рд░рдореНрднрдорд╛, рд╕рдмреИ рдиреЛрдбрд╣рд░реВ рдкрд╛рддрд╣рд░реВ (рдЯрд░реНрдорд┐рдирд▓рд╣рд░реВ) рдорд╛рдирд┐рдиреНрдЫ, рдЬрд╕рд▓реЗ рдкреНрд░рддреАрдХ рдЖрдлреИрдВ рд░ рдпрд╕рдХреЛ рд╡рдЬрди (рдЕрд░реНрдерд╛рдд, рдШрдЯрдирд╛рдХреЛ рдЖрд╡реГрддреНрддрд┐) рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдЧрд░реНрджрдЫред рдЖрдиреНрддрд░рд┐рдХ рдиреЛрдбрд╣рд░реВрд▓реЗ рдХреНрдпрд╛рд░реЗрдХреНрдЯрд░рдХреЛ рд╡рдЬрди рд╕рдорд╛рд╡реЗрд╢ рдЧрд░реНрджрдЫ рд░ рджреБрдИ рд╡рдВрд╢рдЬ рдиреЛрдбрд╣рд░реВрд▓рд╛рдИ рд╕рдиреНрджрд░реНрдн рдЧрд░реНрджрдЫред рд╕рд╛рдорд╛рдиреНрдп рд╕рд╣рдорддрд┐ рджреНрд╡рд╛рд░рд╛, рдмрд┐рдЯ "0" рдмрд╛рдпрд╛рдБ рд╢рд╛рдЦрд╛ рдХреЛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдЧрд░реНрджрдЫ, рд░ "1" - рджрд╛рдпрд╛рдБрддрд░реНрдлред рдкреВрд░реНрдг рд░реВрдЦрдорд╛ N рдкрд╛рдд рд░ N-1 рдЖрдиреНрддрд░рд┐рдХ рдиреЛрдбрд╣рд░реВред рдпреЛ рд╕рд┐рдлрд╛рд░рд┐рд╕ рдЧрд░рд┐рдПрдХреЛ рдЫ рдХрд┐ Huffman рд░реВрдЦ рдирд┐рд░реНрдорд╛рдг рдЧрд░реНрджрд╛, рдЗрд╖реНрдЯрддрдо рд▓рдореНрдмрд╛рдЗ рдХреЛрдбрд╣рд░реВ рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрди рдкреНрд░рдпреЛрдЧ рдирдЧрд░рд┐рдПрдХрд╛ рдкреНрд░рддреАрдХрд╣рд░реВ рдЦрд╛рд░реЗрдЬ рдЧрд░реНрдиреБрд╣реЛрд╕реНред

рд╣рд╛рдореА Huffman рд░реВрдЦ рдирд┐рд░реНрдорд╛рдг рдЧрд░реНрди рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рд▓рд╛рдо рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреЗрдЫреМрдВ, рдЬрд╣рд╛рдБ рд╕рдмреИрднрдиреНрджрд╛ рдХрдо рдЖрд╡реГрддреНрддрд┐ рднрдПрдХреЛ рдиреЛрдбрд▓рд╛рдИ рдЙрдЪреНрдЪрддрдо рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рджрд┐рдЗрдиреЗрдЫред рдирд┐рд░реНрдорд╛рдг рдЪрд░рдгрд╣рд░реВ рддрд▓ рд╡рд░реНрдгрди рдЧрд░рд┐рдПрдХреЛ рдЫ:

  1. рдкреНрд░рддреНрдпреЗрдХ рдХреНрдпрд╛рд░реЗрдХреНрдЯрд░рдХреЛ рд▓рд╛рдЧрд┐ рд▓реАрдл рдиреЛрдб рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдиреБрд╣реЛрд╕реН рд░ рддрд┐рдиреАрд╣рд░реВрд▓рд╛рдИ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рд▓рд╛рдордорд╛ рдердкреНрдиреБрд╣реЛрд╕реНред
  2. рд▓рд╛рдордорд╛ рдПрдХ рднрдиреНрджрд╛ рдмрдвреА рдкрд╛рдирд╛ рд╣реБрдБрджрд╛, рдирд┐рдореНрди рдЧрд░реНрдиреБрд╣реЛрд╕реН:
    • рд▓рд╛рдордмрд╛рдЯ рдЙрдЪреНрдЪрддрдо рдкреНрд░рд╛рдердорд┐рдХрддрд╛ (рд╕рдмреИрднрдиреНрджрд╛ рдХрдо рдлреНрд░рд┐рдХреНрд╡реЗрдиреНрд╕реА) рднрдПрдХрд╛ рджреБрдИ рдиреЛрдбрд╣рд░реВ рд╣рдЯрд╛рдЙрдиреБрд╣реЛрд╕реН;
    • рдПрдЙрдЯрд╛ рдирдпрд╛рдБ рдЖрдиреНрддрд░рд┐рдХ рдиреЛрдб рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдиреБрд╣реЛрд╕реН, рдЬрд╣рд╛рдБ рдпреА рджреБрдИ рдиреЛрдбрд╣рд░реВ рдмрдЪреНрдЪрд╛рд╣рд░реВ рд╣реБрдиреЗрдЫрдиреН, рд░ рдШрдЯрдирд╛рдХреЛ рдЖрд╡реГрддреНрддрд┐ рдпреА рджреБрдИ рдиреЛрдбрд╣рд░реВрдХреЛ рдлреНрд░рд┐рдХреНрд╡реЗрдиреНрд╕реАрдХреЛ рдпреЛрдЧрдлрд▓ рдмрд░рд╛рдмрд░ рд╣реБрдиреЗрдЫред
    • рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рд▓рд╛рдордорд╛ рдирдпрд╛рдБ рдиреЛрдб рдердкреНрдиреБрд╣реЛрд╕реНред
  3. рдХреЗрд╡рд▓ рдмрд╛рдБрдХреА рдиреЛрдб рдЬрд░рд╛ рд╣реБрдиреЗрдЫ, рд░ рдпрд╕рд▓реЗ рд░реВрдЦрдХреЛ рдирд┐рд░реНрдорд╛рдг рдкреВрд░рд╛ рдЧрд░реНрдиреЗрдЫред

рдХрд▓реНрдкрдирд╛ рдЧрд░реНрдиреБрд╣реЛрд╕реН рдХрд┐ рд╣рд╛рдореАрд╕рдБрдЧ рдХреЗрд╣рд┐ рдкрд╛рда рдЫ рдЬрд╕рдорд╛ рдЕрдХреНрд╖рд░рд╣рд░реВ рдорд╛рддреНрд░ рдЫрдиреН "рдП рдмрд┐ рд╕рд┐ рджрд┐" ╨╕ "рд░", рд░ рддрд┐рдиреАрд╣рд░реВрдХреЛ рдШрдЯрдирд╛ рдЖрд╡реГрддреНрддрд┐рд╣рд░реВ рдХреНрд░рдорд╢рдГ 15, 7, 6, 6, рд░ 5 рд╣реБрдиреНред рддрд▓ рдПрд▓реНрдЧреЛрд░рд┐рджрдордХрд╛ рдЪрд░рдгрд╣рд░реВ рдкреНрд░рддрд┐рдмрд┐рдореНрдмрд┐рдд рдЧрд░реНрдиреЗ рдЪрд┐рддреНрд░рд╣рд░реВ рдЫрдиреНред

Huffman рдХрдореНрдкреНрд░реЗрд╕рди рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо

Huffman рдХрдореНрдкреНрд░реЗрд╕рди рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо

Huffman рдХрдореНрдкреНрд░реЗрд╕рди рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо

Huffman рдХрдореНрдкреНрд░реЗрд╕рди рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо

Huffman рдХрдореНрдкреНрд░реЗрд╕рди рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо

рд░реВрдЯрдмрд╛рдЯ рдХреБрдиреИ рдкрдирд┐ рдЕрдиреНрддрд┐рдо рдиреЛрдбрдорд╛ рдЬрд╛рдиреЗ рдмрд╛рдЯреЛрд▓реЗ рдЗрд╖реНрдЯрддрдо рдЙрдкрд╕рд░реНрдЧ рдХреЛрдб (рдЬрд╕рд▓рд╛рдИ рд╣рдлрдореНрдпрд╛рди рдХреЛрдб рдкрдирд┐ рднрдирд┐рдиреНрдЫ) рддреНрдпреЛ рдЕрдиреНрддрд┐рдо рдиреЛрдбрд╕рдБрдЧ рд╕рдореНрдмрдиреНрдзрд┐рдд рдХреНрдпрд╛рд░реЗрдХреНрдЯрд░рд╕рдБрдЧ рдореЗрд▓ рдЦрд╛рдиреНрдЫред

Huffman рдХрдореНрдкреНрд░реЗрд╕рди рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо
рд╣рдлрдореНрдпрд╛рди рд░реВрдЦ

рддрд▓ рддрдкрд╛рдИрд▓реЗ C++ рд░ рдЬрд╛рднрд╛рдорд╛ рд╣рдлрдореНрдпрд╛рди рдХрдореНрдкреНрд░реЗрд╕рди рдПрд▓реНрдЧреЛрд░рд┐рдереНрдордХреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд╛рдЙрдиреБрд╣реБрдиреЗрдЫ:

#include <iostream>
#include <string>
#include <queue>
#include <unordered_map>
using namespace std;

// A Tree node
struct Node
{
	char ch;
	int freq;
	Node *left, *right;
};

// Function to allocate a new tree node
Node* getNode(char ch, int freq, Node* left, Node* right)
{
	Node* node = new Node();

	node->ch = ch;
	node->freq = freq;
	node->left = left;
	node->right = right;

	return node;
}

// Comparison object to be used to order the heap
struct comp
{
	bool operator()(Node* l, Node* r)
	{
		// highest priority item has lowest frequency
		return l->freq > r->freq;
	}
};

// traverse the Huffman Tree and store Huffman Codes
// in a map.
void encode(Node* root, string str,
			unordered_map<char, string> &huffmanCode)
{
	if (root == nullptr)
		return;

	// found a leaf node
	if (!root->left && !root->right) {
		huffmanCode[root->ch] = str;
	}

	encode(root->left, str + "0", huffmanCode);
	encode(root->right, str + "1", huffmanCode);
}

// traverse the Huffman Tree and decode the encoded string
void decode(Node* root, int &index, string str)
{
	if (root == nullptr) {
		return;
	}

	// found a leaf node
	if (!root->left && !root->right)
	{
		cout << root->ch;
		return;
	}

	index++;

	if (str[index] =='0')
		decode(root->left, index, str);
	else
		decode(root->right, index, str);
}

// Builds Huffman Tree and decode given input text
void buildHuffmanTree(string text)
{
	// count frequency of appearance of each character
	// and store it in a map
	unordered_map<char, int> freq;
	for (char ch: text) {
		freq[ch]++;
	}

	// Create a priority queue to store live nodes of
	// Huffman tree;
	priority_queue<Node*, vector<Node*>, comp> pq;

	// Create a leaf node for each character and add it
	// to the priority queue.
	for (auto pair: freq) {
		pq.push(getNode(pair.first, pair.second, nullptr, nullptr));
	}

	// do till there is more than one node in the queue
	while (pq.size() != 1)
	{
		// Remove the two nodes of highest priority
		// (lowest frequency) from the queue
		Node *left = pq.top(); pq.pop();
		Node *right = pq.top();	pq.pop();

		// Create a new internal node with these two nodes
		// as children and with frequency equal to the sum
		// of the two nodes' frequencies. Add the new node
		// to the priority queue.
		int sum = left->freq + right->freq;
		pq.push(getNode('', sum, left, right));
	}

	// root stores pointer to root of Huffman Tree
	Node* root = pq.top();

	// traverse the Huffman Tree and store Huffman Codes
	// in a map. Also prints them
	unordered_map<char, string> huffmanCode;
	encode(root, "", huffmanCode);

	cout << "Huffman Codes are :n" << 'n';
	for (auto pair: huffmanCode) {
		cout << pair.first << " " << pair.second << 'n';
	}

	cout << "nOriginal string was :n" << text << 'n';

	// print encoded string
	string str = "";
	for (char ch: text) {
		str += huffmanCode[ch];
	}

	cout << "nEncoded string is :n" << str << 'n';

	// traverse the Huffman Tree again and this time
	// decode the encoded string
	int index = -1;
	cout << "nDecoded string is: n";
	while (index < (int)str.size() - 2) {
		decode(root, index, str);
	}
}

// Huffman coding algorithm
int main()
{
	string text = "Huffman coding is a data compression algorithm.";

	buildHuffmanTree(text);

	return 0;
}

import java.util.HashMap;
import java.util.Map;
import java.util.PriorityQueue;

// A Tree node
class Node
{
	char ch;
	int freq;
	Node left = null, right = null;

	Node(char ch, int freq)
	{
		this.ch = ch;
		this.freq = freq;
	}

	public Node(char ch, int freq, Node left, Node right) {
		this.ch = ch;
		this.freq = freq;
		this.left = left;
		this.right = right;
	}
};

class Huffman
{
	// traverse the Huffman Tree and store Huffman Codes
	// in a map.
	public static void encode(Node root, String str,
							  Map<Character, String> huffmanCode)
	{
		if (root == null)
			return;

		// found a leaf node
		if (root.left == null && root.right == null) {
			huffmanCode.put(root.ch, str);
		}


		encode(root.left, str + "0", huffmanCode);
		encode(root.right, str + "1", huffmanCode);
	}

	// traverse the Huffman Tree and decode the encoded string
	public static int decode(Node root, int index, StringBuilder sb)
	{
		if (root == null)
			return index;

		// found a leaf node
		if (root.left == null && root.right == null)
		{
			System.out.print(root.ch);
			return index;
		}

		index++;

		if (sb.charAt(index) == '0')
			index = decode(root.left, index, sb);
		else
			index = decode(root.right, index, sb);

		return index;
	}

	// Builds Huffman Tree and huffmanCode and decode given input text
	public static void buildHuffmanTree(String text)
	{
		// count frequency of appearance of each character
		// and store it in a map
		Map<Character, Integer> freq = new HashMap<>();
		for (int i = 0 ; i < text.length(); i++) {
			if (!freq.containsKey(text.charAt(i))) {
				freq.put(text.charAt(i), 0);
			}
			freq.put(text.charAt(i), freq.get(text.charAt(i)) + 1);
		}

		// Create a priority queue to store live nodes of Huffman tree
		// Notice that highest priority item has lowest frequency
		PriorityQueue<Node> pq = new PriorityQueue<>(
										(l, r) -> l.freq - r.freq);

		// Create a leaf node for each character and add it
		// to the priority queue.
		for (Map.Entry<Character, Integer> entry : freq.entrySet()) {
			pq.add(new Node(entry.getKey(), entry.getValue()));
		}

		// do till there is more than one node in the queue
		while (pq.size() != 1)
		{
			// Remove the two nodes of highest priority
			// (lowest frequency) from the queue
			Node left = pq.poll();
			Node right = pq.poll();

			// Create a new internal node with these two nodes as children 
			// and with frequency equal to the sum of the two nodes
			// frequencies. Add the new node to the priority queue.
			int sum = left.freq + right.freq;
			pq.add(new Node('', sum, left, right));
		}

		// root stores pointer to root of Huffman Tree
		Node root = pq.peek();

		// traverse the Huffman tree and store the Huffman codes in a map
		Map<Character, String> huffmanCode = new HashMap<>();
		encode(root, "", huffmanCode);

		// print the Huffman codes
		System.out.println("Huffman Codes are :n");
		for (Map.Entry<Character, String> entry : huffmanCode.entrySet()) {
			System.out.println(entry.getKey() + " " + entry.getValue());
		}

		System.out.println("nOriginal string was :n" + text);

		// print encoded string
		StringBuilder sb = new StringBuilder();
		for (int i = 0 ; i < text.length(); i++) {
			sb.append(huffmanCode.get(text.charAt(i)));
		}

		System.out.println("nEncoded string is :n" + sb);

		// traverse the Huffman Tree again and this time
		// decode the encoded string
		int index = -1;
		System.out.println("nDecoded string is: n");
		while (index < sb.length() - 2) {
			index = decode(root, index, sb);
		}
	}

	public static void main(String[] args)
	{
		String text = "Huffman coding is a data compression algorithm.";

		buildHuffmanTree(text);
	}
}

рдиреЛрдЯ: рдЗрдирдкреБрдЯ рд╕реНрдЯреНрд░рд┐рдЩ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рдпреЛрдЧ рдЧрд░рд┐рдПрдХреЛ рдореЗрдореЛрд░реА 47 * 8 = 376 рдмрд┐рдЯ рд╣реЛ рд░ рдЗрдиреНрдХреЛрдб рдЧрд░рд┐рдПрдХреЛ рд╕реНрдЯреНрд░рд┐рдЩ рдорд╛рддреНрд░ 194 рдмрд┐рдЯ рд╣реЛред рдбрд╛рдЯрд╛ рд▓рдЧрднрдЧ 48% рджреНрд╡рд╛рд░рд╛ рд╕рдВрдХреБрдЪрд┐рдд рдЫред рдорд╛рдерд┐рдХреЛ C++ рдХрд╛рд░реНрдпрдХреНрд░рдордорд╛, рд╣рд╛рдореА рдкреНрд░реЛрдЧреНрд░рд╛рдо рдкрдвреНрди рдпреЛрдЧреНрдп рдмрдирд╛рдЙрдирдХреЛ рд▓рд╛рдЧрд┐ рдПрдиреНрдХреЛрдб рдЧрд░рд┐рдПрдХреЛ рд╕реНрдЯреНрд░рд┐рдЩ рднрдгреНрдбрд╛рд░рдг рдЧрд░реНрди рд╕реНрдЯреНрд░рд┐рдЩ рдХреНрд▓рд╛рд╕ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдЫреМрдВред

рдХрд┐рдирднрдиреЗ рдХреБрд╢рд▓ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рд▓рд╛рдо рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рдкреНрд░рддрд┐ рд╕рдореНрдорд┐рд▓рди рдЖрд╡рд╢реНрдпрдХ рдЫ O(log(N)) рд╕рдордп, рддрд░ рдкреВрд░реНрдг рдмрд╛рдЗрдирд░реА рд░реВрдЦрдорд╛ N рдкрд╛рддрд╣рд░реВ рдЙрдкрд╕реНрдерд┐рдд рдЫрдиреН 2N-1 рдиреЛрдбрд╣рд░реВ, рд░ Huffman рд░реВрдЦ рдкреВрд░реНрдг рдмрд╛рдЗрдирд░реА рд░реВрдЦ рд╣реЛ, рддреНрдпрд╕рдкрдЫрд┐ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдЪрд▓реНрдЫ O(Nlog(N)) рд╕рдордп, рдХрд╣рд╛рдБ N - рдкрд╛рддреНрд░рд╣рд░реВред

рд╕реНрд░реЛрддрд╣рд░реВ:

en.wikipedia.org/wiki/Huffman_coding
en.wikipedia.org/wiki/Variable-length_code
www.youtube.com/watch?v=5wRPin4oxCo

рдкрд╛рдареНрдпрдХреНрд░рдо рдмрд╛рд░реЗ рдердк рдЬрд╛рдиреНрдиреБрд╣реЛрд╕реНред

рд╕реНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдердкреНрди