Criada: 2003-05-03
Data da prova: 2003-04-30. Enunciado: aqui
Soluções e Critérios de Nota:
BINARY-SEARCH(A, x) 1 if x < A[1] then 2 return 0 3 if x ≥ A[n] then 4 return n 5 // aqui A[1] ≤ x < A[n] 6 start ← 1 7 end ← n 8 // invariante: A[start] ≤ x < A[end] 9 while start + 1 < end do 10 middle ← (start + end)/2 11 if A[middle] ≤ x then 12 start ← middle 13 else 14 end ← middle 15 return start
O objetivo desta questão era testar o que os alunos apenderam sobre loop invariantes. Infelizmente, vários fizeram recursivo e não deu para atingir este objetivo. Apenas para esclarecer, no caso de um algoritmo recursivo podemos dizer que seu invariante é uma afirmação que é sempre verdadeira no início de cada chamada recursiva.
O critério adotado foi:
A recorrência poderia ser resolvida pelo método mestre, o que daria O(n).
O critério adotado foi:
Uma palavra para quem tentou árvore de recursão. É fácil calcular as folhas, que dá O(n) mas somar o tempo gasto em cada nível era mais complicado, infelizmente. Eu fiz em casa mas confesso que tive que usar técnicas de somatório não vistas no curso. É que eu esperava que o pessoal usasse o mestre mesmo.
Solução:
Algoritmo | Complexidade média | Complexidade Pior Caso |
---|---|---|
Insertion Sort | O(n2) | O(n2) |
Selection Sort | O(n2) | O(n2) |
Quicksort | O(n lg n) | O(n2) |
Mergesort | O(n lg n) | O(n lg n) |
Heapsort | O(n lg n) | O(n lg n) |
Os pontos foram atribuídos da seguinte forma:
Uma solução para este problema pode ser obtida com programação dinâmica da seguinte forma. Ordene as atividades por instante de término, em ordem crescente (ou não-decrescente). Defina v[i] = duração total máxima de um subconjunto de atividades compatíveis contendo ai necessariamente e opcionalmente atividades que terminam antes de ai.
O vetor v pode ser calculado pela recorrência:
Após obter todos os v[i], basta tomar o máximo como sendo a resposta final. Isto tudo dá um algoritmo O(n2). Não é o melhor que pode ser feito, há algoritmos O(n lg n).
Os pontos foram atribuídos da seguinte forma:
É claro que a correção e a complexidade só podem ser determinadas caso o algoritmo esteja claramente descrito, daí a importância da clareza na avaliação. Em alguns casos, embora a descrição não estivesse totalmente clara, o estudante ganhou pontos referentes a correção e/ou complexidade se a descrição fosse suficientemente clara para permitir o jugamento destes quesitos.