MC102 - Algoritmos e Programação de Computadores
MC102 Horários Plano de
desenvolvimento
Cronograma Oferecimentos
anteriores

Busca binária

Nesta tarefa, construiremos um visualizador ASCII para o algoritmo de busca binária. Dada uma lista ordenada, a busca binária é feita da seguinte forma:

Suponha que temos a lista abaixo e estamos procurando o elemento 11.

+-----+-----+-----+-----+-----+-----+-----+
| 002 | 003 | 004 | 008 | 011 | 015 | 017 |
+-----+-----+-----+-----+-----+-----+-----+

Para ilustrar o processo, iremos marcar inicialmente o elemento central, cujo valor é 8. Como 8 é menor do que 11, prosseguiremos com os valores à direita da posição central, marcando o elemento 15. Finalmente, ficaremos apenas com o elemento 11, que é a chave procurada.

+-----+-----+-----+=====+-----+-----+-----+
| 002 | 003 | 004 ||008|| 011 | 015 | 017 |
+-----+-----+-----+=====+-----+-----+-----+
                        +-----+=====+-----+
                        | 011 ||015|| 017 |
                        +-----+=====+-----+
                        +=====+
                        ||011||
                        +=====+

Note que quando há um número par de elementos, temos duas chaves centrais. Nesta tarefa, iremos trabalhar sempre com a de menor índice nestes casos.

+-----+-----+-----+=====+-----+-----+-----+-----+
| 002 | 003 | 004 ||008|| 011 | 015 | 017 | 020 |
+-----+-----+-----+=====+-----+-----+-----+-----+

Descrição da entrada

A primeira linha da entrada conterá um inteiro a ser procurado e a segunda linha uma lista de inteiros. Uma de suas tarefas será verificar se esta lista está ordenada. Veja o exemplo abaixo:

4
2 3 4 8 11 15 17 

Descrição da saída

A primeira linha da saída conterá uma linha descrevendo o valor a ser procurado.

Elemento procurado: <elem>

Em seguida, a lista lida deverá ser representada, com inteiros com três dígitos e a moldura formada por caracteres +, | e - conforme os exemplos dados.

+-----+-----+-----+-----+-----+-----+-----+
| 002 | 003 | 004 | 008 | 011 | 015 | 017 |
+-----+-----+-----+-----+-----+-----+-----+

Utilizaremos um número fixo de dígitos para facilitar a escrita e a comparação caso você prefira armazenar as strings e não inteiros (Veja as dicas).

Caso a lista não esteja ordenado, você deve emitir a mensagem "Lista nao ordenada" e interromper o processo.

Os passos dos algoritmos serão ilustrados como no exemplo da primeira seção. A moldura do elemento central conterá caracteres = na parte de cima e na parte de baixo. Nas laterais, teremos duas barras, sem espaço em branco.

+=====+
||008||
+=====+

O visualizador irá mostrar apenas os elementos que estão participando da busca em cada passo. Observe os passos da busca do elemento 4 na lista fornecida.

Elemento procurado: 004
+-----+-----+-----+-----+-----+-----+-----+
| 002 | 003 | 004 | 008 | 011 | 015 | 017 |
+-----+-----+-----+-----+-----+-----+-----+
+-----+-----+-----+=====+-----+-----+-----+
| 002 | 003 | 004 ||008|| 011 | 015 | 017 |
+-----+-----+-----+=====+-----+-----+-----+
+-----+=====+-----+
| 002 ||003|| 004 |
+-----+=====+-----+
            +=====+
            ||004||
            +=====+

Note que precisaremos escrever espaços em branco à esquerda, mas não haverá espaços em branco após o último elemento. Observe novamente a saída com fundo colorido:

Elemento procurado: 004
+-----+-----+-----+-----+-----+-----+-----+
| 002 | 003 | 004 | 008 | 011 | 015 | 017 |
+-----+-----+-----+-----+-----+-----+-----+
+-----+-----+-----+=====+-----+-----+-----+
| 002 | 003 | 004 ||008|| 011 | 015 | 017 |
+-----+-----+-----+=====+-----+-----+-----+
+-----+=====+-----+
| 002 ||003|| 004 |
+-----+=====+-----+
            +=====+
            ||004||
            +=====+

A última parte da saída deverá indicar a posição do elemento, caso encontrado, com a string "Encontrado na posicao: <pos>". Deve-se considerar que a posição inicial da lista é 0 e a escrita das posições não necessitará de formatação extra. Para o exemplo acima, a parte final será:

Encontrado na posicao: 2

Caso o elemento não esteja na lista, a string final será "O elemento nao foi encontrado".

Dicas de Python 3 para esta tarefa:

Testes para o SuSy

Esta tarefa contém 13 testes abertos, exercitando vários caminhos de busca. Contém também um teste fechado em que uma chave está na lista e outro em que não está.

arq01.in arq01.res
25
1 25 100
Elemento procurado: 025
+-----+-----+-----+
| 001 | 025 | 100 |
+-----+-----+-----+
+-----+=====+-----+
| 001 ||025|| 100 |
+-----+=====+-----+
Encontrado na posicao: 1
arq02.in arq02.res
15
2 3 4 8 11 15 17
Elemento procurado: 015
+-----+-----+-----+-----+-----+-----+-----+
| 002 | 003 | 004 | 008 | 011 | 015 | 017 |
+-----+-----+-----+-----+-----+-----+-----+
+-----+-----+-----+=====+-----+-----+-----+
| 002 | 003 | 004 ||008|| 011 | 015 | 017 |
+-----+-----+-----+=====+-----+-----+-----+
                        +-----+=====+-----+
                        | 011 ||015|| 017 |
                        +-----+=====+-----+
Encontrado na posicao: 5
arq03.in arq03.res
3
2 3 4 8 11 15 17
Elemento procurado: 003
+-----+-----+-----+-----+-----+-----+-----+
| 002 | 003 | 004 | 008 | 011 | 015 | 017 |
+-----+-----+-----+-----+-----+-----+-----+
+-----+-----+-----+=====+-----+-----+-----+
| 002 | 003 | 004 ||008|| 011 | 015 | 017 |
+-----+-----+-----+=====+-----+-----+-----+
+-----+=====+-----+
| 002 ||003|| 004 |
+-----+=====+-----+
Encontrado na posicao: 1
arq04.in arq04.res
11
2 3 4 8 11 15 17
Elemento procurado: 011
+-----+-----+-----+-----+-----+-----+-----+
| 002 | 003 | 004 | 008 | 011 | 015 | 017 |
+-----+-----+-----+-----+-----+-----+-----+
+-----+-----+-----+=====+-----+-----+-----+
| 002 | 003 | 004 ||008|| 011 | 015 | 017 |
+-----+-----+-----+=====+-----+-----+-----+
                        +-----+=====+-----+
                        | 011 ||015|| 017 |
                        +-----+=====+-----+
                        +=====+
                        ||011||
                        +=====+
Encontrado na posicao: 4
arq05.in arq05.res
4
2 3 4 8 11 15 17
Elemento procurado: 004
+-----+-----+-----+-----+-----+-----+-----+
| 002 | 003 | 004 | 008 | 011 | 015 | 017 |
+-----+-----+-----+-----+-----+-----+-----+
+-----+-----+-----+=====+-----+-----+-----+
| 002 | 003 | 004 ||008|| 011 | 015 | 017 |
+-----+-----+-----+=====+-----+-----+-----+
+-----+=====+-----+
| 002 ||003|| 004 |
+-----+=====+-----+
            +=====+
            ||004||
            +=====+
Encontrado na posicao: 2
arq06.in arq06.res
17
2 3 4 8 11 15 17
Elemento procurado: 017
+-----+-----+-----+-----+-----+-----+-----+
| 002 | 003 | 004 | 008 | 011 | 015 | 017 |
+-----+-----+-----+-----+-----+-----+-----+
+-----+-----+-----+=====+-----+-----+-----+
| 002 | 003 | 004 ||008|| 011 | 015 | 017 |
+-----+-----+-----+=====+-----+-----+-----+
                        +-----+=====+-----+
                        | 011 ||015|| 017 |
                        +-----+=====+-----+
                                    +=====+
                                    ||017||
                                    +=====+
Encontrado na posicao: 6
arq07.in arq07.res
2
2 3 4 8 11 15 17
Elemento procurado: 002
+-----+-----+-----+-----+-----+-----+-----+
| 002 | 003 | 004 | 008 | 011 | 015 | 017 |
+-----+-----+-----+-----+-----+-----+-----+
+-----+-----+-----+=====+-----+-----+-----+
| 002 | 003 | 004 ||008|| 011 | 015 | 017 |
+-----+-----+-----+=====+-----+-----+-----+
+-----+=====+-----+
| 002 ||003|| 004 |
+-----+=====+-----+
+=====+
||002||
+=====+
Encontrado na posicao: 0
arq08.in arq08.res
20
2 3 4 8 11 15 17 20
Elemento procurado: 020
+-----+-----+-----+-----+-----+-----+-----+-----+
| 002 | 003 | 004 | 008 | 011 | 015 | 017 | 020 |
+-----+-----+-----+-----+-----+-----+-----+-----+
+-----+-----+-----+=====+-----+-----+-----+-----+
| 002 | 003 | 004 ||008|| 011 | 015 | 017 | 020 |
+-----+-----+-----+=====+-----+-----+-----+-----+
                        +-----+=====+-----+-----+
                        | 011 ||015|| 017 | 020 |
                        +-----+=====+-----+-----+
                                    +=====+-----+
                                    ||017|| 020 |
                                    +=====+-----+
                                          +=====+
                                          ||020||
                                          +=====+
Encontrado na posicao: 7
arq09.in arq09.res
9
2 3 4 8 11 15 17 20
Elemento procurado: 009
+-----+-----+-----+-----+-----+-----+-----+-----+
| 002 | 003 | 004 | 008 | 011 | 015 | 017 | 020 |
+-----+-----+-----+-----+-----+-----+-----+-----+
+-----+-----+-----+=====+-----+-----+-----+-----+
| 002 | 003 | 004 ||008|| 011 | 015 | 017 | 020 |
+-----+-----+-----+=====+-----+-----+-----+-----+
                        +-----+=====+-----+-----+
                        | 011 ||015|| 017 | 020 |
                        +-----+=====+-----+-----+
                        +=====+
                        ||011||
                        +=====+
O elemento nao foi encontrado
arq10.in arq10.res
1
2 3 4 8 11 15 17 20
Elemento procurado: 001
+-----+-----+-----+-----+-----+-----+-----+-----+
| 002 | 003 | 004 | 008 | 011 | 015 | 017 | 020 |
+-----+-----+-----+-----+-----+-----+-----+-----+
+-----+-----+-----+=====+-----+-----+-----+-----+
| 002 | 003 | 004 ||008|| 011 | 015 | 017 | 020 |
+-----+-----+-----+=====+-----+-----+-----+-----+
+-----+=====+-----+
| 002 ||003|| 004 |
+-----+=====+-----+
+=====+
||002||
+=====+
O elemento nao foi encontrado
arq11.in arq11.res
8
1 2 3 4 5 6 7 8 9 10 25 36 34 100
Elemento procurado: 008
+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
| 001 | 002 | 003 | 004 | 005 | 006 | 007 | 008 | 009 | 010 | 025 | 036 | 034 | 100 |
+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
Lista nao ordenada
arq12.in arq12.res
35
1 2 3 4 5 6 7 8 9 10 25 34 36 100
Elemento procurado: 035
+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
| 001 | 002 | 003 | 004 | 005 | 006 | 007 | 008 | 009 | 010 | 025 | 034 | 036 | 100 |
+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
+-----+-----+-----+-----+-----+-----+=====+-----+-----+-----+-----+-----+-----+-----+
| 001 | 002 | 003 | 004 | 005 | 006 ||007|| 008 | 009 | 010 | 025 | 034 | 036 | 100 |
+-----+-----+-----+-----+-----+-----+=====+-----+-----+-----+-----+-----+-----+-----+
                                          +-----+-----+-----+=====+-----+-----+-----+
                                          | 008 | 009 | 010 ||025|| 034 | 036 | 100 |
                                          +-----+-----+-----+=====+-----+-----+-----+
                                                                  +-----+=====+-----+
                                                                  | 034 ||036|| 100 |
                                                                  +-----+=====+-----+
                                                                  +=====+
                                                                  ||034||
                                                                  +=====+
O elemento nao foi encontrado
arq13.in arq13.res
11
1 2 3 4 5 6 7 8 9 10 25 34 36 100
Elemento procurado: 011
+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
| 001 | 002 | 003 | 004 | 005 | 006 | 007 | 008 | 009 | 010 | 025 | 034 | 036 | 100 |
+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
+-----+-----+-----+-----+-----+-----+=====+-----+-----+-----+-----+-----+-----+-----+
| 001 | 002 | 003 | 004 | 005 | 006 ||007|| 008 | 009 | 010 | 025 | 034 | 036 | 100 |
+-----+-----+-----+-----+-----+-----+=====+-----+-----+-----+-----+-----+-----+-----+
                                          +-----+-----+-----+=====+-----+-----+-----+
                                          | 008 | 009 | 010 ||025|| 034 | 036 | 100 |
                                          +-----+-----+-----+=====+-----+-----+-----+
                                          +-----+=====+-----+
                                          | 008 ||009|| 010 |
                                          +-----+=====+-----+
                                                      +=====+
                                                      ||010||
                                                      +=====+
O elemento nao foi encontrado

Orientações para submissão

Veja aqui a página de submissão da tarefa. O arquivo a ser submetido deve se chamar lab13.py. No link Arquivos auxiliares há um arquivo aux13.zip que contém todos os arquivos de testes abertos e seus respectivos resultados compactados.

O limite máximo será de 30 submissões. Serão considerados os resultados da última submissão.

O peso desta tarefa é 2.

O prazo final para submissão é 12/07/2020.

A nota desta tarefa é proporcional ao número de testes que executaram corretamente, desde que o código esteja coerente com o enunciado. A submissão de um código que não implementa o algoritmo requisitado, mas que exibe as saídas esperadas dos testes abertos a partir da comparação de trechos da entrada será considerada fraude e acarretará a atribuição de nota zero à média final da disciplina.