Comparando vetores

1. Comparando vetores

william jussim
jussim

(usa Ubuntu)

Enviado em 28/11/2019 - 11:54h

Boa Tarde, estou com uma dúvida.

tenho um vetor de 35 posições e uma matriz de 300 linhas e 35 colunas.

Precisava comparar se esse vetor já existe dentro da matriz. Na exata ordem em que se encontram no Vetor.
Hj estou comparando posição por posição vendo se são identicas, mas o código fica muito grande dessa forma. Existe uma maneira mais "Limpa" de fazer essa comparação?


  


2. Re: Comparando vetores

Ismael Felipe Ferreira dos santos
IsmaelSantos

(usa Ubuntu)

Enviado em 13/01/2020 - 08:32h

Pelo menos em c a única maneira é comparar posição por posição, mas não acho que o código fique grande.
Usando loop é possível comparar todas as posições em poucas linhas e usar lógica para informar o resultado, veja o mais simples que consegui:

#include<stdio.h>

#define FALSE 0
#define TRUE 1

int main(){
int vetor[35], matriz[200][35], teste;

for(int i = 0; i < 200; ++i){
teste = TRUE;
for(int j = 0; j < 35; ++j){
if(vetor[j] != matriz[i][j]){
teste = FALSE;
break;
}
}
if(teste) printf("A vetor estah contido na coluna %d da matriz\n", i);
}
return 0;
}



3. Re: Comparando vetores

Paulo
paulo1205

(usa Ubuntu)

Enviado em 14/01/2020 - 18:54h

A maneira mais segura e canônica de comparar dois vetores em qualquer linguagem de programação é comparar elemento a elemento. Qualquer coisa diferente disso requer hardware especializado ou computação e programação paralela, ou então não passa de uma notação simplificada que esconde a complexidade do algoritmo e/ou hardware (por exemplo, em C++ você tem os operadores == e != podendo ser aplicados a elementos de tipos como std::array e std::vector, mas esses operadores vão acabar invocando, internamente, comparações individuais entre elementos em posições correspondentes em cada vetor/array).

Você não disse qual o tipo de cada elemento do seu vetor e da sua matriz. Se forem ambas de um mesmo tipo inteiro (char, int, long etc.), você pode tentar se valer do fato de que as representações internas de valores desses tipos não possuem ambiguidades (i.e. não existem duas representações diferentes para o mesmo valor) e usar memcmp() para comparar a tripa inteira de bytes em cada um deles, como no exemplo abaixo.
#define COLUNAS 35
#define LINHAS 200

int vetor[COLUNAS], matriz[LINHAS][COLUNAS];

int compara(int *m[LINHAS][COLUNAS], int *v[COLUNAS]){
for(int l=0; l<LINHAS; ++l)
if(memcmp((*m)[l], *v, COLUNAS*sizeof **v)==0)
return l; // Achou linha idêntica ao vetor; retorna o índice dessa linha.
return -1; // Não achou linha igual; retorna índice inválido.
}

int main(void){
/* Popula o vetor e a matriz (não mostrado). */
if(compara(&matriz, &vetor)!=-1)
printf("Encontrada linha igual ao vetor.\n");
else
printf("Nenhuma linha é igual ao vetor.\n");
}


Uma possível vantagem de usar memcmp() é que muitas implementações dessa função empregam instruções diretas do processador para fazer comparações entre blocos de memória (em processadores que possuem tais instruções, como é o caso dos nossos PCs). Entretanto, como já implicado acima, essa técnica não pode ser usada dessa forma com dados de tipos como float ou double, que podem ter mais de uma representação para o mesmo valor, ou com tipos de dados compostos.

Por outro lado, o uso de compiladores que embutem otimizadores (quase todos, hoje em dia) pode acabar reconhecendo um laço de comparação entre elementos consecutivos de dois arrays, e conseguir otimizar essa operação de um modo melhor até do que se poderia conseguir ao se usar memcmp manualmente. Faça testes.


... “Principium sapientiae timor Domini, et scientia sanctorum prudentia.” (Proverbia 9:10)






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts