Você está na página 1de 36

Análise de Algoritmos

Aula 04

Prof. Roberto Leminski


roberto.leminski@docente.unip.br
Conteúdo
•Algoritmos sobre cadeias
Algoritmos gerais sobre strings
Algoritmos de Ordenação
Código de Huffman
 Algoritmo KMP
Algoritmos sobre Strings
•Existem alguns procedimentos
usuais sobre strings.

•Estes algoritmos serão analisados


quanto às complexidades de tempo.
Algoritmos sobre Strings
•Preenchimento de um string : O(n)

•Inserção/Remoção de elemento na
extremidade: O(1)

•Inserção/ remoção de elemento em


estrutura ordenada: O(log n)
Algoritmos sobre Strings
•Busca de elemento em estrutura não
Ordenada: O(n)

•Busca de elemento em Estrutura


Ordenada: O(log n)
Algoritmos de Ordenação
•Vamos rever alguns algoritmos de
ordenação:

•Um método de ordenação é estável


se a ordem relativa dos itens iguais não
se altera durante a ordenação.
Algoritmos de Ordenação
•Nos algoritmos de ordenação as
medidas de complexidade relevantes
são:

Número de comparações C(n) entre


chaves.

Número de movimentações M(n) dos


registros dos vetores.

(n é o número de registros)
Algoritmos de Ordenação
•Insertion Sort ou ordenação por
inserção é o método que percorre um
vetor de elementos da esquerda para a
direita e à medida que avança vai
ordenando os elementos à esquerda.

•Possui complexidade C(n) = O(n) no


melhor caso e C(n) = O(n²) no caso
médio e pior caso. É considerado um
método de ordenação estável.
Algoritmos de Ordenação
•Selection Sort ou ordenação por
seleção 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.

•Para todos os casos (melhor, médio e


pior caso) possui complexidade C(n) =
O(n²) e não é um algoritmo estável.
Algoritmos de Ordenação
•Quick Sort, criado por C. A. R. Hoare
em 1960, é o método de ordenação
interna mais rápido que se conhece para
uma ampla variedade de situações.

•É um algoritmo de comparação que


emprega a estratégia de “divisão e
conquista”.
Algoritmos de Ordenação
•A ideia é dividir o problema de
ordenar um conjunto com n itens em
dois problemas menores. Os problemas
menores são ordenados
independentemente e os resultados são
combinados para produzir a solução
final.

•Possui complexidade C(n) = O(n²) no


pior caso e C(n) = O(n log n) no melhor e
médio caso e não é um algoritmo
Algoritmos de Ordenação
•Mergesort, criado em 1945 pelo
matemático John Von Neumann o é um
exemplo de algoritmo de ordenação que
faz uso da estratégia “dividir para
conquistar” para resolver problemas.

•É um método estável e possui


complexidade C(n) = O(n log n) para
todos os casos.
Algoritmos de Ordenação
•Shell Sort, criado por Donald Shell
em 1959, o método Shell Sort é uma
extensão do algoritmo de ordenação por
inserção. Ele permite a troca de
registros distantes um do outro,
diferente do algoritmo de ordenação por
inserção que possui a troca de itens
adjacentes para determinar o ponto de
inserção.
Algoritmos de Ordenação
•A complexidade do algoritmo é
desconhecida, ninguém ainda foi capaz
de encontrar uma fórmula fechada para
sua função de complexidade e o método
não é estável.
Algoritmos de Ordenação
Código de Huffman
•Em 1951, David A. Huffman e seus
colegas da disciplina Teoria da
Informação, no MIT, foram dadas a
opção de fazer uma monografia ou um
exame final. Seu professor, Robert M.
Fano, designou um trabalho com a tarefa
de se encontrar a codificação binária
mais eficiente.
Código de Huffman
•Huffman, sem conseguir demonstrar
que qualquer código que havia feito era
o mais eficiente, estava à beira de
começar a estudar para o exame final,
até que teve a ideia de usar uma árvore
binária utilizando frequências relativas
para fazer a demonstração que
precisava.
Código de Huffman
•Com isso, Huffman conseguiu fazer
um código mais eficiente que seu
professor, que trabalhava em Teoria da
Informação com o próprio pioneiro
dessa área do conhecimento, Claude
Shannon.

•Construiu a árvore de codificação


binária na metodologia bottom-up ao
invés do top-down que a Codificação de
Shannon-Fano utiliza.
Código de Huffman
•Uma das melhores técnicas de
compressão conhecidas é devida a
Huffman.

•Para uma dada distribuição de


probabilidades gera um código ótimo,
livre de prefixo e de redundância
mínima, além de produzir uma sequência
de bits aleatórios.
Código de Huffman
•Utiliza códigos de tamanho variável
para representar os símbolos do texto,
que podem ser caracteres ou cadeias de
caracteres.

•A ideia básica do algoritmo é atribuir


códigos de bits menores para os
símbolos mais frequentes no texto, e
códigos mais longos para os mais raros.
Código de Huffman
•O algoritmo de Huffman original
baseia-se no método guloso e constrói
um código ótimo com esforço
computacional O(n log n).

•Existem novas versões que


constroem o código de Huffman com
esforço computacional O(n), mas é
necessário que as frequências já
estejam ordenadas.
Código de Huffman
•O algoritmo constrói uma árvore
binária completa com n nós externos e n
− 1 nós internos, onde os nós externos
são rotulados com as frequências.

•Inicialmente, existe um conjunto de


árvores sem filhos, uma para cada
frequência na lista, ordenadas pela
frequência.
Código de Huffman
•A seguir, as duas menores frequências são
colocadas em uma nova árvore cuja
frequência é a soma destas duas e cujos filhos
de raiz são as duas menores frequências.

•A nova árvore é inserida na lista e as duas


frequências das quais foi criada são retiradas.

•E o processo se repete , até que a árvore


final de Huffman é gerada.
Código de Huffman - Exemplo
Código de Huffman - Exemplo
Código de Huffman - Exemplo
Código de Huffman - Exemplo
Código de Huffman
•O algoritmo permite uma codificação
com menor número de bits, sem
prefixação.

•Isto permite a compressão do


tamanho dos arquivos em relação ao
uso de um código de tamanho fixo de
bits (ASCII, por exemplo).
Algoritmo KMP
•O algoritmo de Knuth–Morris–Pratt
procura a ocorrência de uma "palavra"
W dentro de um "texto" S empregando a
simples técnica de que quando aparece
uma diferença, a palavra tem em si a
informação necessária para determinar
onde começar a próxima comparação.
Algoritmo KMP
•O algoritmo foi inventado por Donald
Knuth e Vaughan Pratt e
independentemente por James Morris
em 1977, embora os três tenham-no
publicado conjuntamente.
Algoritmo KMP
•Considere o texto ABAAAABAAAAAAAAA
e o padrão BAAAAAAAAA. Depois de
detectar um conflito na posição i do texto, é
desnecessário retroceder i pois isso não
produziria casamento algum:
Algoritmo KMP
•Este algoritmo pode ser representado
como um autômato finito determinístico (DFA).

•Gerador Online de DFA:


•https://ivanzuzak.info/noam/webapps/fsm_
simulator/
Algoritmo KMP
•O algoritmo KMP é linear: faz apenas M
comparações entre caracteres para construir o
DFA e depois no máximo N comparações entre
caracteres para procurar o padrão.

•Proposição N. O algoritmo KMP examina


não mais que M + N caracteres.

•Se levarmos em conta o tamanho do


alfabeto, R, o consumo de tempo para
construir o DFA é MR.
Referências
• DASGUPTA, Sanjoy. Christos Papadimitriou,
Umesh Vazirani. Algoritmos. Porto Alegre, RS:
AMGH, 2011.

• T.H. Cormen, C.E. Leiserson, R.L. Rivest, C.


Stein, Introduction to Algorithms, 2nd
edition, MIT Press & McGraw-Hill, 2001.
Dúvidas ?
Obrigado !

Você também pode gostar