Algoritmos e complexidade Notas de aula - Arquivo Escolar
Algoritmos e complexidade Notas de aula - Arquivo Escolar Algoritmos e complexidade Notas de aula - Arquivo Escolar
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
- Page 68 and 69: 2. Análise de complexidade funçã
- Page 70 and 71: 2. Análise de complexidade Algorit
- Page 72 and 73: 2. Análise de complexidade resolve
- Page 75: 3. Introdução Resolver problemas
- Page 78 and 79: 4. Algoritmos gulosos A abordagem g
- Page 80 and 81: 4. Algoritmos gulosos Do outro lado
- Page 82 and 83: 4. Algoritmos gulosos Aplicações
- Page 84 and 85: 4. Algoritmos gulosos 1 V ′ := {v
- Page 86 and 87: 4. Algoritmos gulosos Algoritmo de
- Page 88 and 89: 4. Algoritmos gulosos Implementaç
- Page 90 and 91: 4. Algoritmos gulosos Variação do
- Page 92 and 93: 4. Algoritmos gulosos • Como comp
- Page 94 and 95: 4. Algoritmos gulosos Proposição
- Page 96 and 97: 4. Algoritmos gulosos Resultados O
- Page 98 and 99: 5. Programação dinâmica É simpl
- Page 100 and 101: 5. Programação dinâmica soluçã
- Page 102 and 103: 5. Programação dinâmica Teorema:
- Page 104 and 105: 5. Programação dinâmica e calcul
- Page 106 and 107: 5. Programação dinâmica 5.2.2. S
- Page 108 and 109: 5. Programação dinâmica 11 sol1
- Page 110 and 111: 5. Programação dinâmica O algori
- Page 112 and 113: 5. Programação dinâmica Dependen
- Page 114 and 115: 5. Programação dinâmica Análise
- Page 116 and 117: 5. Programação dinâmica curto do
- Page 120 and 121: 5. Programação dinâmica (começa
- Page 122 and 123: 5. Programação dinâmica Árvore
- Page 125 and 126: 6. Divisão e conquista 6.1. Introd
- Page 127 and 128: Recorrências simplificadas Formalm
- Page 129 and 130: 6.2. Resolver recorrências • Usa
- Page 131 and 132: 6.2. Resolver recorrências Para co
- Page 133 and 134: 6.2. Resolver recorrências O algor
- Page 135 and 136: • Prove por indução que T (n) =
- Page 137 and 138: Saída A potência a n . 1 i f n =
- Page 139 and 140: 3 Quicksort (l ,m − 1 ,a ) ; 4 Qu
- Page 141 and 142: 6.2. Resolver recorrências 1. Se f
- Page 143 and 144: 6.3. Algoritmos usando divisão e c
- Page 145 and 146: 6.3. Algoritmos usando divisão e c
- Page 147 and 148: 6.3. Algoritmos usando divisão e c
- Page 149 and 150: 6.3. Algoritmos usando divisão e c
- Page 151 and 152: unidade. Em total a avaliação pro
- Page 153: 3. T (n) = 3T (n/4) + n log n 4. T
- Page 156 and 157: 7. Árvores de busca, backtracking
- Page 158 and 159: 7. Árvores de busca, backtracking
- Page 160 and 161: 7. Árvores de busca, backtracking
- Page 162 and 163: 7. Árvores de busca, backtracking
- Page 164 and 165: 7. Árvores de busca, backtracking
- Page 166 and 167: 7. Árvores de busca, backtracking
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.