рд╣рдлрд╝рдореИрди рд╕рдВрдкреАрдбрд╝рди рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо

рдХреЛрд░реНрд╕ рд╢реБрд░реВ рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ "рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП рдПрд▓реНрдЧреЛрд░рд┐рджрдо" рдЖрдкрдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рдЙрдкрдпреЛрдЧреА рд╕рд╛рдордЧреНрд░реА рдХрд╛ рдЕрдиреБрд╡рд╛рдж рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ рд╣реИред

рд╣рдлрд╝рдореИрди рдХреЛрдбрд┐рдВрдЧ рдПрдХ рдбреЗрдЯрд╛ рдХрдВрдкреНрд░реЗрд╢рди рдПрд▓реНрдЧреЛрд░рд┐рдердо рд╣реИ рдЬреЛ рдлрд╝рд╛рдЗрд▓ рдХрдВрдкреНрд░реЗрд╢рди рдХреЗ рдореВрд▓ рд╡рд┐рдЪрд╛рд░ рдХреЛ рддреИрдпрд╛рд░ рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рд╣рдо рдлрд┐рдХреНрд╕реНрдб рдФрд░ рд╡реЗрд░рд┐рдПрдмрд▓ рд▓реЗрдВрде рдПрдиреНрдХреЛрдбрд┐рдВрдЧ, рдпреВрдирд┐рдХ рдбрд┐рдХреЛрдбреЗрдмрд▓ рдХреЛрдб, рдкреНрд░реАрдлрд┐рдХреНрд╕ рд░реВрд▓реНрд╕ рдФрд░ рд╣рдлрдореИрди рдЯреНрд░реА рдмрдирд╛рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реЗрдВрдЧреЗред

рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рд╡рд░реНрдг рдХреЛ 0 рдФрд░ 1 рдХреЗ рдЕрдиреБрдХреНрд░рдо рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрдЧреНрд░рд╣рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ 8 рдмрд┐рдЯ рд▓рдЧрддреЗ рд╣реИрдВред рдЗрд╕реЗ рдирд┐рд╢реНрдЪрд┐рдд рд▓рдВрдмрд╛рдИ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рд╡рд░реНрдг рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд┐рдЯреНрд╕ рдХреА рд╕рдорд╛рди рдирд┐рд╢реНрдЪрд┐рдд рд╕рдВрдЦреНрдпрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред

рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдореЗрдВ рдЯреЗрдХреНрд╕реНрдЯ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд╣рдо рдПрдХ рдЕрдХреНрд╖рд░ рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╕реНрдерд╛рди рдХреА рдорд╛рддреНрд░рд╛ рдХреЛ рдХреИрд╕реЗ рдХрдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?

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

рдХреИрд╕реЗ, рдмрд┐рдЯреНрд╕ рдХреЗ рдЕрдиреБрдХреНрд░рдо рдХреЛ рдЬрд╛рдирдиреЗ рдХреЗ рдмрд╛рдж, рдЗрд╕реЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдбрд┐рдХреЛрдб рдХрд░реЗрдВ?

рд░реЗрдЦрд╛ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ "рдЕрдмрдХрджрд╛рдм". рдЗрд╕рдореЗрдВ 8 рдЕрдХреНрд╖рд░ рд╣реЛрддреЗ рд╣реИрдВ, рдФрд░ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд▓рдВрдмрд╛рдИ рдХреЛ рдПрдирдХреЛрдб рдХрд░рддреЗ рд╕рдордп рдЗрд╕реЗ рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП 64 рдмрд┐рдЯреНрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдкреНрд░рддреАрдХ рдЖрд╡реГрддреНрддрд┐ "рдП", "рдмреА", "рд╕реА" ╨╕ "рдбреА" рдХреНрд░рдорд╢рдГ 4, 2, 1, 1 рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИред рдЖрдЗрдП рдХрд▓реНрдкрдирд╛ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ "рдЕрдмрдХрджрд╛рдм" рдХрдо рдмрд┐рдЯреНрд╕, рдЗрд╕ рддрдереНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдХрд┐ "рд╕реЗрд╡рд╛" рд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░ рд╣реЛрддрд╛ рд╣реИ "рдмреА"рдФрд░ "рдмреА" рд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░ рд╣реЛрддрд╛ рд╣реИ "рд╕реА" ╨╕ "рдбреА". рдЖрдЗрдП рдХреЛрдбрд┐рдВрдЧ рд╕реЗ рд╢реБрд░реВ рдХрд░реЗрдВ "рд╕реЗрд╡рд╛" рдПрдХ рдмрд┐рдЯ 0 рдХреЗ рдмрд░рд╛рдмрд░ рдХреЗ рд╕рд╛рде, "рдмреА" рд╣рдо рдПрдХ рджреЛ-рдмрд┐рдЯ рдХреЛрдб 11 рдЕрд╕рд╛рдЗрди рдХрд░реЗрдВрдЧреЗ, рдФрд░ рддреАрди рдмрд┐рдЯреНрд╕ 100 рдФрд░ 011 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣рдо рдПрдирдХреЛрдб рдХрд░реЗрдВрдЧреЗ "рд╕реА" ╨╕ "рдбреА".

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

a
0

b
11

c
100

d
011

рддреЛ рд░реЗрдЦрд╛ "рдЕрдмрдХрджрд╛рдм" рд╣рдо рдХреЗ рд░реВрдк рдореЗрдВ рд╕рд╛рдВрдХреЗрддрд┐рдХ рд╢рдмреНрджреЛрдВ рдореЗрдВ рдмрджрд▓рдирд╛ рд╣реЛрдЧрд╛ 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

рдЗрд╕ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдХреЗ рд╕рд╛рде, string "рдЕрдмрдХрджрд╛рдм" рдХреЗ рд░реВрдк рдореЗрдВ рдПрдиреНрдХреЛрдб рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ 00100100011010 (0|0|10|0|100|011|0|10). рд▓реЗрдХрд┐рди 00100100011010 рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдбрд┐рдХреЛрдб рдХрд░рдиреЗ рдФрд░ рдЕрдкрдиреЗ рдореВрд▓ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкрд░ рд╡рд╛рдкрд╕ рдЬрд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдВрдЧреЗ "рдЕрдмрдХрджрд╛рдм".

рд╣рдлрд╝рдореИрди рдХреЛрдбрд┐рдВрдЧ

рдЕрдм рдЬрдм рд╣рдордиреЗ рдЪрд░ рд▓рдВрдмрд╛рдИ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдФрд░ рдЙрдкрд╕рд░реНрдЧ рдирд┐рдпрдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХреА рд╣реИ, рддреЛ рд╣рдлрд╝рдореИрди рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рддреЗ рд╣реИрдВред

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

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

  1. рдкреНрд░рддреНрдпреЗрдХ рд╡рд░реНрдг рдХреЗ рд▓рд┐рдП рдПрдХ рд▓реАрдл рдиреЛрдб рдмрдирд╛рдПрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдХрддрд╛рд░ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВред
  2. рдХрддрд╛рд░ рдореЗрдВ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рд╢реАрдЯ рд╣реЛрдиреЗ рдкрд░, рдирд┐рдореНрди рдХрд╛рд░реНрдп рдХрд░реЗрдВ:
    • рдХрддрд╛рд░ рд╕реЗ рд╕рд░реНрд╡реЛрдЪреНрдЪ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ (рдиреНрдпреВрдирддрдо рдЖрд╡реГрддреНрддрд┐) рд╡рд╛рд▓реЗ рджреЛ рдиреЛрдбреНрд╕ рдирд┐рдХрд╛рд▓реЗрдВ;
    • рдПрдХ рдирдпрд╛ рдЖрдВрддрд░рд┐рдХ рдиреЛрдб рдмрдирд╛рдПрдВ, рдЬрд╣рд╛рдВ рдпреЗ рджреЛ рдиреЛрдб рдмрдЪреНрдЪреЗ рд╣реЛрдВрдЧреЗ, рдФрд░ рдШрдЯрдирд╛ рдХреА рдЖрд╡реГрддреНрддрд┐ рдЗрди рджреЛ рдиреЛрдбреНрд╕ рдХреА рдЖрд╡реГрддреНрддрд┐рдпреЛрдВ рдХреЗ рдпреЛрдЧ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛрдЧреАред
    • рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдХрддрд╛рд░ рдореЗрдВ рдПрдХ рдирдпрд╛ рдиреЛрдб рдЬреЛрдбрд╝реЗрдВред
  3. рдХреЗрд╡рд▓ рд╢реЗрд╖ рдиреЛрдб рд░реВрдЯ рд╣реЛрдЧрд╛, рдФрд░ рдпрд╣ рдкреЗрдбрд╝ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЛ рдкреВрд░рд╛ рдХрд░реЗрдЧрд╛ред

рдХрд▓реНрдкрдирд╛ рдХреАрдЬрд┐рдП рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреБрдЫ рдкрд╛рда рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдХреЗрд╡рд▓ рд╡рд░реНрдг рд╣реИрдВ "рдП рдмреА рд╕реА рдбреА" ╨╕ "рддрдерд╛", рдФрд░ рдЙрдирдХреА рдЖрд╡реГрддреНрддрд┐ рдЖрд╡реГрддреНрддрд┐рдпрд╛рдБ рдХреНрд░рдорд╢рдГ 15, 7, 6, 6 рдФрд░ 5 рд╣реИрдВред рдиреАрдЪреЗ рдРрд╕реЗ рдЪрд┐рддреНрд░ рджрд┐рдП рдЧрдП рд╣реИрдВ рдЬреЛ рдПрд▓реНрдЧреЛрд░рд┐рдердо рдХреЗ рдЪрд░рдгреЛрдВ рдХреЛ рджрд░реНрд╢рд╛рддреЗ рд╣реИрдВред

рд╣рдлрд╝рдореИрди рд╕рдВрдкреАрдбрд╝рди рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо

рд╣рдлрд╝рдореИрди рд╕рдВрдкреАрдбрд╝рди рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо

рд╣рдлрд╝рдореИрди рд╕рдВрдкреАрдбрд╝рди рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо

рд╣рдлрд╝рдореИрди рд╕рдВрдкреАрдбрд╝рди рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо

рд╣рдлрд╝рдореИрди рд╕рдВрдкреАрдбрд╝рди рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо

рд░реВрдЯ рд╕реЗ рдХрд┐рд╕реА рднреА рдЕрдВрддрд┐рдо рдиреЛрдб рдХрд╛ рдкрде рдЙрд╕ рдЕрдВрдд рдиреЛрдб рд╕реЗ рдЬреБрдбрд╝реЗ рд╡рд░реНрдг рдХреЗ рдЕрдиреБрд░реВрдк рдЗрд╖реНрдЯрддрдо рдЙрдкрд╕рд░реНрдЧ рдХреЛрдб (рдЬрд┐рд╕реЗ рд╣рдлрдореИрди рдХреЛрдб рднреА рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ) рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░реЗрдЧрд╛ред

рд╣рдлрд╝рдореИрди рд╕рдВрдкреАрдбрд╝рди рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо
рд╣рдлрдореИрди рдХрд╛ рдкреЗрдбрд╝

рдиреАрдЪреЗ рдЖрдкрдХреЛ C++ рдФрд░ Java рдореЗрдВ рд╣рдлрд╝рдореИрди рдХрдореНрдкреНрд░реЗрд╢рди рдПрд▓реНрдЧреЛрд░рд┐рдердо рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдорд┐рд▓реЗрдЧрд╛:

#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% рд╕реЗ рд╕рдВрдХреБрдЪрд┐рдд рд╣реИред рдЙрдкрд░реЛрдХреНрдд рд╕реА ++ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдореЗрдВ, рд╣рдо рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рдкрдврд╝рдиреЗ рдпреЛрдЧреНрдп рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдиреНрдХреЛрдбреЗрдб рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреНрд▓рд╛рд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред

рдХреНрдпреЛрдВрдХрд┐ рдХреБрд╢рд▓ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдХрддрд╛рд░ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЛ рдкреНрд░рддрд┐ рд╕рдореНрдорд┐рд▓рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдУ (рд▓реЙрдЧ (рдПрди)) рд╕рдордп, рд▓реЗрдХрд┐рди рдПрдХ рдкреВрд░реНрдг рдмрд╛рдЗрдирд░реА рдЯреНрд░реА рдореЗрдВ N рдкрддреНрддреЗ рдореМрдЬреВрдж рд╣реИрдВ 2N-1 рдиреЛрдбреНрд╕, рдФрд░ рд╣рдлрд╝рдореИрди рдЯреНрд░реА рдПрдХ рдкреВрд░реНрдг рдмрд╛рдЗрдирд░реА рдЯреНрд░реА рд╣реИ, рдлрд┐рд░ рдПрд▓реНрдЧреЛрд░рд┐рдердо рдЪрд▓рддрд╛ рд╣реИ рдУ (рдПрдирдПрд▓рдУрдЬреА (рдПрди)) рд╕рдордп, рдХрд╣рд╛рдБ N - рдкрд╛рддреНрд░ред

рд╕реВрддреНрд░реЛрдВ рдХрд╛ рдХрд╣рдирд╛ рд╣реИ:

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

рдХреЛрд░реНрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдФрд░ рдЬрд╛рдиреЗрдВред

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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╝реЗрдВ