Алгоритм Хаффмана.Индекс вышел за пределы массива - C#

Узнай цену своей работы

Формулировка задачи:

Добрый вечер! Возникла проблем,писал алгоритм Хаффмана по методичкам и при работе выдаёт исключение...
Листинг программы
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.IO;
  6. using System.Threading.Tasks;
  7. namespace Huffman
  8. {
  9. class hafman
  10. {
  11. string ReverseString(string s)
  12. {
  13. char[] arr = s.ToCharArray();
  14. Array.Reverse(arr);
  15. return new string(arr);
  16. }
  17. void Swap<T>(ref T x, ref T y)
  18. {
  19. T p = x;
  20. x = y;
  21. y = p;
  22. }
  23.  
  24. void Sort<T>(ref double[] x, ref T[] y)
  25. {
  26. for (int i = 0; i < x.Length; ++i)
  27. for (int j = 0; j < x.Length - 1; ++j)
  28. if (x[j] < x[j + 1])
  29. {
  30. Swap(ref x[j], ref x[j + 1]);
  31. Swap(ref y[j], ref y[j + 1]);
  32. }
  33. }
  34.  
  35. public hafman()
  36. {
  37. StreamWriter s = new StreamWriter(@"c:\1.txt");
  38. Random rand = new Random();
  39. Console.WriteLine("длина алфавита");
  40. int len = Convert.ToInt32(Console.ReadLine());
  41. int[] a, b;
  42. double[] c, d;
  43. string[] h, e1;
  44. int j, u, i;
  45. a = new int[len];
  46. d = new double[len];
  47. c = new double[len];
  48. h = new string[len];
  49. e1 = new string[len];
  50. for (i = 0; i < h.Length; ++i)
  51. h[i] = string.Empty;
  52. Console.WriteLine("количество символов в алфавите");
  53. len = Convert.ToInt32(Console.ReadLine());
  54. b = new int[len];
  55. for (i = 0; i < a.Length; ++i)
  56. {
  57. a[i] = i + 1;
  58. e1[i] = (i + 1).ToString();
  59. }
  60. Console.WriteLine("вероятности");
  61. var aa = Console.ReadLine().Split(new char[] { }).Select(x => Convert.ToDouble(x)).ToArray();
  62. d[0] = aa[0];
  63. for (i = 1; i < a.Length; ++i)
  64. d[i] = d[i - 1] + aa[i];-----Здесь ругается на исключение Индекс вышел за пределы массива
  65. for (i = 0; i < b.Length; ++i)
  66. {
  67. u = 0;
  68. j = rand.Next(0, Convert.ToInt32(d[d.Length - 1]));
  69. while (j > d[u]) { ++u; };
  70. b[i] = a[u];
  71. }
  72. s.WriteLine("входное сообщение");
  73. string hh = string.Empty;
  74. for (i = 0; i < b.Length; ++i)
  75. {
  76. hh += b[i] + " ";
  77. }
  78. s.WriteLine(hh);
  79. s.WriteLine("");
  80. s.WriteLine("Вероятности появления символа :");
  81. Array.Reverse(aa);
  82. for (i = 0; i < a.Length; ++i)
  83. {
  84. s.WriteLine((i + 1) + ": " + aa[i]);
  85. }
  86. Sort(ref c, ref e1);
  87. Array.Reverse(c);
  88. for (j = c.Length - 1; j > 0; --j)
  89. {
  90. c[j - 1] += c[j];
  91. foreach (var x in e1[j])
  92. h[(x - '0') - 1] += 0;
  93. foreach (var x in e1[j - 1])
  94. h[(x - '0') - 1] += 1;
  95. e1[j - 1] += e1[j];
  96. Sort(ref c, ref e1);
  97. Array.Reverse(c);
  98. }
  99. s.WriteLine(" ");
  100. s.WriteLine("Результат :");
  101. for (i = 0; i < a.Length; ++i)
  102. {
  103. h[i] = ReverseString(h[i]);
  104. s.WriteLine(" " + (i + 1) + " = " + h[i]);
  105. }
  106. for (i = 0; i < d.Length; ++i)
  107. d[i] = b.Count(x => x == i + 1) * h[i].Length;
  108. int[] c2 = new int[Convert.ToInt32(d.Sum())];
  109.  
  110. for (j = 0, i = 0; j < b.Length; ++j)
  111. foreach (var x in h[b[j] - 1])
  112. c2[i++] = x - '0';
  113. s.WriteLine("");
  114. s.WriteLine("Закодированное сообщение");
  115. s.WriteLine(String.Join(" ", new List<int>(c2).ConvertAll(x => x.ToString()).ToArray()));
  116. b = new int[205];
  117. int i1, u2 = -1;
  118.  
  119. string hh1 = string.Empty; ;
  120. string r = string.Empty;
  121. string k = String.Join("", new List<int>(c2).ConvertAll(x => x.ToString()).ToArray());
  122. for (j = 0; j < k.Length; ++j)
  123. for (r += k[j], i = h.Min(x => x.Length); i < h.Max(x => x.Length); ++i)
  124. if (r.Length < i)
  125. break;
  126. else
  127. for (i1 = 0; i1 < h.Length; ++i1)
  128. if (r == h[i1])
  129. {
  130. b[++u2] = ++i1;
  131. r = string.Empty;
  132. break;
  133. }
  134. for (j = 0; j < b.Length; ++j) if (b[j] != 0) hh1 += b[j] + " "; else break;
  135. s.WriteLine("декодированное сообщение:");
  136. s.WriteLine(hh1);
  137. s.Close();
  138. }
  139.  
  140. }
  141. class Program
  142. {
  143. static void Main(string[] args)
  144. {
  145. hafman h = new hafman();
  146. Console.ReadKey();
  147. }
  148. }
  149. }

Решение задачи: «Алгоритм Хаффмана.Индекс вышел за пределы массива»

textual
Листинг программы
  1. for (j = c.Length - 1; j > 0; --j)
  2.             {
  3.                 c[j - 1] += c[j];
  4.  
  5.                 foreach (var x in e1[j])
  6.                     h[(x - '0') - 1] += 0;----Индекс за пределы массива.
  7.  
  8.                 foreach (var x in e1[j - 1])
  9.                     h[(x - '0') - 1] += 1;
  10.  
  11.                 e1[j - 1] += e1[j];
  12.  
  13.                 Sort(ref c, ref e1);
  14.                 Array.Reverse(c);
  15.  
  16.             }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

11   голосов , оценка 3.727 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы