Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.05.2011, 04:20   #1
jmeka
Новичок
Джуниор
 
Регистрация: 26.05.2011
Сообщений: 1
По умолчанию Алгоритм сжатия двумерного массива!

Помогите с алгоритмом сжатия квадратной матрицы!
Суть алгоритма: Допустим первая строка матрицы 1 1 1 1 2 2 2. Значит в первую строку новой матрицы записываем 1 4 2 3. То есть матрица разбивается на пары: первое число пары - цифра, а второе число - количество повторений этой цифры. Пример:
Исходная матрица:
1 1 1 1 2 2 2
3 3 3 3 3 3 3
4 4 4 5 5 8 8
9 9 9 9 9 9 9
6 6 6 6 6 3 3
1 1 1 1 1 1 1
2 2 2 2 2 2 2
Полученная матрица:
1 4 2 3
3 7
4 3 5 2 8 2
9 7
6 5 3 2
1 7
2 7
P.S. Если знаете где то примеры подобных, скиньте ссылку плз..
P.P.S Пишу на с++, в роли матрицы - вектор векторов. vector< vector<int> >
jmeka вне форума Ответить с цитированием
Старый 26.05.2011, 09:58   #2
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

А сами как думаете? Где код, предложение оплаты?
Здесь не роботы-решалки, а обычные люди.
Помочь разобраться с непонятным аспектом, это одно, а - "решите за меня", - это за вознаграждение.
Контакты в подписи.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 26.05.2011, 13:13   #3
Rififi
Старожил
 
Регистрация: 19.08.2009
Сообщений: 2,119
По умолчанию

jmeka

хм, а задачка забавная....
Вот решение на C++ (в вектор инсерты не оптимальные, но для лабы сойдёт...)

также заполнение матрицы сделано "по-быстрому" ибо лень возится с телегами из push_back

Код:
#include <vector>

#include <locale>
#include <iostream>
#include <iterator>

#include <algorithm>
#include <functional>

#include <boost/range/begin.hpp>
#include <boost/range/end.hpp>

#include <boost/assign.hpp>
#include <boost/assign/list_of.hpp>
using boost::assign::list_of;

template <typename R>
void compress_sequence(R& r)
{
	typedef typename boost::range_iterator<R>::type iterator;
	typedef typename std::iterator_traits<iterator>::value_type T;

	iterator curr = boost::begin(r), next;
	for(; (next = std::adjacent_find(curr, boost::end(r), std::not2(std::equal_to<T>()))) != boost::end(r); curr = next, ++curr)
	{
		const size_t curr_length = std::distance(curr, next) + 1;
		next = r.erase(curr, next);
		r.insert(++next, curr_length);
	}

	const size_t last_length = std::distance(curr, next);
	next = r.erase(++curr, next);
	r.insert(next, last_length);
}

typedef std::vector<int> V;
typedef std::vector<V> VV;

void compress(VV& vv)
{
	for (VV::iterator it = vv.begin(); it != vv.end(); ++it)
		compress_sequence(*it);
};

void print(const V& v)
{
	typedef std::ostream_iterator<V::value_type> O;
	std::copy(v.begin(), v.end(), O(std::cout, "\t"));
}

void print(const VV& vv)
{
	for (VV::const_iterator it = vv.begin(); it != vv.end(); ++it)
	{
		print(*it);
		std::cout << std::endl;
	}
}

int main()
{
	setlocale(LC_ALL, "");

	VV vv = list_of<V>
		(list_of(1)(1)(1)(1)(2)(2)(2))
		(list_of(3)(3)(3)(3)(3)(3)(3))
		(list_of(4)(4)(4)(5)(5)(8)(8))
		(list_of(9)(9)(9)(9)(9)(9)(9))
		(list_of(6)(6)(6)(6)(6)(3)(3))
		(list_of(1)(1)(1)(1)(1)(1)(1))
		(list_of(2)(2)(2)(2)(2)(2)(2))
		;
	
	std::cout << "Matrix before compress: " << std::endl;
	print(vv);
	std::cout << std::endl;

	compress(vv);

	std::cout << "Matrix after compress: " << std::endl;
	print(vv);
	std::cout << std::endl;
	
	return 0;
}

Пример работы: http://liveworkspace.org/code/34e88e...74bf402c21522c
Rififi вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Алгоритм сжатия Хаффмана onryo Общие вопросы Delphi 0 10.04.2011 16:08
Самый эффективный алгоритм сжатия информации в свободном доступе infosave Свободное общение 20 10.02.2011 13:49
алгоритм сжатия информации LZW на Java sagnio Общие вопросы по Java, Java SE, Kotlin 1 09.12.2009 21:11
Алгоритм сжатия+ zlib Воин-Леший Общие вопросы Delphi 1 09.12.2007 15:05