Você está na página 1de 70

Algoritmos e Estrutura de Dados II

Prof. Me. Diego Oliveira


Apresentação do Professor


Diego Oliveira
– Formação

Mestrado em Ciência da Computação – UFG

Especialista em Docência

Graduação em Engenharia da Computação – PUCGO
– Experiência

Analista de Sistemas/BI Sênior – Grupo José Alves

Analista de Sistemas Pleno – América Planos de Saúde

Pesquisador na área de Sistemas Distribuídos e Banco de Dados - UFG

2
Apresentação do Professor


Diego Oliveira
– Contatos:

Email: diego.oliveira@unialfa.com.br

Linkedin: linkedin.com/in/djcoliveira

3
Apresentação do Curso


Cursos: Sistemas de Informação / Eng. Software/Computação

Componente: CIN7005 – Algoritmos e Estrutura de Dados II

Carga Horária Total: 80 horas

Dia da Semana: Sexta

4
Apresentação do Curso


Conhecimentos Prévios
– Lógica de programação, POO, AED I

5
Apresentação do Curso


Conteúdo
– UNIDADE I RECURSIVIDADE

Funções Recursivas;

Algoritmos Recursivos.

6
Apresentação do Curso


Conteúdo
– UNIDADE II: ORDENAÇÃO

Conceituação e aplicabilidade da ordenação

Ordenação por troca e seleção: insertion sort, selection sort, bubble sort e heap sort

Divisão e conquista: shell sort, merge sort e quick sort

7
Apresentação do Curso


Conteúdo
– UNIDADE III: BUSCA EM MEMÓRIA PRIMÁRIA

Busca sequencial;

Busca binária;

Caminhamento em árvore;

Árvores binárias de pesquisa;

Árvore AVL;

Árvores B;

Árvores B*;

Árvore Rubro-Negra;

Código de Huffman;

Código de Shannon.
8
Apresentação do Curso


Conteúdo
– UNIDADE VI: TEORIA DOS GRAFOS

Introdução;

Conceitos básicos de grafo;

Problemas de ciclos e caminhos;

Algoritmo de Dijistrak.

9
Apresentação do Curso


Avaliação
– Frequência mínima de 75%
– N1, N2, N3 e N4
– Duas provas
– Exercícios teóricos e práticos

10
Apresentação do Curso


Bibliografia
– Estruturas de Dados e seus Algoritmos 3ª Ed. / 2010,
– Programação estruturada de computadores : algoritmos estruturados 3.
ed. / 2013,
– Algoritmos : lógica para desenvolvimento de programação de computadores
26. ed. / 2012.
– Algoritmos : lógica para desenvolvimento de programação de computadores
27. ed. / 2014,

11
Apresentação do Curso


Bibliografia
– Projeto de Algoritmos com Implementações
em Java e C++, Nivio Ziviani

12
Unidade I - Recursividade

Projeto de Banco de Dados


Prof. Me. Diego Oliveira
13
Definição


Algorítimos Recursivos
– Definição Recorrente: Uma definição onde o item a ser definido aparece
como parte da própria definição é chamado de Definição Recorrente (ou
Definição por Recursividade).
– Quando uma função executa uma chamada a ela mesma dentro do seu
escopo, a chamamos de função recursiva.

14
Definição

15
Definição


Algorítimos Recursivos
– Caso básico: determina onde a recursão deve ser finalizada, caso contrário
entraria em loop infinito. A lógica interna da função recursiva deve-se
aproximar do caso básico a cada nova chamada.

16
Definição


Algorítimos Recursivos - Vantagens
– Um programa recursivo tem um código mais simples e elegante que uma
versão iterativa (usado laço de repetição, por exemplo).

17
Definição


Algorítimos Recursivos - Desvantagens
– Maior uso de memória pois os valores a serem processados devem ser
mantidos na pilha de execução.
– Nem sempre será mais rápido, devido a grande quantidade de chamadas a
função.
– Dependendo da situação, pode levar mais tempo para ser compreendido.

18
Algorítimos Recursivos


Exemplo 1 - Uma sequência Q é uma lista de objetos que são
numerados em uma determinada ordem.
– Q(1) = 1
– Q(n) = 2.Q(n-1), n>=2

Escrever os cinco primeiros elementos dessa sequência

19
Algorítimos Recursivos


Exemplo 2 - Uma sequência T é uma lista de objetos que são
numerados em uma determinada ordem.
– T(0) = 1
– T(n) = T(n – 1) + 4, n >= 1

Escrever os cinco primeiros elementos dessa sequência

20
Algorítimos Recursivos


Exemplo 3 – Fórmula para determinar a quantidade de movimentos
mínimos necessários para se resolver o problema da Torre de Hanói
com n discos.
– H(1) = 1
– H(n) = 2.H(n – 1) + 1, n >= 2

Quantos movimentos são necessários para resolver a Torre de Hanói
com 5 discos?

21
Algorítimos Recursivos


Exemplo 4 – Sequência de Fibonacci
– F(1) = 1
– F(2) = 1
– F(n) = F(n – 1) + F(n - 2), n >= 3

Quais são os oito primeiros termos da sequência de Fibonacci?

22
Algorítimos Recursivos


Exemplo 5 – Fatorial.
– 0! = 1
– a! = a.(a – 1)!, a >= 1

Calcule o fatorial de 5 usando recursão.

23
Algorítimos Recursivos


Exemplo 6 – Exponenciação.
– a0 = 1
– an = a.an-1,n >= 1

Calcule o 24.

24
Algorítimos Recursivos


Reposta exponenciação

25
Algorítimos Recursivos


Resposta fatorial

26
Algorítimos Recursivos


Resposta fibonacci

27
Algorítimos Recursivos


Resposta torre de hanoi

28
Algorítimos Recursivos


Resposta PA

29
Algorítimos Recursivos


Resposta PG

30
Algoritmos de Ordenação

Prof. Me. Diego Oliveira

31
Cenário


Imagine como seria buscar um número em um catálogo telefônico
se o nome das pessoas não estivessem listados em ordem
alfabética?

Como seria procurar uma palavra em um dicionário?

32
Ordenação


Conceito
– A ordenação ou classificação de registros consiste em organizá-los em
ordem crescente ou decrescente e assim facilitar a recuperação desses
dados.
– A ordenação tem como objetivo facilitar as buscas e pesquisas de
ocorrências de determinado elemento em um conjunto ordenado.

33
Ordenação


Classificação
– Ordenação Interna: onde todos os elementos a serem ordenados cabem na
memória principal e qualquer registro pode ser imediatamente acessado.
– Ordenação Externa: onde os elementos a serem ordenados não cabem na
memória principal e os registros são acessados sequencialmente ou em
grandes blocos.

34
Algoritmos Ordenação


Tipos
– Ordenação por troca e seleção (métodos simples).

Insertion sort

Selection sort

Bubble sort

Heap sort

35
Algoritmos Ordenação


Tipos
– Divisão e conquista (métodos complexos).

Shell sort

Merge sort

Quick sort

36
Algoritmos Ordenação


Insertion Sort
– O mais simples dos algoritmos de ordenação, baseia-se em percorrer cada
elemento do vetor da esquerda para a direita comparando dois elementos,
caso o da esquerda seja maior que o da direita, realiza-se a troca e repete-se
o processo de verificação e troca da esquerda para direita.

37
Algoritmos Ordenação


Insertion Sort - Demostração

38
Algoritmos Ordenação


Insertion Sort – Pseudo Código

39
Algoritmos Ordenação


Insertion Sort – Atividade
– Implementar, usando a linguagem Java, o algoritmo insertion sort como
demonstrado no slide anterior.

40
Algoritmos Ordenação


Selection Sort
– A ordenação por seleção ou selection sort consiste em selecionar o menor
item e colocar na primeira posição, selecionar o segundo menor item e
colocar na segunda posição, segue estes passos até que reste um único
elemento.

41
Algoritmos Ordenação


Selection Sort - Demostração

42
Algoritmos Ordenação

Selection Sort – Pseudo Código

43
Algoritmos Ordenação


Selection Sort – Atividade
– Implementar, usando a linguagem Java, o algoritmo selection sort como
demonstrado no slide anterior.

44
Algoritmos Ordenação


Bubble Sort
– Compara dois elementos adjacentes no vetor, da esquerda para a direita,
trocando suas posições se estiverem fora de ordem até o final do vetor. O
algoritmo então repete esse processo, mas para a última posição que foi
ordenada. O processo é repetido até que reste apenas o primeiro elemento.

45
Algoritmos Ordenação


Bubble Sort – Demostração
– https://www.youtube.com/watch?v=JP5KkzdUEYI

46
Algoritmos Ordenação


Bubble Sort – Exercício
– Implementar, usando a linguagem Java, o algoritmo bubble sort como
demonstrado no slide anterior.

47
Algoritmos Ordenação


Shell Sort
– Criado em 1959 por Donald Shell e publicado em artigo pela Universidade
de Cincinnati.
– Considerado como refinamento do método insert sort.
– Ao invés de considerar o vetor inteiro como único seguimento a ser
ordenado, o mesmo é divididos em seguimentos menores, também
chamados de GAP.

48
Algoritmos Ordenação


Shell Sort – Passo a Passo
– Separar o vetor principal em vetores menores, com intervalos na
comparação que vão decrescendo até chegar no intervalo 1.
– Ao chegar no valor 1, o algorítimo se comporta como uma insert sort
comum, mas com a vantagem de que a maioria dos elementos já está pré-
ordenada.

49
Algoritmos Ordenação


Shell Sort – Passo a Passo

50
Algoritmos de Busca

Prof. Me. Diego Oliveira

51
Algoritmos de Busca


Problema
– Dada uma coleção de n elementos, pretende-se saber se um determinado
elemento (valor) está presente neste coleção.
– Determinar a posição desse elemento, valor em um conjunto de elementos.

52
Algoritmos de Busca


Vetor v = (3, 5, 7, 11, 21, 35, 42, 59, 72)

Problemas
– Como encontrar o valor 82
– Como determinar a posição do valor 21

53
Algoritmos de Busca


Tipos de Busca
– Busca sequencial ou linear
– Busca binária
– Busca com Hash

54
Busca Sequencial


Percorrer o vetor desde a primeira posição até a última. Para cada
posição i, comparamos o vetor[i] com o valor buscado.
– Se forem iguais dizemos que o valor existe.
– Se chegarmos ao fim do vetor sem sucesso dizemos que o valor não existe.

55
Busca Sequencial

56
Busca Sequencial

57
Busca Sequencial


Quanto tempo a busca sequencial demora para executar? Em outras
palavras, quantas vezes a comparação vetor[i] == valor é executada?
– Caso o valor não esteja presente no vetor, n vezes
– Caso o valor esteja presente no vetor

1 vez no melhor caso (valor na primeira posição)

n vezes no pior caso (valor está na última posição)

n/2 Vezes no vaso médio

58
Busca Sequencial


Implementar em Java:
– Um algoritmo de busca sequencial
– A sua versão recursiva

59
Busca Binária


Agora vamos supor que o vetor esteja ordenado (crescente)

Será que é possível resolver o problema de modo mais eficiente?

Será que podemos fazer algo melhor do que verificar cada posição
do vetor?

Que tal verificarmos se a posição do meio do vetor contem x. O que
podemos concluir?

60
Busca Binária


Se x for menor que o elemento do meio, então x deve estar na
metade inferior do vetor.

Se x for maior que o elemento do meio, então x deve estar na
metade superior do vetor.

61
Busca Binária


Ou seja
– Caso a lista esteja ordenada, sabemos que, para qualquer i e j, i < j, se, e
somente se, A[i] <= A[j]
– Portanto, comparando um determinado elemento como o elemento
procurado, saberemos:

Se o elemento procurado é o elemento comparado

Se ele está antes do elemento comparado ou depois

62
Busca Binária


Se fizermos isso sempre com o elemento do meio da lista, a cada
comparação dividiremos a lista em duas, reduzindo nosso tempo
(custo computacional) de busca.

Se em um determinado momento o vetor, após sucessivas divisões,
tiver tamanho zero, então o elemento não está no vetor.

63
Busca Binária

64
Busca Binária

65
Busca Binária

66
Busca Binária

67
Busca Binária


Quanto tempo a busca binária demora para executar (custo de
processamento)? Em outras palavras, quantas vezes a comparação
vetor[i] == valor é executada?
– Caso o valor exista, log2 (n) vezes
– Caso valor exista no vetor

1 vez no melhor caso (valor no meio do vetor)

log2(n) vezes no caso médio
– O logaritmo de base 2 parece porque sempre dividimos o intervalo no meio.

68
Busca Binária x Sequencial


Para n = 1000, o algoritmo sequencial irá executar 1000
comparações no pior caso e 500 no caso médio

Por sua vez, o algoritmo de busca binária irá executar 10
comparações no pior caso, para o mesmo n

O algoritmo de busca binária supõe que o vetor está ordenado.
Ordenar um vetor também tem um curso!

69
Busca Binária


Implementar um algoritmo de busca sequencial

Implementar a sua versão recursiva

70

Você também pode gostar