Реализовать алгоритм сжатия данных RLE

2 июня 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.

Автор: Евтеев Евгений Александрович