Escolar Documentos
Profissional Documentos
Cultura Documentos
●
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
●
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
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
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