Algoritmo de compressão RLE

1. Algoritmo de compressão RLE

Renan Tebaldi Barreto
rtbarreto

(usa Ubuntu)

Enviado em 03/09/2013 - 11:41h

Bom dia Galera, tudo certo ?
preciso de um algoritmo de compressão RLE, não manjo nada de programação e gostaria da ajuda de vocês.
as regras que esse algoritmo deve seguir são.
compactar acima de 4. ex: aaaa = !4a
se na sentença ja tiver "!" duplicar o mesmo. ex: !aaaa = !!!4a
e usar $ no final de combinações. ex: !aaaabcdbcdbcd = !!!4a!3bcd$

agradeço a ajuda de sempre de vocês do VOL, grande abraço


  


2. Re: Algoritmo de compressão RLE

Perfil removido
removido

(usa Nenhuma)

Enviado em 03/09/2013 - 21:00h

Aqui no viva o linux é um pouco dificil alguem te reponder mas procurando no bom e velho google encontrei esse material.

http://www3.eletronica.org/artigos/compressao-de-dados


Espero ter ajudado.



rtbarreto escreveu:

Bom dia Galera, tudo certo ?
preciso de um algoritmo de compressão RLE, não manjo nada de programação e gostaria da ajuda de vocês.
as regras que esse algoritmo deve seguir são.
compactar acima de 4. ex: aaaa = !4a
se na sentença ja tiver "!" duplicar o mesmo. ex: !aaaa = !!!4a
e usar $ no final de combinações. ex: !aaaabcdbcdbcd = !!!4a!3bcd$

agradeço a ajuda de sempre de vocês do VOL, grande abraço




3. Re: Algoritmo de compressão RLE

Paulo
paulo1205

(usa Ubuntu)

Enviado em 04/09/2013 - 01:18h

Ao contrário do que as respostas acima talvez tenham dado a entender, a verdade não é que seja difícil receber ajuda no Viva O Linux ou neste fórum em particular. No entanto, a ajuda que se costuma dar por aqui é na linha de ajudar a aprender, de tirar dúvidas, de ver se o caminho que você tomou até o momento é bom ou não e propor alternativas. Pegar um enunciado de questão e resolver o problema por você é que vai na contramão dessa linha de "ensinar a pescar em vez de dar o peixe".

Feito esse esclarecimento, eis uma peça de ajuda direta: não está faltando alguma coisa nesse enunciado, do tipo tamanho máximo do bloco, conjunto de caracteres passíveis de compressão , número máximo de repetições etc.? Como eu poderia -- se é que deveria -- comprimir os seguintes textos?

44444444444444444444444444444444444444444444
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
$$$$$$$$$$$$$$$$$$$$$$$$$$
$4$4$4$4$
(Um texto absurdamente longo que se repete 15 vezes a cada dois milhões de caracteres?)



4. Re: Algoritmo de compressão RLE

Renan Tebaldi Barreto
rtbarreto

(usa Ubuntu)

Enviado em 04/09/2013 - 07:13h

paulo1205 escreveu:

Ao contrário do que as respostas acima talvez tenham dado a entender, a verdade não é que seja difícil receber ajuda no Viva O Linux ou neste fórum em particular. No entanto, a ajuda que se costuma dar por aqui é na linha de ajudar a aprender, de tirar dúvidas, de ver se o caminho que você tomou até o momento é bom ou não e propor alternativas. Pegar um enunciado de questão e resolver o problema por você é que vai na contramão dessa linha de "ensinar a pescar em vez de dar o peixe".

Feito esse esclarecimento, eis uma peça de ajuda direta: não está faltando alguma coisa nesse enunciado, do tipo tamanho máximo do bloco, conjunto de caracteres passíveis de compressão , número máximo de repetições etc.? Como eu poderia -- se é que deveria -- comprimir os seguintes textos?

44444444444444444444444444444444444444444444
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
$$$$$$$$$$$$$$$$$$$$$$$$$$
$4$4$4$4$
(Um texto absurdamente longo que se repete 15 vezes a cada dois milhões de caracteres?)


Bom dia Paulo,
Entendo perfeitamente o que você disse, claro que é muito melhor ajudar uma pessoa a aprender do que dar de mão beijada.
esse algoritmo é para um trabalho de faculdade, eu não gosto de programação, não entendo quase nada por isso pedi a ajuda pro pessoal do VOL, eles sempre me ajudaram em outras questões esse é a primeira vez que peço ajuda em programação. sobre o enunciando não tem tamanho maximo de bloco, nem conjunto de caracteres passiveism.
se você poder me passar o seu email, a gente vai trocando uma ideia.
obrigado pela atenção a todos que responderam ao topico


5. Re: Algoritmo de compressão RLE

Renan Tebaldi Barreto
rtbarreto

(usa Ubuntu)

Enviado em 04/09/2013 - 09:19h

paulo1205 escreveu:

Ao contrário do que as respostas acima talvez tenham dado a entender, a verdade não é que seja difícil receber ajuda no Viva O Linux ou neste fórum em particular. No entanto, a ajuda que se costuma dar por aqui é na linha de ajudar a aprender, de tirar dúvidas, de ver se o caminho que você tomou até o momento é bom ou não e propor alternativas. Pegar um enunciado de questão e resolver o problema por você é que vai na contramão dessa linha de "ensinar a pescar em vez de dar o peixe".

Feito esse esclarecimento, eis uma peça de ajuda direta: não está faltando alguma coisa nesse enunciado, do tipo tamanho máximo do bloco, conjunto de caracteres passíveis de compressão , número máximo de repetições etc.? Como eu poderia -- se é que deveria -- comprimir os seguintes textos?

44444444444444444444444444444444444444444444
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
$$$$$$$$$$$$$$$$$$$$$$$$$$
$4$4$4$4$
(Um texto absurdamente longo que se repete 15 vezes a cada dois milhões de caracteres?)


segue abaixo o codigo, estou tendo problemas para fazer ele funcionar.
quando coloco por exemplo aaaaaaaaaaaaaaaaaa era pra ele compactar para !10a mais ele da um erro
alguém pode ajudar


6. codigo

Renan Tebaldi Barreto
rtbarreto

(usa Ubuntu)

Enviado em 04/09/2013 - 09:19h

#include <iostream>
#include <fstream>
#include <stdlib.h>
#include <string.h>

using namespace std;

void zipar(fstream &arq){
char zipado[50];
cout <<"\n\tDigite O nome do arquivo de saida:\t";
cin >> zipado ;
ofstream zip(zipado,ios::out | ios::binary);
char anterior = (char)arq.get(); //le oprimeiro caracter
int cont = 1; //inicia o contador pois ja foi lido um caracter
while(arq) //enquanto conseguir ler o arquivo( not eof)
{
char letra = (char)arq.get(); //a variavel letra recebe o segundo caracter
if(letra == anterior) // compara os caracteres lidos
cont++; //se forem iguais acresse o contador
else
{
if(cont > 1) //se forem diferentes deve-se colocar no arq de saida
{ //o marcador
zip.put('@');
zip.write(( char* )&cont, sizeof(int)); // escreve no arquivo o valor contido no contador
} //que representa o quanto o caracter lido esta repetido
zip.put(anterior); //escreve o caracer
anterior = letra; // altera a variavel para o proximo caracter lido
cont = 1; //retorna o contador para 01 pois apenas um caracter foi lido
}
}
cout <<"\n\n\nºººººººººººFim da Compressao...ººººººººººººººº\n";
}

void deszipar(fstream &arq) /* esta rotina ainda nao foi implementada */
{
char saida[50];
cout <<"\n\tDigite O nome do arquivo de saida:\t";
cin >> saida ;
fstream zip(saida,ios::out | ios::in | ios::binary);
int numero;
char letra = (char)arq.get();
int cont = 1;
while(arq)
{
if(letra == '@')
{
arq.read((char *)&numero, sizeof(int));//(int)arq.get();
letra = (char)arq.get();
for(int i=0; i < numero; i++)
{
zip.put(letra);
}
}
else
{
zip.put(letra);
}
letra = (char)arq.get();
}
cout <<"\n\n\nºººººººººººDescompactacao OK!...ººººººººººººººº\n";
}
void sobre(){
system("cls");
cout <<"\n\tSimples Exemplo da utilizacao do metodo";
cout <<"\n\tde Compressao RLE (Run Length Encoding.)";
cout <<"\n";
cout <<"\n\tO metodo consiste em agrupar sequencias";
cout <<"\n\trepetidas de caracteres.";
cout <<"\n\tPor Exemplo:";
cout <<"\n\tAAAAAAAAABBBBBBBBBBBBBBB";
cout <<"\n\tSeria expresso no formato";
cout <<"\n\t@9A@15B";

}
void menu()
{
system("cls");
cout <<"\n\t::::::::::::::::::::::::::::::::::::::::::::::::::";
cout <<"\n\t:::::::::::::::MENU DE OPCOES:::::::::::::::::::::";
cout <<"\n\t::::::::::::::::::::::::::::::::::::::::::::::::::";
cout <<"\n\t::\t\t\t\t\t\t::\n\t:: 1 - COMPACTAR UM ARQUIVO.\t\t\t::";
cout <<"\n\t::\t\t\t\t\t\t::";
cout <<"\n\t:: 2 - AJUDA - DESCRICAO DO PROGRAMA.\t\t::";
cout <<"\n\t::\t\t\t\t\t\t::";
cout <<"\n\t:: 3 - SAIR\t\t\t\t\t::\n\t::\t\t\t\t\t\t::";
cout <<"\n\t::\t\t ESCOLHA UMA OPCAO\t\t::";
cout <<"\n\t::::::::::::::::::::::::::::::::::::::::::::::::::\n\t";
}

int main()
{
char nome[50];
char nomearq[50],sai = 'n';
int opc;
while(sai == 'n' || sai == 'N' )
{
menu();
cin >> opc;
switch(opc)
{
case 1:
{
cout <<"\tCompactar Um Arquvo....\n";
cout <<"\n\tDigite O nome do arquivo para compactar:\t";
cin >> nomearq ;
fstream dado(nomearq,ios::in | ios::out | ios::binary);
// system("pause");
if(!dado.is_open())
{
cout <<"\n\tERRO! Nao Foi Possivel Abrir O Arquivo!\n";
getchar();
}
else
zipar(dado);
getchar();
}
break;


case 2:
sobre();
break;

case 3:
exit(0);
break;
default:
printf("\n\t>> Nenhuma das opcoes foi selecionada!\n\n");
}
cout << "\n\tDESEJA SAIR DO PROGRAMA? - (S / N)\t";
cin >> sai;
}
}




  



Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts