introdução a estrutura de dados - aula 1

Upload: jonataspulz

Post on 24-Feb-2018

213 views

Category:

Documents


0 download

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