Advertisement
Guest User

Untitled

a guest
Sep 18th, 2019
148
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.98 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6.  
  7. namespace лаба_1
  8. {
  9. class Program
  10. {
  11. public class CharProbability : IComparable
  12. {
  13. public char Character;
  14. public double Probability;
  15. public CharProbability(char Character, double Probability)
  16. {
  17. this.Character = Character;
  18. this.Probability = Probability;
  19. }
  20.  
  21. public int CompareTo(object obj)
  22. {
  23. CharProbability secondCharProbability = (CharProbability)obj;
  24. return this.Probability.CompareTo(secondCharProbability.Probability);
  25. }
  26. }
  27.  
  28.  
  29. static public void ShannonFanoCode(List<CharProbability> charProbabilities, Dictionary<char,string> CharCode, int l, int r)
  30. {
  31. if (l == r)
  32. return;
  33. double sum = 0;
  34. for (int i = l; i <= r; i++)
  35. sum += charProbabilities[i].Probability;
  36. double half = sum / 2;
  37. double SumFirstGroup = 0;
  38. int GroupSeparationIndex = 0;
  39. for (int i = l; i <= r; i++)
  40. {
  41. if(SumFirstGroup + charProbabilities[i].Probability > half)
  42. {
  43. if (half - SumFirstGroup > charProbabilities[i].Probability / 2)
  44. GroupSeparationIndex = i;
  45. else
  46. GroupSeparationIndex = i - 1;
  47. break;
  48. }
  49. SumFirstGroup += charProbabilities[i].Probability;
  50. }
  51. for(int i = l; i <= GroupSeparationIndex; i++)
  52. {
  53. CharCode[charProbabilities[i].Character] += "0";
  54. }
  55. for (int i = GroupSeparationIndex+1; i <= r; i++)
  56. {
  57. CharCode[charProbabilities[i].Character] += "1";
  58. }
  59. ShannonFanoCode(charProbabilities, CharCode, l, GroupSeparationIndex);
  60. ShannonFanoCode(charProbabilities, CharCode, GroupSeparationIndex + 1, r);
  61. }
  62.  
  63.  
  64. static void Main(string[] args)
  65. {
  66. Console.Write("Enter the string: ");
  67. string StartedInputString = Console.ReadLine();
  68. StartedInputString = StartedInputString.ToLower();
  69. string InputString = StartedInputString.Replace(" ", string.Empty);
  70. Dictionary<char, int> CharCount = new Dictionary<char, int>();
  71. for(int i = 0; i< InputString.Length; i++)
  72. {
  73. if (!CharCount.Keys.Contains(InputString[i]))
  74. CharCount[InputString[i]] = 1;
  75. else
  76. CharCount[InputString[i]]++;
  77. }
  78. List<CharProbability> charProbabilities = new List<CharProbability>();
  79. foreach(char character in CharCount.Keys)
  80. {
  81. charProbabilities.Add(new CharProbability(character,CharCount[character] / (double)InputString.Length));
  82. }
  83. charProbabilities.Sort();
  84. charProbabilities.Reverse();
  85. Dictionary<char, string> CharCode = new Dictionary<char, string>();
  86. foreach(char character in CharCount.Keys)
  87. {
  88. CharCode[character] = "";
  89. }
  90. ShannonFanoCode(charProbabilities, CharCode, 0, charProbabilities.Count-1);
  91.  
  92.  
  93. for(int i = 0; i < StartedInputString.Length; i++)
  94. {
  95. if(StartedInputString[i] == ' ')
  96. Console.Write(' ');
  97. else
  98. Console.Write(CharCode[StartedInputString[i]]);
  99. Console.Write(".");
  100. }
  101. Console.WriteLine();
  102.  
  103. foreach(char character in CharCode.Keys)
  104. {
  105. Console.WriteLine($"{character} -> {CharCode[character]}");
  106. }
  107. }
  108. }
  109. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement