Реализовать алгоритм сжатия данных RLE
2009
Перед написанием программы разберемся, в чем суть алгоритма 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.
Автор: Евтеев Евгений Александрович
Email: evteev_e2003@mail.ru