āĻšāĻžāĻĢāĻŽā§āĻ¯āĻžāĻ¨ āĻ•āĻŽā§āĻĒā§āĻ°ā§‡āĻļāĻ¨ āĻ…ā§āĻ¯āĻžāĻ˛āĻ—āĻ°āĻŋāĻĻāĻŽ

āĻ•ā§‹āĻ°ā§āĻ¸ āĻļā§āĻ°ā§āĻ° āĻ†āĻ—ā§‡ "āĻŦāĻŋāĻ•āĻžāĻļāĻ•āĻžāĻ°ā§€āĻĻā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻ…ā§āĻ¯āĻžāĻ˛āĻ—āĻ°āĻŋāĻĻāĻŽ" āĻ†āĻĒāĻ¨āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻ…āĻ¨ā§āĻ¯ āĻāĻ•āĻŸāĻŋ āĻĻāĻ°āĻ•āĻžāĻ°ā§€ āĻ‰āĻĒāĻžāĻĻāĻžāĻ¨ā§‡āĻ° āĻ…āĻ¨ā§āĻŦāĻžāĻĻ āĻĒā§āĻ°āĻ¸ā§āĻ¤ā§āĻ¤ āĻ•āĻ°āĻž āĻšāĻ¯āĻŧā§‡āĻ›ā§‡āĨ¤

āĻšāĻžāĻĢāĻŽā§āĻ¯āĻžāĻ¨ āĻ•ā§‹āĻĄāĻŋāĻ‚ āĻšāĻ˛ āĻāĻ•āĻŸāĻŋ āĻĄā§‡āĻŸāĻž āĻ•āĻŽā§āĻĒā§āĻ°ā§‡āĻļāĻ¨ āĻ…ā§āĻ¯āĻžāĻ˛āĻ—āĻ°āĻŋāĻĻāĻŽ āĻ¯āĻž āĻĢāĻžāĻ‡āĻ˛ āĻ•āĻŽā§āĻĒā§āĻ°ā§‡āĻļāĻ¨ā§‡āĻ° āĻĒā§āĻ°āĻžāĻĨāĻŽāĻŋāĻ• āĻ§āĻžāĻ°āĻŖāĻž āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°ā§‡āĨ¤ āĻāĻ‡ āĻ¨āĻŋāĻŦāĻ¨ā§āĻ§ā§‡, āĻ†āĻŽāĻ°āĻž āĻ¸ā§āĻĨāĻŋāĻ° āĻāĻŦāĻ‚ āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨āĻļā§€āĻ˛ āĻĻā§ˆāĻ°ā§āĻ˜ā§āĻ¯ā§‡āĻ° āĻāĻ¨āĻ•ā§‹āĻĄāĻŋāĻ‚, āĻ…āĻ¨āĻ¨ā§āĻ¯āĻ­āĻžāĻŦā§‡ āĻĄāĻŋāĻ•ā§‹āĻĄā§‡āĻŦāĻ˛ āĻ•ā§‹āĻĄ, āĻ‰āĻĒāĻ¸āĻ°ā§āĻ—ā§‡āĻ° āĻ¨āĻŋāĻ¯āĻŧāĻŽ āĻāĻŦāĻ‚ āĻāĻ•āĻŸāĻŋ āĻšāĻžāĻĢāĻŽā§āĻ¯āĻžāĻ¨ āĻŸā§āĻ°āĻŋ āĻ¤ā§ˆāĻ°āĻŋāĻ° āĻŦāĻŋāĻˇāĻ¯āĻŧā§‡ āĻ•āĻĨāĻž āĻŦāĻ˛āĻŦāĨ¤

āĻ†āĻŽāĻ°āĻž āĻœāĻžāĻ¨āĻŋ āĻ¯ā§‡ āĻĒā§āĻ°āĻ¤āĻŋāĻŸāĻŋ āĻ…āĻ•ā§āĻˇāĻ° 0 āĻāĻŦāĻ‚ 1 āĻāĻ° āĻ•ā§āĻ°āĻŽ āĻšāĻŋāĻ¸āĻžāĻŦā§‡ āĻ¸āĻ‚āĻ°āĻ•ā§āĻˇāĻŖ āĻ•āĻ°āĻž āĻšāĻ¯āĻŧ āĻāĻŦāĻ‚ 8 āĻŦāĻŋāĻŸ āĻ¨ā§‡āĻ¯āĻŧāĨ¤ āĻāĻ•ā§‡ āĻ¨āĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āĻŸ āĻĻā§ˆāĻ°ā§āĻ˜ā§āĻ¯ā§‡āĻ° āĻāĻ¨āĻ•ā§‹āĻĄāĻŋāĻ‚ āĻŦāĻ˛āĻž āĻšāĻ¯āĻŧ āĻ•āĻžāĻ°āĻŖ āĻĒā§āĻ°āĻ¤āĻŋāĻŸāĻŋ āĻ…āĻ•ā§āĻˇāĻ° āĻ¸āĻ‚āĻ°āĻ•ā§āĻˇāĻŖā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻāĻ•āĻ‡ āĻ¨āĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āĻŸ āĻ¸āĻ‚āĻ–ā§āĻ¯āĻ• āĻŦāĻŋāĻŸ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡āĨ¤

āĻ§āĻ°āĻž āĻ¯āĻžāĻ• āĻ†āĻŽāĻ°āĻž āĻŸā§‡āĻ•ā§āĻ¸āĻŸ āĻĻā§‡āĻ“āĻ¯āĻŧāĻž āĻ•āĻ°āĻ›āĻŋ. āĻ•āĻŋāĻ­āĻžāĻŦā§‡ āĻ†āĻŽāĻ°āĻž āĻāĻ•āĻŸāĻŋ āĻāĻ•āĻ• āĻ…āĻ•ā§āĻˇāĻ° āĻ¸āĻ‚āĻ°āĻ•ā§āĻˇāĻŖ āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻœāĻ¨ā§€āĻ¯āĻŧ āĻ¸ā§āĻĨāĻžāĻ¨ā§‡āĻ° āĻĒāĻ°āĻŋāĻŽāĻžāĻŖ āĻ•āĻŽāĻžāĻ¤ā§‡ āĻĒāĻžāĻ°āĻŋ?

āĻĒā§āĻ°āĻ§āĻžāĻ¨ āĻ§āĻžāĻ°āĻŖāĻž āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨āĻļā§€āĻ˛ āĻĻā§ˆāĻ°ā§āĻ˜ā§āĻ¯ āĻāĻ¨āĻ•ā§‹āĻĄāĻŋāĻ‚ āĻšāĻ¯āĻŧ. āĻ†āĻŽāĻ°āĻž āĻāĻ‡ āĻ¸āĻ¤ā§āĻ¯āĻŸāĻŋ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°āĻŋ āĻ¯ā§‡ āĻĒāĻžāĻ ā§āĻ¯ā§‡āĻ° āĻ•āĻŋāĻ›ā§ āĻ…āĻ•ā§āĻˇāĻ° āĻ…āĻ¨ā§āĻ¯āĻĻā§‡āĻ° āĻšā§‡āĻ¯āĻŧā§‡ āĻŦā§‡āĻļāĻŋ āĻ˜āĻ¨ āĻ˜āĻ¨ āĻ˜āĻŸā§‡ (āĻāĻ–āĻžāĻ¨ā§‡ āĻĻā§‡āĻ–ā§āĻ¨) āĻāĻ•āĻŸāĻŋ āĻ…ā§āĻ¯āĻžāĻ˛āĻ—āĻ°āĻŋāĻĻāĻŽ āĻŦāĻŋāĻ•āĻžāĻļ āĻ•āĻ°āĻ¤ā§‡ āĻ¯āĻž āĻ•āĻŽ āĻŦāĻŋāĻŸā§‡ āĻ…āĻ•ā§āĻˇāĻ°ā§‡āĻ° āĻāĻ•āĻ‡ āĻ•ā§āĻ°āĻŽ āĻ‰āĻĒāĻ¸ā§āĻĨāĻžāĻĒāĻ¨ āĻ•āĻ°āĻŦā§‡āĨ¤ āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨āĻļā§€āĻ˛ āĻĻā§ˆāĻ°ā§āĻ˜ā§āĻ¯ā§‡āĻ° āĻāĻ¨āĻ•ā§‹āĻĄāĻŋāĻ‚-āĻ, āĻ†āĻŽāĻ°āĻž āĻ…āĻ•ā§āĻˇāĻ°āĻ—ā§āĻ˛āĻŋāĻ•ā§‡ āĻāĻ•āĻŸāĻŋ āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨āĻļā§€āĻ˛ āĻ¸āĻ‚āĻ–ā§āĻ¯āĻ• āĻŦāĻŋāĻŸ āĻŦāĻ°āĻžāĻĻā§āĻĻ āĻ•āĻ°āĻŋ, āĻāĻŸāĻŋ āĻāĻ•āĻŸāĻŋ āĻĒā§āĻ°āĻĻāĻ¤ā§āĻ¤ āĻĒāĻžāĻ ā§āĻ¯ā§‡ āĻ•āĻ¤ āĻ˜āĻ¨ āĻ˜āĻ¨ āĻĒā§āĻ°āĻĻāĻ°ā§āĻļāĻŋāĻ¤ āĻšāĻŦā§‡ āĻ¤āĻžāĻ° āĻ‰āĻĒāĻ° āĻ¨āĻŋāĻ°ā§āĻ­āĻ° āĻ•āĻ°ā§‡āĨ¤ āĻļā§‡āĻˇ āĻĒāĻ°ā§āĻ¯āĻ¨ā§āĻ¤, āĻ•āĻŋāĻ›ā§ āĻ…āĻ•ā§āĻˇāĻ° 1 āĻŦāĻŋāĻŸā§‡āĻ° āĻŽāĻ¤ā§‹ āĻ•āĻŽ āĻ¸āĻŽāĻ¯āĻŧ āĻ¨āĻŋāĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡, āĻ…āĻ¨ā§āĻ¯āĻ°āĻž 2 āĻŦāĻŋāĻŸ, 3 āĻŦāĻž āĻ¤āĻžāĻ° āĻŦā§‡āĻļāĻŋ āĻ¸āĻŽāĻ¯āĻŧ āĻ¨āĻŋāĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĨ¤ āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨āĻļā§€āĻ˛ āĻĻā§ˆāĻ°ā§āĻ˜ā§āĻ¯ā§‡āĻ° āĻāĻ¨āĻ•ā§‹āĻĄāĻŋāĻ‚āĻ¯āĻŧā§‡āĻ° āĻ¸āĻŽāĻ¸ā§āĻ¯āĻžāĻŸāĻŋ āĻ•ā§‡āĻŦāĻ˛āĻŽāĻžāĻ¤ā§āĻ° āĻ•ā§āĻ°āĻŽāĻŸāĻŋāĻ° āĻĒāĻ°āĻŦāĻ°ā§āĻ¤ā§€ āĻĄāĻŋāĻ•ā§‹āĻĄāĻŋāĻ‚āĨ¤

āĻ•āĻŋāĻ­āĻžāĻŦā§‡, āĻŦāĻŋāĻŸ āĻ•ā§āĻ°āĻŽ āĻŦā§āĻĻā§āĻ§āĻŋāĻŽāĻžāĻ¨, āĻāĻŸāĻž āĻĻā§āĻŦā§āĻ¯āĻ°ā§āĻĨāĻšā§€āĻ¨āĻ­āĻžāĻŦā§‡ āĻĄāĻŋāĻ•ā§‹āĻĄ?

āĻ˛āĻžāĻ‡āĻ¨āĻŸāĻŋ āĻŦāĻŋāĻŦā§‡āĻšāĻ¨āĻž āĻ•āĻ°ā§āĻ¨ "abacdab". āĻāĻŸāĻŋāĻ¤ā§‡ 8āĻŸāĻŋ āĻ…āĻ•ā§āĻˇāĻ° āĻ°āĻ¯āĻŧā§‡āĻ›ā§‡ āĻāĻŦāĻ‚ āĻāĻ•āĻŸāĻŋ āĻ¨āĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āĻŸ āĻĻā§ˆāĻ°ā§āĻ˜ā§āĻ¯ āĻāĻ¨āĻ•ā§‹āĻĄ āĻ•āĻ°āĻžāĻ° āĻ¸āĻŽāĻ¯āĻŧ āĻāĻŸāĻŋ āĻ¸āĻ‚āĻ°āĻ•ā§āĻˇāĻŖ āĻ•āĻ°āĻ¤ā§‡ 64 āĻŦāĻŋāĻŸ āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻœāĻ¨ āĻšāĻŦā§‡āĨ¤ āĻ˛āĻ•ā§āĻˇāĻŖā§€āĻ¯āĻŧ āĻĢā§āĻ°āĻŋāĻ•ā§‹āĻ¯āĻŧā§‡āĻ¨ā§āĻ¸āĻŋ āĻ˛āĻ•ā§āĻˇā§āĻ¯ āĻ•āĻ°ā§āĻ¨ "a", "b", "c" и "āĻĄāĻŋ" āĻ¯āĻĨāĻžāĻ•ā§āĻ°āĻŽā§‡ 4, 2, 1, 1 āĻ¸āĻŽāĻžāĻ¨āĨ¤ āĻāĻ° āĻ•āĻ˛ā§āĻĒāĻ¨āĻž āĻ•āĻ°āĻžāĻ° āĻšā§‡āĻˇā§āĻŸāĻž āĻ•āĻ°āĻž āĻ¯āĻžāĻ• "abacdab" āĻ•āĻŽ āĻŦāĻŋāĻŸ, āĻ¯ā§‡ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ "āĻĒā§āĻ°āĻ¤āĻŋ" āĻ¤ā§āĻ˛āĻ¨āĻžāĻ¯āĻŧ āĻ†āĻ°ā§‹ āĻ˜āĻ¨ āĻ˜āĻ¨ āĻ˜āĻŸā§‡ "āĻ–"āĻāĻŦāĻ‚ "āĻ–" āĻ¤ā§āĻ˛āĻ¨āĻžāĻ¯āĻŧ āĻ†āĻ°ā§‹ āĻ˜āĻ¨ āĻ˜āĻ¨ āĻ˜āĻŸā§‡ "āĻ—" и "āĻĄāĻŋ". āĻ•ā§‹āĻĄāĻŋāĻ‚ āĻĻāĻŋāĻ¯āĻŧā§‡ āĻļā§āĻ°ā§ āĻ•āĻ°āĻž āĻ¯āĻžāĻ• "āĻĒā§āĻ°āĻ¤āĻŋ" 0 āĻāĻ° āĻ¸āĻŽāĻžāĻ¨ āĻāĻ• āĻŦāĻŋāĻŸ āĻ¸āĻš, "āĻ–" āĻ†āĻŽāĻ°āĻž āĻāĻ•āĻŸāĻŋ āĻĻā§āĻ‡-āĻŦāĻŋāĻŸ āĻ•ā§‹āĻĄ 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", "b", "c" и "āĻĄāĻŋ" āĻ•ā§‹āĻĄ āĻ¯ā§‡ āĻ‰āĻĒāĻ¸āĻ°ā§āĻ— āĻ¨āĻŋāĻ¯āĻŧāĻŽ āĻ¸āĻ¨ā§āĻ¤ā§āĻˇā§āĻŸ.

a
0

b
10

c
110

d
111

āĻāĻ‡ āĻāĻ¨āĻ•ā§‹āĻĄāĻŋāĻ‚, āĻ¸ā§āĻŸā§āĻ°āĻŋāĻ‚ āĻ¸āĻ™ā§āĻ—ā§‡ "abacdab" āĻšāĻŋāĻ¸āĻžāĻŦā§‡ āĻāĻ¨āĻ•ā§‹āĻĄ āĻ•āĻ°āĻž āĻšāĻŦā§‡ 00100100011010 (0|0|10|0|100|011|0|10)āĨ¤ āĻāĻŦāĻ‚ āĻāĻ–āĻžāĻ¨ā§‡ 00100100011010 āĻ†āĻŽāĻ°āĻž āĻ‡āĻ¤āĻŋāĻŽāĻ§ā§āĻ¯ā§‡āĻ‡ āĻĻā§āĻŦā§āĻ¯āĻ°ā§āĻĨāĻšā§€āĻ¨āĻ­āĻžāĻŦā§‡ āĻĄāĻŋāĻ•ā§‹āĻĄ āĻ•āĻ°āĻ¤ā§‡ āĻāĻŦāĻ‚ āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻ†āĻ¸āĻ˛ āĻ¸ā§āĻŸā§āĻ°āĻŋāĻ‚āĻ¯āĻŧā§‡ āĻĢāĻŋāĻ°ā§‡ āĻ¯ā§‡āĻ¤ā§‡ āĻ¸āĻ•ā§āĻˇāĻŽ āĻšāĻŦ "abacdab".

āĻšāĻžāĻĢāĻŽā§āĻ¯āĻžāĻ¨ āĻ•ā§‹āĻĄāĻŋāĻ‚

āĻāĻ–āĻ¨ āĻ¯ā§‡āĻšā§‡āĻ¤ā§ āĻ†āĻŽāĻ°āĻž āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨āĻļā§€āĻ˛ āĻĻā§ˆāĻ°ā§āĻ˜ā§āĻ¯ āĻāĻ¨āĻ•ā§‹āĻĄāĻŋāĻ‚ āĻāĻŦāĻ‚ āĻĒā§āĻ°āĻŋāĻĢāĻŋāĻ•ā§āĻ¸ āĻ¨āĻŋāĻ¯āĻŧāĻŽ āĻ¨āĻŋāĻ¯āĻŧā§‡ āĻ•āĻžāĻœ āĻ•āĻ°ā§‡āĻ›āĻŋ, āĻ†āĻ¸ā§āĻ¨ āĻšāĻžāĻĢāĻŽā§āĻ¯āĻžāĻ¨ āĻāĻ¨āĻ•ā§‹āĻĄāĻŋāĻ‚ āĻ¸āĻŽā§āĻĒāĻ°ā§āĻ•ā§‡ āĻ•āĻĨāĻž āĻŦāĻ˛āĻŋāĨ¤

āĻĒāĻĻā§āĻ§āĻ¤āĻŋāĻŸāĻŋ āĻŦāĻžāĻ‡āĻ¨āĻžāĻ°āĻŋ āĻ—āĻžāĻ› āĻ¤ā§ˆāĻ°āĻŋāĻ° āĻ‰āĻĒāĻ° āĻ­āĻŋāĻ¤ā§āĻ¤āĻŋ āĻ•āĻ°ā§‡āĨ¤ āĻāĻŸāĻŋāĻ¤ā§‡, āĻ¨ā§‹āĻĄ āĻšā§‚āĻĄāĻŧāĻžāĻ¨ā§āĻ¤ āĻŦāĻž āĻ…āĻ­ā§āĻ¯āĻ¨ā§āĻ¤āĻ°ā§€āĻŖ āĻšāĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĨ¤ āĻĒā§āĻ°āĻžāĻĨāĻŽāĻŋāĻ•āĻ­āĻžāĻŦā§‡, āĻ¸āĻŽāĻ¸ā§āĻ¤ āĻ¨ā§‹āĻĄāĻ•ā§‡ āĻĒāĻžāĻ¤āĻž (āĻŸāĻžāĻ°ā§āĻŽāĻŋāĻ¨āĻžāĻ˛) āĻšāĻŋāĻ¸āĻžāĻŦā§‡ āĻŦāĻŋāĻŦā§‡āĻšāĻ¨āĻž āĻ•āĻ°āĻž āĻšāĻ¯āĻŧ, āĻ¯āĻž āĻĒā§āĻ°āĻ¤ā§€āĻ• āĻ¨āĻŋāĻœā§‡āĻ‡ āĻāĻŦāĻ‚ āĻāĻ° āĻ“āĻœāĻ¨ (āĻ…āĻ°ā§āĻĨāĻžā§Ž, āĻ¸āĻ‚āĻ˜āĻŸāĻ¨ā§‡āĻ° āĻĢā§āĻ°āĻŋāĻ•ā§‹āĻ¯āĻŧā§‡āĻ¨ā§āĻ¸āĻŋ) āĻĒā§āĻ°āĻ¤āĻŋāĻ¨āĻŋāĻ§āĻŋāĻ¤ā§āĻŦ āĻ•āĻ°ā§‡āĨ¤ āĻ…āĻ­ā§āĻ¯āĻ¨ā§āĻ¤āĻ°ā§€āĻŖ āĻ¨ā§‹āĻĄāĻ—ā§āĻ˛āĻŋ āĻšāĻ°āĻŋāĻ¤ā§āĻ°ā§‡āĻ° āĻ“āĻœāĻ¨ āĻ§āĻžāĻ°āĻŖ āĻ•āĻ°ā§‡ āĻāĻŦāĻ‚ āĻĻā§āĻŸāĻŋ āĻŦāĻ‚āĻļāĻ§āĻ° āĻ¨ā§‹āĻĄāĻ•ā§‡ āĻ‰āĻ˛ā§āĻ˛ā§‡āĻ– āĻ•āĻ°ā§‡āĨ¤ āĻ¸āĻžāĻ§āĻžāĻ°āĻŖ āĻšā§āĻ•ā§āĻ¤āĻŋ āĻĻā§āĻŦāĻžāĻ°āĻž, āĻŦāĻŋāĻŸ "0" āĻŦāĻžāĻŽ āĻļāĻžāĻ–āĻž āĻ…āĻ¨ā§āĻ¸āĻ°āĻŖ āĻ•āĻ°ā§‡ āĻĒā§āĻ°āĻ¤āĻŋāĻ¨āĻŋāĻ§āĻŋāĻ¤ā§āĻŦ āĻ•āĻ°ā§‡, āĻāĻŦāĻ‚ "1" - āĻĄāĻžāĻ¨āĻĻāĻŋāĻ•ā§‡. āĻ¸āĻŽā§āĻĒā§‚āĻ°ā§āĻŖ āĻ—āĻžāĻ›ā§‡ N āĻĒāĻžāĻ¤āĻž āĻāĻŦāĻ‚ āĻāĻ¨-1 āĻ…āĻ­ā§āĻ¯āĻ¨ā§āĻ¤āĻ°ā§€āĻŖ āĻ¨ā§‹āĻĄāĨ¤ āĻāĻŸāĻŋ āĻ¸ā§āĻĒāĻžāĻ°āĻŋāĻļ āĻ•āĻ°āĻž āĻšāĻ¯āĻŧ āĻ¯ā§‡ āĻāĻ•āĻŸāĻŋ āĻšāĻžāĻĢāĻŽā§āĻ¯āĻžāĻ¨ āĻ—āĻžāĻ› āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻžāĻ° āĻ¸āĻŽāĻ¯āĻŧ, āĻ¸āĻ°ā§āĻŦā§‹āĻ¤ā§āĻ¤āĻŽ āĻĻā§ˆāĻ°ā§āĻ˜ā§āĻ¯ā§‡āĻ° āĻ•ā§‹āĻĄāĻ—ā§āĻ˛āĻŋ āĻĒā§‡āĻ¤ā§‡ āĻ…āĻŦā§āĻ¯āĻŦāĻšā§ƒāĻ¤ āĻšāĻŋāĻšā§āĻ¨āĻ—ā§āĻ˛āĻŋ āĻŦāĻžāĻ¤āĻŋāĻ˛ āĻ•āĻ°āĻž āĻšāĻŦā§‡ā§ˇ

āĻ†āĻŽāĻ°āĻž āĻāĻ•āĻŸāĻŋ āĻšāĻžāĻĢāĻŽā§āĻ¯āĻžāĻ¨ āĻŸā§āĻ°āĻŋ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻ¤ā§‡ āĻāĻ•āĻŸāĻŋ āĻ…āĻ—ā§āĻ°āĻžāĻ§āĻŋāĻ•āĻžāĻ° āĻ¸āĻžāĻ°āĻŋ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻŦ, āĻ¯ā§‡āĻ–āĻžāĻ¨ā§‡ āĻ¸āĻ°ā§āĻŦāĻ¨āĻŋāĻŽā§āĻ¨ āĻĢā§āĻ°āĻŋāĻ•ā§‹āĻ¯āĻŧā§‡āĻ¨ā§āĻ¸āĻŋ āĻ¸āĻš āĻ¨ā§‹āĻĄāĻ•ā§‡ āĻ¸āĻ°ā§āĻŦā§‹āĻšā§āĻš āĻ…āĻ—ā§āĻ°āĻžāĻ§āĻŋāĻ•āĻžāĻ° āĻĻā§‡āĻ“āĻ¯āĻŧāĻž āĻšāĻŦā§‡āĨ¤ āĻ¨āĻŋāĻ°ā§āĻŽāĻžāĻŖā§‡āĻ° āĻ§āĻžāĻĒāĻ—ā§āĻ˛āĻŋ āĻ¨ā§€āĻšā§‡ āĻŦāĻ°ā§āĻŖāĻ¨āĻž āĻ•āĻ°āĻž āĻšāĻ¯āĻŧā§‡āĻ›ā§‡:

  1. āĻĒā§āĻ°āĻ¤āĻŋāĻŸāĻŋ āĻ…āĻ•ā§āĻˇāĻ°ā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻāĻ•āĻŸāĻŋ āĻ˛āĻŋāĻĢ āĻ¨ā§‹āĻĄ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°ā§āĻ¨ āĻāĻŦāĻ‚ āĻ¤āĻžāĻĻā§‡āĻ° āĻ…āĻ—ā§āĻ°āĻžāĻ§āĻŋāĻ•āĻžāĻ° āĻ¸āĻžāĻ°āĻŋāĻ¤ā§‡ āĻ¯ā§āĻ•ā§āĻ¤ āĻ•āĻ°ā§āĻ¨āĨ¤
  2. āĻ¸āĻžāĻ°āĻŋāĻ¤ā§‡ āĻāĻ•āĻžāĻ§āĻŋāĻ• āĻļā§€āĻŸ āĻĨāĻžāĻ•āĻžāĻ•āĻžāĻ˛ā§€āĻ¨, āĻ¨āĻŋāĻŽā§āĻ¨āĻ˛āĻŋāĻ–āĻŋāĻ¤āĻ—ā§āĻ˛āĻŋ āĻ•āĻ°ā§āĻ¨:
    • āĻ¸āĻžāĻ°āĻŋ āĻĨā§‡āĻ•ā§‡ āĻ¸āĻ°ā§āĻŦā§‹āĻšā§āĻš āĻ…āĻ—ā§āĻ°āĻžāĻ§āĻŋāĻ•āĻžāĻ° (āĻ¸āĻ°ā§āĻŦāĻ¨āĻŋāĻŽā§āĻ¨ āĻĢā§āĻ°āĻŋāĻ•ā§‹āĻ¯āĻŧā§‡āĻ¨ā§āĻ¸āĻŋ) āĻ¸āĻš āĻĻā§āĻŸāĻŋ āĻ¨ā§‹āĻĄ āĻ¸āĻ°āĻžāĻ¨;
    • āĻāĻ•āĻŸāĻŋ āĻ¨āĻ¤ā§āĻ¨ āĻ…āĻ­ā§āĻ¯āĻ¨ā§āĻ¤āĻ°ā§€āĻŖ āĻ¨ā§‹āĻĄ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°ā§āĻ¨, āĻ¯ā§‡āĻ–āĻžāĻ¨ā§‡ āĻāĻ‡ āĻĻā§āĻŸāĻŋ āĻ¨ā§‹āĻĄ āĻļāĻŋāĻļā§ āĻšāĻŦā§‡ āĻāĻŦāĻ‚ āĻ¸āĻ‚āĻ˜āĻŸāĻ¨ā§‡āĻ° āĻĢā§āĻ°āĻŋāĻ•ā§‹āĻ¯āĻŧā§‡āĻ¨ā§āĻ¸āĻŋ āĻāĻ‡ āĻĻā§āĻŸāĻŋ āĻ¨ā§‹āĻĄā§‡āĻ° āĻĢā§āĻ°āĻŋāĻ•ā§‹āĻ¯āĻŧā§‡āĻ¨ā§āĻ¸āĻŋāĻ° āĻ¯ā§‹āĻ—āĻĢāĻ˛ā§‡āĻ° āĻ¸āĻŽāĻžāĻ¨ āĻšāĻŦā§‡āĨ¤
    • āĻ…āĻ—ā§āĻ°āĻžāĻ§āĻŋāĻ•āĻžāĻ° āĻ¸āĻžāĻ°āĻŋāĻ¤ā§‡ āĻāĻ•āĻŸāĻŋ āĻ¨āĻ¤ā§āĻ¨ āĻ¨ā§‹āĻĄ āĻ¯ā§‹āĻ— āĻ•āĻ°ā§āĻ¨āĨ¤
  3. āĻāĻ•āĻŽāĻžāĻ¤ā§āĻ° āĻ…āĻŦāĻļāĻŋāĻˇā§āĻŸ āĻ¨ā§‹āĻĄāĻŸāĻŋ āĻŽā§‚āĻ˛ āĻšāĻŦā§‡ āĻāĻŦāĻ‚ āĻāĻŸāĻŋ āĻ—āĻžāĻ›ā§‡āĻ° āĻ¨āĻŋāĻ°ā§āĻŽāĻžāĻŖ āĻ¸āĻŽā§āĻĒā§‚āĻ°ā§āĻŖ āĻ•āĻ°āĻŦā§‡āĨ¤

āĻ•āĻ˛ā§āĻĒāĻ¨āĻž āĻ•āĻ°ā§āĻ¨ āĻ¯ā§‡ āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻāĻŽāĻ¨ āĻ•āĻŋāĻ›ā§ āĻĒāĻžāĻ ā§āĻ¯ āĻ°āĻ¯āĻŧā§‡āĻ›ā§‡ āĻ¯āĻž āĻļā§āĻ§ā§āĻŽāĻžāĻ¤ā§āĻ° āĻ…āĻ•ā§āĻˇāĻ° āĻ¨āĻŋāĻ¯āĻŧā§‡ āĻ—āĻ āĻŋāĻ¤ "āĻ āĻŦāĻŋ āĻ¸āĻŋ āĻĄāĻŋ" и "āĻāĻŦāĻ‚", āĻāĻŦāĻ‚ āĻ¤āĻžāĻĻā§‡āĻ° āĻ¸āĻ‚āĻ˜āĻŸāĻ¨ āĻĢā§āĻ°āĻŋāĻ•ā§‹āĻ¯āĻŧā§‡āĻ¨ā§āĻ¸āĻŋ āĻ¯āĻĨāĻžāĻ•ā§āĻ°āĻŽā§‡ 15, 7, 6, 6 āĻāĻŦāĻ‚ 5āĨ¤ āĻ¨ā§€āĻšā§‡āĻ° āĻšāĻŋāĻ¤ā§āĻ°āĻ—ā§āĻ˛āĻŋ āĻ…ā§āĻ¯āĻžāĻ˛āĻ—āĻ°āĻŋāĻĻāĻŽā§‡āĻ° āĻ§āĻžāĻĒāĻ—ā§āĻ˛āĻŋāĻ•ā§‡ āĻĒā§āĻ°āĻ¤āĻŋāĻĢāĻ˛āĻŋāĻ¤ āĻ•āĻ°ā§‡ā§ˇ

āĻšāĻžāĻĢāĻŽā§āĻ¯āĻžāĻ¨ āĻ•āĻŽā§āĻĒā§āĻ°ā§‡āĻļāĻ¨ āĻ…ā§āĻ¯āĻžāĻ˛āĻ—āĻ°āĻŋāĻĻāĻŽ

āĻšāĻžāĻĢāĻŽā§āĻ¯āĻžāĻ¨ āĻ•āĻŽā§āĻĒā§āĻ°ā§‡āĻļāĻ¨ āĻ…ā§āĻ¯āĻžāĻ˛āĻ—āĻ°āĻŋāĻĻāĻŽ

āĻšāĻžāĻĢāĻŽā§āĻ¯āĻžāĻ¨ āĻ•āĻŽā§āĻĒā§āĻ°ā§‡āĻļāĻ¨ āĻ…ā§āĻ¯āĻžāĻ˛āĻ—āĻ°āĻŋāĻĻāĻŽ

āĻšāĻžāĻĢāĻŽā§āĻ¯āĻžāĻ¨ āĻ•āĻŽā§āĻĒā§āĻ°ā§‡āĻļāĻ¨ āĻ…ā§āĻ¯āĻžāĻ˛āĻ—āĻ°āĻŋāĻĻāĻŽ

āĻšāĻžāĻĢāĻŽā§āĻ¯āĻžāĻ¨ āĻ•āĻŽā§āĻĒā§āĻ°ā§‡āĻļāĻ¨ āĻ…ā§āĻ¯āĻžāĻ˛āĻ—āĻ°āĻŋāĻĻāĻŽ

āĻ°ā§āĻŸ āĻĨā§‡āĻ•ā§‡ āĻ¯ā§‡āĻ•ā§‹āĻ¨ āĻāĻ¨ā§āĻĄ āĻ¨ā§‹āĻĄ āĻĒāĻ°ā§āĻ¯āĻ¨ā§āĻ¤ āĻāĻ•āĻŸāĻŋ āĻĒāĻžāĻĨ āĻ¸ā§‡āĻ‡ āĻļā§‡āĻˇ āĻ¨ā§‹āĻĄā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻ¯ā§āĻ•ā§āĻ¤ āĻ…āĻ•ā§āĻˇāĻ°ā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻ¸āĻŽā§āĻĒāĻ°ā§āĻ•āĻŋāĻ¤ āĻ¸āĻ°ā§āĻŦā§‹āĻ¤ā§āĻ¤āĻŽ āĻ‰āĻĒāĻ¸āĻ°ā§āĻ— āĻ•ā§‹āĻĄ (āĻšāĻžāĻĢāĻŽā§āĻ¯āĻžāĻ¨ āĻ•ā§‹āĻĄ āĻ¨āĻžāĻŽā§‡āĻ“ āĻĒāĻ°āĻŋāĻšāĻŋāĻ¤) āĻ¸āĻ‚āĻ°āĻ•ā§āĻˇāĻŖ āĻ•āĻ°āĻŦā§‡āĨ¤

āĻšāĻžāĻĢāĻŽā§āĻ¯āĻžāĻ¨ āĻ•āĻŽā§āĻĒā§āĻ°ā§‡āĻļāĻ¨ āĻ…ā§āĻ¯āĻžāĻ˛āĻ—āĻ°āĻŋāĻĻāĻŽ
āĻšāĻžāĻĢāĻŽā§āĻ¯āĻžāĻ¨ āĻ—āĻžāĻ›

āĻ¨ā§€āĻšā§‡ āĻ†āĻĒāĻ¨āĻŋ 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(āĻ˛āĻ—(N)) āĻ¸āĻŽāĻ¯āĻŧ, āĻ•āĻŋāĻ¨ā§āĻ¤ā§ āĻ¸āĻ™ā§āĻ—ā§‡ āĻāĻ•āĻŸāĻŋ āĻ¸āĻŽā§āĻĒā§‚āĻ°ā§āĻŖ āĻŦāĻžāĻ‡āĻ¨āĻžāĻ°āĻŋ āĻ—āĻžāĻ› N āĻĒāĻžāĻ¤āĻž āĻ‰āĻĒāĻ¸ā§āĻĨāĻŋāĻ¤ 2N-1 āĻ¨ā§‹āĻĄ, āĻāĻŦāĻ‚ āĻšāĻžāĻĢāĻŽā§āĻ¯āĻžāĻ¨ āĻŸā§āĻ°āĻŋ āĻāĻ•āĻŸāĻŋ āĻ¸āĻŽā§āĻĒā§‚āĻ°ā§āĻŖ āĻŦāĻžāĻ‡āĻ¨āĻžāĻ°āĻŋ āĻŸā§āĻ°āĻŋ, āĻ¤āĻžāĻ°āĻĒāĻ° āĻ…ā§āĻ¯āĻžāĻ˛āĻ—āĻ°āĻŋāĻĻāĻŽ āĻšāĻ˛ā§‡ 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

āĻāĻ•āĻŸāĻŋ āĻŽāĻ¨ā§āĻ¤āĻŦā§āĻ¯ āĻœā§āĻĄāĻŧā§āĻ¨