introdução a estrutura de dados - aula 1
TRANSCRIPT
-
7/24/2019 Introduo a estrutura de dados - Aula 1
1/12
MAC2301Laboratorio de Programacao
Aula 01
Professores: Joao Eduardo Ferreira e Marcelo Finger
Primeiro Semestre de 2012
1 O que sao algoritmos?Descricao de um procedimento formal que recebe um conjuntode valores de entrada e produz um conjunto de valores de sada.(Cormen et al.)
Para resolver um problema:
Abstracao da realidade do problema (quais os dados que interessam?).
Representacao dos dados, depende tambem das operacoes que vao serrealizadas sobre eles.
Exemplo 1 (Wirth) Representacao dos numeros:
tracos (adicao facil)
arabicos (adicao mais complicada, mas outras
operacoes mais simples)
binarios (adequado para computador, mas nao para nos)
Representacao escolhida depende das informacoes a serem guardadas eda forma como serao manipuladas.
2 Revisao rapida de C
Problema 1 Dado um numero naturaln, imprimir todos os numeros pri-mos entre2 en.
1
-
7/24/2019 Introduo a estrutura de dados - Aula 1
2/12
2.1 Solucao 1
Contador i varia de 2 a n. Para cada valor, testa se i e primo, se for,imprime. Para testar se i e primo, verifica se algum numero entre 2 e i1e um divisor de i.
2.1.1 C
# i n c l u d e
i n t main ( ) {
i n t
i , j , / C o n t r ol e de l a c o . /n , / L i mi t e s u p e r i o r . /pr imo ; / p ri mo v a l e 1 s e o numero e p ri mo /
/ e 0 c . c . /
p r i n t f ( D i gi t e o v a lo r de n : ) ;s c anf (%d,&n);
f or ( i = 2 ; i
-
7/24/2019 Introduo a estrutura de dados - Aula 1
3/12
para exibir valores enquanto que a classe cin e utilizada para armazenar
valores recebidos por meio do teclado em variaveis. Na linguagem C asfuncoes printf e scanf eram utilizadas para executar essas mesmas funcoes.Entretanto, observe que a denominacao apropriada que usamos para essasfuncionalidades na linguagem C++ foi classe e nao funcao!
As sintaxes utilizadas para cin e cout sao respectivamente:
cin >> variavel_destino;
cout
-
7/24/2019 Introduo a estrutura de dados - Aula 1
4/12
# i n c l u d e
u s i n g n am es pa ce s t d ;
i n t main ( ) {
i n ti , j , / C o n t r ol e de l a c o . /n , / L i mi t e s u p e r i o r . /pr imo ; / p ri mo v a l e 1 s e o numero e p ri mo /
/ e 0 c . c . /
c out > n ;
f or ( i = 2 ; i
-
7/24/2019 Introduo a estrutura de dados - Aula 1
5/12
n ; / L i mi t e s u p e r i o r . /
p r i n t f ( D i gi t e o v a lo r de n : ) ;s c a nf (%d , &n ) ;
/ I n i c i a l i z a c a o do c r i v o /f or ( i = 2 ; i
-
7/24/2019 Introduo a estrutura de dados - Aula 1
6/12
n ; / L i mi t e s u p e r i o r . /
c out > n ;
/ I n i c i a l i z a c a o do c r i v o /f or ( i = 2 ; i
-
7/24/2019 Introduo a estrutura de dados - Aula 1
7/12
3 Recursao
1. Fatorial: Definicao matematica:
0! = 1n! =n(n1)!
Algoritmo recursivo:
i n t f a t ( i n t n ) {
i f ( n == 0 )
r e tu r n 1 ;e l s er e t u r n n f a t ( n1);
}
2. Fibonacci: Definicao matematica:
F(0) = 0F(1) = 1F(n) =F(n1) + F(n2)
Algoritmo recursivo:i n t Fi b ( i n t n ) {
i f ( n == 0 )r e tu r n 0 ;
e l s e i f ( n == 1)r e tu r n 1 ;
e l s er e t u rn F ib ( n1)+Fib(n2);
}
Veja mais sobre recursao em: http://www.ime.usp.br/~pf/algoritmos/aulas/recu.htm
-
7/24/2019 Introduo a estrutura de dados - Aula 1
8/12
4 Ordenacao de um vetor
4.1 Selecao
A cada passo, selecionamos o menor elemento do vetorv[i..n1] e colocamosna posicao i. Sabemos que o vetor v[0..i 1] esta em ordem crescente ev[i1] v[i..n1].
Complexidade: O(n2).
v oi d s e l e ca o ( i n t n , i n t v [ ] ) {i n t i , j , min , aux ;
f or ( i = 0 ; i < n1; i++) {
/ P ro cu ra o minimo no v e t o r de i a n1. /min = i ;f o r ( j = i +1; j < n ; j ++)
i f ( v [ j ] < v [ min ] ) min = j ;
/ C o l oc a o minimo no i n i c i o . /aux = v [ i ] ;v [ i ] = v [ min ] ;v [ min ] = a ux ;
}}
Versao recursiva:
v o id s e l e c a o r e c ( i n t i , i n t n , i n t v [ ] ) {i n t j , min , aux , x ;
i f ( i
-
7/24/2019 Introduo a estrutura de dados - Aula 1
9/12
s e l e c a o r e c ( i +1 ,n , v ) ;}
}
4.2 Insercao
A cada passo, sabemos que o vetor v[0..i 1] esta em ordem crescente.Guardamos o valor de v[i] em j. Percorremos o vetor de v[i 1] paratras deslocando cada elemento uma casa para frente ate encontrarmos umelemento menor quej. Inserimos o valor dejapos o ultimo elemento testado.
v o id i n se r ca o ( i n t n , i n t v [ ] ) {
i nt j , i , x ;f or ( j = 1 ; j < n ; j ++) {
x = v [ j ] ;
/ Move o s e l e m e nt o s m a i o re s q ue v [ j ] uma c a s a p a ra f r e n t e f o r ( i = j 1; i >= 0 && v [ i ] > x ; i )
v [ i +1] = v [ i ] ;
/ C o l o ca v [ j ] no e s p ac o q ue s o br o u . /v [ i + 1] = x ;
}}
4.3 Intercalacao (Mergesort)
Ideia: Divide na metade, ordena as duas metades e intercala.Para intercalar as metades ordenadas, e preciso resolver o seguinte pro-
blema auxiliar: suponha quev[p..q1] e v[q..r1] estao em ordem crescente;queremos colocar v[p..r1] em ordem crescente.
Intercala: Entrada: vetor v , inteirosp, q,r, tais que
v[p..q1] e v[q..r1]
estao ordenados.Sada: vetor v[p...r1] ordenado.
i = p ; j = q ; k = p ;
-
7/24/2019 Introduo a estrutura de dados - Aula 1
10/12
Enquanto nao acabou nenhuma metade:
s e ( v [ i ] < v [ j ] )w [ k ] = v [ i ] ;i = i +1 ;
s e na o w [ k ] = v [ j ] ;j = j +1 ;
k = k + 1 ;
Copia o pedaco que sobrou de um vetor. Copia tudo de w em v.Usando intercala, o algoritmo de ordenacao fica:
v oi d m er ge so rt ( i n t p , i n t r , i n t v [ ] ) {i n t q ;
i f ( p < r1) {q = ( p + r ) / 2 ;m er ge so rt ( p , q , v ) ;m er ge so rt ( q , r , v ) ;i n t e r c a l a ( p , q , r , v ) ;
}}
Resolvemos log(n) problemas (dividindo por dois a cada vez), cada ro-dada leva tempo O(n), a complexidade e O(nlog(n))
Exerccio 1 Comparar os tempos de execucao dos algoritmos de ordenacaovistos em aula. Testar com vetores aleatorios e tambem com os seguintescasos limite:
vetor ja esta ordenado,
vetor ordenado em ordem decrescente e
vetor com todos os elementos iguais.
Para testar o tempo use:
#inc lude
. . .
d o ub l e t im e1 , t im e2 , t o t a l ;
-
7/24/2019 Introduo a estrutura de dados - Aula 1
11/12
t im e1 = ( d ou bl e ) c l o c k ( ) ;
t im e2 = ( d ou bl e ) c l o c k ( ) ;
t o t a l = ( d o ub l e ) ( t im e2time 1 ) /CLOCKS PER SEC ;
Para preencher um vetor com valores aleatoriosuse:
#inc lude
v o id p re e nc h e ( i n t v [ ] , i n t n ){
i n t i ;
s r a n d ( 0 ) ;f or ( i = 0 ; i < n ; i ++)
v [ i ] = rand()%MAX; / MAX de ve s e r d e f i n i d o /}
Bibliografia: Cormen et al. captulos 1 e 2.
Exerccio 2 ((Extra) Torre de Hanoi) Ha um jogo interessante cuja asolucao e naturalmente recursiva. Ele consiste de 3 varetas e alguns discos.Uma das varetas contem uma pilha de n discos de modo que os raios dimi-nuem da base para o topo. As outras duas est ao vazias. O jogo consiste empassar os discos da vareta original para uma das outras sempre movendo odisco do topo e nunca colocando um disco de raio maior sobre um disco deraio menor.
| | |
- | |
--- | |
----- | |
------- | |
vareta 1 2 3
Ex. de configuracao originalEscreva um programa de computador que apresente quais movimentos
devem ser feitos. Por exemplo no caso acima com quatro discos a sadadeveria ser algo como:
-
7/24/2019 Introduo a estrutura de dados - Aula 1
12/12
Mova o disco do topo da vareta 1 para a vareta 2
Mova o disco do topo da vareta 1 para a vareta 3Mova o disco do topo da vareta 2 para a vareta 3
Mova o disco do topo da vareta 1 para a vareta 2
Mova o disco do topo da vareta 3 para a vareta 1
Mova o disco do topo da vareta 3 para a vareta 2
Mova o disco do topo da vareta 1 para a vareta 2
Mova o disco do topo da vareta 1 para a vareta 3
Mova o disco do topo da vareta 2 para a vareta 3
Mova o disco do topo da vareta 2 para a vareta 1
Mova o disco do topo da vareta 3 para a vareta 1
Mova o disco do topo da vareta 2 para a vareta 3
Mova o disco do topo da vareta 1 para a vareta 2Mova o disco do topo da vareta 1 para a vareta 3
Mova o disco do topo da vareta 2 para a vareta 3