Перед написанием программы разберемся, в чем суть алгоритма RLE? Суть алгоритма состоит в том, что последовательность из n одинаковых символов k заменяется парой символов nk. Например, нужно закодировать строку “aaaaarooow”, после кодирования по алгоритму RLE получаем сжатую строку вида “5ar3ow”. Кодированная строка на 4 символа меньше, соответственно эффективность алгоритма доказана. Теперь можно приступить к реализации данного алгоритма в виде программного кода на C#.
Текст, который нужно будет кодировать, получим из текстового поля “text_input” и запишем в строковую переменную “str1”. Далее будем пробегать по каждому символу в этой строке, получать текущий символ в строковую переменную “ch”. В том случае, если данный символ равен следующему, продолжаем поиск количества таких символов, начиная текущей позиции в строке.
После всего этого формируем кодируемую строку равную количеству найденных символов и самому символу, которых повторяется друг за другом n-e количество раз. Если найден только один символ строка принимает значение равное этому символу.
Все выше описанные операции выполняются до тех пор, пока не будет достигнут конец файла.
string str1 = text_input.Text, str = "", ch = ""; int i, k, j; for (i = 0; i < str1.Length; ) { // от 0 до длины строки ch = str1.Substring(i, 1); // получаем текущий символ из строки str1 k = 0; //счетчик количества повторяющихся символов if (i == str1.Length - 1) { // если последний символ str += Convert.ToString(ch); break; //выходим из цикла } if (str1.Substring(i + 1, 1) == ch) { for (j = i; j < str1.Length; j++) { if (str1.Substring(j, 1) == ch) //если текущий символ равен символу из строки ch k++; //увеличиваем счетчик else break; //выходим из цикла } i = j; } else i++; if (k != 0) str += Convert.ToString(k) + Convert.ToString(ch); else str += Convert.ToString(ch); } text_output.Text = str; button2.Enabled = true;
Кодировку успешно выполнили, теперь напишем декодировку строки, кодированную при помощи алгоритма RLE. Декодирование закодированной строки выполняется путем поиска числа, которое является количеством повторений символа и самого символа.
И так, получаем закодированную строку из текстового поля “textBox1” и записывает полученный текст в переменную “str1”. При каждом проходе цикла, который выполняется, пока недостигнут последний символ, записываем в переменную “ch” текущий символ и если он является цифрой, выполняем поиск цифр идущих друг за другом. Тем самым последовательность найденных цифр будет представлять собой число, являющееся количеством повторений символа, идущего сразу же после этой последовательности. В конце в строковую переменную “str” записываем букву столько раз, сколько равно значение числа.
string str1 = textBox1.Text, str = "", ch = "", s = "", symb = ""; int i, k = 0, j; for (i = 0; i < str1.Length; ) { ch = str1.Substring(i, 1); // текущий символ i k = 0; s = ""; if ("0123456789".Contains(ch)) { // если символ ch является цифрой for (j = i; j < str1.Length; j++) { if ("0123456789".Contains(str1.Substring(j, 1))) { // если текущий символ j является цифрой s += str1.Substring(j, 1); } else break; } symb = str1.Substring(j, 1); // получаем букву i = j + 1; } else i++; if (s.Length != 0) { for (j = 0; j < Convert.ToInt32(s); j++) // декодирование буквы str += symb; } else str += Convert.ToString(ch); } out_shifr.Text = str;
В данной программе реализовано кодирование и декодирование строки, используя алгоритм сжатия данных RLE.
Автор: Евтеев Евгений Александрович