Algoritmos e complexidade Notas de aula - Arquivo Escolar

Algoritmos e complexidade Notas de aula - Arquivo Escolar Algoritmos e complexidade Notas de aula - Arquivo Escolar

arquivoescolar.org
from arquivoescolar.org More from this publisher
13.04.2013 Views

5. Programação dinâmica Logo, podemos definir T (i, V ) como menor rota começando no vértice i e passando por todos vértices em V exatamente uma vez e volta para vértice 1. A solução desejada então é T (1, [2, n]). Para determinar o valor de T (i, V ) temos que minizar sobre todas continuações possíveis. Isso leva à recorrência T (i, V ) = minv∈V div + T (v, V \ {v}) V = ∅ caso V = ∅ di1 Se ordenamos todos os sub-conjuntos dos vértices [1, n] em ordem de ⊆, obtemos uma matrix de dependências 1 2 V1 V2 · · · V2 n . n em que qualquer elemento depende somente de elementos em colunas mais para esquerda. Uma implementação pode representar uma subconjunto de [1, n] como número entre 0 e 2 n − 1. Nessa caso, a ordem natural já respeita a ordem ⊆ entre os conjuntos, e podemos substituir um teste v ∈ Vj com 2 v &j = 2 v e a operação Vj \ {v} com j − 2 v . 1 for i ∈ [1, n] do Ti,0 := di1 { base } 2 for j ∈ [1, 2 n − 1] do 3 for i ∈ [1, n] do 4 Ti,j := min 2 k &j=2 k dik + T i,j−2 k { tempo O(n) ! } 5 end for 6 end for A complexidade de tempo desse algoritmo é n 2 2 n porque a minimzação na linha 4 precisa O(n) operações. A complexidade do espação é O(n2 n ). Essa é atualmente o melhor algoritmo exato conhecido para o problema do caixeiro viajante (veja também xkcd.com/399). 5.5.3. Árvore de busca binária ótima Motivação 116 • Suponha que temos um conjunto de chaves com probabilidades de busca conhecidas. • Caso a busca é repetida muitas vezes, vela a pena construir uma estrutura de dados que minimiza o tempo médio para encontrar uma chave.

• Uma estrutura de busca eficiente é uma árvore binária. 5.5. Tópicos Portanto, vamos investigar como construir a árvore binária ótima. Para um conjunto de chaves com distribuição de busca conhecida, queremos minimizar o número médio de comparações (nossa medida de custos). Exemplo 5.2 Considere a sequência ordenada a < b < c < d e as probabilidades Exemplo Elemento a b c d Pr 0.2 0.1 0.6 0.1 qual seria uma árvore ótima? Alguns exemplos Árvore correspondente a b c d b a c d d b a c que têm um número médio de comparações 0.2×1+0.1×2+0.6×3+0.1×4 = 2.6, 0.2×2+0.1×1+0.6×2+0.1×3 = 2.0, 0.2×3+0.1×2+0.6×3+0.1×1 = 2.7, respectivamente. ♦ Árvore de Busca Binária Ótima Em geral, temos que considerar as probabilidades de procurar uma chave junto com as probabilidades que uma chave procurada não pertence à árvore. Logo, supomos que temos 1. uma sequência ordenada a1 < a2 < · · · < an de n chaves e 2. probabilidades Pr[c < a1], Pr[c = a1], Pr[a1 < c < a2], . . . . . . , Pr[an−1 < c < an], Pr[c = an], Pr[an < c] que a chave procurada c é uma das chaves da sequência ou cai num intervalo entre elas. A partir dessas informações queremos minimizar a complexidade média da busca. Em uma dada árvore, podemos observar que o número de comparações para achar uma chave existente é igual a profundidade dela na árvore 117

5. Programação dinâmica<br />

Logo, po<strong>de</strong>mos <strong>de</strong>finir T (i, V ) como menor rota começando no vértice i e<br />

passando por todos vértices em V exatamente uma vez e volta para vértice<br />

1. A solução <strong>de</strong>sejada então é T (1, [2, n]). Para <strong>de</strong>terminar o valor <strong>de</strong> T (i, V )<br />

temos que minizar sobre todas continuações possíveis. Isso leva à recorrência<br />

T (i, V ) =<br />

<br />

minv∈V div + T (v, V \ {v}) V = ∅<br />

caso V = ∅<br />

di1<br />

Se or<strong>de</strong>namos todos os sub-conjuntos dos vértices [1, n] em or<strong>de</strong>m <strong>de</strong> ⊆, obtemos<br />

uma matrix <strong>de</strong> <strong>de</strong>pendências<br />

1<br />

2<br />

V1 V2 · · · V2 n<br />

.<br />

n<br />

em que qualquer elemento <strong>de</strong>pen<strong>de</strong> somente <strong>de</strong> elementos em colunas mais<br />

para esquerda. Uma implementação po<strong>de</strong> representar uma subconjunto <strong>de</strong><br />

[1, n] como número entre 0 e 2 n − 1. Nessa caso, a or<strong>de</strong>m natural já respeita<br />

a or<strong>de</strong>m ⊆ entre os conjuntos, e po<strong>de</strong>mos substituir um teste v ∈ Vj com<br />

2 v &j = 2 v e a operação Vj \ {v} com j − 2 v .<br />

1 for i ∈ [1, n] do Ti,0 := di1 { base }<br />

2 for j ∈ [1, 2 n − 1] do<br />

3 for i ∈ [1, n] do<br />

4 Ti,j := min 2 k &j=2 k dik + T i,j−2 k { tempo O(n) ! }<br />

5 end for<br />

6 end for<br />

A <strong>complexida<strong>de</strong></strong> <strong>de</strong> tempo <strong>de</strong>sse algoritmo é n 2 2 n porque a minimzação na<br />

linha 4 precisa O(n) operações. A <strong>complexida<strong>de</strong></strong> do espação é O(n2 n ). Essa é<br />

atualmente o melhor algoritmo exato conhecido para o problema do caixeiro<br />

viajante (veja também xkcd.com/399).<br />

5.5.3. Árvore <strong>de</strong> busca binária ótima<br />

Motivação<br />

116<br />

• Suponha que temos um conjunto <strong>de</strong> chaves com probabilida<strong>de</strong>s <strong>de</strong> busca<br />

conhecidas.<br />

• Caso a busca é repetida muitas vezes, vela a pena construir uma estrutura<br />

<strong>de</strong> dados que minimiza o tempo médio para encontrar uma chave.

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!