Algoritmo e estruturas de dados operações com matrizes

25

Transcript of Algoritmo e estruturas de dados operações com matrizes

Page 1: Algoritmo e estruturas de dados operações com matrizes

Universidade Federal de Ouro Preto

Instituto de Ciências Exatas e Biológicas

Departamento de Computação

ALGORITMOS E ESTRUTURAS DE DADOS

Operações com Matrizes

Antonio Carlos de Nazaré Júnior

Professor - David Menotti

Ouro Preto

15 de janeiro de 2009

Page 2: Algoritmo e estruturas de dados operações com matrizes

Sumário

1 Introdução 1

1.1 Descrição do Problema . . . . . . . . . . . . . . . . . . . . . . . . . . 11.2 O que são Matrizes . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1

1.2.1 Tipos de Matrizes . . . . . . . . . . . . . . . . . . . . . . . . . 21.2.2 Operações com Matrizes . . . . . . . . . . . . . . . . . . . . . 2

2 Implementação 3

2.1 Estrutura de Dados Utilizada . . . . . . . . . . . . . . . . . . . . . . 32.2 Funções e Procedimentos . . . . . . . . . . . . . . . . . . . . . . . . . 4

2.2.1 CreateTMatriz . . . . . . . . . . . . . . . . . . . . . . . . . . 52.2.2 ReadTMatriz . . . . . . . . . . . . . . . . . . . . . . . . . . . 52.2.3 CreateTMatrizIdentity . . . . . . . . . . . . . . . . . . . . . . 62.2.4 CompareTMatriz . . . . . . . . . . . . . . . . . . . . . . . . . 72.2.5 AddTMatriz . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82.2.6 MultiplyTMatriz . . . . . . . . . . . . . . . . . . . . . . . . . 82.2.7 PrintTMatriz . . . . . . . . . . . . . . . . . . . . . . . . . . . 92.2.8 DestroyTMatriz . . . . . . . . . . . . . . . . . . . . . . . . . . 10

2.3 Programa Principal . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11

3 Testes 13

4 Estudo de Complexidade 14

5 Conclusão 15

6 Anexos 16

2

Page 3: Algoritmo e estruturas de dados operações com matrizes

Lista de Tabelas

1 Diagrama da Estrutura de Dados TMatriz . . . . . . . . . . . . . . . 32 Testes realizados. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133 Resumo das Funções de Complexidade. . . . . . . . . . . . . . . . . . 14

3

Page 4: Algoritmo e estruturas de dados operações com matrizes

Lista de Figuras

1 Representação de uma Matriz . . . . . . . . . . . . . . . . . . . . . . 12 Implementação de uma matriz utilizando ponteiros . . . . . . . . . . 4

4

Page 5: Algoritmo e estruturas de dados operações com matrizes

Lista de Programas e Arquivos

1 Estrutura da Matriz em c++ . . . . . . . . . . . . . . . . . . . . . . 32 Exemplo de uma função para o estudo da função de complexidade . . 43 Função para criação da Matriz em c++ . . . . . . . . . . . . . . . . . 54 Função para leitura da Matriz em c++ . . . . . . . . . . . . . . . . . 65 Função para criação da Matriz Identidade em c++ . . . . . . . . . . 66 Função para comparação das Matrizes em c++ . . . . . . . . . . . . 77 Função para adição de Matrizes em c++ . . . . . . . . . . . . . . . . 88 Função para multiplicação de Matrizes em c++ . . . . . . . . . . . . 99 Procedimento para impreensão de Matrizes em c++ . . . . . . . . . . 1010 Procedimento para destruição da Matriz em c++ . . . . . . . . . . . 1011 Programa Principal em c++ . . . . . . . . . . . . . . . . . . . . . . . 1112 Programa TMatriz em c++ . . . . . . . . . . . . . . . . . . . . . . . 16

5

Page 6: Algoritmo e estruturas de dados operações com matrizes

1 Introdução

1.1 Descrição do Problema

O problema consiste em representar as matrizes e suas operações computacional-mente. Devem ser apresentados procedimentos e funções que realizem as seguintestarefas:

• Ler uma matriz (dimensão e os dados);

• Criar uma matriz identidade;

• Comparar duas matrizes;

• Somar duas matrizes;

• Multiplicar duas matrizes;

• Imprimir uma matriz.

1.2 O que são Matrizes

Na matemática uma matriz é uma tabela m × n, representada sob a forma deum quadro com m linhas e n colunas e é amplamente utilizada para resolução desistema de equações e transformações lineares.[3]

A �gura 1 apresenta a representação de uma matriz:

Figura 1: Representação de uma Matriz

1

Page 7: Algoritmo e estruturas de dados operações com matrizes

1.2.1 Tipos de Matrizes

• Matriz Quadrada: Matriz cujo o número de linhas é igual ao número decolunas. Este número é dado pela ordem, assim dizemos que uma matrizquadrada é de ordem n.

• Matriz Identidade: É uma matriz quadrada, cujo os elementos da diagonalprincipal, ou seja i = j, são iguais a 1 e os demais nulos.

X =

1 0 00 1 00 0 1

Exemplo de uma matriz Identidade

1.2.2 Operações com Matrizes

• Adição de Matrizes: Dado as matrizes A e B do tipo m×n, sua soma A+Bé a matriz m× n computada adicionando os elementos correspondentes: [3]

(A + B)[i, j] = A[i, j] + B[i, j]. (1)

Veja Exemplo:

1 2 69 6 36 6 3

+

1 5 41 2 72 1 8

=

1 + 1 2 + 5 6 + 49 + 1 6 + 2 3 + 76 + 2 6 + 1 3 + 8

=

2 7 1010 8 108 7 11

Exemplo da soma dos elementos de uma matriz

• Multiplicação de Matrizes: A multiplicação de duas matrizes é bem de�-nida apenas se o número de colunas da matriz da esquerda é o mesmo númerode linhas da matriz da direita. Se A é uma matriz m × n e B é uma matrizn × p, então seu produto AB é a matriz m × p (m linhas e p colunas) dadapor: [3]

(AB)[i, j] = A[i, 1]B[1, j] + A[i, 2]B[2, j] + . . . + A[i, n]B[n, j] (2)

para cada par de i e j. Veja Exemplo:

[1 0 2−1 3 1

3 12 11 0

=

[(1× 3 + 0× 2 + 2× 1) (1× 1 + 0× 1 + 2× 0)

(−1× 3 + 3× 2 + 1× 1) (−1× 1 + 3× 1 + 1× 0)

]=

2 7 1010 8 108 7 11

Exemplo da multiplicação dos elementos de uma matriz

2

Page 8: Algoritmo e estruturas de dados operações com matrizes

2 Implementação

A implementação foi realizada no estilo de programação Procedimental, utili-zando a linguagem C++. Para a representação da Matriz foi utilizado um TDA(Tipo Abstrato de Dados). O programa é divido nas seguintes funções e procedi-mentos que manipulam os dados da estrutura.

• CreateTMatriz: (Cria uma matriz)

• ReadTMatriz: (Lê uma matriz)

• CreateTMatrizIdentity (Cria uma matriz Identidade)

• CompareTMatriz (Compara se duas matrizes são iguais)

• AddTMatriz (Calcula a soma de duas matrizes)

• MultiplyTMatriz (Calcula a multiplicação de duas matrizes)

• PrintTMatriz (Exibe na tela uma matriz)

• DestroyTMatriz (Destroi uma matriz liberando espaço na memória)

O funcionamento detalhado de cada função e procedimento será apresentado naseção 2.2.

2.1 Estrutura de Dados Utilizada

Para representar a matriz foi utilizado um TDA (Tipo Abstrato de Dados) coma seguinte estrutura apresentada pela tabela 1:

TMatriz

int order

int** pElements

Tabela 1: Diagrama da Estrutura de Dados TMatriz

O código 1 apresenta o algoritmo da estrutura de dados.

Programa 1: Estrutura da Matriz em c++struct TMatriz{

int order ;int ∗∗ pElements ;

} ;

3

Page 9: Algoritmo e estruturas de dados operações com matrizes

Onde int order armazena a ordem da matriz e int** pElements é um ponteirode ponteiros que tem a referência para as linhas das matrizes. A alocação de memóriapara os elementos é feita de forma dinâmica. Essa técnica permite ao programadoralocar memória para variáveis quando o programa está sendo executado. Assim,pode-se de�nir, por exemplo, um vetor ou uma matriz em tempo de execução.[2]

A �gura 2 ilustra a implementação da matriz utilizando ponteiros:

Figura 2: Implementação de uma matriz utilizando ponteiros

2.2 Funções e Procedimentos

Descrição do funcionamento de cada função e procedimento utilizados no pro-grama. Apresentação do código em C++ e o estudo da complexidade de cadafunção.

No calculo da função de complexidade foram ignoradas as chamadas de outrasFunções(ou Procedimentos) dentro da função em questão no estudo. Por exemplo,veja o código 3.

Programa 2: Exemplo de uma função para o estudo da função de complexidadevoid PRINT( int n){

cout << n−1;cout << n ;cout << n+1;

}

void fazAlgo ( int n){

PRINT(n) ;for ( int i =0, i<n , i++)

cout << i ;}

4

Page 10: Algoritmo e estruturas de dados operações com matrizes

No estudo de complexidade do segundo procedimento(levando em conta o númerode cout) o valor da função é f(x) = n, pois ele não leva em conta o número deexecuções do procedimento PRINT que é chamado dentro dele. Por isso será feito oestudo de cada função e procedimento do programa e depois apresentado como umtodo na Seção 4.

2.2.1 CreateTMatriz

Função utilizada para a criação da Matriz, ou seja faz a alocação de memóriapara os elementos. Para otimizar o algoritmo foi implementada uma técnica(código3) que utiliza apenas duas alocações de memória, isto é vantajoso pois a opera-ção de alocação tem um custo computacional alto. A implementação comumenteutilizada seria alocar cada linha da matriz onde teriamos n+1 operações de malloc.

Programa 3: Função para criação da Matriz em c++int CreateTMatriz ( TMatriz∗ pMatriz , int order ){

pMatriz−>order = order ;pMatriz−>pElements = ( int ∗∗) mal loc ( s izeof ( int ∗) ∗ order ) ;i f ( ! pMatriz−>pElements )

return 0 ;pMatriz−>pElements [ 0 ] = ( int ∗) mal loc ( s izeof ( int ) ∗( order ∗ order ) ) ;i f ( ! pMatriz−>pElements [ 0 ] )

return 0 ;for ( int i =1; i<order ; i++)

pMatriz−>pElements [ i ] = pMatriz−>pElements [0 ]+ i ∗ order ;return 1 ;

}

Entrada:Referência da matriz a ser criada e a ordem da matriz;

Saída:Retorna 1 ou 0 conforme a matriz foi criada com sucesso ou não, respec-tivamente;

Função de Complexidade:(Considerando o número de atribuições)

1 + 1 + 1 +n−1∑i=1

1 = 3 + (n− 1) = n + 2 (3)

• Melhor caso: f(x) = n + 2

• Pior caso: f(x) = n + 2

• Caso Médio: f(x) = n + 2

Ordem de Complexidade: O(n)

2.2.2 ReadTMatriz

Função utilizada para a leitura da matriz. Faz a leitura de cada elemento. Elautiliza a função CreateTMatriz para a criação da matriz a ser lida.

5

Page 11: Algoritmo e estruturas de dados operações com matrizes

Programa 4: Função para leitura da Matriz em c++int ReadTMatriz ( TMatriz∗ pMatriz , int order ){

i f ( ! CreateTMatriz ( pMatriz , order ) )return 0 ;

for ( int i =0; i < pMatriz−>order ; i++)for ( int j =0; j < pMatriz−>order ; j++){

cout << "Element [ " << i+1 << " ] [ " << j+1 << " ] : " ;c in >> pMatriz−>pElements [ i ] [ j ] ;

}return 1 ;

}

Entrada:Referência da matriz a ser lida e a ordem da matriz;

Saída:Retorna 1 ou 0 conforme a matriz foi criada e lida com sucesso ou não,respectivamente;

Função de Complexidade:(Considerando o número de atribuições atráves do co-mando cin)

n−1∑i=0

n−1∑j=0

1 =n−1∑i=0

n = n× n = n2 (4)

• Melhor caso: f(x) = n2

• Pior caso: f(x) = n2

• Caso Médio: f(x) = n2

Ordem de Complexidade: O(n2)

2.2.3 CreateTMatrizIdentity

Função utilizada para a criação de uma matriz Identidade. Ela utiliza a funçãoCreateTMatriz para a criação da matriz e depois faz a atribuição dos valores deacordo com as posições, obedecendo a regra aij = 1 para todo i = j.

Programa 5: Função para criação da Matriz Identidade em c++int CreateTMatr iz Ident i ty ( TMatriz∗ pMatriz , int order ){

i f ( ! CreateTMatriz ( pMatriz , order ) )return 0 ;

for ( int i =0; i < pMatriz−>order ; i++)for ( int j =0; j < pMatriz−>order ; j++){

i f ( i==j )pMatriz−>pElements [ i ] [ j ]=1;

else

pMatriz−>pElements [ i ] [ j ]=0;}

return 1 ;}

6

Page 12: Algoritmo e estruturas de dados operações com matrizes

Entrada:Referência da matriz a ser criada e a ordem da matriz;

Saída:Retorna 1 ou 0 conforme a matriz foi criada com sucesso ou não, respec-tivamente;

Função de Complexidade:(Considerando o número de atribuições)

n−1∑i=0

n−1∑j=0

1 =n−1∑i=0

n = n× n = n2 (5)

• Melhor caso: f(x) = n2

• Pior caso: f(x) = n2

• Caso Médio: f(x) = n2

Ordem de Complexidade: O(n2)

2.2.4 CompareTMatriz

Compara duas matrizes. Primeiramente compara se o número de elementos dasmatrizes são iguais, caso contrário aborta o programa. Se a ordem for igual elecompara os elementos um a um para veri�car a regra aij = bij.

Programa 6: Função para comparação das Matrizes em c++int CompareTMatriz ( TMatriz pMatriz01 , TMatriz pMatriz02 ){

i f ( pMatriz01 . order !=pMatriz02 . order )return 0 ;

for ( int i =0; i<pMatriz01 . order ; i++)for ( int j =0; j<pMatriz01 . order ; j++)

i f ( pMatriz01 . pElements [ i ] [ j ] != pMatriz02 . pElements [ i ] [ j ] )return 0 ;

return 1 ;}

Entrada:Cópia das duas matrizes a serem comparadas;

Saída:Retorna 1 ou 0 conforme as matrizes são iguais ou não, respectivamente;

Função de Complexidade:(Considerando o número de comparações)

1 +n−1∑i=0

n−1∑j=0

1 = 1 +n−1∑i=0

n = 1 + (n× n) = n2 + 1 (6)

• Melhor caso: f(x) = 1 (Quando as matrizes não tem a mesma ordem)

• Pior caso: f(x) = n2 + 1 (Quando as matrizes são Iguais)

• Caso Médio: n2

2+ 1

Ordem de Complexidade: O(n2)

7

Page 13: Algoritmo e estruturas de dados operações com matrizes

2.2.5 AddTMatriz

Adiciona duas matrizes. Primeiramente compara se o número de elementos dasmatrizes são iguais, caso contrario aborta a função e atribui o valor NULL para oponteiro pElements da matriz que receberia o Resultado, o objetivo desta atribuiçãoé iniciar a matriz como vazia, ou seja, se a operação não for realizada, a matrizresultado recebe vazio(NULL).

Se a ordem for igual ele faz a adição da seguinte maneira cij = aij + bij.

Programa 7: Função para adição de Matrizes em c++int AddTMatriz ( TMatriz Matriz01 , TMatriz Matriz02 , TMatriz∗ pMatrizR ){

i f ( Matriz01 . order !=Matriz02 . order ){

pMatrizR−>pElements=NULL;return 0 ;

}i f ( ! CreateTMatriz ( pMatrizR , Matriz01 . order ) )

return 0 ;for ( int i =0; i<Matriz01 . order ; i++)

for ( int j =0; j<Matriz01 . order ; j++)pMatrizR−>pElements [ i ] [ j ] = Matriz01 . pElements [ i ] [ j ]+

Matriz02 . pElements [ i ] [ j ] ;return 1 ;

}

Entrada:Cópia das duas matrizes a serem somadas e a referência da matriz querecebera a soma;

Saída:Retorna 1 ou 0 conforme as matrizes podem ou não serem adicionadas, res-pectivamente;

Função de Complexidade:(Considerando o número de atribuições)

n−1∑i=0

n−1∑j=0

1 =n−1∑i=0

n = n× n = n2 (7)

• Melhor caso: f(x) = 0 (Quando as matrizes não podem ser adicionadas)

• Pior caso: f(x) = n2 (Quando a operação é realizada)

• Caso Médio: f(x) = n2

Ordem de Complexidade: O(n2)

2.2.6 MultiplyTMatriz

Multiplica duas matrizes. Primeiramente compara se o número de colunas daprimeira matriz é igual ao número de linhas da segunda coluna, para matrizes qua-dradas esta veri�cação é feita comparando as ordens das matrizes, caso contrário aoperação é abortada e atribui o valor NULL para o ponteiro pElements da matrizque receberia o Resultado, como é realizado na função de AddTMatriz.

8

Page 14: Algoritmo e estruturas de dados operações com matrizes

Se a ordem for igual ele faz a multiplicação da seguinte maneira cij = ai1b1j +ai2b2j + . . . + ainbnj.

Programa 8: Função para multiplicação de Matrizes em c++int MultiplyTMatriz ( TMatriz Matriz01 , TMatriz Matriz02 , TMatriz∗

pMatrizR ){

i f ( Matriz01 . order !=Matriz02 . order ){

pMatrizR−>pElements=NULL;return 0 ;

}i f ( ! CreateTMatriz ( pMatrizR , Matriz01 . order ) )

return 0 ;for ( int i =0; i<Matriz02 . order ; i++)

for ( int j =0; j<Matriz02 . order ; j++){

pMatrizR−>pElements [ i ] [ j ] = 0 ;for ( int k=0; k<Matriz02 . order ; k++){

pMatrizR−>pElements [ i ] [ j ] += Matriz01 . pElements [ i ] [ k ]∗Matriz02 . pElements [ k ] [ j ] ;

}}

return 1 ;}

Entrada:Cópia das duas matrizes a serem multiplicadas e a referência da matrizque recebera a multiplicação;

Saída:Retorna 1 ou 0 conforme as matrizes podem ou não serem multiplicadas,respectivamente;

Função de Complexidade:(Levando em conta o número de atribuições)

n−1∑i=0

n−1∑j=0

n−1∑k=0

1 =n−1∑i=0

n−1∑j=0

n =n−1∑i=0

(n× n) = n× n× n = n3 (8)

• Melhor caso: f(x) = 0 (Quando as matrizes não podem ser multiplicadas)

• Pior caso: f(x) = n3 (Quando a operação é realizada)

• Caso Médio: f(x) = n3

Ordem de Complexidade: O(n3)Existem hoje algoritmos recursivos mais e�ciente para multiplicação de matrizescomo o Algoritmo de Strassen que tem ordem de complexidade O(nlog2 7) ou o Al-goritmo de Coppersmith e Winograd com ordem de complexidade O(n2.376).[1]

2.2.7 PrintTMatriz

Imprime uma matriz. Primeiramente veri�ca a existência de elementos na ma-triz. Para isso ela comapara se pElements é igual a NULL. Se vazia retorna uma

9

Page 15: Algoritmo e estruturas de dados operações com matrizes

mensagem 'Essa matriz não possui elementos' e aborta o procedimento.

Programa 9: Procedimento para impreensão de Matrizes em c++void PrintTMatriz ( TMatriz∗ pMatriz ){

i f ( pMatriz−>pElements==NULL){

p r i n t f ("\nEssa matr iz não pos su i e lementos \n\n" ) ;return ;

}for ( int i =0; i<pMatriz−>order ; i++)/{

p r i n t f (" | " ) ;for ( int j =0; j<pMatriz−>order ; j++)

p r i n t f ("%4d " , pMatriz−>pElements [ i ] [ j ] ) ;p r i n t f (" |\n" ) ;

}p r i n t f ("\n" ) ;

}

Entrada:Cópia da matriz a ser impressa;

Saída:Como é um procedimento não retorna valor;

Função de Complexidade:(Levando em conta o número de printf)[n−1∑i=0

(2 +

n−1∑j=0

1

)]+ 1 =

[n−1∑i=0

(2 + n)

]+ 1 = [n× (2 + n)] =

(n2 + 2n

)+ 1 (9)

• Melhor caso: f(x) = 1 (Quando as matriz está vazia)

• Pior caso: f(x) = n2 + 2n + 1 (Quando existe elementos na matriz)

• Caso Médio: f(x) = n2 + 2n + 1

Ordem de Complexidade: O(n2)

2.2.8 DestroyTMatriz

Procedimento para destruir uma Matriz, ou seja, liberar o espaço na memóriaocupado pelos elementos. Primeiramente veri�ca a existência de elementos na ma-triz. Para isso ele compara se pElements é igual a NULL. Caso a matriz esteja vazianão é realizado a desalocação da memória. Se a Matriz possuir elementos elemen-tos, é chamado o comando free, primeiramentem em pELements[0] e depois empElements.

Programa 10: Procedimento para destruição da Matriz em c++void DestroyTMatriz ( TMatriz∗ pMatriz ){

i f ( pMatriz−>pElements !=NULL) /∗Somente l i b e r a espaço de uma matr iznão vaz i a ∗/

{

10

Page 16: Algoritmo e estruturas de dados operações com matrizes

f r e e ( pMatriz−>pElements [ 0 ] ) ;f r e e ( pMatriz−>pElements ) ;

}}

Entrada:Referência da matriz a ser destruída;

Saída:Como é um procedimento não retorna valor;

Função de Complexidade:(Levando em conta o número de free)

• Melhor caso: f(x) = 0 (Quando as matriz está vazia)

• Pior caso: f(x) = 2 (Quando existe elementos na matriz)

• Caso Médio: f(x) = 2

Ordem de Complexidade: O(1)

2.3 Programa Principal

O programa principal deve conter as seguintes operações:

• Declarar 5 matrizes.

• Ler a matriz A de ordem 3.

• Criar uma matriz identidade I de ordem 3.

• Multiplicar A por I e armazenar o resultado em R.

• Comparar A e R dizer se são iguais ou não.

• Imprimir A e R.

• Ler a matriz B de ordem 3.

• Somar R e B e armazenar o resultado em C.

• Imprime B e C.

A implementação do programa principal foi feita de maneira simples, apenas paraexempli�car a utilização das funções e procedimentos criados para a manipulaçãode matrizes quadradas. A ordem das matrizes a serem criadas foram passadas parao programa em tempo de compilação, conforme o enunciado do trabalho.

A seguir o código 12 apresenta o programa principal:

Programa 11: Programa Principal em c++int main ( ){

TMatriz A,B,C, I ,R;ReadTMatriz(&A, 3 ) ;CreateTMatr iz Ident i ty (&I , 3 ) ;MultiplyTMatriz (A, I ,&R) ;

11

Page 17: Algoritmo e estruturas de dados operações com matrizes

i f (CompareTMatriz (A,R) )cout << "As matr i ze s são i g u a i s \n" ;

else

cout << "As matr i ze s não são i g u a i s \n" ;PrintTMatriz(&A) ;PrintTMatriz(&R) ;ReadTMatriz(&B, 3 ) ;AddTMatriz (R,B,&C) ;PrintTMatriz(&B) ;PrintTMatriz(&C) ;DestroyTMatriz(&A) ;DestroyTMatriz(&B) ;DestroyTMatriz(&C) ;DestroyTMatriz(&I ) ;DestroyTMatriz(&R) ;system ("PAUSE" ) ;return 0 ;

}

12

Page 18: Algoritmo e estruturas de dados operações com matrizes

3 Testes

Foram realizados testes, dos quais se obteve os seguintes resultados

Testes Realizados

Teste Resultado Passou

Alteração da ordem da matrizidêntidade para 2

Não foi realizada a multiplicaçãoa matriz R recebeu NULL e nãofoi impressa.

Sim

Impressão da matriz A antes daleitura 3

O programa travou. Pois o pon-teiro pElements não havia sidoiniciado

Não

Mutiplicar as matrizes A e B semantes lê os seus valores

Não foi feita a multiplicação Sim

Adicionar as matrizes A e B semantes lê os seus valores

Não foi feita a adição Sim

Alocar 1000 matrizes de ordem1000

No meio da execução ele retor-nava que não era possivel alocara matriz

Sim

Tabela 2: Testes realizados.

13

Page 19: Algoritmo e estruturas de dados operações com matrizes

4 Estudo de Complexidade

O estudo da função de complexidade detalhada de cada função foi feito na Seção2.2.

A seguir a tabela 4 apresenta o resumo dos resultados:

Resumo das Funções de Complexidade dos Procedimentos e Funções

ID Nome Melhor Pior Médio Orden

F1(n) CreateTMatriz n + 2 n + 2 n + 2 O(n)F2(n) ReadTMatriz n2 n2 n2 O(n2)F3(n) CreateTMatrizIdentity n2 n2 n2 O(n2)

F4(n) CompareTMatriz 1 n2 + 1 n2

2+ 1 O(n2)

F5(n) AddTMatriz 0 n2 n2 O(n2)F6(n) MultiplyTMatriz 0 n3 n3 O(n3)P1(n) PrintTMatriz 1 n2 + 2n + 1 n2 + 2n + 1 O(n2)P2(n) DestroyTMatriz 0 2 2 O(1)

Tabela 3: Resumo das Funções de Complexidade.

Conforme os resultados obtidos com o estudo da função de complexidade de cadaFunção e Procedimento, podemos concluir a ordem do programa através da seguinteequação[4].

O ((F1(n) + F2(n) + F3(n) + F4(n) + F5(n) + F6(n) + P1(n) + P2(n)) =

O (max (F1(n), F2(n), F3(n), F4(n), F5(n), F6(n), P1(n), P2(n))) =

O(max (O(n), O(n2), O(n2), O(n2), O(n2), O(n3), O(n2), O(1))

)=

O(n3)

Portanto a ordem de complexidade do programa como um todo é O(n3)

14

Page 20: Algoritmo e estruturas de dados operações com matrizes

5 Conclusão

Após a implementação deste trabalho concluiu-se o seguinte:

• Alocar os elementos da matriz de forma dinâmica é e�ciente, pois não desper-diça memória.

• Programas que envolem operações com matrizes sempre terá uma Ordem deComplexidade superior à n2

• A forma procedimental de programação não se mostrou e�ciente, pois é ne-cessário o encapsulamento dos elementos da matriz para não haver erros comoinicialização dos ponteiros.

15

Page 21: Algoritmo e estruturas de dados operações com matrizes

6 Anexos

Nesta seção esta anexado todo o código do programa utilizado para desenvolvero trabalho.

Programa 12: Programa TMatriz em c++#include <s td i o . h>#include <s t d l i b . h>#include <iostream>using namespace std ;

struct TMatriz{

int order ;int ∗∗ pElements ;

} ;

/∗Função re sponsáve l pe l a a locação dinâmica dos e lementos ∗/int CreateTMatriz ( TMatriz∗ pMatriz , int order ){

pMatriz−>order = order ; /∗armazena a ordem da matr iz ∗/pMatriz−>pElements = ( int ∗∗) mal loc ( s izeof ( int ∗) ∗ order ) ; /∗

a locação ∗/i f ( ! pMatriz−>pElements )

return 0 ;pMatriz−>pElements [ 0 ] = ( int ∗) mal loc ( s izeof ( int ) ∗( order ∗ order ) ) ;

/∗ a locação ∗/i f ( ! pMatriz−>pElements [ 0 ] )

return 0 ;for ( int i =1; i<order ; i++)/∗ a t r i b u i ç ã o do r e s t an t e dos

pon t e i r o s ∗/pMatriz−>pElements [ i ] = pMatriz−>pElements [0 ]+ i ∗ order ;

return 1 ;}

/∗Função para l e i t u r a dos e lementos da matr iz do tamanho da ordempassada ∗/

int ReadTMatriz ( TMatriz∗ pMatriz , int order ){

i f ( ! CreateTMatriz ( pMatriz , order ) ) /∗Aloca a matr iz a ser l i d a ∗/return 0 ;

for ( int i =0; i < pMatriz−>order ; i++)/∗ Lei tura dos e lementos ∗/for ( int j =0; j < pMatriz−>order ; j++){

cout << "Element [ " << i+1 << " ] [ " << j+1 << " ] : " ;c in >> pMatriz−>pElements [ i ] [ j ] ;

}return 1 ;

}

/∗Função que c r i a uma Matriz Iden t i dade do tamanho da ordem passada ∗/int CreateTMatr iz Ident i ty ( TMatriz∗ pMatriz , int order ){

i f ( ! CreateTMatriz ( pMatriz , order ) ) /∗Aloca a matr iz a ser cr iada ∗/return 0 ;

for ( int i =0; i < pMatriz−>order ; i++)/∗Atr i bu i ção dos e lementos ∗/for ( int j =0; j < pMatriz−>order ; j++)

16

Page 22: Algoritmo e estruturas de dados operações com matrizes

{i f ( i==j )

pMatriz−>pElements [ i ] [ j ]=1;else

pMatriz−>pElements [ i ] [ j ]=0;}

return 1 ;}

/∗Função de comparação de duas matr i zes ∗/int CompareTMatriz ( TMatriz pMatriz01 , TMatriz pMatriz02 ){

i f ( pMatriz01 . order !=pMatriz02 . order )return 0 ; /∗ re torna f a l s e caso as matr i ze s são d i f e r e n t e s ∗/

for ( int i =0; i<pMatriz01 . order ; i++)for ( int j =0; j<pMatriz01 . order ; j++)

i f ( pMatriz01 . pElements [ i ] [ j ] != pMatriz02 . pElements [ i ] [ j ] )return 0 ; /∗ re torna f a l s e no pr imeiro elemento d i f e r e n t e ∗/

return 1 ;}

/∗Função para adição de matr i ze s ∗/int AddTMatriz ( TMatriz Matriz01 , TMatriz Matriz02 , TMatriz∗ pMatrizR ){

i f ( Matriz01 . order !=Matriz02 . order ) /∗Não permite a soma de matr i ze sd i f e r e n t e s ∗/

{pMatrizR−>pElements=NULL; /∗ c r i a a matr iz mesmo assim , porem vaz ia

∗/return 0 ;

}i f ( ! CreateTMatriz ( pMatrizR , Matriz01 . order ) )

return 0 ;for ( int i =0; i<Matriz01 . order ; i++)/∗ f a z adição dos e lementos ∗/

for ( int j =0; j<Matriz01 . order ; j++)pMatrizR−>pElements [ i ] [ j ] = Matriz01 . pElements [ i ] [ j ]+

Matriz02 . pElements [ i ] [ j ] ;return 1 ;

}

/∗Função para mu l t i p l i c a ção de matr i ze s ∗/int MultiplyTMatriz ( TMatriz Matriz01 , TMatriz Matriz02 , TMatriz∗

pMatrizR ){

i f ( Matriz01 . order !=Matriz02 . order ) /∗Não permite o produto dematr i ze s d i f e r e n t e s ∗/

{pMatrizR−>pElements=NULL; /∗ c r i a a matr iz mesmo assim , porem vaz ia

∗/return 0 ;

}i f ( ! CreateTMatriz ( pMatrizR , Matriz01 . order ) )

return 0 ;for ( int i =0; i<Matriz02 . order ; i++)/∗ f a z a mu l t i p l i c a ç ão dos

e lementos ∗/for ( int j =0; j<Matriz02 . order ; j++)

17

Page 23: Algoritmo e estruturas de dados operações com matrizes

{pMatrizR−>pElements [ i ] [ j ] = 0 ;for ( int k=0; k<Matriz02 . order ; k++){

pMatrizR−>pElements [ i ] [ j ] += Matriz01 . pElements [ i ] [ k ]∗Matriz02 . pElements [ k ] [ j ] ;

}}

return 1 ;}

/∗Procedimento para v i s u a l i z a r uma matr iz na t e l a ∗/void PrintTMatriz ( TMatriz∗ pMatriz ){

i f ( pMatriz−>pElements==NULL) /∗Não imprime uma matr iz va z i a ∗/{

p r i n t f ("\nEssa matr iz não pos su i e lementos \n\n" ) ;return ;

}for ( int i =0; i<pMatriz−>order ; i++)/∗ impreensão dos e lementos ∗/{

p r i n t f (" | " ) ;for ( int j =0; j<pMatriz−>order ; j++)

p r i n t f ("%4d " , pMatriz−>pElements [ i ] [ j ] ) ;p r i n t f (" |\n" ) ;

}p r i n t f ("\n" ) ;

}

/∗Procedimento para l i b e r a r a memória ocupada pe la Matriz ∗/void DestroyTMatriz ( TMatriz∗ pMatriz ){

i f ( pMatriz−>pElements !=NULL) /∗Somente l i b e r a espaço de uma matr iznão vaz i a ∗/

{f r e e ( pMatriz−>pElements [ 0 ] ) ;

f r e e ( pMatriz−>pElements ) ;}

}

int main ( ){

TMatriz A,B,C, I ,R;ReadTMatriz(&A, 3 ) ;CreateTMatr iz Ident i ty (&I , 3 ) ;MultiplyTMatriz (A, I ,&R) ;i f (CompareTMatriz (A,R) )

cout << "As matr i ze s são i g u a i s \n" ;else

cout << "As matr i ze s não são i g u a i s \n" ;PrintTMatriz(&A) ;PrintTMatriz(&R) ;ReadTMatriz(&B, 3 ) ;AddTMatriz (R,B,&C) ;PrintTMatriz(&B) ;PrintTMatriz(&C) ;DestroyTMatriz(&A) ;

18

Page 24: Algoritmo e estruturas de dados operações com matrizes

DestroyTMatriz(&B) ;DestroyTMatriz(&C) ;DestroyTMatriz(&I ) ;DestroyTMatriz(&R) ;system ("PAUSE" ) ;return 0 ;

}

19

Page 25: Algoritmo e estruturas de dados operações com matrizes

Referências

[1] Olga Holtz. Fast and stable matrix multiplication.www.cs.berkeley.edu/ oholtz/Talks/mit.pdf.

[2] David Menotti. Programação em C, Um curso básico e abrangente. DCC, Uni-versidade Federal de Minas Gerais, 2005.

[3] Alfredo Steinbruch. Algebra Linear. McGraw-Hill, São Paulo, 2st edition, 1987.

[4] Nivio Ziviani. Projeto de Algoritmos com implementação em C++ e Java.THOMSON Learning.

20