SlideShare a Scribd company logo
1 of 25
Download to read offline
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

More Related Content

What's hot

Resistência dos Materiais II - Unidade 02
Resistência dos Materiais II - Unidade 02Resistência dos Materiais II - Unidade 02
Resistência dos Materiais II - Unidade 02Leonardo Goliatt
 
Gramatica1ciclo 120526092514-phpapp02
Gramatica1ciclo 120526092514-phpapp02Gramatica1ciclo 120526092514-phpapp02
Gramatica1ciclo 120526092514-phpapp02Luísa Figueiredo
 
Madeira (Resistência dos materiais)
Madeira (Resistência dos materiais)Madeira (Resistência dos materiais)
Madeira (Resistência dos materiais)Lais Ferraz
 
Pnaic unidade 3 ensino da ortografia
Pnaic unidade 3   ensino da ortografiaPnaic unidade 3   ensino da ortografia
Pnaic unidade 3 ensino da ortografiatlfleite
 
Ferramentas Utilizadas na Construção de Edificações
Ferramentas Utilizadas na Construção de EdificaçõesFerramentas Utilizadas na Construção de Edificações
Ferramentas Utilizadas na Construção de EdificaçõesMarcelo Magalhaes Barbosa
 
Aços Especiais - Arquitetura
Aços Especiais - ArquiteturaAços Especiais - Arquitetura
Aços Especiais - ArquiteturaAngélica Vidal
 
Caracterização da indústria na construção civil
Caracterização da indústria na construção civilCaracterização da indústria na construção civil
Caracterização da indústria na construção civilDaniela Maracaba
 
História da Tecnologia da Informação e Comunicação
História da Tecnologia da Informação e Comunicação História da Tecnologia da Informação e Comunicação
História da Tecnologia da Informação e Comunicação sergio.ramiro
 
Capitulo 8 flexão (2)
Capitulo 8   flexão (2)Capitulo 8   flexão (2)
Capitulo 8 flexão (2)Tiago Gomes
 
Noções de resistências dos materiais: esforços axiais e transversais
Noções de resistências dos materiais: esforços axiais e transversaisNoções de resistências dos materiais: esforços axiais e transversais
Noções de resistências dos materiais: esforços axiais e transversaisSamanta Lacerda
 

What's hot (20)

Resistência dos Materiais II - Unidade 02
Resistência dos Materiais II - Unidade 02Resistência dos Materiais II - Unidade 02
Resistência dos Materiais II - Unidade 02
 
Apostila Ansys Workbench
Apostila Ansys WorkbenchApostila Ansys Workbench
Apostila Ansys Workbench
 
Gramatica1ciclo 120526092514-phpapp02
Gramatica1ciclo 120526092514-phpapp02Gramatica1ciclo 120526092514-phpapp02
Gramatica1ciclo 120526092514-phpapp02
 
A lenda do milho
A lenda do milhoA lenda do milho
A lenda do milho
 
Madeira (Resistência dos materiais)
Madeira (Resistência dos materiais)Madeira (Resistência dos materiais)
Madeira (Resistência dos materiais)
 
Pnaic unidade 3 ensino da ortografia
Pnaic unidade 3   ensino da ortografiaPnaic unidade 3   ensino da ortografia
Pnaic unidade 3 ensino da ortografia
 
Relatorio
RelatorioRelatorio
Relatorio
 
Análise estrutural i
Análise estrutural iAnálise estrutural i
Análise estrutural i
 
Rugosidade
RugosidadeRugosidade
Rugosidade
 
Ferramentas Utilizadas na Construção de Edificações
Ferramentas Utilizadas na Construção de EdificaçõesFerramentas Utilizadas na Construção de Edificações
Ferramentas Utilizadas na Construção de Edificações
 
Lista i
Lista iLista i
Lista i
 
Instalação manutenção equip_informáticos
Instalação manutenção equip_informáticosInstalação manutenção equip_informáticos
Instalação manutenção equip_informáticos
 
Manual alvenaria estrutural
Manual alvenaria estruturalManual alvenaria estrutural
Manual alvenaria estrutural
 
Estrutura cristalina
Estrutura cristalinaEstrutura cristalina
Estrutura cristalina
 
Aços Especiais - Arquitetura
Aços Especiais - ArquiteturaAços Especiais - Arquitetura
Aços Especiais - Arquitetura
 
Caracterização da indústria na construção civil
Caracterização da indústria na construção civilCaracterização da indústria na construção civil
Caracterização da indústria na construção civil
 
História da Tecnologia da Informação e Comunicação
História da Tecnologia da Informação e Comunicação História da Tecnologia da Informação e Comunicação
História da Tecnologia da Informação e Comunicação
 
Capitulo 8 flexão (2)
Capitulo 8   flexão (2)Capitulo 8   flexão (2)
Capitulo 8 flexão (2)
 
Nbr 13279 2005
Nbr 13279 2005Nbr 13279 2005
Nbr 13279 2005
 
Noções de resistências dos materiais: esforços axiais e transversais
Noções de resistências dos materiais: esforços axiais e transversaisNoções de resistências dos materiais: esforços axiais e transversais
Noções de resistências dos materiais: esforços axiais e transversais
 

Viewers also liked

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
 

Viewers also liked (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
 

Similar to 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
 

Similar to 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
 

More from 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