SlideShare ist ein Scribd-Unternehmen logo
1 von 25
Downloaden Sie, um offline zu lesen
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
Sumário
1 Introdução 1
1.1 Descrição do Problema . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.2 O que são Matrizes . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.2.1 Tipos de Matrizes . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.2.2 Operações com Matrizes . . . . . . . . . . . . . . . . . . . . . 2
2 Implementação 3
2.1 Estrutura de Dados Utilizada . . . . . . . . . . . . . . . . . . . . . . 3
2.2 Funções e Procedimentos . . . . . . . . . . . . . . . . . . . . . . . . . 4
2.2.1 CreateTMatriz . . . . . . . . . . . . . . . . . . . . . . . . . . 5
2.2.2 ReadTMatriz . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
2.2.3 CreateTMatrizIdentity . . . . . . . . . . . . . . . . . . . . . . 6
2.2.4 CompareTMatriz . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.2.5 AddTMatriz . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
2.2.6 MultiplyTMatriz . . . . . . . . . . . . . . . . . . . . . . . . . 8
2.2.7 PrintTMatriz . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
2.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
Lista de Tabelas
1 Diagrama da Estrutura de Dados TMatriz . . . . . . . . . . . . . . . 3
2 Testes realizados. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
3 Resumo das Funções de Complexidade. . . . . . . . . . . . . . . . . . 14
3
Lista de Figuras
1 Representação de uma Matriz . . . . . . . . . . . . . . . . . . . . . . 1
2 Implementação de uma matriz utilizando ponteiros . . . . . . . . . . 4
4
Lista de Programas e Arquivos
1 Estrutura da Matriz em c++ . . . . . . . . . . . . . . . . . . . . . . 3
2 Exemplo de uma função para o estudo da função de complexidade . . 4
3 Função para criação da Matriz em c++ . . . . . . . . . . . . . . . . . 5
4 Função para leitura da Matriz em c++ . . . . . . . . . . . . . . . . . 6
5 Função para criação da Matriz Identidade em c++ . . . . . . . . . . 6
6 Função para comparação das Matrizes em c++ . . . . . . . . . . . . 7
7 Função para adição de Matrizes em c++ . . . . . . . . . . . . . . . . 8
8 Função para multiplicação de Matrizes em c++ . . . . . . . . . . . . 9
9 Procedimento para impreensão de Matrizes em c++ . . . . . . . . . . 10
10 Procedimento para destruição da Matriz em c++ . . . . . . . . . . . 10
11 Programa Principal em c++ . . . . . . . . . . . . . . . . . . . . . . . 11
12 Programa TMatriz em c++ . . . . . . . . . . . . . . . . . . . . . . . 16
5
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 seguintes
tarefas:
• 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 de
um quadro com m linhas e n colunas e é amplamente utilizada para resolução de
sistema 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
1.2.1 Tipos de Matrizes
• Matriz Quadrada: Matriz cujo o número de linhas é igual ao número de
colunas. Este número é dado pela ordem, assim dizemos que uma matriz
quadrada é de ordem n.
• Matriz Identidade: É uma matriz quadrada, cujo os elementos da diagonal
principal, ou seja i = j, são iguais a 1 e os demais nulos.
X =


1 0 0
0 1 0
0 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 6
9 6 3
6 6 3

 +


1 5 4
1 2 7
2 1 8

 =


1 + 1 2 + 5 6 + 4
9 + 1 6 + 2 3 + 7
6 + 2 6 + 1 3 + 8

 =


2 7 10
10 8 10
8 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úmero
de linhas da matriz da direita. Se A é uma matriz m × n e B é uma matriz
n × p, então seu produto AB é a matriz m × p (m linhas e p colunas) dada
por: [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 1
2 1
1 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 10
10 8 10
8 7 11


Exemplo da multiplicação dos elementos de uma matriz
2
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 na
seção 2.2.
2.1 Estrutura de Dados Utilizada
Para representar a matriz foi utilizado um TDA (Tipo Abstrato de Dados) com
a 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 o r d e r ;
int∗∗ pElements ;
} ;
3
Onde int order armazena a ordem da matriz e int** pElements é um ponteiro
de ponteiros que tem a referência para as linhas das matrizes. A alocação de memória
para os elementos é feita de forma dinâmica. Essa técnica permite ao programador
alocar memória para variáveis quando o programa está sendo executado. Assim,
pode-se denir, 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 cada
função.
No calculo da função de complexidade foram ignoradas as chamadas de outras
Funçõ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 complexidade
void PRINT( int n )
{
c o u t  n −1;
c o u t  n ;
c o u t  n +1;
}
void f a z A l g o ( int n )
{
PRINT( n ) ;
for ( int i =0 , i n , i ++)
c o u t  i ;
}
4
No estudo de complexidade do segundo procedimento(levando em conta o número
de cout) o valor da função é f(x) = n, pois ele não leva em conta o número de
execuções do procedimento PRINT que é chamado dentro dele. Por isso será feito o
estudo de cada função e procedimento do programa e depois apresentado como um
todo 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ória
para os elementos. Para otimizar o algoritmo foi implementada uma técnica(código
3) 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 comumente
utilizada 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 C r e a t e T M a t r i z ( TMatriz ∗ pMatriz , int o r d e r )
{
pMatriz−o r d e r = o r d e r ;
pMatriz−pElements = ( int∗∗) m a l l o c ( sizeof( int∗) ∗ o r d e r ) ;
if ( ! pMatriz−pElements )
return 0 ;
pMatriz−pElements [ 0 ] = ( int∗) m a l l o c ( sizeof( int) ∗( o r d e r ∗ o r d e r ) ) ;
if ( ! pMatriz−pElements [ 0 ] )
return 0 ;
for ( int i =1; i o r d e r ; i ++)
pMatriz−pElements [ i ] = pMatriz−pElements [ 0 ] + i ∗ o r d e r ;
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. Ela
utiliza a função CreateTMatriz para a criação da matriz a ser lida.
5
Programa 4: Função para leitura da Matriz em c++
int ReadTMatriz ( TMatriz ∗ pMatriz , int o r d e r )
{
if ( ! C r e a t e T M a t r i z ( pMatriz , o r d e r ) )
return 0 ;
for ( int i =0; i  pMatriz−o r d e r ; i ++)
for ( int j =0; j  pMatriz−o r d e r ; j ++)
{
c o u t  Element [   i +1   ] [   j +1   ] :  ;
c i n  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ção
CreateTMatriz para a criação da matriz e depois faz a atribuição dos valores de
acordo 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 C r e a t e T M a t r i z I d e n t i t y ( TMatriz ∗ pMatriz , int o r d e r )
{
if ( ! C r e a t e T M a t r i z ( pMatriz , o r d e r ) )
return 0 ;
for ( int i =0; i  pMatriz−o r d e r ; i ++)
for ( int j =0; j  pMatriz−o r d e r ; j ++)
{
if ( i==j )
pMatriz−pElements [ i ] [ j ] = 1 ;
else
pMatriz−pElements [ i ] [ j ] = 0 ;
}
return 1 ;
}
6
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 das
matrizes são iguais, caso contrário aborta o programa. Se a ordem for igual ele
compara os elementos um a um para vericar a regra aij = bij.
Programa 6: Função para comparação das Matrizes em c++
int CompareTMatriz ( TMatriz p M a t r i z 0 1 , TMatriz p M a t r i z 0 2 )
{
if ( p M a t r i z 0 1 . o r d e r != p M a t r i z 0 2 . o r d e r )
return 0 ;
for ( int i =0; i p M a t r i z 0 1 . o r d e r ; i ++)
for ( int j =0; j p M a t r i z 0 1 . o r d e r ; j ++)
if ( p M a t r i z 0 1 . pElements [ i ] [ j ] ! = p M a t r i z 0 2 . 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
2.2.5 AddTMatriz
Adiciona duas matrizes. Primeiramente compara se o número de elementos das
matrizes são iguais, caso contrario aborta a função e atribui o valor NULL para o
ponteiro 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 matriz
resultado 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 M a t r i z 0 1 , TMatriz M a t r i z 0 2 , TMatriz ∗ pMatrizR )
{
if ( M a t r i z 0 1 . o r d e r != M a t r i z 0 2 . o r d e r )
{
pMatrizR−pElements=NULL ;
return 0 ;
}
if ( ! C r e a t e T M a t r i z ( pMatrizR , M a t r i z 0 1 . o r d e r ) )
return 0 ;
for ( int i =0; i M a t r i z 0 1 . o r d e r ; i ++)
for ( int j =0; j M a t r i z 0 1 . o r d e r ; j ++)
pMatrizR−pElements [ i ] [ j ] = M a t r i z 0 1 . pElements [ i ] [ j ]+
M a t r i z 0 2 . pElements [ i ] [ j ] ;
return 1 ;
}
Entrada:Cópia das duas matrizes a serem somadas e a referência da matriz que
recebera 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 da
primeira matriz é igual ao número de linhas da segunda coluna, para matrizes qua-
dradas esta vericação é feita comparando as ordens das matrizes, caso contrário a
operação é abortada e atribui o valor NULL para o ponteiro pElements da matriz
que receberia o Resultado, como é realizado na função de AddTMatriz.
8
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 M u l t i p l y T M a t r i z ( TMatriz M a t r i z 0 1 , TMatriz M a t r i z 0 2 , TMatriz ∗
pMatrizR )
{
if ( M a t r i z 0 1 . o r d e r != M a t r i z 0 2 . o r d e r )
{
pMatrizR−pElements=NULL ;
return 0 ;
}
if ( ! C r e a t e T M a t r i z ( pMatrizR , M a t r i z 0 1 . o r d e r ) )
return 0 ;
for ( int i =0; i M a t r i z 0 2 . o r d e r ; i ++)
for ( int j =0; j M a t r i z 0 2 . o r d e r ; j ++)
{
pMatrizR−pElements [ i ] [ j ] = 0 ;
for ( int k =0; kM a t r i z 0 2 . o r d e r ; k++)
{
pMatrizR−pElements [ i ] [ j ] += M a t r i z 0 1 . pElements [ i ] [ k ] ∗
M a t r i z 0 2 . pElements [ k ] [ j ] ;
}
}
return 1 ;
}
Entrada:Cópia das duas matrizes a serem multiplicadas e a referência da matriz
que 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 eciente para multiplicação de matrizes
como 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 verica a existência de elementos na ma-
triz. Para isso ela comapara se pElements é igual a NULL. Se vazia retorna uma
9
mensagem 'Essa matriz não possui elementos' e aborta o procedimento.
Programa 9: Procedimento para impreensão de Matrizes em c++
void P r i n t T M a t r i z ( TMatriz ∗ p M a t r i z )
{
if ( pMatriz−pElements==NULL)
{
p r i n t f ( nEssa matriz não possui elementos nn) ;
return;
}
for ( int i =0; i pMatriz−o r d e r ; i ++)/
{
p r i n t f (  | ) ;
for ( int j =0; j pMatriz−o r d e r ; 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ória
ocupado pelos elementos. Primeiramente verica a existência de elementos na ma-
triz. Para isso ele compara se pElements é igual a NULL. Caso a matriz esteja vazia
nã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 em
pElements.
Programa 10: Procedimento para destruição da Matriz em c++
void D e s t r o y T M a t r i z ( TMatriz ∗ p M a t r i z )
{
if ( pMatriz−pElements !=NULL) /∗Somente l i b e r a espaço de uma matriz
não vazia ∗/
{
10
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 para
exemplicar a utilização das funções e procedimentos criados para a manipulação
de matrizes quadradas. A ordem das matrizes a serem criadas foram passadas para
o 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 ) ;
C r e a t e T M a t r i z I d e n t i t y ( I , 3 ) ;
M u l t i p l y T M a t r i z (A, I ,R) ;
11
if ( CompareTMatriz (A, R) )
c o u t  As matrizes são iguais n ;
else
c o u t  As matrizes não são iguais n ;
P r i n t T M a t r i z (A) ;
P r i n t T M a t r i z (R) ;
ReadTMatriz(B , 3 ) ;
AddTMatriz (R, B,C) ;
P r i n t T M a t r i z (B) ;
P r i n t T M a t r i z (C) ;
D e s t r o y T M a t r i z (A) ;
D e s t r o y T M a t r i z (B) ;
D e s t r o y T M a t r i z (C) ;
D e s t r o y T M a t r i z ( I ) ;
D e s t r o y T M a t r i z (R) ;
s y s t e m ( PAUSE) ;
return 0 ;
}
12
3 Testes
Foram realizados testes, dos quais se obteve os seguintes resultados
Testes Realizados
Teste Resultado Passou
Alteração da ordem da matriz
idêntidade para 2
Não foi realizada a multiplicação
a matriz R recebeu NULL e não
foi impressa.
Sim
Impressão da matriz A antes da
leitura 3
O programa travou. Pois o pon-
teiro pElements não havia sido
iniciado
Não
Mutiplicar as matrizes A e B sem
antes lê os seus valores
Não foi feita a multiplicação Sim
Adicionar as matrizes A e B sem
antes lê os seus valores
Não foi feita a adição Sim
Alocar 1000 matrizes de ordem
1000
No meio da execução ele retor-
nava que não era possivel alocar
a matriz
Sim
Tabela 2: Testes realizados.
13
4 Estudo de Complexidade
O estudo da função de complexidade detalhada de cada função foi feito na Seção
2.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 cada
Função e Procedimento, podemos concluir a ordem do programa através da seguinte
equaçã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
5 Conclusão
Após a implementação deste trabalho concluiu-se o seguinte:
• Alocar os elementos da matriz de forma dinâmica é eciente, pois não desper-
diça memória.
• Programas que envolem operações com matrizes sempre terá uma Ordem de
Complexidade superior à n2
• A forma procedimental de programação não se mostrou eciente, pois é ne-
cessário o encapsulamento dos elementos da matriz para não haver erros como
inicialização dos ponteiros.
15
6 Anexos
Nesta seção esta anexado todo o código do programa utilizado para desenvolver
o trabalho.
Programa 12: Programa TMatriz em c++
#include  s t d i o . h
#include  s t d l i b . h
#include i o s t r e a m 
using namespace s t d ;
struct TMatriz
{
int o r d e r ;
int∗∗ pElements ;
} ;
/∗Função responsável pela alocação dinâmica dos elementos ∗/
int C r e a t e T M a t r i z ( TMatriz ∗ pMatriz , int o r d e r )
{
pMatriz−o r d e r = o r d e r ; /∗armazena a ordem da matriz ∗/
pMatriz−pElements = ( int∗∗) m a l l o c ( sizeof( int∗) ∗ o r d e r ) ; /∗
alocação ∗/
if ( ! pMatriz−pElements )
return 0 ;
pMatriz−pElements [ 0 ] = ( int∗) m a l l o c ( sizeof( int) ∗( o r d e r ∗ o r d e r ) ) ;
/∗ alocação ∗/
if ( ! pMatriz−pElements [ 0 ] )
return 0 ;
for ( int i =1; i o r d e r ; i ++)/∗ atribuição do restante dos
ponteiros ∗/
pMatriz−pElements [ i ] = pMatriz−pElements [ 0 ] + i ∗ o r d e r ;
return 1 ;
}
/∗Função para l e i t u r a dos elementos da matriz do tamanho da ordem
passada ∗/
int ReadTMatriz ( TMatriz ∗ pMatriz , int o r d e r )
{
if ( ! C r e a t e T M a t r i z ( pMatriz , o r d e r ) ) /∗Aloca a matriz a ser l i d a ∗/
return 0 ;
for ( int i =0; i  pMatriz−o r d e r ; i ++)/∗ Leitura dos elementos ∗/
for ( int j =0; j  pMatriz−o r d e r ; j ++)
{
c o u t  Element [   i +1   ] [   j +1   ] :  ;
c i n  pMatriz−pElements [ i ] [ j ] ;
}
return 1 ;
}
/∗Função que cria uma Matriz Identidade do tamanho da ordem passada ∗/
int C r e a t e T M a t r i z I d e n t i t y ( TMatriz ∗ pMatriz , int o r d e r )
{
if ( ! C r e a t e T M a t r i z ( pMatriz , o r d e r ) ) /∗Aloca a matriz a ser criada ∗/
return 0 ;
for ( int i =0; i  pMatriz−o r d e r ; i ++)/∗ Atribuição dos elementos ∗/
for ( int j =0; j  pMatriz−o r d e r ; j ++)
16
{
if ( i==j )
pMatriz−pElements [ i ] [ j ] = 1 ;
else
pMatriz−pElements [ i ] [ j ] = 0 ;
}
return 1 ;
}
/∗Função de comparação de duas matrizes ∗/
int CompareTMatriz ( TMatriz p M a t r i z 0 1 , TMatriz p M a t r i z 0 2 )
{
if ( p M a t r i z 0 1 . o r d e r != p M a t r i z 0 2 . o r d e r )
return 0 ; /∗ retorna f a l s e caso as matrizes são d i f e r e n t e s ∗/
for ( int i =0; i p M a t r i z 0 1 . o r d e r ; i ++)
for ( int j =0; j p M a t r i z 0 1 . o r d e r ; j ++)
if ( p M a t r i z 0 1 . pElements [ i ] [ j ] ! = p M a t r i z 0 2 . pElements [ i ] [ j ] )
return 0 ; /∗ retorna f a l s e no primeiro elemento d i f e r e n t e ∗/
return 1 ;
}
/∗Função para adição de matrizes ∗/
int AddTMatriz ( TMatriz M a t r i z 0 1 , TMatriz M a t r i z 0 2 , TMatriz ∗ pMatrizR )
{
if ( M a t r i z 0 1 . o r d e r != M a t r i z 0 2 . o r d e r ) /∗Não permite a soma de matrizes
d i f e r e n t e s ∗/
{
pMatrizR−pElements=NULL ; /∗ cria a matriz mesmo assim , porem vazia
∗/
return 0 ;
}
if ( ! C r e a t e T M a t r i z ( pMatrizR , M a t r i z 0 1 . o r d e r ) )
return 0 ;
for ( int i =0; i M a t r i z 0 1 . o r d e r ; i ++)/∗ faz adição dos elementos ∗/
for ( int j =0; j M a t r i z 0 1 . o r d e r ; j ++)
pMatrizR−pElements [ i ] [ j ] = M a t r i z 0 1 . pElements [ i ] [ j ]+
M a t r i z 0 2 . pElements [ i ] [ j ] ;
return 1 ;
}
/∗Função para multiplicação de matrizes ∗/
int M u l t i p l y T M a t r i z ( TMatriz M a t r i z 0 1 , TMatriz M a t r i z 0 2 , TMatriz ∗
pMatrizR )
{
if ( M a t r i z 0 1 . o r d e r != M a t r i z 0 2 . o r d e r ) /∗Não permite o produto de
matrizes d i f e r e n t e s ∗/
{
pMatrizR−pElements=NULL ; /∗ cria a matriz mesmo assim , porem vazia
∗/
return 0 ;
}
if ( ! C r e a t e T M a t r i z ( pMatrizR , M a t r i z 0 1 . o r d e r ) )
return 0 ;
for ( int i =0; i M a t r i z 0 2 . o r d e r ; i ++)/∗ faz a multiplicação dos
elementos ∗/
for ( int j =0; j M a t r i z 0 2 . o r d e r ; j ++)
17
{
pMatrizR−pElements [ i ] [ j ] = 0 ;
for ( int k =0; kM a t r i z 0 2 . o r d e r ; k++)
{
pMatrizR−pElements [ i ] [ j ] += M a t r i z 0 1 . pElements [ i ] [ k ] ∗
M a t r i z 0 2 . pElements [ k ] [ j ] ;
}
}
return 1 ;
}
/∗ Procedimento para v i s u a l i z a r uma matriz na t e l a ∗/
void P r i n t T M a t r i z ( TMatriz ∗ p M a t r i z )
{
if ( pMatriz−pElements==NULL) /∗Não imprime uma matriz vazia ∗/
{
p r i n t f ( nEssa matriz não possui elementos nn) ;
return;
}
for ( int i =0; i pMatriz−o r d e r ; i ++)/∗ impreensão dos elementos ∗/
{
p r i n t f (  | ) ;
for ( int j =0; j pMatriz−o r d e r ; 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 pela Matriz ∗/
void D e s t r o y T M a t r i z ( TMatriz ∗ p M a t r i z )
{
if ( pMatriz−pElements !=NULL) /∗Somente l i b e r a espaço de uma matriz
não vazia ∗/
{
f r e e ( pMatriz−pElements [ 0 ] ) ;
f r e e ( pMatriz−pElements ) ;
}
}
int main ( )
{
TMatriz A, B , C, I , R ;
ReadTMatriz(A, 3 ) ;
C r e a t e T M a t r i z I d e n t i t y ( I , 3 ) ;
M u l t i p l y T M a t r i z (A, I ,R) ;
if ( CompareTMatriz (A, R) )
c o u t  As matrizes são iguais n ;
else
c o u t  As matrizes não são iguais n ;
P r i n t T M a t r i z (A) ;
P r i n t T M a t r i z (R) ;
ReadTMatriz(B , 3 ) ;
AddTMatriz (R, B,C) ;
P r i n t T M a t r i z (B) ;
P r i n t T M a t r i z (C) ;
D e s t r o y T M a t r i z (A) ;
18
D e s t r o y T M a t r i z (B) ;
D e s t r o y T M a t r i z (C) ;
D e s t r o y T M a t r i z ( I ) ;
D e s t r o y T M a t r i z (R) ;
s y s t e m ( PAUSE) ;
return 0 ;
}
19
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

Weitere ähnliche Inhalte

Was ist angesagt?

Apostila cálculo técnico
Apostila cálculo técnicoApostila cálculo técnico
Apostila cálculo técnicoSergio Barrios
 
1) matrizes 2012 (prevest)
1) matrizes 2012 (prevest)1) matrizes 2012 (prevest)
1) matrizes 2012 (prevest)Márcio Queiroz
 
1º Ano - Aula 04 - Intervalos Reais - Resolução de exercícios (parte 2).pptx
1º Ano - Aula 04 - Intervalos Reais - Resolução de exercícios (parte 2).pptx1º Ano - Aula 04 - Intervalos Reais - Resolução de exercícios (parte 2).pptx
1º Ano - Aula 04 - Intervalos Reais - Resolução de exercícios (parte 2).pptxAdamWallisson1
 
Engineering Drawing: Chapter 04 orthographic writing
Engineering Drawing: Chapter 04 orthographic writingEngineering Drawing: Chapter 04 orthographic writing
Engineering Drawing: Chapter 04 orthographic writingmokhtar
 
Reflective symmetry 2
Reflective symmetry 2Reflective symmetry 2
Reflective symmetry 2dorjhuu
 
Exercícios produtos notáveis
Exercícios produtos notáveisExercícios produtos notáveis
Exercícios produtos notáveisMichele Boulanger
 
Divisao euclidiana matematica
Divisao euclidiana matematicaDivisao euclidiana matematica
Divisao euclidiana matematicaAna Almeida
 
Equilibrio corpo rigido
Equilibrio corpo rigidoEquilibrio corpo rigido
Equilibrio corpo rigidoSherazade Lira
 
Apostila de desenho técnico
Apostila de desenho técnicoApostila de desenho técnico
Apostila de desenho técnicoRenaldo Adriano
 
Lista de exercícios extra campos numéricos (1)
Lista de exercícios extra campos numéricos (1)Lista de exercícios extra campos numéricos (1)
Lista de exercícios extra campos numéricos (1)Jcraujonunes
 
www.AulasDeMatematicaApoio.com - Matemática - Frações
www.AulasDeMatematicaApoio.com  - Matemática -  Fraçõeswww.AulasDeMatematicaApoio.com  - Matemática -  Frações
www.AulasDeMatematicaApoio.com - Matemática - FraçõesAulas De Matemática Apoio
 
As medidas de comprimento inglesas
As medidas de comprimento inglesasAs medidas de comprimento inglesas
As medidas de comprimento inglesasinesgois2002
 
1ª LISTA DE EXERCÍCIOS( PIRÂMIDES)
1ª LISTA DE EXERCÍCIOS( PIRÂMIDES)1ª LISTA DE EXERCÍCIOS( PIRÂMIDES)
1ª LISTA DE EXERCÍCIOS( PIRÂMIDES)carlos josé gomes
 
Sections القطاعات - إسقاط قطاعات الأجسام
Sections   القطاعات - إسقاط قطاعات الأجسامSections   القطاعات - إسقاط قطاعات الأجسام
Sections القطاعات - إسقاط قطاعات الأجسامأحمد دعبس
 
Exercicios resolvidos (números racionais)
Exercicios resolvidos (números racionais)Exercicios resolvidos (números racionais)
Exercicios resolvidos (números racionais)Helena Borralho
 

Was ist angesagt? (20)

Apostila cálculo técnico
Apostila cálculo técnicoApostila cálculo técnico
Apostila cálculo técnico
 
Metrologia
MetrologiaMetrologia
Metrologia
 
1) matrizes 2012 (prevest)
1) matrizes 2012 (prevest)1) matrizes 2012 (prevest)
1) matrizes 2012 (prevest)
 
1º Ano - Aula 04 - Intervalos Reais - Resolução de exercícios (parte 2).pptx
1º Ano - Aula 04 - Intervalos Reais - Resolução de exercícios (parte 2).pptx1º Ano - Aula 04 - Intervalos Reais - Resolução de exercícios (parte 2).pptx
1º Ano - Aula 04 - Intervalos Reais - Resolução de exercícios (parte 2).pptx
 
Elementos de máquinas
Elementos de máquinasElementos de máquinas
Elementos de máquinas
 
Engrenagens
EngrenagensEngrenagens
Engrenagens
 
Engineering Drawing: Chapter 04 orthographic writing
Engineering Drawing: Chapter 04 orthographic writingEngineering Drawing: Chapter 04 orthographic writing
Engineering Drawing: Chapter 04 orthographic writing
 
Reflective symmetry 2
Reflective symmetry 2Reflective symmetry 2
Reflective symmetry 2
 
Exercícios produtos notáveis
Exercícios produtos notáveisExercícios produtos notáveis
Exercícios produtos notáveis
 
Divisao euclidiana matematica
Divisao euclidiana matematicaDivisao euclidiana matematica
Divisao euclidiana matematica
 
Equilibrio corpo rigido
Equilibrio corpo rigidoEquilibrio corpo rigido
Equilibrio corpo rigido
 
Apostila de desenho técnico
Apostila de desenho técnicoApostila de desenho técnico
Apostila de desenho técnico
 
Lista de exercícios extra campos numéricos (1)
Lista de exercícios extra campos numéricos (1)Lista de exercícios extra campos numéricos (1)
Lista de exercícios extra campos numéricos (1)
 
Classificação das bombas
Classificação das bombasClassificação das bombas
Classificação das bombas
 
www.AulasDeMatematicaApoio.com - Matemática - Frações
www.AulasDeMatematicaApoio.com  - Matemática -  Fraçõeswww.AulasDeMatematicaApoio.com  - Matemática -  Frações
www.AulasDeMatematicaApoio.com - Matemática - Frações
 
As medidas de comprimento inglesas
As medidas de comprimento inglesasAs medidas de comprimento inglesas
As medidas de comprimento inglesas
 
1ª LISTA DE EXERCÍCIOS( PIRÂMIDES)
1ª LISTA DE EXERCÍCIOS( PIRÂMIDES)1ª LISTA DE EXERCÍCIOS( PIRÂMIDES)
1ª LISTA DE EXERCÍCIOS( PIRÂMIDES)
 
Angulos
AngulosAngulos
Angulos
 
Sections القطاعات - إسقاط قطاعات الأجسام
Sections   القطاعات - إسقاط قطاعات الأجسامSections   القطاعات - إسقاط قطاعات الأجسام
Sections القطاعات - إسقاط قطاعات الأجسام
 
Exercicios resolvidos (números racionais)
Exercicios resolvidos (números racionais)Exercicios resolvidos (números racionais)
Exercicios resolvidos (números racionais)
 

Andere mochten auch

Introdução a programação
Introdução a programaçãoIntrodução a programação
Introdução a programaçãoGustavo Nazário
 
Algoritmos C/C++ - Aula 01
Algoritmos C/C++ - Aula 01Algoritmos C/C++ - Aula 01
Algoritmos C/C++ - Aula 01Leandro Rezende
 
Apostila dev c++
Apostila dev c++Apostila dev c++
Apostila dev c++Rafael Mota
 
Slide: Matrizes, Matemática.
Slide: Matrizes, Matemática.Slide: Matrizes, Matemática.
Slide: Matrizes, Matemática.agendab
 
Lista de exercicios algoritmos resolvida-
Lista de exercicios   algoritmos  resolvida-Lista de exercicios   algoritmos  resolvida-
Lista de exercicios algoritmos resolvida-Mauro Pereira
 
Hype vs. Reality: The AI Explainer
Hype vs. Reality: The AI ExplainerHype vs. Reality: The AI Explainer
Hype vs. Reality: The AI ExplainerLuminary Labs
 

Andere mochten auch (7)

Apostila de dev
Apostila de devApostila de dev
Apostila de dev
 
Introdução a programação
Introdução a programaçãoIntrodução a programação
Introdução a programação
 
Algoritmos C/C++ - Aula 01
Algoritmos C/C++ - Aula 01Algoritmos C/C++ - Aula 01
Algoritmos C/C++ - Aula 01
 
Apostila dev c++
Apostila dev c++Apostila dev c++
Apostila dev c++
 
Slide: Matrizes, Matemática.
Slide: Matrizes, Matemática.Slide: Matrizes, Matemática.
Slide: Matrizes, Matemática.
 
Lista de exercicios algoritmos resolvida-
Lista de exercicios   algoritmos  resolvida-Lista de exercicios   algoritmos  resolvida-
Lista de exercicios algoritmos resolvida-
 
Hype vs. Reality: The AI Explainer
Hype vs. Reality: The AI ExplainerHype vs. Reality: The AI Explainer
Hype vs. Reality: The AI Explainer
 

Ähnlich wie Algoritmo e estruturas de dados operações com matrizes

Scilab estatistica
Scilab estatisticaScilab estatistica
Scilab estatisticacassiusgo
 
SysSorting Professional
SysSorting ProfessionalSysSorting Professional
SysSorting ProfessionalMichel Alves
 
sistemas_operacionais-livro.pdf
sistemas_operacionais-livro.pdfsistemas_operacionais-livro.pdf
sistemas_operacionais-livro.pdfJoelManuel8
 
Aula6 programação
Aula6 programaçãoAula6 programação
Aula6 programaçãoIFPB
 
Linguagem c wellington telles - aula 06
Linguagem c   wellington telles - aula 06Linguagem c   wellington telles - aula 06
Linguagem c wellington telles - aula 06profwtelles
 
Aula_07_Complexidade_de_Algoritmos.ppt
Aula_07_Complexidade_de_Algoritmos.pptAula_07_Complexidade_de_Algoritmos.ppt
Aula_07_Complexidade_de_Algoritmos.pptssuserd654cb1
 
Aula_07_Complexidade_de_Algoritmos (1).ppt
Aula_07_Complexidade_de_Algoritmos (1).pptAula_07_Complexidade_de_Algoritmos (1).ppt
Aula_07_Complexidade_de_Algoritmos (1).pptssuserd654cb1
 
Graph Theory - Exercises - Chapter 3 - Algorithms of Dijkstra and Bellman-Ford
Graph Theory - Exercises - Chapter 3 - Algorithms of Dijkstra and Bellman-FordGraph Theory - Exercises - Chapter 3 - Algorithms of Dijkstra and Bellman-Ford
Graph Theory - Exercises - Chapter 3 - Algorithms of Dijkstra and Bellman-FordMichel Alves
 
Curso python
Curso pythonCurso python
Curso pythonTiago
 
METAHEURÍSTICA GRASP APLICADA AO PROBLEMA DO SEQUENCIAMENTO DE TAREFAS
METAHEURÍSTICA GRASP APLICADA AO PROBLEMA DO SEQUENCIAMENTO DE TAREFASMETAHEURÍSTICA GRASP APLICADA AO PROBLEMA DO SEQUENCIAMENTO DE TAREFAS
METAHEURÍSTICA GRASP APLICADA AO PROBLEMA DO SEQUENCIAMENTO DE TAREFASJoao Gonçalves
 
Aula 2 - TEÓRICA - Prof. MSc. Cloves Rocha - PIE - AA - (2018.2) CCO 8 NA
Aula 2 - TEÓRICA - Prof. MSc. Cloves Rocha - PIE - AA - (2018.2) CCO 8 NAAula 2 - TEÓRICA - Prof. MSc. Cloves Rocha - PIE - AA - (2018.2) CCO 8 NA
Aula 2 - TEÓRICA - Prof. MSc. Cloves Rocha - PIE - AA - (2018.2) CCO 8 NACloves da Rocha
 

Ähnlich wie Algoritmo e estruturas de dados operações com matrizes (20)

Guia Matlab
Guia MatlabGuia Matlab
Guia Matlab
 
Estruturas dados
Estruturas dadosEstruturas dados
Estruturas dados
 
Estruturas dados
Estruturas dadosEstruturas dados
Estruturas dados
 
Scilab estatistica
Scilab estatisticaScilab estatistica
Scilab estatistica
 
monografia_andre_paro
monografia_andre_paromonografia_andre_paro
monografia_andre_paro
 
SysSorting Professional
SysSorting ProfessionalSysSorting Professional
SysSorting Professional
 
Aa booklet
Aa bookletAa booklet
Aa booklet
 
sistemas_operacionais-livro.pdf
sistemas_operacionais-livro.pdfsistemas_operacionais-livro.pdf
sistemas_operacionais-livro.pdf
 
Aula6 programação
Aula6 programaçãoAula6 programação
Aula6 programação
 
Linguagem c wellington telles - aula 06
Linguagem c   wellington telles - aula 06Linguagem c   wellington telles - aula 06
Linguagem c wellington telles - aula 06
 
Aula_07_Complexidade_de_Algoritmos.ppt
Aula_07_Complexidade_de_Algoritmos.pptAula_07_Complexidade_de_Algoritmos.ppt
Aula_07_Complexidade_de_Algoritmos.ppt
 
Aula_07_Complexidade_de_Algoritmos (1).ppt
Aula_07_Complexidade_de_Algoritmos (1).pptAula_07_Complexidade_de_Algoritmos (1).ppt
Aula_07_Complexidade_de_Algoritmos (1).ppt
 
0001
00010001
0001
 
000003 complexidade
000003 complexidade000003 complexidade
000003 complexidade
 
Graph Theory - Exercises - Chapter 3 - Algorithms of Dijkstra and Bellman-Ford
Graph Theory - Exercises - Chapter 3 - Algorithms of Dijkstra and Bellman-FordGraph Theory - Exercises - Chapter 3 - Algorithms of Dijkstra and Bellman-Ford
Graph Theory - Exercises - Chapter 3 - Algorithms of Dijkstra and Bellman-Ford
 
Apostila curso matlab
Apostila curso matlabApostila curso matlab
Apostila curso matlab
 
Analise Algoritmos
Analise AlgoritmosAnalise Algoritmos
Analise Algoritmos
 
Curso python
Curso pythonCurso python
Curso python
 
METAHEURÍSTICA GRASP APLICADA AO PROBLEMA DO SEQUENCIAMENTO DE TAREFAS
METAHEURÍSTICA GRASP APLICADA AO PROBLEMA DO SEQUENCIAMENTO DE TAREFASMETAHEURÍSTICA GRASP APLICADA AO PROBLEMA DO SEQUENCIAMENTO DE TAREFAS
METAHEURÍSTICA GRASP APLICADA AO PROBLEMA DO SEQUENCIAMENTO DE TAREFAS
 
Aula 2 - TEÓRICA - Prof. MSc. Cloves Rocha - PIE - AA - (2018.2) CCO 8 NA
Aula 2 - TEÓRICA - Prof. MSc. Cloves Rocha - PIE - AA - (2018.2) CCO 8 NAAula 2 - TEÓRICA - Prof. MSc. Cloves Rocha - PIE - AA - (2018.2) CCO 8 NA
Aula 2 - TEÓRICA - Prof. MSc. Cloves Rocha - PIE - AA - (2018.2) CCO 8 NA
 

Mehr von RADILSON RIPARDO DE FRETIAS (6)

Debug tool
Debug toolDebug tool
Debug tool
 
Formação cobol
Formação cobolFormação cobol
Formação cobol
 
Apostila de banco de dados da ucg
Apostila de banco de dados da ucgApostila de banco de dados da ucg
Apostila de banco de dados da ucg
 
Código de Processo Penal
Código de Processo PenalCódigo de Processo Penal
Código de Processo Penal
 
Sql comandos agregacao
Sql comandos agregacaoSql comandos agregacao
Sql comandos agregacao
 
Serminario itil service_desk
Serminario itil service_deskSerminario itil service_desk
Serminario itil service_desk
 

Algoritmo e estruturas de dados operações com matrizes

  • 1. 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
  • 2. Sumário 1 Introdução 1 1.1 Descrição do Problema . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1.2 O que são Matrizes . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1.2.1 Tipos de Matrizes . . . . . . . . . . . . . . . . . . . . . . . . . 2 1.2.2 Operações com Matrizes . . . . . . . . . . . . . . . . . . . . . 2 2 Implementação 3 2.1 Estrutura de Dados Utilizada . . . . . . . . . . . . . . . . . . . . . . 3 2.2 Funções e Procedimentos . . . . . . . . . . . . . . . . . . . . . . . . . 4 2.2.1 CreateTMatriz . . . . . . . . . . . . . . . . . . . . . . . . . . 5 2.2.2 ReadTMatriz . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 2.2.3 CreateTMatrizIdentity . . . . . . . . . . . . . . . . . . . . . . 6 2.2.4 CompareTMatriz . . . . . . . . . . . . . . . . . . . . . . . . . 7 2.2.5 AddTMatriz . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 2.2.6 MultiplyTMatriz . . . . . . . . . . . . . . . . . . . . . . . . . 8 2.2.7 PrintTMatriz . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 2.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
  • 3. Lista de Tabelas 1 Diagrama da Estrutura de Dados TMatriz . . . . . . . . . . . . . . . 3 2 Testes realizados. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 3 Resumo das Funções de Complexidade. . . . . . . . . . . . . . . . . . 14 3
  • 4. Lista de Figuras 1 Representação de uma Matriz . . . . . . . . . . . . . . . . . . . . . . 1 2 Implementação de uma matriz utilizando ponteiros . . . . . . . . . . 4 4
  • 5. Lista de Programas e Arquivos 1 Estrutura da Matriz em c++ . . . . . . . . . . . . . . . . . . . . . . 3 2 Exemplo de uma função para o estudo da função de complexidade . . 4 3 Função para criação da Matriz em c++ . . . . . . . . . . . . . . . . . 5 4 Função para leitura da Matriz em c++ . . . . . . . . . . . . . . . . . 6 5 Função para criação da Matriz Identidade em c++ . . . . . . . . . . 6 6 Função para comparação das Matrizes em c++ . . . . . . . . . . . . 7 7 Função para adição de Matrizes em c++ . . . . . . . . . . . . . . . . 8 8 Função para multiplicação de Matrizes em c++ . . . . . . . . . . . . 9 9 Procedimento para impreensão de Matrizes em c++ . . . . . . . . . . 10 10 Procedimento para destruição da Matriz em c++ . . . . . . . . . . . 10 11 Programa Principal em c++ . . . . . . . . . . . . . . . . . . . . . . . 11 12 Programa TMatriz em c++ . . . . . . . . . . . . . . . . . . . . . . . 16 5
  • 6. 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 seguintes tarefas: • 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 de um quadro com m linhas e n colunas e é amplamente utilizada para resolução de sistema 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
  • 7. 1.2.1 Tipos de Matrizes • Matriz Quadrada: Matriz cujo o número de linhas é igual ao número de colunas. Este número é dado pela ordem, assim dizemos que uma matriz quadrada é de ordem n. • Matriz Identidade: É uma matriz quadrada, cujo os elementos da diagonal principal, ou seja i = j, são iguais a 1 e os demais nulos. X =   1 0 0 0 1 0 0 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 6 9 6 3 6 6 3   +   1 5 4 1 2 7 2 1 8   =   1 + 1 2 + 5 6 + 4 9 + 1 6 + 2 3 + 7 6 + 2 6 + 1 3 + 8   =   2 7 10 10 8 10 8 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úmero de linhas da matriz da direita. Se A é uma matriz m × n e B é uma matriz n × p, então seu produto AB é a matriz m × p (m linhas e p colunas) dada por: [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 1 2 1 1 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 10 10 8 10 8 7 11   Exemplo da multiplicação dos elementos de uma matriz 2
  • 8. 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 na seção 2.2. 2.1 Estrutura de Dados Utilizada Para representar a matriz foi utilizado um TDA (Tipo Abstrato de Dados) com a 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 o r d e r ; int∗∗ pElements ; } ; 3
  • 9. Onde int order armazena a ordem da matriz e int** pElements é um ponteiro de ponteiros que tem a referência para as linhas das matrizes. A alocação de memória para os elementos é feita de forma dinâmica. Essa técnica permite ao programador alocar memória para variáveis quando o programa está sendo executado. Assim, pode-se denir, 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 cada função. No calculo da função de complexidade foram ignoradas as chamadas de outras Funçõ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 complexidade void PRINT( int n ) { c o u t n −1; c o u t n ; c o u t n +1; } void f a z A l g o ( int n ) { PRINT( n ) ; for ( int i =0 , i n , i ++) c o u t i ; } 4
  • 10. No estudo de complexidade do segundo procedimento(levando em conta o número de cout) o valor da função é f(x) = n, pois ele não leva em conta o número de execuções do procedimento PRINT que é chamado dentro dele. Por isso será feito o estudo de cada função e procedimento do programa e depois apresentado como um todo 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ória para os elementos. Para otimizar o algoritmo foi implementada uma técnica(código 3) 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 comumente utilizada 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 C r e a t e T M a t r i z ( TMatriz ∗ pMatriz , int o r d e r ) { pMatriz−o r d e r = o r d e r ; pMatriz−pElements = ( int∗∗) m a l l o c ( sizeof( int∗) ∗ o r d e r ) ; if ( ! pMatriz−pElements ) return 0 ; pMatriz−pElements [ 0 ] = ( int∗) m a l l o c ( sizeof( int) ∗( o r d e r ∗ o r d e r ) ) ; if ( ! pMatriz−pElements [ 0 ] ) return 0 ; for ( int i =1; i o r d e r ; i ++) pMatriz−pElements [ i ] = pMatriz−pElements [ 0 ] + i ∗ o r d e r ; 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. Ela utiliza a função CreateTMatriz para a criação da matriz a ser lida. 5
  • 11. Programa 4: Função para leitura da Matriz em c++ int ReadTMatriz ( TMatriz ∗ pMatriz , int o r d e r ) { if ( ! C r e a t e T M a t r i z ( pMatriz , o r d e r ) ) return 0 ; for ( int i =0; i pMatriz−o r d e r ; i ++) for ( int j =0; j pMatriz−o r d e r ; j ++) { c o u t Element [ i +1 ] [ j +1 ] : ; c i n 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ção CreateTMatriz para a criação da matriz e depois faz a atribuição dos valores de acordo 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 C r e a t e T M a t r i z I d e n t i t y ( TMatriz ∗ pMatriz , int o r d e r ) { if ( ! C r e a t e T M a t r i z ( pMatriz , o r d e r ) ) return 0 ; for ( int i =0; i pMatriz−o r d e r ; i ++) for ( int j =0; j pMatriz−o r d e r ; j ++) { if ( i==j ) pMatriz−pElements [ i ] [ j ] = 1 ; else pMatriz−pElements [ i ] [ j ] = 0 ; } return 1 ; } 6
  • 12. 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 das matrizes são iguais, caso contrário aborta o programa. Se a ordem for igual ele compara os elementos um a um para vericar a regra aij = bij. Programa 6: Função para comparação das Matrizes em c++ int CompareTMatriz ( TMatriz p M a t r i z 0 1 , TMatriz p M a t r i z 0 2 ) { if ( p M a t r i z 0 1 . o r d e r != p M a t r i z 0 2 . o r d e r ) return 0 ; for ( int i =0; i p M a t r i z 0 1 . o r d e r ; i ++) for ( int j =0; j p M a t r i z 0 1 . o r d e r ; j ++) if ( p M a t r i z 0 1 . pElements [ i ] [ j ] ! = p M a t r i z 0 2 . 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
  • 13. 2.2.5 AddTMatriz Adiciona duas matrizes. Primeiramente compara se o número de elementos das matrizes são iguais, caso contrario aborta a função e atribui o valor NULL para o ponteiro 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 matriz resultado 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 M a t r i z 0 1 , TMatriz M a t r i z 0 2 , TMatriz ∗ pMatrizR ) { if ( M a t r i z 0 1 . o r d e r != M a t r i z 0 2 . o r d e r ) { pMatrizR−pElements=NULL ; return 0 ; } if ( ! C r e a t e T M a t r i z ( pMatrizR , M a t r i z 0 1 . o r d e r ) ) return 0 ; for ( int i =0; i M a t r i z 0 1 . o r d e r ; i ++) for ( int j =0; j M a t r i z 0 1 . o r d e r ; j ++) pMatrizR−pElements [ i ] [ j ] = M a t r i z 0 1 . pElements [ i ] [ j ]+ M a t r i z 0 2 . pElements [ i ] [ j ] ; return 1 ; } Entrada:Cópia das duas matrizes a serem somadas e a referência da matriz que recebera 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 da primeira matriz é igual ao número de linhas da segunda coluna, para matrizes qua- dradas esta vericação é feita comparando as ordens das matrizes, caso contrário a operação é abortada e atribui o valor NULL para o ponteiro pElements da matriz que receberia o Resultado, como é realizado na função de AddTMatriz. 8
  • 14. 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 M u l t i p l y T M a t r i z ( TMatriz M a t r i z 0 1 , TMatriz M a t r i z 0 2 , TMatriz ∗ pMatrizR ) { if ( M a t r i z 0 1 . o r d e r != M a t r i z 0 2 . o r d e r ) { pMatrizR−pElements=NULL ; return 0 ; } if ( ! C r e a t e T M a t r i z ( pMatrizR , M a t r i z 0 1 . o r d e r ) ) return 0 ; for ( int i =0; i M a t r i z 0 2 . o r d e r ; i ++) for ( int j =0; j M a t r i z 0 2 . o r d e r ; j ++) { pMatrizR−pElements [ i ] [ j ] = 0 ; for ( int k =0; kM a t r i z 0 2 . o r d e r ; k++) { pMatrizR−pElements [ i ] [ j ] += M a t r i z 0 1 . pElements [ i ] [ k ] ∗ M a t r i z 0 2 . pElements [ k ] [ j ] ; } } return 1 ; } Entrada:Cópia das duas matrizes a serem multiplicadas e a referência da matriz que 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 eciente para multiplicação de matrizes como 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 verica a existência de elementos na ma- triz. Para isso ela comapara se pElements é igual a NULL. Se vazia retorna uma 9
  • 15. mensagem 'Essa matriz não possui elementos' e aborta o procedimento. Programa 9: Procedimento para impreensão de Matrizes em c++ void P r i n t T M a t r i z ( TMatriz ∗ p M a t r i z ) { if ( pMatriz−pElements==NULL) { p r i n t f ( nEssa matriz não possui elementos nn) ; return; } for ( int i =0; i pMatriz−o r d e r ; i ++)/ { p r i n t f ( | ) ; for ( int j =0; j pMatriz−o r d e r ; 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ória ocupado pelos elementos. Primeiramente verica a existência de elementos na ma- triz. Para isso ele compara se pElements é igual a NULL. Caso a matriz esteja vazia nã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 em pElements. Programa 10: Procedimento para destruição da Matriz em c++ void D e s t r o y T M a t r i z ( TMatriz ∗ p M a t r i z ) { if ( pMatriz−pElements !=NULL) /∗Somente l i b e r a espaço de uma matriz não vazia ∗/ { 10
  • 16. 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 para exemplicar a utilização das funções e procedimentos criados para a manipulação de matrizes quadradas. A ordem das matrizes a serem criadas foram passadas para o 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 ) ; C r e a t e T M a t r i z I d e n t i t y ( I , 3 ) ; M u l t i p l y T M a t r i z (A, I ,R) ; 11
  • 17. if ( CompareTMatriz (A, R) ) c o u t As matrizes são iguais n ; else c o u t As matrizes não são iguais n ; P r i n t T M a t r i z (A) ; P r i n t T M a t r i z (R) ; ReadTMatriz(B , 3 ) ; AddTMatriz (R, B,C) ; P r i n t T M a t r i z (B) ; P r i n t T M a t r i z (C) ; D e s t r o y T M a t r i z (A) ; D e s t r o y T M a t r i z (B) ; D e s t r o y T M a t r i z (C) ; D e s t r o y T M a t r i z ( I ) ; D e s t r o y T M a t r i z (R) ; s y s t e m ( PAUSE) ; return 0 ; } 12
  • 18. 3 Testes Foram realizados testes, dos quais se obteve os seguintes resultados Testes Realizados Teste Resultado Passou Alteração da ordem da matriz idêntidade para 2 Não foi realizada a multiplicação a matriz R recebeu NULL e não foi impressa. Sim Impressão da matriz A antes da leitura 3 O programa travou. Pois o pon- teiro pElements não havia sido iniciado Não Mutiplicar as matrizes A e B sem antes lê os seus valores Não foi feita a multiplicação Sim Adicionar as matrizes A e B sem antes lê os seus valores Não foi feita a adição Sim Alocar 1000 matrizes de ordem 1000 No meio da execução ele retor- nava que não era possivel alocar a matriz Sim Tabela 2: Testes realizados. 13
  • 19. 4 Estudo de Complexidade O estudo da função de complexidade detalhada de cada função foi feito na Seção 2.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 cada Função e Procedimento, podemos concluir a ordem do programa através da seguinte equaçã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
  • 20. 5 Conclusão Após a implementação deste trabalho concluiu-se o seguinte: • Alocar os elementos da matriz de forma dinâmica é eciente, pois não desper- diça memória. • Programas que envolem operações com matrizes sempre terá uma Ordem de Complexidade superior à n2 • A forma procedimental de programação não se mostrou eciente, pois é ne- cessário o encapsulamento dos elementos da matriz para não haver erros como inicialização dos ponteiros. 15
  • 21. 6 Anexos Nesta seção esta anexado todo o código do programa utilizado para desenvolver o trabalho. Programa 12: Programa TMatriz em c++ #include s t d i o . h #include s t d l i b . h #include i o s t r e a m using namespace s t d ; struct TMatriz { int o r d e r ; int∗∗ pElements ; } ; /∗Função responsável pela alocação dinâmica dos elementos ∗/ int C r e a t e T M a t r i z ( TMatriz ∗ pMatriz , int o r d e r ) { pMatriz−o r d e r = o r d e r ; /∗armazena a ordem da matriz ∗/ pMatriz−pElements = ( int∗∗) m a l l o c ( sizeof( int∗) ∗ o r d e r ) ; /∗ alocação ∗/ if ( ! pMatriz−pElements ) return 0 ; pMatriz−pElements [ 0 ] = ( int∗) m a l l o c ( sizeof( int) ∗( o r d e r ∗ o r d e r ) ) ; /∗ alocação ∗/ if ( ! pMatriz−pElements [ 0 ] ) return 0 ; for ( int i =1; i o r d e r ; i ++)/∗ atribuição do restante dos ponteiros ∗/ pMatriz−pElements [ i ] = pMatriz−pElements [ 0 ] + i ∗ o r d e r ; return 1 ; } /∗Função para l e i t u r a dos elementos da matriz do tamanho da ordem passada ∗/ int ReadTMatriz ( TMatriz ∗ pMatriz , int o r d e r ) { if ( ! C r e a t e T M a t r i z ( pMatriz , o r d e r ) ) /∗Aloca a matriz a ser l i d a ∗/ return 0 ; for ( int i =0; i pMatriz−o r d e r ; i ++)/∗ Leitura dos elementos ∗/ for ( int j =0; j pMatriz−o r d e r ; j ++) { c o u t Element [ i +1 ] [ j +1 ] : ; c i n pMatriz−pElements [ i ] [ j ] ; } return 1 ; } /∗Função que cria uma Matriz Identidade do tamanho da ordem passada ∗/ int C r e a t e T M a t r i z I d e n t i t y ( TMatriz ∗ pMatriz , int o r d e r ) { if ( ! C r e a t e T M a t r i z ( pMatriz , o r d e r ) ) /∗Aloca a matriz a ser criada ∗/ return 0 ; for ( int i =0; i pMatriz−o r d e r ; i ++)/∗ Atribuição dos elementos ∗/ for ( int j =0; j pMatriz−o r d e r ; j ++) 16
  • 22. { if ( i==j ) pMatriz−pElements [ i ] [ j ] = 1 ; else pMatriz−pElements [ i ] [ j ] = 0 ; } return 1 ; } /∗Função de comparação de duas matrizes ∗/ int CompareTMatriz ( TMatriz p M a t r i z 0 1 , TMatriz p M a t r i z 0 2 ) { if ( p M a t r i z 0 1 . o r d e r != p M a t r i z 0 2 . o r d e r ) return 0 ; /∗ retorna f a l s e caso as matrizes são d i f e r e n t e s ∗/ for ( int i =0; i p M a t r i z 0 1 . o r d e r ; i ++) for ( int j =0; j p M a t r i z 0 1 . o r d e r ; j ++) if ( p M a t r i z 0 1 . pElements [ i ] [ j ] ! = p M a t r i z 0 2 . pElements [ i ] [ j ] ) return 0 ; /∗ retorna f a l s e no primeiro elemento d i f e r e n t e ∗/ return 1 ; } /∗Função para adição de matrizes ∗/ int AddTMatriz ( TMatriz M a t r i z 0 1 , TMatriz M a t r i z 0 2 , TMatriz ∗ pMatrizR ) { if ( M a t r i z 0 1 . o r d e r != M a t r i z 0 2 . o r d e r ) /∗Não permite a soma de matrizes d i f e r e n t e s ∗/ { pMatrizR−pElements=NULL ; /∗ cria a matriz mesmo assim , porem vazia ∗/ return 0 ; } if ( ! C r e a t e T M a t r i z ( pMatrizR , M a t r i z 0 1 . o r d e r ) ) return 0 ; for ( int i =0; i M a t r i z 0 1 . o r d e r ; i ++)/∗ faz adição dos elementos ∗/ for ( int j =0; j M a t r i z 0 1 . o r d e r ; j ++) pMatrizR−pElements [ i ] [ j ] = M a t r i z 0 1 . pElements [ i ] [ j ]+ M a t r i z 0 2 . pElements [ i ] [ j ] ; return 1 ; } /∗Função para multiplicação de matrizes ∗/ int M u l t i p l y T M a t r i z ( TMatriz M a t r i z 0 1 , TMatriz M a t r i z 0 2 , TMatriz ∗ pMatrizR ) { if ( M a t r i z 0 1 . o r d e r != M a t r i z 0 2 . o r d e r ) /∗Não permite o produto de matrizes d i f e r e n t e s ∗/ { pMatrizR−pElements=NULL ; /∗ cria a matriz mesmo assim , porem vazia ∗/ return 0 ; } if ( ! C r e a t e T M a t r i z ( pMatrizR , M a t r i z 0 1 . o r d e r ) ) return 0 ; for ( int i =0; i M a t r i z 0 2 . o r d e r ; i ++)/∗ faz a multiplicação dos elementos ∗/ for ( int j =0; j M a t r i z 0 2 . o r d e r ; j ++) 17
  • 23. { pMatrizR−pElements [ i ] [ j ] = 0 ; for ( int k =0; kM a t r i z 0 2 . o r d e r ; k++) { pMatrizR−pElements [ i ] [ j ] += M a t r i z 0 1 . pElements [ i ] [ k ] ∗ M a t r i z 0 2 . pElements [ k ] [ j ] ; } } return 1 ; } /∗ Procedimento para v i s u a l i z a r uma matriz na t e l a ∗/ void P r i n t T M a t r i z ( TMatriz ∗ p M a t r i z ) { if ( pMatriz−pElements==NULL) /∗Não imprime uma matriz vazia ∗/ { p r i n t f ( nEssa matriz não possui elementos nn) ; return; } for ( int i =0; i pMatriz−o r d e r ; i ++)/∗ impreensão dos elementos ∗/ { p r i n t f ( | ) ; for ( int j =0; j pMatriz−o r d e r ; 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 pela Matriz ∗/ void D e s t r o y T M a t r i z ( TMatriz ∗ p M a t r i z ) { if ( pMatriz−pElements !=NULL) /∗Somente l i b e r a espaço de uma matriz não vazia ∗/ { f r e e ( pMatriz−pElements [ 0 ] ) ; f r e e ( pMatriz−pElements ) ; } } int main ( ) { TMatriz A, B , C, I , R ; ReadTMatriz(A, 3 ) ; C r e a t e T M a t r i z I d e n t i t y ( I , 3 ) ; M u l t i p l y T M a t r i z (A, I ,R) ; if ( CompareTMatriz (A, R) ) c o u t As matrizes são iguais n ; else c o u t As matrizes não são iguais n ; P r i n t T M a t r i z (A) ; P r i n t T M a t r i z (R) ; ReadTMatriz(B , 3 ) ; AddTMatriz (R, B,C) ; P r i n t T M a t r i z (B) ; P r i n t T M a t r i z (C) ; D e s t r o y T M a t r i z (A) ; 18
  • 24. D e s t r o y T M a t r i z (B) ; D e s t r o y T M a t r i z (C) ; D e s t r o y T M a t r i z ( I ) ; D e s t r o y T M a t r i z (R) ; s y s t e m ( PAUSE) ; return 0 ; } 19
  • 25. 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