Apostila Exercícios 2014.1 2014-02-26-2100.pdf

download Apostila Exercícios 2014.1 2014-02-26-2100.pdf

of 67

Transcript of Apostila Exercícios 2014.1 2014-02-26-2100.pdf

  • 7/23/2019 Apostila Exerccios 2014.1 2014-02-26-2100.pdf

    1/67

    UESCUniversidade Estadual de Santa Cruz

    Cincia da ComputaoEstruturas de DadosListas de Exerccios

    Paulo Costa19 Agosto 2013

  • 7/23/2019 Apostila Exerccios 2014.1 2014-02-26-2100.pdf

    2/67

    Sumrio

    Parte 1Listas de exerccios ........................................................................... 1

    1. Recurso ................................................................................................................. 12. Abstrao de dados................................................................................................ 3

    3. Vetores ................................................................................................................... 4

    4. Listas encadeadas .................................................................................................. 6

    5. Pilhas, filas e deques ............................................................................................ 10

    6. Complexidade....................................................................................................... 13

    7. Ordenao ............................................................................................................ 20

    8. rvores ................................................................................................................. 219. Heaps .................................................................................................................... 26

    10. Tabelas Hash ........................................................................................................ 28

    Parte 2Solues de exerccios selecionados ................................................ 32

    1. Recurso ............................................................................................................... 32

    2. Abstrao de dados.............................................................................................. 34

    3. Vetores ................................................................................................................. 36

    4. Listas encadeadas ................................................................................................ 38

    5. Pilhas, filas e deques ............................................................................................ 40

    6. Complexidade....................................................................................................... 42

    7. Ordenao ............................................................................................................ 54

    8. rvores ................................................................................................................. 55

    9. Heaps .................................................................................................................... 59

    10. Tabelas Hash ........................................................................................................ 62

  • 7/23/2019 Apostila Exerccios 2014.1 2014-02-26-2100.pdf

    3/67

    Paulo Costa2013 Estruturas de DadosListas de exerccios e solues 1

    Parte 1Listas de exerccios

    1. Recurso

    Exerccio 1.1 1) Determine o que a seguinte funo recursiva em C calcula:

    int func (int n) {if (n == 0)return 0;

    return (n + func (n-1));}

    2) Escreva uma funo iterativa que atinja o mesmo objetivo.

    Exerccio 1.2 Escreva as funes a seguir. Todas tomam como entrada dois inteiros no negativosae b(a, b0).

    a) somaI, uma funo iterativa que retorna a+b.b) somaR, uma funo recursiva que retorna a+b.c) multI, uma funo iterativa que retorna ab. Faa uma chamada asomaIse desejar.d) multR, uma funo recursiva que retorna ab. Faa uma chamada asomaRse desejar.

    No use qualquer operador aritmtico alm de incremento (++) ou decremento (--).

    Exerccio 1.3

    Escreva a funo recursiva menorDigito que toma um inteiro no negativo e retorna o menor detodos os seus dgitos. No use laos (for, while) nem declare variveis locais.

    Exerccio 1.4

    Escreva a funo recursiva maiorDigitoque toma um inteiro no negativo e retorna o maior de todosos seus dgitos. No use laos (for, while) nem declare variveis locais.

    Exerccio 1.5

    Tente reescrever as funes do exerccio 1.2 obedecendo todos os critrios abaixo:

    a) No utilize qualquer operador aritmtico alm de incremento (++) ou decremento (--).

    b) No passe qualquer parmetro alm dos dois operandos (ae b).c) No declare qualquer varivel local, nem mesmo para o valor a ser retornado.

    Se no for possvel obedecer todos para alguma funo, fornea uma soluo que viole s um critrio.

    Exerccio 1.6

    Escreva uma funo recursiva que toma um inteiro no negativo e retorna a soma de seus dgitos. Nouse laos (for, while) nem variveis locais. Sugesto:n%10produz o dgito mais direita de n, en/10produz todos os dgitos de nexceto aquele mais direita.

    Exerccio 1.7

    Escreva uma funo recursiva que toma um inteiro no negativo e retorna a quantidade de dgitos queele contm. No use laos (for, while) nem declare variveis locais.

  • 7/23/2019 Apostila Exerccios 2014.1 2014-02-26-2100.pdf

    4/67

    Paulo Costa2013 Estruturas de DadosListas de exerccios e solues 2

    Exerccio 1.8

    Calcule o nmero de adies necessrias para computar fib(n)para 0 n 10usando os mtodositerativo e recursivo implementados a seguir:

    /* Nmeros de Fibonacci, mtodo iterativo */

    int iFIB (int n) {int i, f1=0, f2=1, f3=0;for (i = 2; i

  • 7/23/2019 Apostila Exerccios 2014.1 2014-02-26-2100.pdf

    5/67

    Paulo Costa2013 Estruturas de DadosListas de exerccios e solues 3

    SomaSubconjunto (0, {2, 4, 8}, 3, 10) deve retornarTRUESomaSubconjunto (0, {2, 4, 8}, 3, 14) deve retornarTRUESomaSubconjunto (0, {2, 4, 8}, 3, 9) deve retornarFALSE

    Sugestes:

    a) Nas chamadas recursivas, ao invs de considerar os nmeros no arrayinteiro, considere apenasa parte do array comeando em inicio. Na primeira chamada em main() o usurio

    especifica a busca no arrayinteiro passando o valor 0 parainicio. No necessrio nenhumlao; a recurso trata pores cada vez menores do array.

    b) O caso base quandoinicio >= totNumeros. Nesse caso, retorneTRUE sesoma 0.

    c) Caso contrrio, considere o nmero na posio inicio do array. H apenas duaspossibilidades: ou esse nmero usado para formarsoma, ou ele no usado.

    d) Faa uma chamada recursiva para verificar se possvel obter uma soluo usando essenmero (no esquea de ajustar o valor desejado desomapara refletir o fato que o nmero jfoi usado).

    e) Se no for possvel, faa outra chamada recursiva para verificar se possvel obter uma soluosem usar esse nmero.

    f) Se nenhuma das tentativas for bem sucedida, ento o problema no tem soluo.

    2. Abstrao de dados

    Exerccio 2.1

    Defina o tipo de dados abstrato Complexo. A estrutura dos nmeros complexos :

    um nmero real (p.ex.float, doubleou RACIONAL) representando a parte real

    um nmero real representando o coeficiente da parte imaginria.

    Defina os mtodos cria_complexo, soma, mult e igual. Lembre que a multiplicao de complexos feita de forma distributiva, ou seja:

    (a + bi) (c + di) = ac + (bi) (di)+ adi + cbi= ac + bd(-1)+ (ad + cb)i= (ac -bd)+ (ad + cb)i

    Exerccio 2.2

    Defina o tipo de dados abstrato Vetor. Um vetor v no espao cartesiano bidimensional pode ser

    definido por um par ordenado (a,b)onde ae bso nmeros reais,como na Figura 1 abaixo.

    Defina tambm os mtodos abaixo com os seguintes parmetros:

    Mtodo Parmetros Resultado

    cria_vetor float, float vetormodulo vetor floatproduto vetor, vetor floatangulo vetor, vetor floatiguais vetor, vetor true oufalse

    Figura 1 Figura 2

    Dados dois vetores v = (a,b)e w = (c,d)

    - O mdulo de v dado por |v| = SQRT(a2

    + b2)onde SQRT a funo raiz quadrada

    - O produto escalar de ve w dado porp = v w = ac+ bd

    - O ngulo entre v e w dado por ACOS ((v w) / (|v| |w|)) onde ACOS a funo arco-cosseno (veja Figura 2).

  • 7/23/2019 Apostila Exerccios 2014.1 2014-02-26-2100.pdf

    6/67

    Paulo Costa2013 Estruturas de DadosListas de exerccios e solues 4

    Use a notao de vetor v= onde v[O] ev[1] so os coeficientex ey dev. Noteque um vetor no pode ser nulo, ou seja, seus dois coeficientes no podem ser ambos 0.

    Exerccio 2.3

    Considere os seguintes tipos de dados em C e seus respectivos tamanhos em bytes:

    Tipo de dado Tamanhochar 1 byteshort int 2 bytesint 4 bytesdouble 8 bytes

    Considere tambm a seguinte sequncia de caracteres: A B C D 1 2 3 A. Escreva um programa em Cque mostra na tela os valores numricos obtidos quando se interpreta a sequncia acima como shortint, inte double. A sada do programa dever consistir no seguinte:

    Como char: A B C D 1 2 3 AComo short int: 16961 17475 12849 16691Como int: 1145258561 1093874225

    Como double: 1258033.266651

    Naturalmente os nmeros impressos devero refletir os caracteres da sequncia; se fosse usada outrasequncia de caracteres, a sada do programa seria diferente.

    3. Vetores

    Exerccio 3.1

    Considere uma tabela de notas de uma turma, onde cada linha contm um par de nmeros: matrculado aluno (do tipo inteiro) e sua nota (do tipo real). Escreva um programa que leia essa tabela e calcule:

    a) a mdia da turma;b) quantos alunos obtiveram nota acima da mdia;c) quantos alunos obtiveram nota igual mdia;d) quantos alunos obtiveram nota abaixo da mdia;e) a maior nota e quantos alunos a obtiveram.

    Exerccio 3.2

    O imperador romano Csar usava um sistema simples para criptografar as mensagens que enviava aosseus generais. Nesse sistema, cada letra era substituda por trs letras frente no alfabeto.

    Sua tarefa semelhante, porm mais simples. Escreva um programa que converta cada letra, esomente as letras, de uma mensagem de at ncaracteres para a letra imediatamente posterior. Noteque zdeve ser convertido para ae Zpara A.

    Exerccio 3.3

    Palndromos so palavras que podem ser lidas igualmente nas duas direes, como ARARA, RADAReANILINA. Note que AMORAno um palndromo, ainda que AROMAseja uma palavra vlida.

    Escreva uma funo ehPalindromo que recebe um ponteiro para a 1 letra de uma palavra e onmero de letras, e retorna um booleano (TRUE=1 ou FALSE=0) indicando se a palavra umpalndromo. No use recurso; a funo deve ser iterativa.

    Sugesto:Primeiro leia os caracteres da palavra e armazene-os em um vetor, depois verifique se trata-se de um palndromo.

  • 7/23/2019 Apostila Exerccios 2014.1 2014-02-26-2100.pdf

    7/67

    Paulo Costa2013 Estruturas de DadosListas de exerccios e solues 5

    Exerccio 3.4

    Considere duas sequncias A e B, cada uma com at 8 nmeros inteiros entre 0 e 9 inclusive. Escrevaum programa que interprete A e B como nmeros inteiros, some-os, e produza uma nova sequncia Ccontendo os dgitos da soma. Exemplo:

    Exerccio 3.5

    Considere duas sequncias ordenadas A e B com at nletras de aa z, por exemplo:

    A =g i i i m r t

    B =d g g i i k o o t

    Escreva um programa que, dadas as sequncias ordenadas A e B, gere 4 sequncias ordenadas com

    a) a unio de A e B, com repeties. Exemplo:d g g g i i i i i k m o o r t t

    b) a unio de A e B, sem repeties. Exemplo:d g i k m o r t

    c) a interseo de A e B, com repeties. Exemplo:g i i t

    d) a interseo de A e B, sem repeties. Exemplo:g i t

    Exerccio 3.6

    Escreva um programa que, dado um conjunto de at maxnmeros inteiros, calcule a mdia, mediana emoda dos nmeros. O tamanho do conjunto, n, deve ser fornecido pelo usurio em tempo de execuo.

    A mediana e a moda de um conjunto de nnmeros so assim definidas:

    Se n for mpar, a mediana o nmero m tal que metade dos demais nmeros me a outra

    metade m. Se n for par, a mediana a mdia entre m1 e m2 tal que metade dos demaisnmeros m1e a outra metade m2.

    A moda o nmero que ocorre com maior frequncia. Se mais de um nmero ocorre com amesma frequncia mxima, ento a moda no est definida. Seu programa deve indicar quandoesse caso ocorrer.

    Sugesto: Teste o programa com conjuntos de tamanho par e mpar.

    Exerccio 3.7

    Modifique o cdigo do exerccio 3.3 de modo que a funo seja recursiva.

    Exerccio 3.8

    Escreva uma funo que, dada uma matriz quadrada de nmeros inteiros, retorna o caractere

    S se a matriz for triangular superior,

    I

    se a matriz for triangular inferior,D

    se a matriz for diagonal, ou

    X

    em qualquer outro caso.

    A funo deve receber como parmetros

    o tamanho da matriz, por exemplo, 3 para uma matriz quadrada 3 x 3

    um ponteiro para o primeiro elemento da matriz.

    Exerccio 3.9

    Modifique o programa do exerccio 3.5 para que aceite sequncias desordenadas. Em nenhummomento ordene as sequncias de entrada.

    9 8 7 6

    9 8 7

    1 0 8 6 3

    A:

    B:

    C:

  • 7/23/2019 Apostila Exerccios 2014.1 2014-02-26-2100.pdf

    8/67

    Paulo Costa2013 Estruturas de DadosListas de exerccios e solues 6

    Exerccio 3.10

    Modifique o programa do exerccio 3.9 para aceitar sequncias desordenadas de qualquer coisa inteiros, nmeros decimais (floatou double), caracteres, estruturas, etc.

    Sugestes:

    Coloque o cdigo de clculo de unio e interseo em funes separadas.

    Use um #definepara definir o tipo de dado contido nas sequncias. Para determinar o tamanho desse tipo de dado, utilize a funo sizeof()da biblioteca de C.

    Para comparar valores de tipo e tamanho arbitrrios, use a funo memcmp()da biblioteca de C.

    4. Listas encadeadas

    Exerccio 4.1

    Considere uma lista simplesmente encadeada com a seguinte estrutura:

    struct nodo {

    int dado;struct nodo* prox;};

    Escreva a funoRemoveUltimo que

    recebe um ponteiro para a listaL, remove o ltimo nodo deL, e no retorna nada.

    A funo deve funcionar corretamente em todos os casos, incluindo:

    lista vazia, lista com um nico nodo,

    lista com dois nodos, e lista com nnodos.

    Exerccio 4.2

    Considere uma lista simplesmente encadeada com a mesma estrutura do exerccio 4.1. Escreva afunoMoveParaInicio que

    recebe um ponteiro para a listaLe o inteiroN, casoNse encontre em um ou mais nodos deL, move os nodos contendoNpara o incio deL, e retorna um booleano indicando seNencontra-se ou no emL; suponha que o tipo Boolj existe

    e que pode assumir os valores TRUEou FALSE.

    Essa funo deve manipular apenas ponteiros, ou seja, no deve criar nodos com malloc() nemdestru-los com free(). Alm disso, a funo deve funcionar corretamente em todos os casos,incluindo:

    lista vazia, lista com um nico nodo contendoN, lista com um nico nodo no contendoN, lista com dois nodos, nenhum deles contendoN, lista com dois nodos, apenas um contendoN, lista com dois nodos, ambos contendoN, lista com nnodos, nenhum deles contendoN, lista com nnodos, apenas um contendoN, e lista com nnodos, vrios contendoN, mas no todos, e

    lista com nnodos, todos contendoN.

  • 7/23/2019 Apostila Exerccios 2014.1 2014-02-26-2100.pdf

    9/67

    Paulo Costa2013 Estruturas de DadosListas de exerccios e solues 7

    Exerccio 4.3

    Considere a funo

    int Tamanho (struct nodo* lista)

    que recebe um ponteiro para uma lista linear (veja figura no exerccio 4.7) e retorna o nmero de nodosda lista. Uma forma de implementar essa funo consiste em percorrer toda a lista contando o nmerode nodos visitados. Uma implementao alternativa envolve o uso de uma varivel global

    static int tamLista

    Assim, ao invs de percorrer toda a l ista contando o nmero de nodos, a funo Tamanho()apenasretorna o valor armazenado em tamLista.

    Responda as seguintes perguntas:

    1) Por que tamListadeve ser global? Por que no pode ser local a Tamanho()?

    2) Por que tamLista declarada como static?

    3) Quais as vantagens dessa implementao alternativa?

    4) Quais as desvantagens?

    Exerccio 4.4

    Considere uma lista duplamente encadeada com a seguinte estrutura:

    struct nodo {char letra;struct nodo* antes;struct nodo* depois;

    };

    Escreva a funoehPalindromo que

    recebe dois ponteiros para a listaL(um para o incio e outro para o fim deL), determina se a palavra formada pelas letras emL um palndromo (veja o exerccio 3.3), e

    retorna um booleano indicando se trata-se ou no de um palndromo; suponha que o tipo Booljexiste e que pode assumir os valores TRUEou FALSE.

    A funo deve ser iterativa (ou seja, no use recurso). Alm disso, a funo deve funcionarcorretamente em todos os casos, incluindo:

    lista vazia, lista com um nico nodo, lista com dois nodos contendo letras iguais, lista com dois nodos contendo letras diferentes, lista com trs, quatro e nnodos contendo um palndromo, e lista com trs, quatro e nnodos contendo um no-palndromo.

    Exerccio 4.5 Implemente a verso recursiva da funoehPalindromo do exerccio anterior.

    Exerccio 4.6

    Considere a funo mostrada a seguir, que opera sobre uma lista linear simplesmente encadeada coma mesma estrutura do exerccio 4.1. O objetivo da funo remover o nodo inicial de uma lista no-vazia e retornar o dado nele contido. Suponha que tDado, nodo, dadoe prox j foram definidos.

    Essa funo realiza corretamente a operao esperada? Justifique.

  • 7/23/2019 Apostila Exerccios 2014.1 2014-02-26-2100.pdf

    10/67

    Paulo Costa2013 Estruturas de DadosListas de exerccios e solues 8

    tDado TiraDoInicio (struct nodo* lista) {struct nodo* inicio;tDado dadoNoInicio;inicio = lista;if (inicio == NULL)exit (-1);

    dadoNoInicio = inicio->dado;lista = inicio->prox;free (inicio);return (dadoNoInicio);

    }

    Exerccio 4.7

    Uma lista circular simplesmente encadeada uma lista linear onde o ltimo nodo aponta de volta para oprimeiro. A lista linear acessada atravs de um ponteiro para o primeiro nodo; a circular, atravs deum ponteiro para o ltimo nodo. Isso permite um acesso fcil a ambas as extremidades da lista circular.

    Considere uma lista linearLe uma lista circular C, ambas simplesmente encadeadas e com a mesmaestrutura do exerccio 4.1.

    1) Escreva a funoTornaCircular que

    recebe um ponteiro para a lista linearL, transformaLem uma lista circular, e no retorna nada.

    2) Escreva a funoTornaLinear que faz o oposto da funo anterior.

    3) Escreva a funoTamanhoCircular que

    recebe um ponteiro para a lista circular C, conta o nmero de nodos em C, e retorna esse nmero.

    As trs funes acima devem funcionar corretamente em todos os casos, incluindo:

    lista vazia, lista com um nico nodo, lista com dois nodos, e lista com nnodos.

    4) Escreva a funoUneCirculares que

    recebe dois ponteiro para as listas circulares C eD, une C eDem uma nica lista circular, coloca o resultado da unio em C, deixaDvazia, e no retorna nada.

    A funo acima deve executar em tempo constante, indepen-dente do tamanho de C eD. Alm disso, a funo devefuncionar corretamente em todos os casos, incluindo as 16combinaes ao lado.

    Nodos em D

    0 1 2 n

    Nodo

    semC 0

    1

    2n

    Lista linear Lista circular

    A B C

    incio

    A B C

    fim

  • 7/23/2019 Apostila Exerccios 2014.1 2014-02-26-2100.pdf

    11/67

    Paulo Costa2013 Estruturas de DadosListas de exerccios e solues 9

    Exerccio 4.8

    Considere uma lista simplesmente encadeada com a mesma estrutura do exerccio 4.1, onde os todosos inteiros esto entre 0 e 9 inclusive.

    1) Escreva a funoListaParaInt que

    recebe um ponteiro para a listaL, interpreta os nmeros emLcomo dgitos de umlong unsigned int, e retorna o nmero resultante.

    Suponha que o dgito mais significativo esteja no incio da lista, e que o nmero final pode serarmazenado em umlong unsigned int sem causar overflow.

    A funo deve funcionar corretamente em todos os casos, incluindo:

    lista vazia (nesse caso a funo deve retornar 0), lista com um nico nodo, lista com dois nodos, e lista com nnodos.

    2) Escreva a funoIntParaLista que faz o oposto da funo acima, ou seja:

    recebe um inteiroNdo tipounsigned long int,

    coloca cada um dos dgitos decimais deNem uma listaL, e retorna um ponteiro para o incio deL.

    Exerccio 4.9

    Considere uma lista circularLduplamente encadeada,como na figura ao lado.

    Os nodos da lista possuem aseguinte estrutura:

    Considere tambm a funo abaixo, onde *fimaponta para o ltimo nodo deL.

    struct nodo {struct nodo* antes;int dado;struct nodo* depois;

    };

    void funcao (struct nodo **fim) {struct nodo *p;if (*fim == NULL)return;

    p = *fim->depois;p->antes = NULL;*fim->depois = NULL;*fim = p;

    }

    Qual o objetivo dessa funo? Ou seja, o que ela faz?

    Exerccio 4.10

    A funo ao lado opera sobre uma listasimplesmente encadeada com a mesmaestrutura do exerccio 4.1. O que faz essafuno?

    void funcao (struct nodo** lista) {struct nodo* resultado = NULL;struct nodo* atual = *lista;struct nodo* prox;while (atual != NULL) {prox = atual->prox;atual->prox = resultado;resultado = atual;atual = prox;

    }*lista = resultado;

    }

    *fim

  • 7/23/2019 Apostila Exerccios 2014.1 2014-02-26-2100.pdf

    12/67

    Paulo Costa2013 Estruturas de DadosListas de exerccios e solues 10

    Exerccio 4.11

    A funo abaixo opera sobre uma lista simplesmente encadeada com a mesma estrutura do exerccio4.1. O que faz essa funo?

    void funcaoRecursiva (struct nodo** lista) {struct nodo* primeiro;

    struct nodo* resto;if (*lista == NULL)return;

    primeiro = *lista;resto = primeiro->prox;if (resto == NULL)return;

    funcaoRecursiva (&resto);primeiro->prox->prox = primeiro;primeiro->prox = NULL;*lista = resto;

    }

    5. Pilhas, filas e deques

    Exerccio 5.1

    Projete uma pilha de caracteres utilizando um vetor Vno-circular de tamanho n, de modo que o ndicedo caractere no topo da pilha seja armazenado em V[0]e os caracteres empilhados em V[1]a V[n1].Implemente as funes de acesso pilha listadas abaixo:

    void poePilha (char letra)char tiraPilha (void)char topoPilha (void)int tamPilha (void)Bool pilhaVazia (void)

    Exerccio 5.2

    Projete duas pilhas de caracteres utilizando um nico vetor Vde tamanho n, de modo que

    o ndice do caractere no topo da pilha 0 seja armazenado em V[0], o ndice do caractere no topo da pilha 1 seja armazenado em V[n1], as pilhas possam crescer enquanto houver posies livres em V, e as pilhas no sejam deslocadas durante a execuo do programa.

    Implemente as funes de acesso listadas abaixo. O nmero da pilha pode ser 0 ou 1.

    void poePilha (int numPilha, char letra)char tiraPilha (int numPilha)char topoPilha (int numPilha)int tamPilha (int numPilha)Bool pilhaVazia (int numPilha)

    Exerccio 5.3

    Escreva uma funo BoolehPalindromo(void)que determina se uma palavra um palndromo(veja a lista L2, Exerccio 3.3). As letras da palavra so obtidas com a funo char obtemLetra(void), que retorna uma letra de cada vez, enquanto houver letras sem serem lidas. Se no houvermais letras, uma chamada a obtemLetra causa erro. Para evitar esse erro, use a funo BoolacabaramAsLetras(void). Note que a palavra s pode ser lida uma vez; no possvel recomeardo incio da palavra.

  • 7/23/2019 Apostila Exerccios 2014.1 2014-02-26-2100.pdf

    13/67

    Paulo Costa2013 Estruturas de DadosListas de exerccios e solues 11

    H trs tipos de estruturas de dados disponveis, mas apenas uma de cada tipo: uma pilha, uma fila eum deque; todas armazenam caracteres. Voc pode usar as estruturas em qualquer combinao, ouseja: apenas uma das trs, ou duas delas, ou todas as trs. Para utiliz-las, chame as funes deacesso descritas abaixo.

    Implemente apenas a funo ehPalindromo, sem usar recurso. Suponha que todas as demais jexistam. Suponha tambm que o tipo Boolj existe, e que pode assumir os valores TRUEou FALSE.

    Pilha Fila Deque

    void poePilha (char letra) void poeFila (char letra) void poeInicioDeque (char letra)char tiraPilha (void) char tiraFila (void) void poeFimDeque (char letra)char topoPilha (void) char frenteFila (void) char tiraInicioDeque (void)int tamPilha (void) int tamFila (void) char tiraFimDeque (void)Bool pilhaVazia (void) Bool filaVazia (void) char inicioDeque (void)

    char fimDeque (void)int tamDeque (void)Bool dequeVazio (void)

    Sugestes:

    Use o projeto de Dev-C++ chamado ehPalindromo que acompanha esta lista de exerccios. Esseprojeto contm todo o cdigo de suporte necessrio realizao do exerccio. Abra o arquivoehPalindromo.c e escreva seu cdigo na funo ehPalindromo(). No altere mais nada nocdigo fornecido. Se o programa compilar e funcionar corretamente, ento sua implementaoprovavelmente estar correta.

    Exerccio 5.4

    Imagine um deque implementado atravs de um array circular A de tamanho TAM de modo queelementos adicionados ao final do deque ocupam posies crescentes no array, enquanto elementosadicionados ao incio do deque ocupam posies decrescentes no array. Por exemplo:

    A inicio fim Deque

    Incio da execuo [- - - -] -1 -1 Incio-> 1 1 2 3 1 2 4 3 1 2 4 3 1

  • 7/23/2019 Apostila Exerccios 2014.1 2014-02-26-2100.pdf

    14/67

    Paulo Costa2013 Estruturas de DadosListas de exerccios e solues 12

    ( ) Ao implementar um deque atravs de uma lista encadeada com dois ponteiros de acesso (incioe fim da lista), consideramos duas opes: a)usar uma lista circular simplesmente encadeada, eb)usar uma lista linear duplamente encadeada. Dessas, a opo b mais eficiente.

    ( ) Uma boa estrutura de dados para se implementar uma fila um array circular com compactaoaps cada remoo.

    ( ) Se usarmos uma lista linear duplamente encadeada para implementar uma fila, tanto faz termos

    apenas um ponteiro para o incio ou para o final da lista; em qualquer caso, inseres eremoes da fila levaro tempo O(1).

    Exerccio 5.6

    Implemente uma fila atravs de duas pilhas.

    Pressupostos:

    1) O tipo de dado a ser armazenado na fila, tDado, j est definido.2) Todos os mtodos de acesso a pilhas, listados na tabela abaixo, j esto implementados.3) Esses mtodos so capazes de manipular vrias pilhas independentes ao mesmo tempo.4) Esses mtodos tomam o nmero da pilha como parmetro.

    Restries:1) Implemente apenas os mtodos de acesso fila listados na tabela abaixo.2) No declare nenhuma varivel.3) Use apenas os mtodos de acesso a pilhas e os comandos de C que julgar convenientes.4) Use apenas duas pilhas, numeradas 0 e 1.5) No use recurso.

    Pilha Fila

    void poePilha (int numPilha, tDado dado) void poeFila (tDado dado)tDado tiraPilha (int numPilha) tDado tiraFila (void)tDado topoPilha (int numPilha) tDado frenteFila (void)int tamPilha (int numPilha) int tamFila (void)

    Bool pilhaVazia (int numPilha) Bool filaVazia (void)

    Sugestes:

    Use o projeto Dev-C++ filaComPilhasque acompanha esta lista de exerccios. O projeto contm todoo cdigo de suporte necessrio realizao do exerccio. Abra o arquivo fila.ce escreva seu cdigonas funes a serem implementadas. No altere mais nada no cdigo fornecido.

    filaComPilhas uma modificao do projeto ehPalindromo. O cdigo em filaComPilhas.ctesta afuncionalidade da fila em uma aplicao simples: verificao se palavras digitadas pelo usurio sopalndromos. Se o programa compilar e funcionar corretamente, ento sua implementao da filaprovavelmente estar correta.

    Exerccio 5.7 Implemente um deque atravs de duas pilhas.

    Pressupostos:

    1) O tipo de dado a ser armazenado no deque, tdado, j est definido.2) Todos os mtodos de acesso a pilhas, listados na tabela abaixo, j esto implementados.3) Esses mtodos so capazes de manipular vrias pilhas independentes ao mesmo tempo.4) Esses mtodos tomam o nmero da pilha como parmetro.

    Restries:

    1) Implemente apenas os mtodos de acesso ao deque listados na tabela abaixo.2) No declare nenhuma varivel.

    3) Use apenas os mtodos de acesso a pilhas e os comandos de C que julgar convenientes.4) Use apenas duas pilhas, numeradas 0 e 1.5) No use recurso.

  • 7/23/2019 Apostila Exerccios 2014.1 2014-02-26-2100.pdf

    15/67

    Paulo Costa2013 Estruturas de DadosListas de exerccios e solues 13

    Pilha Deque

    void poePilha (int numPilha, tDado dado) void poeInicioDeque (tDado dado)tDado tiraPilha (int numPilha) void poeFimDeque (tDado dado)tDado topoPilha (int numPilha) tDado tiraInicioDeque (void)int tamPilha (int numPilha) tDado tiraFimDeque (void)Bool pilhaVazia (int numPilha) tDado inicioDeque (void)

    tDado fimDeque (void)

    int tamDeque (void)Bool dequeVazio (void)

    Exerccio 5.8

    Implemente uma pilha atravs de uma fila. Suponha que o tipo de dado a ser armazenado (tdado) e osmtodos de acesso fila j foram previamente implementados.

    Restries:

    1) O nmero total de variveis usadas em todos os mtodos no pode ser maior que trs.2) Use apenas os mtodos de acesso fila e os comandos de C que julgar convenientes.3) No use recurso.

    Mtodos a serem usados Mtodos a serem implementados

    void poeFila (tDado dado)tDado tiraFila (void)tDado frenteFila (void)int tamFila (void)Bool filaVazia (void)

    void poePilha (tDado dado)tDado tiraPilha (void)tDado topoPilha (void)int tamPilha (void)Bool pilhaVazia (void)

    Exerccio 5.9

    Considere uma fila implementada em um vetor Vno-circular de tamanho n, de modo que o primeiroitem colocado na fila seja armazenado em V[0], o prximo em V[1]etc. Ao retirarmos itens da fila, a

    frente da fila passa a estar em V[1], V[2]etc., criando espaos vazios no incio do vetor. Pode-se evitaresse desperdcio compactando o vetorou seja, deslocando a fila para baixo no vetor -- de modo quea frente da fila volte a estar em V[0]. Essa compactao pode ser feita em momentos distintos:

    1) aps cada remoo da fila,2) antes de cada insero na fila, ou3) antes de uma insero quando o fim da fila j chegou ao final do vetor, ou seja, V[n].

    Para cada um desses mtodos:

    Discuta suas vantagens e desvantagens. Escreva as funes de acesso fila incorporando o respectivo mtodo de compactao.

    6. Complexidade

    Exerccio 6.1

    Liste as limitaes da anlise experimental de complexidade de algoritmos.

    Exerccio 6.2

    A anlise terica de complexidade de algoritmos utiliza os conceitos de melhor caso, caso mdio e piorcaso. Liste trs motivos pelos quais a anlise do caso mdio pode ser problemtica.

    Exerccio 6.3

    Liste trs limitaes do modelo RAM de computao.

  • 7/23/2019 Apostila Exerccios 2014.1 2014-02-26-2100.pdf

    16/67

    Paulo Costa2013 Estruturas de DadosListas de exerccios e solues 14

    Exerccio 6.4

    Para cada uma das operaes descritas abaixo, fornea o tempo de execuo no pior caso. Use anotao O grande, por exemplo, T(n) = O(log(n)). Suponha que todas as operaes bsicas sejamrealizadas em tempo constante.

    1) Busca de um dado em arraydesordenado com nposies.

    2) Busca binria de um dado em arrayordenado com nposies.3) Busca de um dado em uma matriz quadrada com nlinhas e colunas.

    4) Clculo de cnusando apenas multiplicaes.

    5) Clculo de cnusando apenas adies.

    Exerccio 6.5

    Coloque as funes abaixo em ordem crescente de complexidade assinttica. Atribua 1 para a funode menor complexidade e 8 para a funo de maior complexidade.

    A.( ) 10n (log n) E.( ) 10 log n

    B.( ) n F. ( ) 10 n C. ( ) 100 (log n) G. ( ) 300n log n

    D.( ) n (log n) H. ( ) 2n

    Exerccio 6.6

    Coloque as funes abaixo em ordem crescente de complexidade assinttica. Atribua 1 para a funode menor complexidade e 8 para a funo de maior complexidade.

    A.( ) 103n

    2 E.( ) 10n

    3(10

    2log 10

    2n)

    3

    B.( ) 2n F. ( ) 10n

    3

    C. ( ) 102n (103log 103n)2 G. ( ) 106(105 log 104n)3

    D.( ) 103n log 10

    2n H. ( ) 10

    8log 10

    9n

    Exerccio 6.7

    Coloque as funes abaixo em ordem crescente de complexidade assinttica. Atribua 1 para a funode menor complexidade e 10 para a funo de maior complexidade.

    A.( ) 10n F.( ) 2n

    B.( ) 10 n log 10 n G. ( ) 10 log 10 n

    C. ( ) 10 n H. ( ) 10n (10 log 10 n)

    D.( ) 10 n log (10 n ) I. ( ) 10 (10log 10 n)

    E. ( ) 10n (10 log 10 n) J. ( ) 10 n (10 log 10 n)

    Exerccio 6.8

    Verdadeiro ou falso:

    01.( ) Sef(n)=(g(n)) entof(n)=O(g(n))

    02.( ) Sef(n)=(g(n)) entof(n)=(g(n))

    03. ( ) Sef(n)=O (g(n)) entof(n)=(g(n))

    04.( ) Sef(n)=(g(n)) entof(n)=(g(n))05. ( ) Sef(n)=O(g(n)) entog(n)=O (f(n))

  • 7/23/2019 Apostila Exerccios 2014.1 2014-02-26-2100.pdf

    17/67

    Paulo Costa2013 Estruturas de DadosListas de exerccios e solues 15

    06. ( ) Sef(n)=(g(n)) entog(n)=(f(n))

    07. ( ) Sef(n)=O(g(n)) eg(n)=O (f(n)) entof(n)=(g(n))

    08. ( ) Sef(n)=O(g(n)) eg(n)=O (f(n)) entog(n)=(f(n))

    09. ( ) Sef(n)=O(g(n)) eg(n)=O (f(n)) entof(n)=(g(n))

    10. ( ) Sef(n)=O(g(n)) eg(n)=O (f(n)) entog(n)=(f(n))

    11. ( ) Sef(n)=O(h(n)) e h(n)=O(g(n)) entof(n)=O(g(n))

    12. ( ) Sef(n)=O(h(n)) eg(n)=O(h(n)) entof(n)g(n)=O(h(n))

    13. ( ) Sef(n)=O(h(n)) eg(n)=O(h(n)) entof(n)g(n)=O(h(n))

    14. ( ) Sef(n)=O(g(n)) ento kf(n)=O(g(n)) onde k uma constante

    15. ( ) Sef(n)= O(g(n)) no pior caso, entof(n)=O(g(n)) em qualquer caso

    16. ( ) Sef(n)= O(g(n)) no melhor caso, entof(n)=O(g(n)) em qualquer caso

    17. ( ) Sef(n)= (g(n)) no pior caso, entof(n)=(g(n)) em qualquer caso

    18. ( ) Sef(n)= (g(n)) no melhor caso, entof(n)=(g(n)) em qualquer caso

    19. ( ) Sef(n)= (g(n)) no pior caso, entof(n)=(g(n)) em qualquer caso

    20. ( ) Sef(n)= (g(n)) no melhor caso, entof(n)=(g(n)) em qualquer caso

    Exerccio 6.9

    Considere a definio de O(g(n))a seguir:

    O(g(n))= {f(n): constantes ce n00| 0f(n) cg(n) para todo nn0}

    Considere tambm a funof(n)= an+bonde ae bso constantes inteiras e a0.

    Pergunta:f(n) O(n2

    )? Prove que sua resposta est correta utilizando a definio de O(g(n)) acima.

    Exerccio 6.10

    Para cada um dos trechos de cdigo abaixo, fornea o tempo de execuo no pior caso. Use a notaoO grande, por exemplo, . Suponha que todas as variveis so inteiras.

    Trecho 1 Trecho 2 Trecho 3

    for (i=0;i

  • 7/23/2019 Apostila Exerccios 2014.1 2014-02-26-2100.pdf

    18/67

    Paulo Costa2013 Estruturas de DadosListas de exerccios e solues 16

    Exerccio 6.11

    Para cada estrutura de dados nas tabelas a seguir, fornea o tempo de execuo no pior caso dasoperaes de insero (INS) e remoo (REM) de elementos. Utilize a notao O grande.

    Implementao Variveis disponveis INS REM

    Pilha

    Array ndice do topo da pilha 1

    Lista linearsimplesmenteencadeada

    Ponteiro p/ topo da pilha (ltimo nodo) 2

    Ponteiro p/ base da pilha (1 nodo) 3

    Lista linearduplamenteencadeada

    Ponteiro p/ topo da pilha (ltimo nodo) 4

    Ponteiro p/ base da pilha (1 nodo) 5

    Ponteiros p/ topo e base da pilha (1 e ltimo nodos) 6

    Lista circularsimplesmenteencadeada

    Ponteiro p/ topo da pilha (ltimo nodo) 7

    Ponteiro p/ base da pilha (1 nodo) 8

    Lista circularduplamenteencadeada

    Ponteiro p/ topo da pilha (ltimo nodo) 9

    Ponteiro p/ base da pilha (1 nodo) 10

    Ponteiros p/ topo e base da pilha (1 e ltimo nodos) 11

    Fila

    Arraysemcompactao ndices do incio e fim da fila 12

    Arrayc/ compactaoaps cada remoo ndice do fim da fila 13

    Arraycircular ndices do incio e fim da fila 14

    Lista linearsimplesmenteencadeada

    Ponteiro p/ incio da fila (1 nodo) 15

    Ponteiros p/ incio e fim da fila (1 e ltimo nodos) 16

    Lista linearduplamenteencadeada

    Ponteiro p/ incio da fila (1 nodo) 17

    Ponteiro p/ fim da fila (ltimo nodo) 18

    Ponteiros p/ incio e fim da fila (1 e ltimo nodos) 19

    Lista circularsimplesmenteencadeada

    Ponteiro p/ incio da fila (1 nodo) 20

    Ponteiro p/ fim da fila (ltimo nodo) 21

    Ponteiros p/ incio e fim da fila (1 e ltimo nodos) 22

    Lista circularduplamenteencadeada

    Ponteiro p/ incio da fila (1 nodo) 23

    Ponteiro p/ fim da fila (ltimo nodo) 24

    Ponteiros p/ incio e fim da fila (1 e ltimo nodos) 25

    2 pilhasimplementadaspor arrays

    ndice do topo de cada pilha

    Precedida por insero

    26

    Precedida por remoo

    27

  • 7/23/2019 Apostila Exerccios 2014.1 2014-02-26-2100.pdf

    19/67

    Paulo Costa2013 Estruturas de DadosListas de exerccios e solues 17

    Exerccio 6.12

    Considere o Bubble Sort, cujo pseudocdigo est listado abaixo. Determine o nmero de operaesprimitivas executadas em cada linha do pseudocdigo e calcule o nmero total, tanto para o melhorcaso quanto para o pior caso.

    Algoritmo: bubbleSort (A, n)Entrada: array A com n elementosSada: array A em ordem crescente

    1) para i de 0 at n-1 passo 1 faa2) para j de n-1 at i+1 passo -1 faa3) se A[j-1] > A[j] ento4) temp = A[j-1]5) A[j-1] = A[j]6) A[j] = temp

    NOTA: A identao mostra o escopo dos comandos:

    o parana linha 2 est dentro do parana linha 1,o sena linha 3 est dentro do parana linha 2, eas linhas 4 a 6 esto dentro do sena linha 3.

    Linha Melhor caso Pior caso

    1

    2

    3

    4

    5

    6

    Total

    Exerccio 6.13

    Considere o Insertion Sort, cujo pseudocdigo est listado abaixo. Determine o nmero de operaesprimitivas executadas em cada linha do pseudocdigo e calcule o nmero total, tanto para o melhorcaso quanto para o pior caso.

    Algoritmo: insertionSort (A, n)Entrada: array A com n elementosSada: array A em ordem crescente

    1) para i de 1 at n-1 faa2) atual = A[i]3) j = i-14) enquanto j>=0 e A[j]>atual faa5) A[j+1] = A[j]6) j = j-17) A[j+1] = atual

    NOTA: A identao mostra o escopo dos comandos:

    as linhas 5 e 6 esto dentro do enquantona linha 4;

    as linhas 2 a 7 esto dentro do parana linha 1.

    Linha Melhor caso Pior caso

    1

    2

    3

    4

    5

    6

    7

    Total

    Exerccio 6.14

    Considere o Selection Sort, cujo pseudocdigo est listado abaixo. Determine o nmero de operaesprimitivas executadas em cada linha do pseudocdigo e calcule o nmero total, tanto para o melhor

    caso quanto para o pior caso.A gor tmo: se ect onSort A, nEntrada: array A com n elementosSada: array A em ordem crescente

    1) para i de 0 at n-2 faa2) para j de i+1 at n-1 faa3) se A[j] < A[min] ento4) temp = A[i]5) A[i] = A[min]6) A[min] = temp

    NOTA: A identao mostra o escopo dos comandos:

    o parana linha 2 est dentro do parana linha 1,o sena linha 3 est dentro do parana linha 2, e

    as linhas 4 a 6 esto dentro do sena linha 3.

    Linha Melhor caso Pior caso

    1

    2

    3

    4

    5

    6

    Total

  • 7/23/2019 Apostila Exerccios 2014.1 2014-02-26-2100.pdf

    20/67

    Paulo Costa2013 Estruturas de DadosListas de exerccios e solues 18

    Exerccio 6.15

    Existem dois algoritmos para resolver certo problema, cujos tempos de execuo so dados por:

    Algoritmo 1 Algoritmo 2

    onde n o tamanho da entrada. Responda as seguintes perguntas, justificando todas as respostas:1) possvel afirmar que um dos algoritmos executa sempre mais rpido que o outro para entradas

    de qualquer tamanho?

    2) possvel afirmar que um dos algoritmos executa sempre mais rpido que o outro para entradasde tamanho entre 10 e 30? Se for possvel, qual dos dois?

    3) possvel afirmar que um dos algoritmos executa sempre mais rpido que o outro para entradasde tamanho igual a 50? Se for possvel, qual dos dois?

    4) possvel afirmar que um dos algoritmos executa sempre mais rpido que o outro para entradasde tamanho entre 90 e 200? Se for possvel, qual dos dois?

    5) possvel afirmar que um dos algoritmos executa sempre mais rpido que o outro para entradasde tamanho acima de 500? Se for possvel, qual dos dois?

    Exerccio 6.16

    Existem dois algoritmos para resolver certo problema, cujos tempos de execuo so dados por:

    Algoritmo 1 Algoritmo 2

    onde n o tamanho da entrada. Responda as seguintes perguntas, justificando todas as respostas:

    1) Os tamanhos da entrada para os quais o algoritmo 1 executa mais rpido que o algoritmo 2.2) Os tamanhos da entrada para os quais o algoritmo 2 executa mais rpido que o algoritmo 1.3) Os tamanhos da entrada para os quais os dois algoritmos executam em tempos iguais.

    Dica:Solucione as equaes e, a partir da, esboce os grficos de e .

    Exerccio 6.17

    Existem dois algoritmos para resolver certo problema, cujos tempos de execuo so dados por:

    Algoritmo 1 Algoritmo 2

    onde n o tamanho da entrada. Responda as seguintes perguntas, justificando todas as respostas:

    1) Os tamanhos da entrada para os quais o algoritmo 1 executa mais rpido que o algoritmo 2.2) Os tamanhos da entrada para os quais o algoritmo 2 executa mais rpido que o algoritmo 1.

    3) Os tamanhos da entrada para os quais os dois algoritmos executam em tempos iguais.Dica:Uma equao cbica com trs razes reais pode ser escrita na forma

    n3(a+ b+ c) n

    2+ (ab+ bc+ ac)n(abc)

    onde a, be cso as razes reais.

    Exerccio 6.18

    Considere a definio de (g(n))a seguir:

    (g(n))= {f(n): constantes c1, c2e n00| 0c1g(n) f(n) c2g(n) para todo nn0}

    Use a definio acima para mostrar que 2n2n/2 = (n2)

  • 7/23/2019 Apostila Exerccios 2014.1 2014-02-26-2100.pdf

    21/67

    Paulo Costa2013 Estruturas de DadosListas de exerccios e solues 19

    Exerccio 6.19

    Considere a definio de (g(n))no exerccio 6.18. Considere tambm a funo f(n) = 10n3300n

    2+

    2000n. Use o mtodo analtico discutido em aula para responder as seguintes perguntas:

    1) Qual o menor valor inteiro de n0 que permite provar quef(n) = (n3)?

    2) Qual o maior valor inteiro de c1que permite provar quef(n) = (n3)?

    3) Se usarmos c1=5 e c2=20, qual o menor valor inteiro de n0 que permite provar quef(n) = (n3)?

    Dados:5 = 2,24e 17 = 4,12.

    Exerccio 6.20

    Considere a definio de (g(n))no exerccio 6.18. Considere tambm a funo f(n)= 8n3300n

    2+

    40n. Utilize as informaes nos grficos fornecidos para responder as perguntas a seguir. Fornea suasrespostas na forma de intervalos, por exemplo (0, 10]. Justifique as respostas de 1 a 6.

    1) Qual a faixa de valores de n0 que satisfazem a definio de para quaisquer c1e c20?2) Qual a faixa de valores de c1que satisfazem a definio de ?

    3) Qual a faixa de valores de c2que satisfazem a definio de ?Considere agora que c1, c2, ne n0so nmeros inteirospositivos (ou seja, maiores que zero).

    4) Qual a faixa de valores de n0 que satisfazem a definio de para quaisquer c1e c20?

    5) Qual a faixa de valores de c1que satisfazem a definio de ?6) Qual a faixa de valores de c2que satisfazem a definio de ?

    7) Use a definio de para mostrar quef(n) = (n3).

    8) Use os resultados anteriores para mostrar graficamente quef(n) = (n3).

    Grfico 1 Grfico 2f '(n) = 8 300/n 4/n2

    -4

    4

    8

    12

    16

    00 -200 200 400 600 800

    n

    T(n)

    (37.36, 0)

    T1(n) = 7n2 300n 40

    -4 103

    -3 103

    -2 103

    -1 103

    1 103

    5 10 15 20 25 30 35 40 45

    n

    T(n)

    (42.7, 0)

  • 7/23/2019 Apostila Exerccios 2014.1 2014-02-26-2100.pdf

    22/67

    Paulo Costa2013 Estruturas de DadosListas de exerccios e solues 20

    7. Ordenao

    Exerccio 7.1

    O que um algoritmo de ordenao estvel? O que um algoritmo de ordenao in place?

    Exerccio 7.2 Caracterize o melhor e o pior caso do Quick Sort.

    Exerccio 7.3

    Diferencie o melhor e o pior caso do Merge Sort e justifique.

    Exerccio 7.4

    1) O tempo de execuo do Merge Sort igual para o melhor caso e o pior caso? Justifique.2) O tempo de execuo do Quick Sort igual para o melhor caso e o pior caso? Justifique.

    Exerccio 7.5 Descreva os principais mtodos de escolha do piv no Quick Sort. Para cada um, comente sobre seuimpacto na eficincia da ordenao.

    Exerccio 7.6

    Complete a tabela abaixo, fornecendo a complexidade assinttica dos vrios algoritmos de ordenao.

    AlgoritmoTempo

    Pior caso Caso mdio Melhor caso

    Bubble sort

    Bubble sort modificado

    Selection sort

    Insertion sort

    Heap sort

    Merge sort

    Quicksort

    Exerccio 7.7

    Verdadeiro ou falso:01.( ) Todos os algoritmos de ordenao funcionam atravs de comparaes entre chaves.

    02.( ) Os algoritmos de ordenao estveis incluem o Merge Sort, o Quick Sort e o Bubble Sort.

    03. ( ) Heap Sort pode ser feito in place, mas mais simples e intuitivo se usa um heapseparado.

    04.( ) O algoritmo de ordenao mais eficiente executa em tempo O( nlog n).

    05. ( ) Selection Sort uma variao do FP-Sort (FP = Fila de Prioridades) onde a fila deprioridades implementada com uma sequncia ordenada.

    06. ( ) O Merge Sort pode ser implementado tanto de forma recursiva como de forma iterativa.

    07. ( ) O Merge Sort, o Heap Sort e o Insertion Sort executam em tempo O(nlog n).

    08. ( ) O tempo de execuo do Merge Sort igual para o melhor caso e o pior caso.

    09. ( ) O tempo de execuo do Quick Sort igual para o melhor caso e o pior caso.

  • 7/23/2019 Apostila Exerccios 2014.1 2014-02-26-2100.pdf

    23/67

    Paulo Costa2013 Estruturas de DadosListas de exerccios e solues 21

    8. rvores

    Exerccio 8.1

    Considere as duas rvores binrias a seguir.

    rvore 1 rvore 2

    1) Escreva a sequncia em que os ns da rvore 1so visitados em um caminhamento prefixado.

    2) Escreva a sequncia em que os ns da rvore 1so visitados em um caminhamento infixado.

    3) Escreva a sequncia em que os ns da rvore 1so visitados em um caminhamento posfixado.

    4) Escreva a sequncia em que os ns da rvore 2so visitados em um caminhamento prefixado.

    5) Escreva a sequncia em que os ns da rvore 2so visitados em um caminhamento infixado.

    6) Escreva a sequncia em que os ns da rvore 2so visitados em um caminhamento posfixado.

    Exerccio 8.2

    1) O que uma rvore binriaprpria?2) O que uma rvore binria completa?

    3) O que uma rvore binria quase completa?

    4) No caminhamento de Euler sobre uma rvore binria, quantas vezes os ns so visitados? Explique.

    5) Qual o tempo de execuo do caminhamento de Euler sobre uma rvore binria prpria com nns ealtura h? Justifique.

    Exerccio 8.3

    Considere a expresso prefixadaa seguir, onde todos os operadores so binrios:

    5 4 3 1 8 6 2 7Desenhe a rvore binria correspondente expresso.

    Exerccio 8.4

    Considere a expresso infixadaa seguir, onde todos os operadores so binrios:

    (8((27)4))(((56)3)1)Desenhe a rvore binria correspondente expresso, sem parnteses.

    Exerccio 8.5

    Considere a expresso posfixadaa seguir, onde todos os operadores so binrios:

    5 7 3 1 8 2 4 6 Desenhe a rvore binria correspondente expresso.

    IH

    B C

    ED GF

    ON

    LK

    QP

    A

    R

    J

    M ON QP RM

    I

    B C

    ED G

    LK

    A

    J

    F

    H

  • 7/23/2019 Apostila Exerccios 2014.1 2014-02-26-2100.pdf

    24/67

    Paulo Costa2013 Estruturas de DadosListas de exerccios e solues 22

    Exerccio 8.6

    O caminhamento prefixadode uma rvore binria visita seus ns na seguinte ordem:

    A B D H M N E I O C F J K P G L Q R

    O caminhamento infixadoda mesma rvore binria visita seus ns na seguinte ordem:

    M H N D B I O E A J F P K C G Q L R

    O caminhamento posfixadoda mesma rvore binria visita seus ns na seguinte ordem:

    M N H D O I E B J P K F Q R L G C A

    Desenhe a rvore.

    Exerccio 8.7

    O caminhamento prefixadode uma rvore binria visita seus ns na seguinte ordem:

    A B D H M N I O E J P C F K Q G L R

    O caminhamento infixadoda mesma rvore binria visita seus ns na seguinte ordem:

    M H N D I O B E J P A F K Q C G L R

    O caminhamento posfixadoda mesma rvore binria visita seus ns na seguinte ordem:

    M N H O I D P J E B Q K F R L G C A

    Desenhe a rvore.

    Exerccio 8.8

    Considere a expresso prefixadaa seguir, onde todos os operadores so binrios:

    T L G K X J C Q A1) Escreva a expresso em notao infixada, com parnteses.

    2) Escreva a expresso em notao posfixada, sem parnteses.

    Exerccio 8.9

    Considere a expresso infixadaa seguir, onde todos os operadores so binrios:

    ( ( ( E C ) H )( A ( ( G D ) F ) ) ) B1) Escreva a expresso em notao prefixada, sem parnteses.

    2) Escreva a expresso em notao posfixada, sem parnteses.

    Exerccio 8.10

    Considere a expresso posfixadaa seguir, onde todos os operadores so binrios:

    8 1 4 9 7 3 8 6 5 2 1) Escreva a expresso em notao prefixada, sem parnteses.2) Escreva a expresso em notao infixada, com parnteses.

    Exerccio 8.11

    Verdadeiro ou falso:

    01.( ) Todo heap uma rvore binria prpria.

    02.( ) Toda rvore binria prpria um heap.

    03. ( ) Toda rvore binria quase completa um heap.

    04.( ) Todo heap uma rvore binria quase completa.05. ( ) Todo heap uma rvore binria de busca.

  • 7/23/2019 Apostila Exerccios 2014.1 2014-02-26-2100.pdf

    25/67

    Paulo Costa2013 Estruturas de DadosListas de exerccios e solues 23

    06. ( ) Toda rvore binria de busca um heap.

    07. ( ) Nem toda rvore binria de busca uma rvore binria prpria.

    08. ( ) Toda rvore binria de busca uma rvore binria quase completa.

    09. ( ) Nem toda rvore binria quase completa uma rvore binria prpria.

    10. ( ) Toda rvore binria prpria uma rvore binria quase completa.

    Exerccio 8.12

    Seja:

    G uma rvore binria genrica no vazia

    eg o nmero de nodos externos de G

    ig o nmero de nodos internos de G

    ng o nmero total de nodos de G

    hg a altura de G

    P uma rvore binria prpria no vazia

    ep o nmero de nodos externos deP

    ip o nmero de nodos internos deP

    np o nmero total de nodos deP

    hp a altura deP

    Verdadeiro ou falso:

    01.( ) 2hp+ 1 np

    02.( ) np 2p+1

    1

    03. ( ) hp+ 1 ep

    04.( ) ep 2hp

    05. ( ) hp ip 2p

    1

    06. ( ) ng = 2eg1

    07. ( ) 1 eg 2g

    08. ( ) hg ig 2g

    1

    Exerccio 8.13

    Considere uma rvoreAcom raiz re um total de nns. Define-se o ancestral comum mais prximoentre dois ns ne mouACMP(n,m) como o n mais baixo deA(ou seja, o n mais distante de r) quetem ambos ne mcomo descendentes. Um n pode ser considerado descendente de si mesmo.

    Escreva uma funo em C que recebe ponteiros para dois ns como entrada e retorna um ponteiropara oACMPentre eles. Suponha que a funopai j exista; abaixo, seu prottipo:

    /* ENTRADA: ponteiro para um n *//* SADA: ponteiro para seu pai, ou NULL se o n a raiz */

    pNo *pai (tNo *pNo);

    Abaixo, o prottipo da funo ACMPque voc deve escrever:

    pNo *ACMP (tNo *pN1, tNo *pN2);

  • 7/23/2019 Apostila Exerccios 2014.1 2014-02-26-2100.pdf

    26/67

    Paulo Costa2013 Estruturas de DadosListas de exerccios e solues 24

    4

    5 8

    13

    7

    26

    Exerccio 8.14

    A figura a seguir mostra vrios vetores, cada um implementando uma rvore binria diferente.

    0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17

    1 6 7 9 15 10 18 11 13 17 21 19

    2 3 8 6 11 19 16 10 12 15 20 17 13 18 23 24

    3 8 16 14 22 18 20 32 34 24 36 40 28

    4 30 14 46 10 21 38 16 26 35 41

    5 4 8 7 11 9 10 16 17 12 18 20 14 13 19 21

    6 60 28 92 42 76 24 52 62 88

    7 4 8 7 11 9 10 16 17 12 18 20 14 13 19 21

    8 30 14 46 21 38 15 26 31 44

    Para cada vetor, indique, com Simou No, se a rvore correspondente

    Uma rvore binria prpria Uma rvore binria completa

    Uma rvore binria quase completa Uma rvore de busca binria

    Vetor rvore...

    binriaprpria?

    binriacompleta?

    binria quasecompleta?

    de buscabinria?

    1

    2

    3

    4

    5

    6

    7

    8

    Exerccio 8.15

    Descreva um mtodo usando o caminhamento de Euler para calcular o nmero de descendentes decada n em uma rvore binria. possvel armazenar informaes nos ns, se necessrio. Qual otempo de execuo desse algoritmo?

    Exerccio 8.16

    Descreva um mtodo usando o caminhamento deEuler para imprimir uma expresso aritmtica infixadacom parnteses a partir de sua rvore.

    Por exemplo, se o mtodo for aplicado rvore aolado...

  • 7/23/2019 Apostila Exerccios 2014.1 2014-02-26-2100.pdf

    27/67

  • 7/23/2019 Apostila Exerccios 2014.1 2014-02-26-2100.pdf

    28/67

    Paulo Costa2013 Estruturas de DadosListas de exerccios e solues 26

    Escreva a funo recursivaarvoreParaLista que

    recebe um ponteiro para a raiz de uma rvoreA, reorganiza os ponteiros internos da rvore de modo a transform-la numa lista circular

    duplamente encadeada, com os dados organizados em ordem crescente, retorna um ponteiro para o primeiro nodo da lista (o nodo com do dado de menor valor), e executa em tempo O(n), operando uma nica vez sobre cada nodo.

    A funo deve funcionar corretamente em todos os casos, incluindo: rvore vazia, rvore com um nico nodo, rvore com dois nodos, e rvore com nnodos.

    As figuras a seguir mostram uma rvore antes e depois de ser transformada numa lista.

    Antes Depois

    9. Heaps

    Exerccio 9.1

    Um heap uma rvore binria que armazena uma coleo de chaves em seus nodos e que satisfazduas propriedades adicionais: uma relacional e outra estrutural. Explique essas propriedades.

    Exerccio 9.2

    Para cada uma das rvores abaixo, indique se ela um heap ou, caso contrrio, qual propriedade

    violada. Use a seguinte marcao nas suas respostas:- Hn a rvore no viola nenhuma propriedade, portanto um heap; o ltimo n tem chave n.- R a rvore viola a propriedade relacional, portanto no um heap.- E a rvore viola a propriedade estrutural, portanto no um heap.- RE a rvore viola as duas propriedades, portanto no um heap.

    Por exemplo, se a rvore no um heap porque viola apenas a propriedade estrutural, escreva E. Sefor um heap e a chave no seu ltimo n for 40, escreva H 40.

  • 7/23/2019 Apostila Exerccios 2014.1 2014-02-26-2100.pdf

    29/67

  • 7/23/2019 Apostila Exerccios 2014.1 2014-02-26-2100.pdf

    30/67

    Paulo Costa2013 Estruturas de DadosListas de exerccios e solues 28

    Exerccio 9.4

    Considere o heap mostrado na figura a seguir. Mostre a sequncia de transformaes feitas no heap aoremovermosum nodo. Para cada etapa da sequncia, mostre tambm o contedo do vetor utilizadopara armazenar os nodos do heap.

    Exerccio 9.5

    Considere a figura do exerccio 8.14, onde cada vetor implementa uma rvore binria diferente. Paracada um, determine se a rvore correspondente um heap. Se for um heap, indique o ltimo n; seno, indique qual a propriedade do heap violada. Use a seguinte marcao nas suas respostas:

    - Hn a rvore no viola nenhuma propriedade, portanto um heap; o ltimo n tem chave n.- R a rvore viola a propriedade relacional, portanto no um heap.- E a rvore viola a propriedade estrutural, portanto no um heap.- RE a rvore viola as duas propriedades, portanto no um heap.

    Por exemplo, se a rvore correspondente no um heap porque viola apenas a propriedade estrutural,escreva E. Se for um heap e a chave no seu ltimo n for 40, escreva H 40.

    Exerccio 9.6

    Um heap dito crescentequando a chave em um n qualquer menor ou igual s chaves nos seusfilhos. Similarmente, o heap dito decrescentequando a chave em um n qualquer maior ou igual schaves nos seus filhos.

    1) Em que posies de um heap crescente possvel encontrar a maior chave?

    2) possvel armazenar 7 chaves distintas em um heap H de modo que um caminhamentoprefixadode H retorne as chaves em ordem crescente? Se a resposta for no, justifique. Se aresposta for sim, o heap deve ser crescente, decrescente, ou pode ser de ambos os tipos?Fornea como exemplo um heap contendo as chaves de 1 a 7.

    3) possvel armazenar 7 chaves distintas em um heapHde modo que um caminhamento infixadodeHretorne as chaves em ordem crescente? Se a resposta for no, justifique. Se a resposta for

    sim, o heap deve ser crescente, decrescente, ou pode ser de ambos os tipos? Fornea comoexemplo um heap contendo as chaves de 1 a 7.

    4) possvel armazenar 7 chaves distintas em um heap H de modo que um caminhamentopsfixadode H retorne as chaves em ordem crescente? Se a resposta for no, justifique. Se aresposta for sim, o heap deve ser crescente, decrescente, ou pode ser de ambos os tipos?Fornea como exemplo um heap contendo as chaves de 1 a 7.

    10.Tabelas Hash

    Exerccio 10.1

    Uma tabela hash consiste de um array A de tamanho N e de uma funo hash h. Quais os doiscomponentes da funo hash? Fornea seus nomes, parmetros de entrada e de sada, e expliqueseus objetivos.

    12

    4035

    15

    2921

    2630

    18

    2824

    33 12 15 18 21 29 24 28 30 26 35 40 33

    0 1 2 3 4 5 6 7 8 9 10 11 12 13

  • 7/23/2019 Apostila Exerccios 2014.1 2014-02-26-2100.pdf

    31/67

    Paulo Costa2013 Estruturas de DadosListas de exerccios e solues 29

    Exerccio 10.2

    Liste quatro cdigos hash mais utilizados. Para cada um, fornea seu nome, uma breve descrio decomo funciona, e uma indicao dos tipos de chave s quais ele se adqua.

    Exerccio 10.3

    Liste duas funes de compresso mais utilizadas, seus nomes e suas expresses matemticas.

    Exerccio 10.4

    1) Algumas funes de compresso usam nmeros primos e a funo mdulo (%em C). Por que?

    2) Na funo (ay+ b) mod N, necessrio que amod N 0. Por que?

    Exerccio 10.5

    1) O que uma coliso em uma tabela hash?

    2) Existem duas estratgias principais para o tratamento de colises em tabelas hash. Para cada uma,fornea seu nome, uma breve descrio de como funciona, e vantagens e desvantagens.

    3) Qual estratgia para o tratamento de colises mais apropriado quando se desconhece o nmerode itens a serem armazenados na tabela? Justifique.

    Exerccio 10.6

    1) Qual o tempo de execuo das operaes de busca, insero e remoo em uma tabela hash

    no melhor caso? no pior caso?

    2) O que caracteriza o pior caso possvel para as operaes sobre uma tabela hash?

    3) O principal fator que afeta o desempenho de uma tabela hash o chamado fator de carga. Definaesse fator e explique como ele afeta o desempenho da tabela hash.

    Exerccio 10.7Considere a seguinte sequncia de chaves, a serem inseridas em uma tabela hash com 11 posies:

    7, 12, 19, 29, 35, 42, 56, 67, 76, 89, 81

    Considere tambm que a tabela usa a seguinte funo hash:

    h(k) = (2k+ 5) mod 11

    Desenhe a tabela aps a insero das chaves acima, na ordem em que foram listadas, supondo que atabela usa encadeamento separado.

    Nota Utilize a tabela com valores pr-calculados fornecida no exerccio 13.

    Exerccio 10.8

    Idem ao exerccio anterior, exceto pelas chaves a serem inseridas:

    89, 97, 76, 42, 19, 28, 50, 67, 35, 12, 7

    Exerccio 10.9

    Idem ao exerccio anterior, exceto pelas chaves a serem inseridas:

    7, 21, 92, 6, 53, 24, 65, 76, 80, 91, 19

  • 7/23/2019 Apostila Exerccios 2014.1 2014-02-26-2100.pdf

    32/67

    Paulo Costa2013 Estruturas de DadosListas de exerccios e solues 30

    Exerccio 10.10

    Idem ao exerccio anterior, exceto pelas chaves a serem inseridas:

    9, 16, 32, 45, 69, 81, 94, 2, 26, 53, 19

    Exerccio 10.11 Idem ao exerccio anterior, exceto pelas chaves a serem inseridas:

    12, 44, 13, 88, 23, 94, 11, 39, 20, 16, 5

    Exerccio 10.12

    Idem ao exerccio anterior, exceto que tabela usa endereamento aberto e teste linear.

    Exerccio 10.13

    Uma tcnica de resoluo de colises em tabelas hash com endereamento aberto o hashing duplo.Essa tcnica usa uma funo de hash secundrio d(k)e resolve colises colocando o item que colidiuna primeira clula disponvel na srie (i + j d(k))modN para j= 0, 1, , N1 ondeN otamanho da tabela, ka chave do item que colidiu, e ia posio da tabela onde tentou-se inserir o itemque colidiu.

    Considere uma tabela hash com 11 posies que usa as seguintes funes de hash:

    Hash primrio: h(k) = (2k+ 5) mod 11

    Hash secundrio: d(k) = 7(kmod 7)

    Mostre a tabela hash aps a insero das chaves indicadas abaixo, na ordem em que aparecem. Utilizea tabela a seguir para facilitar os clculos.

    1) 87, 16, 94, 5, 12, 20, 13, 65, 43, 10, 272) 42, 11, 37, 15, 60, 20, 89, 29, 82, 72, 52

    3) 15, 84, 32, 61, 75, 6, 1, 5, 18, 96, 28

    4) 24, 46, 53, 28, 70, 91, 40, 60, 85, 81, 22

    5) 31, 76, 15, 2, 44, 27, 86, 63, 9, 54, 93

    6) 41, 11, 37, 15, 60, 20, 89, 29, 82, 72, 58

    7) 18, 84, 32, 61, 75, 6, 1, 5, 18, 93, 31

    8) 42, 64, 35, 82, 7, 19, 27, 66, 58, 75, 11

  • 7/23/2019 Apostila Exerccios 2014.1 2014-02-26-2100.pdf

    33/67

    Paulo Costa2013 Estruturas de DadosListas de exerccios e solues 31

    k(2k + 5) mod 11

    7(kmod 7)

    05

    17

    29

    30

    42

    54

    66

    78

    810

    91

    7 6 5 4 3 2 1 7 6 5

    10 3 11 5 12 7 13 9 14 0 15 2 16 4 17 6 18 8 19 104 3 2 1 7 6 5 4 3 2

    201

    213

    225

    237

    249

    250

    262

    274

    286

    298

    1 7 6 5 4 3 2 1 7 6

    3010

    311

    323

    335

    347

    359

    360

    372

    384

    396

    5 4 3 2 1 7 6 5 4 3

    408

    4110

    421

    433

    445

    457

    469

    470

    482

    494

    2 1 7 6 5 4 3 2 1 7

    506

    518

    5210

    531

    543

    555

    567

    579

    580

    592

    6 5 4 3 2 1 7 6 5 4

    60 4 61 6 62 8 63 10 64 1 65 3 66 5 67 7 68 9 69 03 2 1 7 6 5 4 3 2 1

    702

    714

    726

    738

    7410

    751

    763

    775

    787

    799

    7 6 5 4 3 2 1 7 6 5

    800

    812

    824

    836

    848

    8510

    861

    873

    885

    897

    4 3 2 1 7 6 5 4 3 2

    909

    910

    922

    934

    946

    958

    9610

    971

    983

    995

    1 7 6 5 4 3 2 1 7 6

  • 7/23/2019 Apostila Exerccios 2014.1 2014-02-26-2100.pdf

    34/67

    Paulo Costa2013 Estruturas de DadosListas de exerccios e solues 32

    Parte 2Solues de exerccios selecionados

    1. Recurso

    Exerccio 1.1A funo calcula a soma

    Abaixo, uma verso iterativa dessa funo:

    int func (int n) {int i, soma;for (i=1, soma=0; i0; b--)a++;

    return (a);}

    Soma recursiva

    int somaR (int a, int b) {if (a==0) return (b);if (b==0) return (a);return (somaR (++a, --b));

    }

    Multiplicao iterativa

    int multI (int a, int b) {int m;for (m=0; b>0; b--)m = somaI (m,a);

    return (m);}

    Multiplicao recursiva

    /* Essa funo apenas passa o terceiro *//* parmetro para a funo recursiva */

    int multR (int a, int b) {return (multRaux (a, b, 0));

    }

    /* Clculo recursivo propriamente dito */

    int multRaux (int a, int b, int m) {if (a==0 || b==0) return (m);return (multRaux (a, --b, somaR(m,a)));

    }

    Exerccio 1.3

    int menorDigito (int n) {if (n

  • 7/23/2019 Apostila Exerccios 2014.1 2014-02-26-2100.pdf

    35/67

    Paulo Costa2013 Estruturas de DadosListas de exerccios e solues 33

    Exerccio 1.5

    As funes de soma (somaIesomaR) na soluo anterior j obedecem todos os critrios do exerccio.

    As funes de multiplicao no podem obedecer todos os critrios ao mesmo tempo; ao menos umdeve ser violado. EmmultI o critrio cfoi violado; emmultR o critrio bfoi violado.

    Uma implementao alternativa demultR, que viola o critrio a, dada abaixo:

    int multR (int a, int b) {if (a==0 || b==0) return (0);if (a==1) return (b);if (b==1) return (a);return (a + multR (a, --b));

    }

    Exerccio 1.6

    int somaDigitos (int n) {if (n==0) return (0);

    return ((n%10) + somaDigitos (n/10));}

    Exerccio 1.7

    int totalDigitos (int n) {if (n

  • 7/23/2019 Apostila Exerccios 2014.1 2014-02-26-2100.pdf

    36/67

    Paulo Costa2013 Estruturas de DadosListas de exerccios e solues 34

    Exerccio 1.9

    MDC recursivo

    int mdcR (int x, int y) {if ((y

  • 7/23/2019 Apostila Exerccios 2014.1 2014-02-26-2100.pdf

    37/67

    Paulo Costa2013 Estruturas de DadosListas de exerccios e solues 35

    Define-se a soma de dois nmeros complexos ae bcomo

    (a[0] + a[1]i) + (b[0] + b[1]i) = (a[0] + b[0]) + (a[1] + b[1])i= soma[0] + soma[1]i

    Define-se a multiplicao de dois nmeros complexos ae bcomo

    (a[0] + a[1]i) * (b[0] + b[1]i)= (a[0] * b[0] - a[1] * b[1]) + (a[0] * b[1] + b[0] * a[1])i

    = mult[0] + mult[1]i

    Define-se a igualdade entre dois nmeros complexos ae bcomo

    (a[0] + a[1]i) = (b[0] + b[1]i) (a[0] = b[0]) AND (a[1] = b[1])

    Especificao do TDA Complexo

    abstract typedef COMPLEXO;

    abstract COMPLEXO cria_complexo (real a, real b);postconditioncria_racional[O] = a;

    cria_racional[1] = b;abstract COMPLEXO soma (COMPLEXO a, COMPLEXO b);postconditionsoma[O] = a[O] + b[O];soma[1] = a[1] + b[1];

    abstract COMPLEXO mult (COMPLEXO a, COMPLEXO b);postconditionmult[O] = a[0]*b[0] - a[1]*b[1];mult[1] = a[0]*b[1] + b[0]*a[1];

    abstract COMPLEXO igual (COMPLEXO a, COMPLEXO b);postconditionigual = (a[0] == b[0]) AND (a[1] == b[1]);

    Exerccio 2.2

    Especificao do TDA Vetor

    abstract typedef VETOR;

    abstract VETOR cria_vetor (float a, float b);precondition(a 0) OR (b 0);

    postconditioncria_vetor[O] = a;

    cria_vetor[1] = b;

    abstract float modulo (VETOR v);postconditionmodulo = SQRT (v[O]*v[0] + v[1]*v[1]);

    abstract float produto (VETOR v, VETOR w);postconditionproduto = v[O]*w[O] + v[1]*w[1];

    abstract float angulo (VETOR v, VETOR w);postconditionangulo = ACOS (produto(v,w) / (modulo(v) * modulo(w)));

    abstract boolean iguais (VETOR v, VETOR w);

    postconditioniguais = (v[0] == w[0]) AND (v[1] == w[1]);

  • 7/23/2019 Apostila Exerccios 2014.1 2014-02-26-2100.pdf

    38/67

    Paulo Costa2013 Estruturas de DadosListas de exerccios e solues 36

    Exerccio 2.3

    int main (void) {

    union {char c [8];short int si[4];

    int i [2];double d;}u;

    int k;

    u.c[0] = 'A'; u.c[1] = 'B';u.c[2] = 'C'; u.c[3] = 'D';u.c[4] = '1'; u.c[5] = '2';u.c[6] = '3'; u.c[7] = 'A';

    printf ("\n Como char: ");for (k=0; k

  • 7/23/2019 Apostila Exerccios 2014.1 2014-02-26-2100.pdf

    39/67

    Paulo Costa2013 Estruturas de DadosListas de exerccios e solues 37

    Exerccio 3.5

    #define TAM_MAX 15#define POS_VAZIA 0

    char A [TAM_MAX],B [TAM_MAX],C [TAM_MAX];

    void uniaoComRep (char *letraA, char *letraB, char *letraC) {while ((*letraA != POS_VAZIA) && (*letraB != POS_VAZIA))*letraC++ = (*letraA

  • 7/23/2019 Apostila Exerccios 2014.1 2014-02-26-2100.pdf

    40/67

    Paulo Costa2013 Estruturas de DadosListas de exerccios e solues 38

    Exerccio 3.7

    #define TAM_MAX 100#define Bool int#define TRUE 1#define FALSE 0

    Bool ehPalindromo (char *palavra, int tamanho, int pos) {Bool letrasIguais;

    if (tamanho-2*pos prox == NULL) { /* Lista */free (*lista); /* com */*lista = NULL; /* um */return; /* nico */

    } /* nodo */

    penultimo = *lista; /* Lista */ultimo = penultimo->prox; /* com */while (ultimo->prox != NULL) { /* dois */penultimo = ultimo; /* ou */ultimo = ultimo->prox; /* mais */

    } /* nodos */free (ultimo); /* */penultimo->prox = NULL; /* */

    }

    Exerccio 4.3

    1) Porque se fosse local a Tamanho(), ela no seria visvel pelas funes que precisam modific-laao adicionar ou remover nodos.

  • 7/23/2019 Apostila Exerccios 2014.1 2014-02-26-2100.pdf

    41/67

    Paulo Costa2013 Estruturas de DadosListas de exerccios e solues 39

    2) Porque isso garante que tamLista mantm seu valor entre chamadas a Tamanho(). Sem omodificador static, a varivel tamLista perderia seu valor anterior, tendo um valor aleatrio(lixo) em cada chamada a Tamanho().

    3) A funo Tamanho()no precisa percorrer a lista inteira para calcular seu tamanho, o que levariatempo O(n). Basta retornar o valor de tamLista, o que levaria tempo O(1).

    4) Qualquer adio ou remoo de nodos na lista deve atualizar o valor de tamLista. Isso diminui a

    mantenibilidade do cdigo, ao misturar funes distintas em vrias pores do cdigo.

    Exerccio 4.6

    A funo norealiza corretamente a operao esperada. O problema est na definio do parmetro,que um ponteiro para o incio da lista. Esse parmetro passado por valor, mas deveria ser passadopor referncia. Como est, a funo realiza a operao corretamente, mas no capaz de atualizar oponteiro que foi passado para a funo; a modificao efetuada na lista perdida quando a funoretorna. Ao final da funo, a lista original permanece como estava antes da chamada da funo.

    Exerccio 4.7

    struct nodo *TornaLinear (struct nodo *fim) {struct nodo *inicio;if (fim == NULL)return (NULL);

    inicio = fim->prox;fim->prox = NULL;return (inicio);

    }

    struct nodo *TornaCircular (struct nodo *inicio) {struct nodo *fim;if (inicio == NULL)return (NULL);

    fim = inicio;while (fim->prox != NULL)

    fim = fim->prox;fim->prox = inicio;return (fim);

    }

    void UneCirculares (struct nodo **fim1, struct nodo **fim2) {struct nodo *inicio;if (*fim2 == NULL)return;

    if (*fim1 != NULL) {inicio = *fim1->prox;*fim1->prox = *fim2->prox;*fim2->prox = inicio;

    }*fim1 = *fim2;

    *fim2 = NULL;}

    Exerccio 4.9

    A funo transforma a lista circular em uma lista linear.

    Exerccio 4.10

    A funo inverte a lista de entrada.

    Exerccio 4.11

    A funo inverte a lista de entrada.

  • 7/23/2019 Apostila Exerccios 2014.1 2014-02-26-2100.pdf

    42/67

    Paulo Costa2013 Estruturas de DadosListas de exerccios e solues 40

    5. Pilhas, filas e deques

    Exerccio 5.3

    Usando um deque

    Bool ehPalindromo (void) {while (! acabaramAsLetras())poeInicioDeque (obtemLetra());

    while (tamDeque() > 1)if (tiraInicioDeque() !=

    tiraFimDeque())return (FALSE);

    return (TRUE);}

    Usando uma pilha e uma fila

    Bool ehPalindromo (void) {char letra;while (! acabaramAsLetras()) {letra = obtemLetra();poePilha (letra);poeFila (letra);

    }while (! pilhaVazia())if (tiraPilha() != tiraFila())return (FALSE);

    return (TRUE);}

    Exerccio 5.4Sim. No. No. Sim.

    Exerccio 5.5

    (V) a: remoo do incio, insero no incio e insero no final executam em tempo O(1); remoo dofinal executa em tempo O(n). b: as quatro operaes executam em tempo O(1).

    (F) Se o array circular, no faz sentido falar-se em compactao. Mesmo que fizesse, nuncahaver desperdcio de espao aps remoes da fila; as compactaes no serviriam para nada,consumindo tempo desnecessariamente.

    (F)Se a lista linear, o fato de ser simplesmente ou duplamente encadeada irrelevante. Apenasum ponteiro para o incio da lista (frente da fila) resulta em remoo em tempo O(1)e inseroem tempo O(n); apenas um ponteiro para o final da lista (fim da fila) resulta em insero emtempo O(1)e remoo em tempo O(n).

    Exerccio 5.6

    /* Insere dado no fim da fila */

    void poeFila (tDado dado) {if (pilhaVazia (0))while (! pilhaVazia (1))poePilha (0, tiraPilha (1));

    poePilha (0, dado);

    }/* Retorna o dado na frente *//* da fila sem remov-lo */

    tDado frenteFila (void) {if (pilhaVazia (1))while (! pilhaVazia (0))poePilha (1, tiraPilha (0));

    return (topoPilha (1));}

    /* Retorna o nro de elemen- *//* tos armazenados na fila */

    int tamFila (void) {return (tamPilha(0)+tamPilha(1));}

    /* Remove dado do incio da fila */

    tDado tiraFila (void) {if (pilhaVazia (1))while (! pilhaVazia (0))poePilha (1, tiraPilha (0));

    return (tiraPilha (1));

    }/* Retorna um Booleano indi- *//* cando se a fila est vazia */

    Bool filaVazia (void) {return ( pilhaVazia(0) &&

    pilhaVazia(1) );}

  • 7/23/2019 Apostila Exerccios 2014.1 2014-02-26-2100.pdf

    43/67

    Paulo Costa2013 Estruturas de DadosListas de exerccios e solues 41

    Exerccio 5.7

    Soluo 1

    /* Poe dado no inicio do deque */

    void poeInicioDeque (tDado dado) {while (! pilhaVazia (0))poePilha (1, tiraPilha (0));

    poePilha (1, dado); }

    /* Tira dado do inicio do deque */

    tDado tiraInicioDeque (void) {while (! pilhaVazia (0))poePilha (1, tiraPilha (0));

    return (tiraPilha (1)); }

    /* Retorna o dado no inicio *//* do deque sem remov-lo */

    tDado inicioDeque (void) {while (! pilhaVazia (0))poePilha (1, tiraPilha (0));

    return (topoPilha (1)); }

    /* Retorna o nmero de elemen- *//* tos armazenados no deque */

    int tamDeque (void) {return (tamPilha(0)+tamPilha(1));

    }

    /* Poe dado no fim do deque */

    void poeFimDeque (tDado dado) {while (! pilhaVazia (1))poePilha (0, tiraPilha (1));

    poePilha (0, dado); }

    /* Tira dado do fim do deque */

    tDado tiraFimDeque (void) {while (! pilhaVazia (1))poePilha (0, tiraPilha (1));

    return (tiraPilha (0)); }

    /* Retorna o dado no fim *//* do deque sem remov-lo */

    tDado fimDeque (void) {while (! pilhaVazia (1))poePilha (0, tiraPilha (1));

    return (topoPilha (0)); }

    /* Retorna um Booleano indi- *//* cando se o deque est vazio */

    Bool dequeVazio (void) {return (pilhaVazia(0) &&

    pilhaVazia(1)); }

    Soluo 2

    /* Poe dado no inicio do deque */

    void poeInicioDeque (tDado dado) {while (! pilhaVazia (1))poePilha (0, tiraPilha (1));

    poePilha (0, dado); }

    /* Tira dado do inicio do deque */

    tDado tiraInicioDeque (void) {while (! pilhaVazia (1))poePilha (0, tiraPilha (1));

    return (tiraPilha (0)); }

    /* Retorna o dado no inicio *//* do deque sem remov-lo */

    tDado inicioDeque (void) {while (! pilhaVazia (1))poePilha (0, tiraPilha (1));

    return (topoPilha (0)); }

    /* Retorna o nmero de elemen- *//* tos armazenados no deque */

    int tamDeque (void) {return (tamPilha(1)+tamPilha(0));

    }

    /* Poe dado no fim do deque */

    void poeFimDeque (tDado dado) {while (! pilhaVazia (0))poePilha (1, tiraPilha (0));

    poePilha (1, dado); }

    /* Tira dado do fim do deque */

    tDado tiraFimDeque (void) {while (! pilhaVazia (0))poePilha (1, tiraPilha (0));

    return (tiraPilha (1)); }

    /* Retorna o dado no fim *//* do deque sem remov-lo */

    tDado fimDeque (void) {while (! pilhaVazia (0))poePilha (1, tiraPilha (0));

    return (topoPilha (1)); }

    /* Retorna um Booleano indi- *//* cando se o deque est vazio */

    Bool dequeVazio (void) {return (pilhaVazia(1) &&pilhaVazia(0)); }

  • 7/23/2019 Apostila Exerccios 2014.1 2014-02-26-2100.pdf

    44/67

    Paulo Costa2013 Estruturas de DadosListas de exerccios e solues 42

    Exerccio 5.8

    /* Insere dado na pilha */

    void poePilha (tDado dado) {poeFila (dado); }

    /* Remove dado da pilha */tDado tiraPilha (void) {int t = tamFila();while (t-- > 1)poeFila (tiraFila());

    return (tiraFila()); }

    /* Retorna o nro de elemen- *//* tos armazenados na pilha */

    int tamPilha (void) {return (tamFila()); }

    /* Retorna o dado no topo *//* da pilha sem remov-lo */

    tDado topoPilha (void) {tDado dado;

    int t = tamFila();while (t-- > 1)poeFila (tiraFila());

    dado = frenteFila();poeFila (tiraFila());return (dado); }

    /* Retorna um Booleano indi- *//* cando se a pilha est vazia */

    Bool pilhaVazia (void) {return (filaVazia()); }

    6. Complexidade

    Exerccio 6.1

    necessrio implementar o algoritmo, o que pode ser difcil ou oneroso. Se as entradas analisadas forem tendenciosas, os resultados sero enganadores. Para comparar dois algoritmos, devem-se replicar as condies experimentais (mesmo hardware

    e mesmo ambiente de execuo).

    Exerccio 6.2

    Pode ser difcil caracterizar o caso mdio. Exige prvio conhecimento da distribuio de probabilidades das diferentes entradas,normalmente desconhecida.

    O clculo da expresso matemtica resultante freqentemente de tratamento complexo. Muitas vezes o caso mdio quase to ruim quanto o pior caso.

    Exerccio 6.3

    Equivalncia imperfeita com processadores reais. Simplificao s vezes irrealista do algoritmo. Um algoritmo simples pode ser difcil de analisar. A anlise pode exigir ferramentas matemticas.

    Exerccio 6.4

    1) 2) 3) 4) 5)

    Exerccio 6.5

    A B C D E F G H

    4 7 2 6 1 5 3 8

  • 7/23/2019 Apostila Exerccios 2014.1 2014-02-26-2100.pdf

    45/67

    Paulo Costa2013 Estruturas de DadosListas de exerccios e solues 43

    Exerccio 6.6

    A B C D E F G H

    5 8 4 3 7 6 2 1

    Exerccio 6.7

    A B C D E F G H I J

    8 3 6 4 7 10 1 9 2 5

    Exerccio 6.8

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20

    V V F F F F V V V V V V F V V F F F F V

    Exerccio 6.9

    O problema consiste em definir ce n00| 0an+

    bcn2para todo nn0.

    Dividindo a inequao acima por n2obtemos0a/n+b/n

    2c.

    Fazendo n0 = 1obtemos0a+

    bcque satisfeita por c= a+|b|.

    A existncia de valores para ce n0que satisfazem a definio de O(g(n))prova que an+

    b O(n

    2).

    Exerccio 6.10

    Trecho 1 Trecho 2 Trecho 3

    Trecho 4 Trecho 5 Trecho 6

    Trecho 7 Trecho 8 Trecho 9

    Trecho 10 Trecho 11 Trecho 12

    Exerccio 6.11

    Insero Remoo Insero Remoo Insero Remoo Insero Remoo

    1 8 15 22 2 9 16 23 3 10 17 24 4 11 18 25 5 12 19 26

    6 13 20 27 7 14 21

  • 7/23/2019 Apostila Exerccios 2014.1 2014-02-26-2100.pdf

    46/67

    Paulo Costa2013 Estruturas de DadosListas de exerccios e solues 44

    Exerccio 6.12

    Algoritmo: bubbleSort (A, n)Entrada: array A com n elementosSada: array A em ordem crescente

    1) para i de 0 at n-1 passo 1 faa2) para j de n-1 at i+1 passo -1 faa

    3) se A[j-1] > A[j] ento4) temp = A[j-1]5) A[j-1] = A[j]6) A[j] = temp

    NOTA: A identao mostra o escopo dos comandos:

    o parana linha 2 est dentro do parana linha 1,o sena linha 3 est dentro do parana linha 2, eas linhas 4 a 6 esto dentro do sena linha 3.

    Linha Melhor caso Pior caso

    1 2n+ 3 2n+ 3

    2 n2+ 3n n

    2+ 3n

    3 2n 2n 2n 2n

    4 0 3 n(n 1) / 2

    5 0 2n 2n

    6 0 n n

    Total 3n + 3n+ 3 (15n 3n+ 6) / 2

    Linha 1, qualquer caso: para i de 0 at n-1 passo 1 faa

    As inicializaes equivalem a 2 operaes bsicas: atribuio de 0 a i e clculo de n 1. Essasoperaes so executadas uma nica vez.

    No comando para temos primeiro um teste da condio de parada; se a condio for falsa, o lao executado uma vez e, ao final, a varivel de controle incrementada.

    Neste comandopara

    , ivaria de 0a n1inclusive, logo a condio de parada ser testada n+1vezes(nvezes ela ser falsa, e na ltima vez ser verdadeira). So n+ 1operaes bsicas.

    A varivel de controle i ser incrementada n vezes. So n operaes bsicas. Esse tambm onmero de vezes que este lao e os comandos dentro dele sero executados.

    Nmero total de operaes bsicas: 2 + n+ 1 + n2n+ 3. Essa anlise independe da qualidade daentrada, portanto o resultado vlido para todos os casos.

    Linha 2, qualquer caso: para j de n-1 at i+1 passo -1 faa

    As inicializaes equivalem a 3 operaes bsicas: clculo de n 1, atribuio do resultado a j e

    clculo de i+ 1. Lembrando que esta linha executada nvezes por causa do comando parana linha 1,conclumos que essas operaes equivalem a 3noperaes bsicas.

    Neste comando para,jvaria de n1at i+ 1inclusive, em decrementos unitrios. Logo, a condio deparada ser testada, e resultar falsa, (n1)(i+1)+ 1vezes; s no prximo teste ser verdadeira. Ototal de testes ser ento (n1)(i+1)+ 1 + 1 ni. So nioperaes bsicas para cada valor dei, determinado pelo lao externo.

    A varivel de controle jser decrementada ni1 vezes. So ni1operaes bsicas para cadavalor de i, determinado pelo lao externo. Esse tambm o nmero de vezes que o lao da linha 2 e oscomandos dentro dele (comando

    se

    da linha 3) sero executados.

    medida que o valor de i aumenta (comando para da linha 1), o teste da condio de parada e o

    decremento dejso executados mais e mais vezes:

    Iteraodo parana linha 1

    i

    j variade n 1at i +1

    Vezes que ser executado...

    o teste da condio deparada na linha 2:n i

    o decremento dejna linha 2:n i 1

    o comando sena linha 3

    primeira 0 1 n0 n n0 1 n 1 n 1

    segunda 1 2 n1 n1 1 n 2 n 2

    terceira 2 3 n2 n2 1 n 3 n 3

    penltima n 2 n 1 n(n 2) 2 n(n 2) 1 1 1

    ltima n 1 n n(n 1) 1 n(n 1) 1 0 0

    Total1 + 2 + + n

    n(n+ 1)/ 2 (n2+ n) / 2

    0 + 1 + + n 1(n

    2 n) / 2 (n

    2 n) / 2

  • 7/23/2019 Apostila Exerccios 2014.1 2014-02-26-2100.pdf

    47/67

    Paulo Costa2013 Estruturas de DadosListas de exerccios e solues 45

    Nmero total de operaes bsicas na linha 2: 3n+ (n2+ n) / 2+ (n

    2 n) / 2 n

    2+ 3n.

    Linha 3, qualquer caso: se A[j-1] > A[j] ento

    Nessa linha h uma subtrao, duas indexaes e uma comparao. So 4operaes bsicas. A linha

    ser executada (n2 n) / 2 vezes. Operaes bsicas: 4 (n

    2 n) / 22n

    2 2n.

    Linhas 4, 5 e 6, melhor caso:

    No melhor caso o array j estar ordenado, de modo que a condio do comando seser sempre falsa.Portanto, os comandos dentro do seno sero executados nenhuma vez. Assim, no importa quantasoperaes bsicas haja nesses comandos; o total de operaes bsicas nessas linhas 0.

    Linha 4, pior caso: temp = A[j-1]

    Nessa linha h uma subtrao, uma indexao e uma atribuio. So 3operaes bsicas. Vimos que,

    no pior caso, os comandos dentro do sesero executados (n2 n) / 2vezes. Operaes bsicas na

    linha 4, no pior caso: 3 (n2 n) / 2.

    Linha 5, pior caso: A[j-1] = A[j]

    Nessa linha h uma subtrao, duas indexaes e uma atribuio. So 4operaes bsicas. Vimos

    que, no pior caso, os comandos dentro dose

    sero executados (n2 n) / 2vezes. Operaes bsicas

    na linha 5, no pior caso: 4 (n2 n) / 22n

    2 2n.

    Linha 6, pior caso: A[j] = temp

    Nessa linha h uma indexao e uma atribuio. So 2operaes bsicas. Vimos que, no pior caso, os

    comandos dentro do se sero executados (n2 n) / 2 vezes. Operaes bsicas na linha 6, no pior

    caso: 2 (n2 n) / 2n

    2 n.

    Exerccio 6.13

    Algoritmo: insertionSort (A, n)Entrada: array A com n elementosSada: array A em ordem crescente

    1) para i de 1 at n-1 faa

    2) atual = A[i]3) j = i-14) enquanto j>=0 e A[j]>atual faa5) A[j+1] = A[j]6) j = j-17) A[j+1] = atual

    NOTA: A identao mostra o escopo dos comandos:

    as linhas 5 e 6 esto dentro do enquantona linha 4;

    as linhas 2 a 7 esto dentro do parana linha 1.

    Linha Melhor caso Pior caso

    1 2n+ 1 2n+ 1

    2 2n 2 2n 2

    3 2n 2 2n 2

    4 4n 4 2n + 2n 4

    5 0 2n 2n

    6 0 n n

    7 3n 3 3n 3

    Total 13n 10 5n + 8n 10

    Linha 1, qualquer caso: para i de 1 at n-1 faa

    As inicializaes equivalem a 2operaes bsicas: atribuio de 1 a ie clculo de n 1.No comando para temos primeiro um teste da condio de parada; se a condio for falsa, o lao executado uma vez e, ao final, a varivel de controle incrementada. Na prxima iterao a condiode parada testada novamente e assim sucessivamente.

    Neste algoritmo em particular, ivaria de 1 a n 1inclusive, logo a condio de parada ser testada nvezes (n 1 vezes ela ser falsa, e na ltima vez ser verdadeira). So noperaes bsicas.

    A varivel de controle iser incrementada n 1 vezes. So n 1operaes bsicas.

    Nmero total de operaes bsicas: 2 + n+ (n 1)2n+ 1.

    Essa anlise independe da qualidade da entrada, portanto o resultado vlido para todos os casos. Omesmo se aplica para as linhas 2, 3 e 7.

    Linha 2, qualquer caso:atual = A[i]

    Nessa linha h uma indexao e uma atribuio. So 2operaes bsicas. A linha ser executada n1 vezes. Operaes bsicas: 2 (n 1)2n 2.

  • 7/23/2019 Apostila Exerccios 2014.1 2014-02-26-2100.pdf

    48/67

    Paulo Costa2013 Estruturas de DadosListas de exerccios e solues 46

    Linha 3, qualquer caso: j = i-1

    Nessa linha h uma subtrao e uma atribuio. So 2operaes bsicas. A linha ser executada n 1vezes. Operaes bsicas: 2 (n 1)2n 2.

    Linha 4, melhor caso: enquanto j>=0 e A[j]>atual faa

    Nessa linha h 4operaes bsicas: duas comparaes, uma indexao e uma operao lgica e.

    No melhor caso, A[j]>atualser sempre falso, portanto a condio de repetio do enquantoserfalsa logo de incio. Assim, os comandos dentro do enquantono sero executados nenhuma vez.

    Essa linha ser executada n 1 vezes. Operaes bsicas: 4 (n 1)4n 4.

    Linhas 5 e 6, melhor caso:

    No importa quantas operaes bsicas haja nesses comandos. Vimos que, no melhor caso, oscomandos dentro do enquanto no sero executados nenhuma vez, portanto o nmero total deoperaes bsicas nessas linhas 0.

    Linha 4, pior caso: enquanto j>=0 e A[j]>atual faa

    Vimos que nessa linha h 4operaes bsicas.

    No pior caso,A[j]>atual

    ser sempre verdadeiro, portanto a condio de repetio doenquanto

    s

    ser falsa quando j>=0for falso. Na linha 3j inicializado com o valor i 1, de modo que temos:

    Iterao doparana linha 1 i j varia de

    atVezes que a linha 4

    ser executada

    Vezes que os comandosdentro do enquanto

    sero executados

    primeira 1 0 1 2 1

    segunda 2 1 1 3 2

    ltima n 1 n 2 1 n n 1

    Total2 + 3 + + n n(n+ 1)/ 2 1

    (n2+ n 2) / 2

    1 + 2 + + n 1n(n+ 1)/ 2 n

    (n2 n) / 2

    Operaes bsicas na linha 4, no pior caso: 4 (n2+ n 2) / 22n

    2+ 2n 4.

    Linha 5, pior caso: A[j+1] = A[j]

    Nessa linha h uma adio, duas indexaes e uma atribuio. So 4operaes bsicas. Vimos que,

    no pior caso, os comandos dentro do enquanto sero executados (n2 n) / 2 vezes. Operaes

    bsicas na linha 5, no pior caso: 4 (n2 n) / 22n

    2 2n.

    Linha 6, pior caso: j = j-1

    Nessa linha h uma subtrao e uma atribuio. So 2operaes bsicas. Vimos que, no pior caso, os

    comandos dentro do enquantosero executados (n2 n) / 2vezes. Operaes bsicas na linha 6, nopior caso: 2 (n

    2 n) / 2n

    2 n.

    Linha 7, qualquer caso: A[j+1] = atual

    Nessa linha h uma adio, uma indexao e uma atribuio. So 3operaes bsicas. A linha serexecutada n 1 vezes. Operaes bsicas: 3 (n 1)3n 3.

  • 7/23/2019 Apostila Exerccios 2014.1 2014-02-26-2100.pdf

    49/67

    Paulo Costa2013 Estruturas de DadosListas de exerccios e solues 47

    Exerccio 6.14

    Algoritmo: selectionSort (A, n)Entrada: array A com n elementosSada: array A em ordem crescente

    1) para i de 0 at n-2 faa2) para j de i+1 at n-1 faa3) se A[j] < A[min] ento

    4) temp = A[i]5) A[i] = A[min]6) A[min] = temp

    NOTA: A identao mostra o escopo dos comandos:

    o parana linha 2 est dentro do parana linha 1,o sena linha 3 est dentro do parana linha 2, eas linhas 4 a 6 esto dentro do sena linha 3.

    Linha Melhor caso Pior caso

    1 2n+ 1 2n+ 1

    2 n2+ 3n4 n

    2+ 3n4

    3 3/2 n

    2

    3/2 n 3/2 n

    2

    3/2 n4 0 n

    2 n

    5 0 3/2 n 3/2 n

    6 0 n n

    Total (5n2 7n 6)/2 6n

    2 3

    Linha 1, qualquer caso:para i de 0 at n-2 faa

    As inicializaes equivalem a 2 operaes bsicas: atribuio de 0 a i e clculo de n 2. Essasoperaes so executadas uma nica vez.

    No comando para temos primeiro um teste da condio de parada; se a condio for falsa, o lao executado uma vez e, ao final, a varivel de controle incrementada.

    Neste comando para, ivaria de 0a n2. A condio de parada ser testada n vezes: n 1 vezes elaser falsa e na ltima vez ser verdadeira. So noperaes bsicas.

    A varivel de controle iser incrementada n 1 vezes. So n 1 operaes bsicas. Esse tambm onmero de vezes que este lao e os comandos dentro dele sero executados.

    Nmero total de operaes bsicas: 2 + n+ n 12n+ 1. Essa anlise independe da qualidade daentrada, portanto o resultado vlido para todos os casos.

    Linha 2, qualquer caso:para j de i+1 at n-1 faa

    As inicializaes equivalem a 3operaes bsicas: clculo de i+ 1, atribuio do resultado aje clculo

    de n 1. Lembrando que esta linha executada n1vezes por causa do comando parana linha 1,conclumos que essas operaes equivalem a 3n3