estruturas de dados e ordenação baseado em: the algorithm design manual steven s. skiena
TRANSCRIPT
![Page 1: Estruturas de Dados e Ordenação Baseado em: The Algorithm Design Manual Steven S. Skiena](https://reader035.vdocuments.mx/reader035/viewer/2022081518/552fc144497959413d8e02ec/html5/thumbnails/1.jpg)
Estruturas de Dados e Ordenação
Baseado em:The Algorithm Design Manual
Steven S. Skiena
![Page 2: Estruturas de Dados e Ordenação Baseado em: The Algorithm Design Manual Steven S. Skiena](https://reader035.vdocuments.mx/reader035/viewer/2022081518/552fc144497959413d8e02ec/html5/thumbnails/2.jpg)
Introdução (1) A alteração de uma estrutura de
dados em um programa lento pode mudar sensivelmente seu tempo de execução.
Esta alteração não muda a corretude do programa.
É importante projetar os programas tendo as estruturas de dados como centro.
![Page 3: Estruturas de Dados e Ordenação Baseado em: The Algorithm Design Manual Steven S. Skiena](https://reader035.vdocuments.mx/reader035/viewer/2022081518/552fc144497959413d8e02ec/html5/thumbnails/3.jpg)
Introdução (2) É importante construir os programas
de forma que implementações alternativas possam ser experimentadas.
É importante separar os componentes da estrutura de dados de sua interface.
Esta abstração de dados é importante para a limpeza, leitura e modificação dos programas.
![Page 4: Estruturas de Dados e Ordenação Baseado em: The Algorithm Design Manual Steven S. Skiena](https://reader035.vdocuments.mx/reader035/viewer/2022081518/552fc144497959413d8e02ec/html5/thumbnails/4.jpg)
Observações (1) A construção de algoritmos em torno de
estruturas de dados tais como dicionários e filas de prioridades leva a estruturas limpas e bons desempenhos.
A escolha errada de uma estrutura de dados pode ser desastroso para o desempenho.
A escolha da melhor estrutura de dados não é tão crítica, pois podem existir outras escolhas que se comportam similarmente.
![Page 5: Estruturas de Dados e Ordenação Baseado em: The Algorithm Design Manual Steven S. Skiena](https://reader035.vdocuments.mx/reader035/viewer/2022081518/552fc144497959413d8e02ec/html5/thumbnails/5.jpg)
Observações (2) A ordenação é uma das partes principais
de um algoritmo. Deveria ser a primeira coisa a ser feita para buscar eficiência.
A ordenação pode ser usada para ilustrar muitos paradigmas de projeto de algoritmos. Técnicas de estruturas de dados, divisão e conquista, randomização e construção incremental levam a algoritmos de ordenação.
![Page 6: Estruturas de Dados e Ordenação Baseado em: The Algorithm Design Manual Steven S. Skiena](https://reader035.vdocuments.mx/reader035/viewer/2022081518/552fc144497959413d8e02ec/html5/thumbnails/6.jpg)
Tipos de dados fundamentais
Um tipo de dado abstrato é uma coleção de operações bem definidas que podem ser feitas em uma estrutura particular.
São estas operações que definem o que a estrutura faz, mas não como ela funciona.
![Page 7: Estruturas de Dados e Ordenação Baseado em: The Algorithm Design Manual Steven S. Skiena](https://reader035.vdocuments.mx/reader035/viewer/2022081518/552fc144497959413d8e02ec/html5/thumbnails/7.jpg)
Containers É uma estrutura de dados que permite
o armazenamento e a recuperação de dados independentemente de seu conteúdo.
As operações fundamentais são: Put(C,x) – insere o dado x no container C. Get(C) – recupera o próximo item do
container C. Tipos diferentes de containers admitem diferentes tipos de recuperação, baseado na ordem ou posição de inserção.
![Page 8: Estruturas de Dados e Ordenação Baseado em: The Algorithm Design Manual Steven S. Skiena](https://reader035.vdocuments.mx/reader035/viewer/2022081518/552fc144497959413d8e02ec/html5/thumbnails/8.jpg)
Containers (2) A utilidade de containers é maior
quando a quantidade de dados é limitada e a ordem de recuperação é pré-definida ou irrelevante.
Tipos de containers: Pilhas Filas Tabelas
![Page 9: Estruturas de Dados e Ordenação Baseado em: The Algorithm Design Manual Steven S. Skiena](https://reader035.vdocuments.mx/reader035/viewer/2022081518/552fc144497959413d8e02ec/html5/thumbnails/9.jpg)
Pilhas
LIFO. Simples de implementar. É o container correto quando a
ordem de recuperação não importa.
Operações: push (Put) e pop (Get).
![Page 10: Estruturas de Dados e Ordenação Baseado em: The Algorithm Design Manual Steven S. Skiena](https://reader035.vdocuments.mx/reader035/viewer/2022081518/552fc144497959413d8e02ec/html5/thumbnails/10.jpg)
Filas
FIFO. Parece ser a melhor maneira de
controlar tempos de espera. São mais difíceis de implementar do
que pilhas e são apropriadas apenas em aplicações em que a ordem é importante.
Operações: enqueue (Put) e dequeue (Get).
![Page 11: Estruturas de Dados e Ordenação Baseado em: The Algorithm Design Manual Steven S. Skiena](https://reader035.vdocuments.mx/reader035/viewer/2022081518/552fc144497959413d8e02ec/html5/thumbnails/11.jpg)
Tabelas
Aceitam recuperação pela posição. As operações de Put e Get
aceitam um índice como argumento.
Tabelas são geralmente implementadas utilizando arrays.
![Page 12: Estruturas de Dados e Ordenação Baseado em: The Algorithm Design Manual Steven S. Skiena](https://reader035.vdocuments.mx/reader035/viewer/2022081518/552fc144497959413d8e02ec/html5/thumbnails/12.jpg)
Implementação de containers
Pode-se usar arrays ou listas ligadas. A escolha entre uma ou outra depende
do conhecimento da quantidade de dados a ser armazenada.
Com o uso de arrays, as operações Put e Get podem ser implementadas em tempo constante.
![Page 13: Estruturas de Dados e Ordenação Baseado em: The Algorithm Design Manual Steven S. Skiena](https://reader035.vdocuments.mx/reader035/viewer/2022081518/552fc144497959413d8e02ec/html5/thumbnails/13.jpg)
Dicionários São uma forma de container que
permite acesso aos dados armazenados pelo seu conteúdo.
As principais operações são: Search(D,k) – Dada uma chave k, retorna
um ponteiro para um elemento em D cujo valor é k, se existir.
Insert(D,x) – Insere o dado de valor x em D.
Delete(D,x) – Dado um ponteiro para um item de valor x, remove-o de D.
![Page 14: Estruturas de Dados e Ordenação Baseado em: The Algorithm Design Manual Steven S. Skiena](https://reader035.vdocuments.mx/reader035/viewer/2022081518/552fc144497959413d8e02ec/html5/thumbnails/14.jpg)
Implementação Lista ligada desordenada
Inserção e remoção em tempo constante. Consulta atravessa a lista toda.
Array ordenada Consulta por busca binária em tempo O(log
n). Inserção e remoção levam tempo linear.
Árvore de Busca Binária Tabelas de Hash
![Page 15: Estruturas de Dados e Ordenação Baseado em: The Algorithm Design Manual Steven S. Skiena](https://reader035.vdocuments.mx/reader035/viewer/2022081518/552fc144497959413d8e02ec/html5/thumbnails/15.jpg)
Ávores de Busca Binária Operações sobre dicionário são rápidas. É uma árvore com raiz na qual cada nó
contém no máximo dois filhos. Os filhos recebem os rótulos right ou left,
conforme sua posição em relação ao pai. Os nós são rotulados com as chaves de
forma que todos os nós da subárvore à esquerda de um nó x tenham valores menores que x e todos à direita tenham valores maiores que x.
![Page 16: Estruturas de Dados e Ordenação Baseado em: The Algorithm Design Manual Steven S. Skiena](https://reader035.vdocuments.mx/reader035/viewer/2022081518/552fc144497959413d8e02ec/html5/thumbnails/16.jpg)
Consulta
BinaryTreeQuery(x,k)if (x=nil) or (k=key[x])
then return xif (k < key[x])
then return BinaryTreeQuery(left[x],k)else return
BinaryTreeQuery(right[x],k)
Tempo O(h), h é a altura da árvore.
![Page 17: Estruturas de Dados e Ordenação Baseado em: The Algorithm Design Manual Steven S. Skiena](https://reader035.vdocuments.mx/reader035/viewer/2022081518/552fc144497959413d8e02ec/html5/thumbnails/17.jpg)
Inserção O item a ser inserido deve ser
colocado na última posição em que pode ser encontrado.
Esta posição é determinada ao fazer-se uma busca pelo valor a ser inserido.
A inserção propriamente dita leva tempo constante após a determinação deste local (que leva tempo O(h)).
![Page 18: Estruturas de Dados e Ordenação Baseado em: The Algorithm Design Manual Steven S. Skiena](https://reader035.vdocuments.mx/reader035/viewer/2022081518/552fc144497959413d8e02ec/html5/thumbnails/18.jpg)
Remoção É mais difícil que a inserção, pois o nó
a ser removido pode não ser uma folha.
A remoção de folhas é fácil, mas a simples remoção de um nó interno não permite acesso aos itens abaixo dele.
Uma reestruturação ou rerotulação dos nós, de forma a levar o item a ser removido para uma folha, é necessário.
![Page 19: Estruturas de Dados e Ordenação Baseado em: The Algorithm Design Manual Steven S. Skiena](https://reader035.vdocuments.mx/reader035/viewer/2022081518/552fc144497959413d8e02ec/html5/thumbnails/19.jpg)
Implementação (1) Todas as operações levam tempo
O(h). A menor altura possível é O(log n),
quando a árvore está perfeitamente balanceada.
Ao inserirmos aleatoriamente os dados em uma árvore, a probabilidade da árvore resultante ter altura O(log n) é grande.
![Page 20: Estruturas de Dados e Ordenação Baseado em: The Algorithm Design Manual Steven S. Skiena](https://reader035.vdocuments.mx/reader035/viewer/2022081518/552fc144497959413d8e02ec/html5/thumbnails/20.jpg)
Implementação (2)
O pior caso ocorre quando a árvore é um caminho.
Para evitar o desbalanceamento usa-se estruturas mais sofisticadas como, por exemplo, árvores rubro-negras.
![Page 21: Estruturas de Dados e Ordenação Baseado em: The Algorithm Design Manual Steven S. Skiena](https://reader035.vdocuments.mx/reader035/viewer/2022081518/552fc144497959413d8e02ec/html5/thumbnails/21.jpg)
Filas de Prioridade (1) Utilizadas em aplicações onde os itens são
processados em uma ordem particular. Por exemplo, o escalonamento de tarefas. As filas de prioridade apresentam vantagem
sobre a ordenação pois as tarefas entram no sistema em intervalos arbitrários.
É mais caro reordenar do que manter os dados em uma fila de prioridade.
![Page 22: Estruturas de Dados e Ordenação Baseado em: The Algorithm Design Manual Steven S. Skiena](https://reader035.vdocuments.mx/reader035/viewer/2022081518/552fc144497959413d8e02ec/html5/thumbnails/22.jpg)
Filas de Prioridade (2)
As principais operações são: Insert(Q,x) – inserir o item x na fila Q. Find_Minimum(Q) ou Find_Maximum(Q) –
retorna um ponteiro para o menor ou maior valor em Q.
Delete_Minimum(Q) ou Delete_Maximum(Q) – remove da lista Q o item com menor ou maior valor.
![Page 23: Estruturas de Dados e Ordenação Baseado em: The Algorithm Design Manual Steven S. Skiena](https://reader035.vdocuments.mx/reader035/viewer/2022081518/552fc144497959413d8e02ec/html5/thumbnails/23.jpg)
Implementação (1) Qualquer uma delas leva tempo O(log
n), representando os dados por uma árvore de busca binária.
A busca do menor (maior) valor pode ser feita buscando-se o valor mais à esquerda (direita) na árvore.
A inserção é feita como na árvore. A remoção consiste em uma busca
seguida da remoção de um nó da árvore.
![Page 24: Estruturas de Dados e Ordenação Baseado em: The Algorithm Design Manual Steven S. Skiena](https://reader035.vdocuments.mx/reader035/viewer/2022081518/552fc144497959413d8e02ec/html5/thumbnails/24.jpg)
Estruturas de Dados Especializadas (1) As estruturas vistas mostram uma
representação para um conjunto desestruturado de dados de forma a facilitar operações de recuperação.
Existem também estruturas de dados potentes utilizadas para representar tipos de objetos mais bem estruturados tais como pontos no espaço, cadeias e grafos.
![Page 25: Estruturas de Dados e Ordenação Baseado em: The Algorithm Design Manual Steven S. Skiena](https://reader035.vdocuments.mx/reader035/viewer/2022081518/552fc144497959413d8e02ec/html5/thumbnails/25.jpg)
Estruturas de Dados Especializadas (2)
Para estes dados: Existe um conjunto de operações
básicas que devem ser feitas repetidamente.
Procuramos estruturas de dados que executem estas operações eficientemente.
![Page 26: Estruturas de Dados e Ordenação Baseado em: The Algorithm Design Manual Steven S. Skiena](https://reader035.vdocuments.mx/reader035/viewer/2022081518/552fc144497959413d8e02ec/html5/thumbnails/26.jpg)
Cadeias (Strings)
Representadas geralmente por arrays de caracteres, com possivelmente um caracter especial para designar o fim da cadeia.
Árvores de sufixos e Arrays de sufixos são estruturas de dados especiais para o pré-processamento de cadeias para tornar a busca de padrões rápida.
![Page 27: Estruturas de Dados e Ordenação Baseado em: The Algorithm Design Manual Steven S. Skiena](https://reader035.vdocuments.mx/reader035/viewer/2022081518/552fc144497959413d8e02ec/html5/thumbnails/27.jpg)
Dados Geométricos Consiste geralmente de coleções de
pontos e regiões. Regiões no plano são descritas por
polígonos, cujas fronteiras são dadas por cadeias de segmentos de reta.
Estruturas de dados espaciais, tais como kd-trees organizam os pontos e regiões pela localização geométrica de forma a tornar a busca rápida.
![Page 28: Estruturas de Dados e Ordenação Baseado em: The Algorithm Design Manual Steven S. Skiena](https://reader035.vdocuments.mx/reader035/viewer/2022081518/552fc144497959413d8e02ec/html5/thumbnails/28.jpg)
Grafos
Geralmente são representados por matrizes de adjacência ou por listas de adjacência.
A escolha da representação é importante no algoritmo resultante.
![Page 29: Estruturas de Dados e Ordenação Baseado em: The Algorithm Design Manual Steven S. Skiena](https://reader035.vdocuments.mx/reader035/viewer/2022081518/552fc144497959413d8e02ec/html5/thumbnails/29.jpg)
Conjuntos
Subconjuntos de itens são geralmente representados usando dicionários, de forma a tornar as consultas de pertinência rápidas.
![Page 30: Estruturas de Dados e Ordenação Baseado em: The Algorithm Design Manual Steven S. Skiena](https://reader035.vdocuments.mx/reader035/viewer/2022081518/552fc144497959413d8e02ec/html5/thumbnails/30.jpg)
Ordenação (1)
A ordenação é a base na qual muitos algoritmos são construídos. Entendendo a ordenação, tem-se conhecimento para resolver outros problemas.
Computadores gastam mais tempo ordenando do que fazendo qualquer outra coisa. A ordenação aparece em muitos problemas na prática.
![Page 31: Estruturas de Dados e Ordenação Baseado em: The Algorithm Design Manual Steven S. Skiena](https://reader035.vdocuments.mx/reader035/viewer/2022081518/552fc144497959413d8e02ec/html5/thumbnails/31.jpg)
Ordenação (2)
É o problema mais estudado em ciência da computação.
Muitas das idéias usadas no projeto de algoritmos aparecem no contexto de ordenação, tais como divisão e conquista, estruturas de dados e algoritmos randomizados.
![Page 32: Estruturas de Dados e Ordenação Baseado em: The Algorithm Design Manual Steven S. Skiena](https://reader035.vdocuments.mx/reader035/viewer/2022081518/552fc144497959413d8e02ec/html5/thumbnails/32.jpg)
Aplicações da Ordenação
Busca Par mais próximo Unicidade de elementos Distribuição de freqüência Seleção Casco convexo
![Page 33: Estruturas de Dados e Ordenação Baseado em: The Algorithm Design Manual Steven S. Skiena](https://reader035.vdocuments.mx/reader035/viewer/2022081518/552fc144497959413d8e02ec/html5/thumbnails/33.jpg)
Busca
Uma busca binária em um dicionário com os dados ordenados leva tempo O(log n).
Provavelmente esta seja a mais simples e importante aplicação da ordenação.
![Page 34: Estruturas de Dados e Ordenação Baseado em: The Algorithm Design Manual Steven S. Skiena](https://reader035.vdocuments.mx/reader035/viewer/2022081518/552fc144497959413d8e02ec/html5/thumbnails/34.jpg)
Par mais próximo
Dado um conjunto de n números, como encontrar o par de números cuja diferença entre eles seja a menor possível?
Com os números ordenados a solução é simples.
Solução em tempo O(n logn) .
![Page 35: Estruturas de Dados e Ordenação Baseado em: The Algorithm Design Manual Steven S. Skiena](https://reader035.vdocuments.mx/reader035/viewer/2022081518/552fc144497959413d8e02ec/html5/thumbnails/35.jpg)
Unicidade de elemento
Dado um conjunto de n elementos, existem elementos duplicados?
Novamente, a melhor solução possível usa a ordenação.
É um caso particular do problema do par mais próximo em que a diferença entre vizinhos é zero.
![Page 36: Estruturas de Dados e Ordenação Baseado em: The Algorithm Design Manual Steven S. Skiena](https://reader035.vdocuments.mx/reader035/viewer/2022081518/552fc144497959413d8e02ec/html5/thumbnails/36.jpg)
Distribuição de freqüência
Dado um conjunto de n elementos, qual elemento ocorre o maior número de vezes?
![Page 37: Estruturas de Dados e Ordenação Baseado em: The Algorithm Design Manual Steven S. Skiena](https://reader035.vdocuments.mx/reader035/viewer/2022081518/552fc144497959413d8e02ec/html5/thumbnails/37.jpg)
Seleção
Qual o k-ésimo maior elemento no conjunto?
Com os dados ordenados, esta informação é determinada em tempo constante.
Em particular, a mediana (o n/2-ésimo elemento).
![Page 38: Estruturas de Dados e Ordenação Baseado em: The Algorithm Design Manual Steven S. Skiena](https://reader035.vdocuments.mx/reader035/viewer/2022081518/552fc144497959413d8e02ec/html5/thumbnails/38.jpg)
Casco convexo (1) Dado um conjunto de n pontos no
plano cartesiano, qual o polígono convexo de menor área que contém todos estes pontos?
Os pontos são ordenadas pelas abscissas dos pontos.
A partir do ponto de menor abscissa, o casco é construído inserindo-se os pontos.
![Page 39: Estruturas de Dados e Ordenação Baseado em: The Algorithm Design Manual Steven S. Skiena](https://reader035.vdocuments.mx/reader035/viewer/2022081518/552fc144497959413d8e02ec/html5/thumbnails/39.jpg)
![Page 40: Estruturas de Dados e Ordenação Baseado em: The Algorithm Design Manual Steven S. Skiena](https://reader035.vdocuments.mx/reader035/viewer/2022081518/552fc144497959413d8e02ec/html5/thumbnails/40.jpg)
Estruturas de Dados Ordenação por seleção. Implementação usando um vetor
desordenado, leva: O(1) para reposicionar o elemento, e O(n) para localizar o elemento.
Ordenação por seleção leva tempo O(n²). Se usarmos um heap ou árvore de busca
balanceada o algoritmo leva tempo O(n log n),
heapsort
![Page 41: Estruturas de Dados e Ordenação Baseado em: The Algorithm Design Manual Steven S. Skiena](https://reader035.vdocuments.mx/reader035/viewer/2022081518/552fc144497959413d8e02ec/html5/thumbnails/41.jpg)
Inserção incremental
Ordenação por inserção É um dos exemplos mais simples
da técnica de inserção incremental.
É uma técnica particularmente útil em algoritmos geométricos.
![Page 42: Estruturas de Dados e Ordenação Baseado em: The Algorithm Design Manual Steven S. Skiena](https://reader035.vdocuments.mx/reader035/viewer/2022081518/552fc144497959413d8e02ec/html5/thumbnails/42.jpg)
Divisão e conquista
Ordenação por intercalação Um problema grande pode ser
dividido em problemas menores que são resolvidos. A solução de cada um deles é então combinada para obter-se a solução do problema inicial.
![Page 43: Estruturas de Dados e Ordenação Baseado em: The Algorithm Design Manual Steven S. Skiena](https://reader035.vdocuments.mx/reader035/viewer/2022081518/552fc144497959413d8e02ec/html5/thumbnails/43.jpg)
Randomização
Quicksort Os pivôs são escolhidos
aleatoriamente. Com esta escolha, o algoritmo tem
alta probabilidade de ser executado em tempo (n log n).
No pior caso é quadrático.
![Page 44: Estruturas de Dados e Ordenação Baseado em: The Algorithm Design Manual Steven S. Skiena](https://reader035.vdocuments.mx/reader035/viewer/2022081518/552fc144497959413d8e02ec/html5/thumbnails/44.jpg)
Técnica de Encestamento Segundo algum critério os dados
são agrupados em cestos (buckets) e os cestos são tratados individualmente.
Esta idéia esta presente em tabelas de hash, kd-trees, e em outras estruturas de dados práticas.
A técnica é boa quando os dados ficam uniformemente distribuídos entre os cestos.