Estrutura de Dados II - 2020-2
UnB-\(\gamma\)

Table of Contents

1 Aulas

1.1 Aula 1   01_fev

1.1.1 Tópicos

  • Apresentação da disciplina em live no YouTube

1.1.2 Material de apoio

Para a aula de hoje é recomendado que o aluno veja os vídeos abaixo:

1.2 Aula 2   03_fev ordenacao_elementar

1.2.1 Tópicos e materiais

Nesta aula vamos começar a trabalhar com algoritmos elementares de ordenação, em especial: BubbleSort; Selection Sort; Insertion Sort.

Antes de começar a trabalhar com os algoritmos de ordenação vamos definir as "regras do jogo", o contexto, a terminologia e o arcabouço mínimo que se espera para começar a implementar os algoritmos de ordenação.

A aula ao vivo é um teaser de todos os algoritmos e os vídeos referenciados na sub-seção abaixo são recomendados para todos os alunos, pois em cada um deles os algoritmos são destrinchados e implementados passo a passo.

1.2.2 Entenda os Algoritmos passo a passo

1.2.3 Exercícios

  1. Lista pública no CD-MOJ
    • Resolva os exercícios propostos na lista pública do CD-MOJ.
    • Para ganhar credenciais de acesso à lista, envie uma mensagem para @mojinhobot, no telegram AQUI, com o conteúdo:

      participar bcr-EDA2-2020_2-ordena-elementar
      
  2. Implemente
    • cada um dos algoritmos discutidos em aula (evite consultar o material e deduza os passos);
  3. Compare o tempo de execução dos algoritmos
    • Gere entradas aleatórias com 100000 elementos (experimente outras variações de tamanho também)
    • Para gerar uma entrada aleatória em bash
    for((i=0;i<100000;i++)); do echo $RANDOM; done > aleatorio.in
    
    • Caso prefira implementar em C
    srand(time(NULL));
    for(int i=0;i<100000;i++) printf("%d\n",rand());
    
    • compile o código e execute da seguinte forma:

      ./meuprograma > aleatorio.in
      
      • O seu programa deve ler o conjunto de números da entrada padrão, e você poderá verificar o tempo executado através dos comandos:
      time ./bubblesort < aleatorio.in > bubblesort.out
      
      • assim o seu programa irá ler o conteúdo do arquivo aleatorio.in como se fosse digitado pelo teclado e toda a saída será gravada no arquivo bubblesort.out (você pode trocar o nome do arquivo se assim desejar [recomendo um arquivo diferente para cada algoritmo implementado].
      • Crie variações dos arquivos, gere arquivos maiores, menores, ordenados, ordenados reversamente… E compare o tempo entre esses arquivos, há diferença?
  4. Verifique a quantidade de operações executadas
    • Modifique a sua implementação de forma a mostrar a quantidade de operações de troca e quantas comparações foram feitas.
    • Compare o resultado com todos os algoritmos implementados para diversas entradas
  5. Escreva uma função que coloque em ordem lexicográfica um vetor de strings
  6. Resolva a Terceira questão desta prova
  7. Resolva a Segunda questão desta prova
  8. Defina o conceito de estabilidade de um algoritmo de ordenação.
    • Liste quais algoritmos trabalhados nesta aula são estáveis e quais não são
  9. Ordenando um registro

    Suponha que cada elemento de um vetor é um registro com dois campos: um inteiro e outro uma string:

    struct registro { int aa; char *bb;};
    

    Escreva uma função que rearranje o vetor de modo que os campos aa fiquem em ordem crescente. Escreva outra função que rearranje o vetor de modo que os campos bb fiquem em ordem lexicográfica.

  10. Execute o benchmark disponibilizado no Github

    Faça o git clone do repositório https://github.com/bcribas/benchmark-ordenacao e siga as instruções do README para executar o experimento com algumas implementações.

1.3 Aula 3   08_fev merge_sort

1.3.1 Tópicos e materiais

Discussão e implementação do Algoritmo linearítmico de Ordenação MergeSort.

Nesta aula foi discutido o algoritmo MergeSort, mas antes, iniciamos a discussão sobre o funcionamento da função intercala (merge) que é a base para o funcionamento do algoritmo de ordenação.

Na live foi implementada a intercalação que recebe dois ponteiros de vetores e seus respectivos intervalos fechados [l,r] (l para left [ou elemento mais a esquerda] e r para right [ou elemento mais a direita]) devolvendo um vetor alocado com os elementos dos dois vetores, a e b, intercalados. A função implementada em aula segue o conceito implementado abaixo:

 1: Item *intercala(Item *a, int la, int ra, Item *b, int lb, int rb)
 2: {
 3:   //Tamanhos dos vetores a e b
 4:   int ta=(ra-la+1);
 5:   int tb=(rb-lb+1);
 6: 
 7:   Item *c=malloc(sizeof(Item)*(ta+tb));
 8: 
 9:   //intervalos do vetor c
10:   int lc=0;
11:   int rc=(ta+tb-1);
12: 
13:   int ia=la, ib=lb,ic=lc;
14: 
15:   while(ia<=ra && ib<=rb)
16:   {
17:     if(lesseq(a[ia],b[ib]))
18:       c[ic++]=a[ia++];
19:     else
20:       c[ic++]=b[ib++];
21:   }
22:   while(ia<=ra)
23:     c[ic++]=a[ia++];
24:   while(ib<=rb)
25:     c[ic++]=b[ib++];
26:   return c;
27: }

Esta implementação difere, ligeiramente, da versão feita no vídeo indicado como complementar ao MergeSort (na seção abaixo), que faz com que a função de intercalação receba um único vetor com os índices l,m,r (left,middle,right).

O efeito da intercalação é o mesmo, porém, a implementação feita em aula exige que o vetor c seja manipulado dentro do procedimento mergesort, diferentemente do outro vídeo.

A complexidade assintótica não é modificada e tão pouco agrega overhead adicional entre as versões. Fica interessante ter a manipulação diferente dos elementos para ter uma visão ampla da implementação.

Dessa forma o mergesort, em aula, foi implementado da seguinte forma:

28: void mergesort(Item *v,int l,int r)
29: {
30:   if(l>=r) return;
31:   int meio=(l+r)/2;
32:   mergesort(v,l,meio);
33:   mergesort(v,meio+1,r);
34:   //principal diferença do intercala não ser in-place
35:   Item *c=intercala(v,l,meio,v,meio+1,r);
36:   for(int i=0;i<r-l+1;i++)
37:     v[l++]=c[i];
38:   free(c);
39: }

A principal diferença na mergesort acontece a partir da linha 35, onde o nosso procedimento manipula o vetor resultante da intercalação para dentro do vetor que está sendo ordenado.

Outra maneira de passar os parâmetros do vetor v como se fossem dois vetores realmente disjuntos, seria passando o ponteiro da posição inicial de cada left do vetor, substituindo a Linha 35 pela linha indicada abaixo:

1: Item *c=intercala(&v[l],0,meio-l,&v[meio+1],0,r-(meio+1));

O que acontece neste ponto é que passamos os ponteiros dos left de cada um dos vetores que devem ser intercalados, um deles começa em l e o outro em meio+1, o que precisamos calcular agora é qual seria o novo right de cada vetor, pois como cada vetor não começa no l do vetor original temos que recalcular o deslocamente de cada parte, ficando meio-l para a primeira metade e r-(meio+1) para a segunda metade.

O aluno também pode acompanhar o material de MergeSort do prof. Paulo Feofiloff

1.3.2 Veja também

1.3.3 Exercícios

  1. Lista pública no CD-MOJ
    • Resolva os exercícios propostos na SEGUNDA lista pública do CD-MOJ.
    • Para ganhar credenciais de acesso à lista, envie uma mensagem para @mojinhobot, no telegram AQUI, com o conteúdo:

      participar bcr-EDA2-2020_2-ordena-rapido-e-busca
      
      • Se você já conta para a outra lista (disponibilizada na Aula 2), pode utilizar as mesmas credenciais.
  2. Implemente o algoritmo da Intercalação (merge)
  3. Implemente o algoritmo de ordenaçao por intercalação (mergesort)
  4. Escreva uma função que
    • receba vetores disjuntos x[0..m-1] e y[0..n-1], ambos em ordem crescente, e produza um vetor z[0..m+n-1] que contenha o resultado da intercalação dos dois vetores dados.
      • É claro que z estará em ordem crescente.
    • Escreva duas versões da função: uma iterativa e uma recursiva.
  5. Exercícios baseados do Professor Paulo Feofiloff
  6. A respeito do problema da Intercalação (merge)

    O problema da intercalação (merge) é clássico na computação e consiste em resolver o seguinte problema: dados vetores crescentes v[p .. q-1] e v[q .. r-1], rearranjar v[p .. r-1] em ordem crescente.

    Uma leO é uma lista encadeada que contém uma sequência crescente de números inteiros. Escreva uma função que intercale duas leO dadas, produzindo assim uma terceira leO. Sua função não deve alocar novas células na memória, mas reaproveitar as células das duas listas dadas.

  7. Execute o benchmark disponibilizado no Github

    Faça o git clone do repositório https://github.com/bcribas/benchmark-ordenacao e siga as instruções do README para executar o experimento com algumas implementações.

    Recomendo que neste momento você execute da seguinte maneira

    TIMEOUT=3 BINARY="dummy bubblesort selectionsort insertionsortslow insertionsort mergesort" make time.reverso time.ordenado
    
    • Após a execução compare a diferença de execução entre os algoritmos e pondere suas implicações
  8. Modifique a sua implementação do MergeSort para que ela mostre a quantidade de comparações feitas e compare com execuções feitas com os algoritmos elementares

1.4 Aula 4   10_fev exercicios

1.4.1 Tópicos e Materiais

Nesta aula o professor irá conversar e discutir com os alunos alguns dos problemas disponibilizados nas listas de exercícios de fixação, liberadas em aulas anteriores.

Os alunos devem ler a maior parte dos problemas para que entendam a motivação de cada um deles.

1.4.2 Vídeos adicionais

1.4.3 Exercícios

  1. 1a lista de exercícios de fixação no MOJ
  2. 2a lista de exercícios de fixação no MOJ
  3. Primeira lista de presença

1.5 Aula 5   17_fev recap assincrono

Quanto à resolução do problema Número Proibido, que se encontra presente na 2a lista de fixação e na 1a lista de presença da disciplina.

Algumas notas antes de discutir a resolução do problema:

  • O login para a lista de presença foi enviado por e-mail, de maneira individualizada, e você deve copiar exatamente a string de login e senha.
  • Para garantir a sua presença, você precisa obter no mínimo 10% de acerto no problema.
    • A quantidade de acerto é mensurada com código após o veredicto, por exemplo:
      • Accepted,100p
      • Wrong Answer,80p
      • Time Limit Exceeded,8p

Em cada um dos exemplos acima o número indicado antes do caractere p representa a porcentagem de acerto. Problemas aceitos terão, sempre, 100% de acertos. Outras respostas terão um valor inferior a 100p.

  • O veredicto Time Limit Exceeded (com qualquer porcentagem de acerto) indica que a sua solução não está com a complexidade esperada, ou seja, a sua solução precisa de mais operações para resolver o problema do que o esperado
    • para a lista de presença isso não é um problema, mas para atividades de avaliação sim.
  • O veredicto RunTime Error indica que sua solução está recebendo segmentation fault, geralmente ocasionado por acesso errado no vetor (exemplo, índice além do tamanho do vetor).
    • para a lista de presença não é um problema, embora você tenha que entender o que está acontecendo para arrumar.

Voltando para a discussão do problema do número proibido, a descrição do problema é bastante clara e não esconde o que precisa ser feito, no entanto é necessário que o aluno tenha alguma "malícia" algorítmica para entender como atacar o problema, mas vamos discutir isso com calma.

Primeiramente o enunciado explica que existe uma lista de números proibidos e eles possuem um tamanho bem específico, até \(140000\) números, e cada um deles é um número positivo entre \([0,2^{31}]\) (note que o intervalo é fechado), o que significa que esses números cabem em um número inteiro.

A entrada dos números inteiros é dada por um \(N\), indicando a quantidade de números proibidos, e depois os \(N\) numerais. O código para entrada é bastante direto e possui complexidade em \(\mathcal{O}(N)\), parecido com o código abaixo:

1: int proibidos[140000];
2: int proibidos_ct;
3: scanf("%d",&proibidos_ct);
4: for(int i=0;i<proibidos_ct;i++)
5:   scanf("%d",&proibidos[i]);

O código acima não tem nenhum segredo, mas o problema começa a apareser nas próximas linhas do enunciado.

O enunciado nos conta que o depois da lista de números proibidos acontecerá um número indeterminado de perguntas, e cada pergunta consiste em saber se um número dado pertence ao conjunto de números proibidos.

A informação da quantidade indeterminada de perguntas nos sugere que elas devem acontecer diversas vezes, muitas vezes mais que a quantidade de números proibidos. E é nesse ponto que você deve ficar encafifado.

Caso você já tenha levado um Time Limit Exceeded, você percebeu que o tempo limite de execução é de meros \(0,2495\) segundos, você identifica isso dentro do log enviado pelo mojinho ao invocar o comando getlog.

Mas vou um pouco mais além e vou mostrar a informação presente nas máquinas. Hoje temos duas máquinas operando como juízes, a jaguapitanga e a ovomaltine (principal), veja a spec delas:

  • jaguapitanga
    • arch: x8664
    • cpu: Intel(R) Celeron(R) CPU 3867U @ 1.80GHz
    • memory: 8077352
  • ovomaltine
    • arch: x8664
    • cpu: Intel(R) Core(TM) i5-4200U CPU @ 1.60GHz
    • memory: 16315452

As máquina são pouco diferentes e o tempo de execução são:

  • jaguapitanga
    • c: .3980
  • ovomaltine
    • c: .2495

Mesmo a ovomaltine sendo mais rápida os tempos não são tão diferentes. Note que a jaguapitanga só é utilizada quando a ovomaltine fica fora do ar, opera como um backup.

Agora vou executar alguns experimentos na jaguapitanga para que consigamos ter uma noção dos tempos que as coisas levam.

Considerando uma ideia bobinha, por exemplo, um código com um vetor de \(140000\) elementos procurando um elemento que não existe, ou seja, efetuando uma busca sequencial. Como o problema nos fala que a quantidade de perguntas é indeterminada, vamos monstar um exemplo que procure \(140000\) vezes um número que não existe.

Como vamos utilizar uma busca sequencial, significa que vamos ter que percorrer o vetor de números proibidos inteiro para descobrir que o número não está lá, então podemos dizer que a busca sequencial é proporcional a \(\mathcal{O}(N)\) operações, como \(N\) é \(140000\) e vamos realizar \(140000\) buscas falhas temos operações propocionais a \(N^2\).

Vamos ver como se comporta um código bobinho desses:

 1: #include <stdio.h>
 2: #include <stdlib.h>
 3: int achou(int num,int *v,int l,int r)
 4: {
 5:   for(int i=l;i<=r;i++)
 6:     if(v[i]==num)
 7:       return 1;
 8:   return 0;
 9: }
10: int main(void)
11: {
12:   int vetor[140000];
13:   //preparando para gerar números aleatórios
14:   srand(140000);
15:   //preenchendo o vetor com números aleatórios inferiores a 1milhão
16:   for(int i=0;i<140000;i++)
17:     vetor[i]=rand()%1000000;
18: 
19:   //fazendo 140000 buscas pelo número 1milhão
20:   for(int i=0;i<140000;i++)
21:     if(!achou(1000000,vetor,0,140000-1))
22:       printf("nao\n");
23:     else
24:       printf("sim\n");
25: }
26: 

Executando este código na jaguapitanga, e compilando com os mesmos parâmetros que usamos no MOJ o tempo de execução fica em enormes \(15,61\) segundos. Muito acima do tempo limite estipulado pelo MOJ.

Veja abaixo como foi executado:

ribas@jaguapitanga:/tmp$ make busca_bobinha CFLAGS='-O2 -static'
cc -O2 -static    busca_bobinha.c   -o busca_bobinha
ribas@jaguapitanga:/tmp$ time ./busca_bobinha > /dev/null

real	0m15.616s
user	0m15.607s
sys	0m0.008s

O resultado é muito aquém ao que esperamos, pois o TL é de \(0,2495\) segundos. Como poderíamos reduzir este tempo?

Lá em EDA-1 você deve ter aprendido que existe um algoritmo que sabe fazer uma busca mais rapidamente que a busca sequencial. Esta é a busca binária. O problema é que a busca binária precisa de um vetor ordenado para poder realizar a busca rapidamente.

Então PARA TUDO! Precisamos ordenar esse vetor antes de fazer a busca!

Aprendemos diversos algoritmos de ordenação neste semestre e temos uma noção de como cada um se comporta.

Peguei rapidamente o Benchmark de Ordenação e resolvi experimentar na jaguapitanga primeiramente testando os clássicos:

  • bubblesort
  • seletionsort
  • insertionsort
  • mergesort

Sabemos que somente o mergesort, dentre os listados acima, possui complexidade em \(\mathcal{O}(N \log{}(N))\), enquanto que os outros estão em \(\mathcal{O}(N^2)\).

Table 1: Tabela de tempos de execução para os algoritmos de ordenação para entradas de tamanhos entre \(2^8\) e \(2^{20}\), com tempo limite de execução em 20 segundos
Alg/#Elementos 256 512 1024 2048 4096 8192 16384 32768 65536 131072 262144 524288 1048576
bubblesort 0.00 0.00 0.00 0.01 0.04 0.20 0.91 3.89 16.01 TLE TLE TLE TLE
selectionsort 0.00 0.00 0.00 0.00 0.01 0.05 0.23 0.91 3.61 14.42 TLE TLE TLE
insertionsort 0.00 0.00 0.00 0.00 0.00 0.01 0.04 0.16 0.67 2.79 11.69 TLE TLE
mergesort 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.01 0.03 0.06 0.12 0.25 0.53

Para gerar a tabela acima o benchmark de ordenação foi executado da seguinte maneira na jaguapitanga:

TIMEOUT=20 BINARY="bubblesort selectionsort insertionsort mergesort" make time.aleatorio

Veja que os algoritmos quadráticos (os três primeiros) crescem na proporção esperada, ou seja, ~4x mais tempo é necessário para ordenar um vetor com o dobro do tamanho.

Logo, é perceptível que somente o mergesort consegue ordenar o vetor dentro do limite de tempo tão justo, ou seja, sabemos que ele ordena \(262144\) elementos em \(0,12\) segundos.

Nesse ponto sabemos o que fazer! Para poder utilizar a busca binária devemos ordenar o vetor com o mergesort, para que seja possível sobrar mais tempo para realizar as consultas.

Modificando o Código da Busca Bobinha para ordenar com MergeSort e realizar a busca binária, ficaria da seguinte forma:

 1: #include <stdio.h>
 2: #include <stdlib.h>
 3: //Mergesort e Intercala OMITIDOS! Use a versão disponibilizada na Aula 3, seção 3.1
 4: 
 5: int buscabinaria(int num,int *v,int l,int r)
 6: {
 7:   if(l>r) return -1;
 8:   int meio=(l+r)/2;
 9:   if(less(v[meio],num))
10:     return achou(num,v,meio+1,r);
11:   else if(lesseq(v[meio],num))
12:     return meio;
13:   else
14:     return achou(num,v,l,meio-1);
15: }
16: int main(void)
17: {
18:   int vetor[140000];
19:   //preparando para gerar números aleatórios
20:   srand(140000);
21:   //preenchendo o vetor com números aleatórios inferiores a 1milhão
22:   for(int i=0;i<140000;i++)
23:     vetor[i]=rand()%1000000;
24: 
25:   //Tenha cuidado com a chamada do MergeSort, o intervalo é FECHADO [l,r]
26:   //por isso é subtraído 1 do tamanho do vetor, para ficar [0,139999]
27:   //que representa os 140000 elementos.
28:   mergesort(vetor,0,140000-1);
29: 
30:   //fazendo 140000 buscas pelo número 1milhão
31:   for(int i=0;i<140000;i++)
32:     if(!buscabinaria(1000000,vetor,0,140000-1))
33:       printf("nao\n");
34:     else
35:       printf("sim\n");
36: }
37: 

O código acima possui a implementação da BuscaBinária e utiliza o MergeSort implementado na Aula 3.

Seguimos a execução conforme abaixo:

ribas@jaguapitanga:/tmp$ make busca2 CFLAGS='-O2 -static'
cc -O2 -static    busca2.c   -o busca2
ribas@jaguapitanga:/tmp$ time ./busca2 >/dev/null

  real	0m0.032s
  user	0m0.028s
  sys	0m0.005s


O que antes demorava mais de \(15\) segundos, passou a executar em apenas \(0,032\) segundos, bem abaixo do tempo limite estipulado no sistema MOJ.

Implementado um código que utiliza esta estratégia sai do custo de \(\mathcal{O}(N^2)\) operações para \(\mathcal{O}(N log{}(N) + N log{}(N))\), pois a ordenação fica em \(\mathcal{O}(N log{}(N)\), e a busca binária fica em \(\mathcal{O}(log{}(N))\), sendo executada \(N\) vezes, pois são feitas \(140000\) perguntas.

A busca que implementamos neste exercício mental trata de uma entrada próxima do pior caso, e que força uma implementação simples a ficar com custo proporcional a \(\mathcal{O}(N^2)\), enquanto que podemos implementar de uma maneira mais eficiente apenas pensando nos custos envolvidos.

1.5.1 Exercícios

  1. Resolva os exercícios propostos das aulas anteriores
  2. O algoritmo MergeSort é estável?
  3. Um algoritmo de intercalação é estável se não altera a posição relativa de elementos iguais. A função intercala discutida na Aula 3 é estável? E se a comparação lesseq(a[ia],b[ib]), for trocada por less(a[ia],b[ib])?
  4. Implemente uma versão modificada do MergeSort com que ele considere os números ímpares sempre maiores que os números pares   HOT
    • Dessa maneira o vetor, sem ordenação, abaixo:

      30 44 1 93 44 77
      
    • Ficaria ordenado da seguinte maneira:

      30 44 44 1 77 93
      

1.6 DONE Aula 6   22_fev avaliacao

1.7 Aula 7   24_fev sobre_avaliacao quicksort

1.7.1 O QuickSort

Segue nesta seção um conjunto de vídeos a respeito do QuickSort, e que serão tema das próximas aulas, assista para que possamos elevar a discussão a respeito deste algoritmo.

1.7.2 Exercícios

  1. Lista pública no CD-MOJ
    • Resolva os exercícios propostos na TERCEIRA lista pública do CD-MOJ.
    • Para ganhar credenciais de acesso à lista, envie uma mensagem para @mojinhobot, no telegram AQUI, com o conteúdo:

      participar bcr-EDA2-2020_2-quick
      
      • Se você já conta para a outra lista (disponibilizada na Aula 2), pode utilizar as mesmas credenciais.
  2. Assista aos vídeos sobre QuickSort no youtube (elencados na seção anterior)

1.8 Aula 8   01_mar quickselect

1.8.1 Exercícios

  1. Escreca o algoritmo da separação
  2. Escreva uma função que rearranje um vetor v[p..r] de inteiros de modo que tenhamos v[p..j-1] <=0 e v[j..r] > 0 para algum j em p..r+1.
    • Faz sentido exigir que j esteja em p..r?
    • Procure fazer uma função rápida que não use vetor auxiliar.
    • Repita o exercício depois de trocar v[j..r] > 0 por v[j..r] >=0.
    • Faz sentido exigir que v[j] seja 0?
  3. Um vetor v[p..r] está arrumado se existe j em p..r tal que v[p..j-1] <=v[j] < v[j+1..r] . Escreva um algoritmo que decida se v[p..r] está arrumado. Em caso afirmativo, o seu algoritmo deve devolver o valor de j.
  4. Um programador inexperiente afirma que a seguinte implementação da função de separação rearranja o vetor v[p..r], com p < r, e devolve um índice j em p..r-1 tal que v[p..j] <= v[j+1..r].
    int sep( int v[], int p, int r) {
       int q, i, j, t;
       i = p; q = (p + r) / 2; j = r;
       do {
          while (v[i] < v[q]) ++i;
          while (v[j] > v[q]) --j;
          if (i <= j) {
             t = v[i], v[i] = v[j], v[j] = t;
             ++i, --j;
          }
       } while (i <= j);
       return i;
    }
    

    Mostre um exemplo onde essa função não dá o resultado esperado. E se trocarmos return i por return i-1? É possível fazer algumas poucas correções de modo que a função dê o resultado esperado?

  5. Qual o resultado da função separa quando os elementos de v[p..r] são todos iguais? E quando v[p..r] é crescente? E quando v[p..r] é decrescente? E quando cada elemento de v[p..r] tem um de dois valores possíveis?
  6. A função separa produz um rearranjo estável do vetor, ou seja, preserva a ordem relativa de elementos de mesmo valor?   HOT
  7. Escreva uma versão recursiva da função separa.
  8. Implemente o QuickSort
  9. Submeta o vetor 77 55 33 99 indexado por 1..4 à função quicksort. Teremos a seguinte sequência de invocações da função (observe a indentação):
    quicksort( v,1,4)
        quicksort( v,1,2)
            quicksort( v,1,0)
            quicksort( v,2,2)
        quicksort( v,4,4)
    

    Repita o exercício com o vetor 55 44 22 11 66 33 indexado por 1..6.

  10. A função quicksort produz uma ordenação estável do vetor?
  11. Escreva uma versão não recursiva do algoritmo Quicksort. sol
  12. Execute todas as variações do QuickSort distribuídas no Benchmark de Ordenação e reflita sobre os resultados

1.9 Aula 9   03_mar hash

1.9.1 Exercícios

  1. Veja o material sobre hash do Prof. Paulo Feofiloff
  2. Você consegue aplicar as ideias de HASH nos exercícios Remoção e Sanidade?
  3. Você consegue aplicar as ideias de HASH no exercício Eleição U.R.S.A.L?
  4. Você consegue aplicar os conhecimentos, adquiridos pelos vídeos acima, no problema Desfile dos Patos (em nossa segunda lista de presença).

1.10 Aula 10   08_mar hash

1.10.1 Exercícios

  1. Lista pública no CD-MOJ
    • Resolva os exercícios propostos na QUARTA lista pública do CD-MOJ.
    • Para ganhar credenciais de acesso à lista, envie uma mensagem para @mojinhobot, no telegram AQUI, com o conteúdo:

      participar bcr-EDA2-2020_2-hash
      
      • Se você já conta para a outra lista (disponibilizada na Aula 2), pode utilizar as mesmas credenciais.
  2. Considere as técnicas de busca sequencial, busca binária e busca baseada em hashing:
    • Descreva as vantagens e desvantagens de cada uma dessas técnicas, indicando em que situações você usaria cada uma delas.
    • Qual é a eficiência de utilização da memória (relação entre o espaço necessário para dados e o espeço total necessário) para cada método?
  3. Sobre Tabelas HASH:
    • É possível criar uma função HASH em que é garantido que nunca haverá colisão? Porquê?
    • Quando existe colisão, quais estratégias podem ser utilizadas para contornad esse problema? Quando cada estratégia é melhor utilizada?
  4. Resolva os exerícios DESTA PROVA   hot

1.11 Aula 11   10_mar hash

Na aula de hoje os alunos devem assistir ao vídeo abaixo (sobre double hash e tabela hash dinâmica) e às 9h00 o professor entrará em LIVE.

Primeiro assista o vídeo abaixo:

Às 9h00 entro ao vivo com vocês:

1.11.1 Exercícios

  1. Imagine que você tenha um bug em sua implementação de tabela hash utilizando hash-dupla (double-hashing) de tal forma que a primeira ou a segunda função de hash retornam sempre o mesmo valor (porém diferente de \(0\)). Descreva o que ocorre (exemplo: os custos de inserção e busca permanecem o esperado?) quando:
    1. a primeira hash está errada;
    2. a segunda hash está errada;
    3. ambas funções hash estão erradas.
  2. Resolva o exerício HASHIT da quarta lista de exerícios de fixação.

    Veja a discussão deste exercício com o Monitor Felipe Borges

  3. Resolva o exercício da Lista de Presença, Desfile dos Patos com o seguinte algoritmo

1.12 DONE Aula 12   15_mar avaliacao

1.13 Aula 13   17_mar assincrono

A aula de hoje terá caráter assíncrono. Os alunos devem relembrar os conceitos de árvores binárias.

Já deixo separado e recomendado que vocês iniciem a leitura de:

1.13.1 Vídeos de apoio

1.13.2 Exercícios

  1. Lista pública no CD-MOJ
    • Resolva os exercícios propostos na QUINTA lista pública do CD-MOJ.
    • Para ganhar credenciais de acesso à lista, envie uma mensagem para @mojinhobot, no telegram AQUI, com o conteúdo:

      participar bcr-EDA2-2020_2-5alista
      
      • Se você já conta para a outra lista (disponibilizada na Aula 2), pode utilizar as mesmas credenciais.
  2. Tente resolver o exercício https://br.spoj.com/problems/PREEMPOS/

1.14 Aula 14   22_mar árvores

1.14.1 Exercícios

  1. Lista de presença para o dia 22 de março está no moj
  2. Lista pública no CD-MOJ
    • Resolva os exercícios propostos na SEXTA lista pública do CD-MOJ.
    • Para ganhar credenciais de acesso à lista, envie uma mensagem para @mojinhobot, no telegram AQUI, com o conteúdo:

      participar bcr-EDA2-2020_2-6alista
      
      • Se você já possui conta para a outra lista (disponibilizada na Aula 2), pode utilizar as mesmas credenciais.

1.15 Aula 15   24_mar exercícios

A aula de hoje é dedicada à resolução de exercícios relativos a árvores binárias.

1.15.1 Exercícios

  1. Lista de presença para o dia 29 de março está no moj
  2. Lista pública no CD-MOJ
    • Resolva os exercícios propostos na SEXTA lista pública do CD-MOJ.
    • Para ganhar credenciais de acesso à lista, envie uma mensagem para @mojinhobot, no telegram AQUI, com o conteúdo:

      participar bcr-EDA2-2020_2-6alista
      
      • Se você já possui conta para a outra lista (disponibilizada na Aula 2), pode utilizar as mesmas credenciais.
  3. Suponha que as chaves 50 30 70 20 40 60 80 15 25 35 45 36 são inseridas, nesta ordem, numa árvore de busca inicialmente vazia. Desenhe a árvore que resulta.   prof_Feofiloff
  4. Considere árvores binárias de busca cujos nós têm a estrutura indicada abaixo.   prof_Feofiloff
    • Escreva uma função que receba a raiz de uma tal árvore e o endereço de um nó x e devolva o endereço do pai de x.

         typedef struct reg {
      int         chave;
      int         conteudo;
      struct reg *esq, *dir; 
         } noh;
      
  5. [NÚMERO DE NÓS.] Escreva uma função que calcule o número de nós de uma árvore binária.   prof_Feofiloff
  6. [FOLHAS.] Escreva uma função que imprima, em ordem in-order, os conteúdos das folhas de uma árvore binária.   prof_Feofiloff
  7. Dada uma árvore binária, encontrar um nó da árvore cujo conteúdo tenha um dado valor val.   prof_Feofiloff
  8. [VARREDURA r-e-d.] Escreva uma função que faça a varredura r-e-d (varredura prefixa) de uma árvore binária.   prof_Feofiloff
  9. [VARREDURA e-d-r.] Escreva uma função que faça varredura e-d-r (varredura posfixa) de uma árvore binária.   prof_Feofiloff
  10. Escreva uma função para calcular a altura de uma árvore binária
  11. Escreva uma função que determine a profundidade de um nó dado.   prof_Feofiloff
  12. Escreva uma função que decida se uma dada árvore binária é quase completa.   prof_Feofiloff

1.16 Aula 16   29_mar

1.16.2 Exercícios

  1. Lista de presença para o dia 29 de março está no moj
  2. Resolva os exercícios de PQ   prof_Feofiloff

1.17 Aula 17   31_mar

1.18 Aula 18   05_abr

1.18.1 Exercícios

  1. Resolva a Sétima Lista de presença   MOJ
  2. (SW 9.1) Suponha que a sequência P R I O * R * * I * T * Y * * * Q U E * * * U * E é aplicada a uma PQ de máximo inicialmente vazia. Uma letra significa inserção e um asterisco significa remoção do máximo. Dê a sequência de letras produzida pelas remoções.   Sedgewick
  3. (SW 9.17) Um vetor em ordem decrescente é um heap decrescente? Um vetor em ordem crescente é um heap crescente?   Sedgewick
  4. Insira os itens E A S Y Q U E S T I O N, nessa ordem, em um heap decrescente inicialmente vazio. Mostre o heap que resulta.   Sedgewick
  5. Escreva um método isMaxHeap() para verificar se o vetor pq[] é um heap decrescente. O seu algoritmo deve consumir tempo linear. Repita para heap crescente.   Sedgewick
  6. Fila priorizada min/max. Projete um tipo-de-dados que dê suporte às seguinte operações: inserção, remoção do mínimo, remoção do máximo, encontrar o mínimo (sem remover), e encontrar o máximo (sem remover). As três primeiras operações devem consumir tempo logarítmico e as duas últimas devem consumir tempo constante. Dica: Use dois heaps.   Sedgewick
  7. Escreva a API completa de Filas de Prioridade de maneira que ela suporte mais de um Fila de prioridades no seu programa
  8. Como você pode implementar um algoritmo de Ordenação utilizando o conceito de filas de prioridade?
    • Analise e entenda a implementação simples usando fila de prioridades AQUI
    • Pense em como modificar o algoritmo acima para não utilizar memória auxiliar, uma solução está AQUI
  9. Rode o conjunto de benchmark de ordenação e idenfique o comportamento dos algoritmos HeapSort e PQsortsimple quando se comparado com o melhor quicksort e o mergesort
  10. O HeapSort é estável?
  11. Você é capaz de ressolver esta ISSUE?
  12. Qual implementação (em vetor ordenado ou não ordenado, com lista encadeada ordenada ou não ordenada, árvore binária em vetor) para encontrar os \(100\) menores elementos de um conjundo de \(10^6\) números aleatórios?   Sedgewick
    • Implemente e faça testes de desempenho
  13. Resolva o problema Classificados de Sementes utilizando os conceitos de fila de prioridades
  14. É possível resolver o problema kk-página utilizando os conceitos de fila de prioridades?
  15. Resolva o problema Eu posso advinhar a estrutura de dados!   urionlinejudge
  16. Implemente a ADT de fila de prioridades para fazer a troca baseada em índice (como vimos no fim da última aula)

  17. Suponha que um vetor está preenchido com as seguintes chaves E A S Y Q U E S T I O N. Imprima o conteúdo do vetor pq e qp após a inserção dos elementos da fila de prioridades implementada no exercício 1.18.1.16
  18. Adicione a operação remover na sua implementação do problema 1.18.1.16
    • esta função serve para quando se remover um elemento qualquer do vetor original
  19. Resolva o exercício Churrascarias da Avenida utilizando a implementação feita no exercício 1.18.1.16   spoj br

1.19 Aula 19   07_abr

1.20 DONE Aula 20   12_abr avaliacao

1.21 Aula 21   14_abr

1.21.2 Exercícios

  1. Resolva a Oitava Lista de presença   MOJ

1.22 Aula 22   19_abr

  1. Exercícios
  2. Lista pública no CD-MOJ
    • Resolva os exercícios propostos na SÉTIMA lista pública do CD-MOJ.
    • Para ganhar credenciais de acesso à lista, envie uma mensagem para @mojinhobot, no telegram AQUI, com o conteúdo:

      participar bcr-EDA2-2020_2-7alista
      
      • Se você já possui conta para a outra lista (disponibilizada na Aula 2), pode utilizar as mesmas credenciais.

1.23 Aula 23   21_abr feriado

1.24 Aula 24   26_abr

1.25 Aula 25   28_abr

1.25.1 Material de Apoio

1.25.2 Exercícios

  1. Resolva os exercícios A,B,C,F da 7a Lista de Exercícios de Fixação

1.26 Aula 26   03_mai

Às 9:00 iniciamos a live

1.27 Aula 27   05_mai

1.27.1 Exercícios

  1. Resolva os exercícios D,E,G da 7a Lista de Exercícios de Fixação

1.28 DONE Aula 28   10_mai avaliacao

  • Atividade de Avaliação 4

1.29 Aula 29   12_mai

1.30 Aula 30   17_mai

1.31 Aula 31   19_mai

  • Finalização da disciplina e notas disponibilizadas

2 Antes de Começar

Nesta disciplina é esperado que o aluno tenha conhecimento básico da linguagem C tais como:

  • Ponteiros
  • Strings
  • Leitura da Entrada padrão

As subseções abaixo elencam alguns vídeos que recaptulam o conhecimento necessário.

2.1 Material no Youtube

Vídeos com material relacionado ao conteúdo esperado para uso na disciplina.

Tenho disponibilizado vários materiais em meu canal no YouTube, por favor, considere assinar o canal e deixar o joinha :)

2.1.1 Revisão de Ponteiros

Segue abaixo a playlist da revisão de ponteiros no Youtube. Por ora são 5 vídeos que exploram o que é necessário saber para a disciplina de EDA-2.

2.1.2 Strings em C

Aqui um apanhando geral em como se manipula strings na linguagem C. Em uma série que chamei de "Umas Palavras sobre String"

2.1.3 SCANF

O SCANF é uma poderosa função capaz de ler dados da entrada padrão (e de outros arquivos com suas aliases como fscanf(3).

Na série Detonando o SCANF temos, além do uso básico da função abordo algumas curiosidades sobre as funções.

3 Plano de Aulas

O plano de ensino e plano de aulas é um PLANO e pode sofrer modificações ao longo do semestre de acordo com o rendimento da turma.

Curso: Engenharia de Software Período Letivo 2020/2
Disciplina: Estrutura de Dados 2 Código  
Carga Horária: 60 horas Créditos 04

3.1 Ementa

  • Estruturas não-lineares. Árvores. Tabelas hash. Grafos
  • Filas de prioridade. Heap
  • Algoritmos de ordenação avançados \(\mathcal{O}(n\log{}n)\)
  • Algoritmos de manupalição e análise de grafos
  • Aplicações

3.2 Horários das aulas e atendimento

3.3 Método

Aula expositiva por meio de vídeos no Youtube (gravados ou em live stream), conversas periódicas em vídeo conferências com os alunos nos horários das aulas, quadro branco (representado pelo tablet), listas de exercícios.

3.4 Critérios de Avaliação

  • A avaliação será baseada nas notas de quatro avaliações, denotados, respectivamente, por \(A_1,A_2,A_3,A_4\)
    • As notas serão compostas por um número inteiro no intervalo \([0,100]\);
  • As avaliações serão compostas por questões, podendo ser, a critério do professor, teóricas e/ou práticas
    • O método de entrega será combina previamente com os alunos, podendo ser realizada por meio: do corretor automático MOJ; questionários no sistema SIGAA e/ou; submissão por e-mail para o professor;
  • Será aplicada uma avaliação de reposição ao final do semestre para o aluno que necessite faltar uma das avaliações, desde que seja justificada previamente e seja corerente com aspectos legais que justifiquem a ausência;
  • Qualquer tentativa de fraude nas provas implicará em média ZERO no semestre para todos os envolvidos.

3.4.1 Presença

A presença na disciplina se dará pela execução e entrega de exercícios determinados pelo professor.

Durante o semestre será disponibilizado diversas listas de presenças com prazos de entrega específicos que contemplarão as atividades que devem ser entregues para receber a presença nas datas específicas.

A entrega DENTRO do prazo é obrigatória para todos os alunos.

A presença será computada pela soma das atividades.

3.4.2 Menção Final

As notas serão calculadas conforme a equação abaixo:

\begin{align} M_F = \frac{A_1 + 2\cdot A_2 + 3\cdot A_3 + 4\cdot A_4}{10} \end{align}

3.4.3 Critérios de aprovação

Obterá aprovação no curso o aluno que cumprir todas as exigências listadas abaixo:

  1. \(M_F >= 50\); e
  2. Presença em \(75\%\) ou mais das aulas.

Por fim, a menção final do curso é dada de acordo com a tabela abaixo:

\(M_F\) Menção Descrição
\(0\) SR Sem rendimento
\([1,29]\) II Inferior
\([30,49]\) MI Médio Inferior
\([50,69]\) MM Médio
\([70,89]\) MS Médio Superior
\([90,100]\) SS Superior

3.5 Cronograma

Data Atividade
Semanas {1,2,3} Ordenação Elementar, QuickSort, MergeSort
22/Fev Avaliação 1
Semanas {4,5,6} Hashing, Filas de Prioridades
15/Mar Avaliação 2
Semanas {7,8,9,10} Heap, Árvores Balanceadas
12/Abr Avaliação 3
Semanas {11,12,13,14,15,16} Grafos
10/Maio Avaliação 4

3.6 Bibliografia

  • CORMEN, Thomas H.; LEISERSON, Charles E.; RIVEST, Ronald L.; STEIN, Cli or. Algoritmos: Teoria e Prática. 2a.edição, Campus.
  • (eBrary) CORMEN, Thomas H.; LEISERSON, Charles E.; RIVEST, Ronald L. Introduction to Algorithms. MIT Press, 2014.
  • (eBrary) MEHLHORN, K; SANDERS, P. Algorithms and Data Structures: The Basic ToolBox, 1st. ed. Springer, 2008.
  • (open access) HALIM, Steve S; HALIM, Felix. Competitive Programming, 1st ed, Lulu, 2010.
  • (eBrary) STEPHENS, Rod. Essential Algorithms: A Pratical Approach to Computer Algorithms. John Wiley Sons, 2013.
  • (open access) AHO, A. V.; ULLMAN, J. D. Foundations of Computer Science: C Edition (Principles of Computer Science Series), 1st ed., W. H. Freeman, 1994.

4 Monitor

O monitor da disciplina é o Felipe Borges, o contato segue abaixo:

  • e-mail: bumbleblo2013 EM gmail.com
  • Canal no YouTube
    • Inscreva-se e ative o sininho :)

Para tirar duas dúvidas, envie um e-mail para o Felipe.

5 Presença

| FEVEREIRO            | MARÇO                         | ABRIL                | MAIO              | %pres | Matrícula |
| 01 03 08 10 17 22 24 | 01 03 08 10 15 17 22 24 29 31 | 05 07 12 14 19 26 28 | 03 05 10 12 17 19 | ----- | --------- |
| X  X  X  X  X  X  X  | X  X  X  X  X  X  -  -  X  X  | X  X  X  X  X  X  X  | X  X  X  X  X  X  |    93 | 190041871 |
| X  X  X  X  X  X  X  | X  X  X  X  X  X  X  X  X  X  | X  X  X  X  X  X  X  | X  X  X  X  X  X  |   100 | 180096991 |
| -  -  -  -  -  X  X  | X  X  X  X  X  X  -  X  X  X  | X  X  -  X  X  X  X  | X  X  X  X  X  X  |    76 | 150004796 |
| -  -  -  -  -  X  X  | X  X  X  X  X  X  -  X  X  X  | X  X  X  X  X  X  X  | X  X  X  X  X  X  |    80 | 190063441 |
| X  X  X  X  X  X  X  | X  X  X  X  X  X  X  X  X  X  | X  X  X  X  X  X  X  | X  X  X  X  X  X  |   100 | 180030264 |
| X  X  X  X  X  X  X  | X  X  X  X  X  X  -  X  X  X  | X  X  X  X  X  X  X  | X  X  X  X  X  X  |    96 | 160112974 |
| X  X  X  X  X  X  X  | X  X  X  X  X  -  X  -  -  -  | X  X  X  X  X  X  X  | X  X  X  X  X  X  |    86 | 170138798 |
| X  X  X  X  X  -  X  | X  X  X  X  X  -  X  -  X  X  | X  X  -  -  -  X  X  | X  X  X  X  X  X  |    80 | 170085023 |
| X  X  X  X  X  -  -  | -  -  -  -  -  -  -  -  -  -  | -  -  -  -  -  X  X  | X  X  -  X  X  X  |    40 | 190011602 |
| X  X  X  X  X  -  X  | X  X  X  X  X  X  X  X  X  X  | X  X  -  X  X  X  X  | X  X  X  X  X  X  |    93 | 190026243 |
| X  X  X  X  X  X  X  | X  X  X  X  X  X  -  -  X  X  | X  X  X  X  X  X  X  | X  X  X  X  X  X  |    93 | 170031438 |
| X  X  X  X  X  X  X  | X  X  X  X  X  X  X  X  X  X  | X  X  X  X  X  X  X  | X  X  X  X  X  X  |   100 | 180149687 |
| X  X  X  X  X  X  X  | X  X  X  X  X  X  X  X  X  X  | X  X  X  -  -  X  X  | X  X  X  X  X  X  |    93 | 190026600 |
| X  X  X  X  X  X  X  | X  X  X  X  X  X  X  X  X  X  | X  X  -  -  -  X  X  | X  X  X  X  X  X  |    90 | 190026758 |
| X  X  X  X  X  X  X  | X  X  X  X  X  -  -  -  -  -  | X  X  X  X  X  X  X  | X  X  X  X  X  X  |    83 | 140136355 |
| X  X  X  X  X  X  X  | X  X  X  X  X  X  X  X  X  X  | X  X  X  X  X  X  X  | X  X  X  X  X  X  |   100 | 180113151 |
| X  X  X  X  X  X  X  | X  X  X  X  X  X  X  X  X  X  | X  X  X  X  X  X  X  | X  X  X  X  X  X  |   100 | 180015834 |
| X  X  X  X  X  -  -  | -  -  -  -  -  X  -  X  -  -  | -  -  -  -  -  X  X  | X  X  -  X  X  X  |    46 | 180119508 |
| X  X  X  X  X  -  -  | -  -  -  -  X  X  X  X  X  X  | X  X  X  X  X  X  X  | X  X  X  X  X  X  |    80 | 160006163 |
| X  X  X  X  X  X  X  | X  X  X  X  X  X  X  X  X  X  | X  X  -  -  -  X  X  | X  X  -  X  X  X  |    86 | 180100831 |
| X  X  X  X  X  X  X  | X  X  X  X  X  X  X  X  X  X  | X  X  X  X  X  X  X  | X  X  X  X  X  X  |   100 | 180100840 |
| X  X  X  X  X  -  X  | X  X  X  X  X  X  X  -  -  -  | X  X  -  X  X  X  X  | X  X  X  X  X  X  |    83 | 180145088 |
| X  X  X  X  X  X  X  | X  X  X  X  X  X  X  X  X  X  | X  X  X  -  -  X  X  | X  X  X  X  X  X  |    93 | 170010341 |
| X  X  X  X  X  -  X  | X  X  X  X  X  -  -  -  X  X  | X  X  -  -  -  X  X  | X  X  -  X  X  X  |    73 | 160120918 |
| X  X  X  X  X  -  X  | X  X  X  X  X  X  -  -  -  -  | X  X  -  -  -  X  X  | X  X  -  X  X  X  |    70 | 180148338 |
| X  X  X  X  X  X  X  | X  X  X  X  X  X  X  X  X  X  | X  X  X  X  X  X  X  | X  X  X  X  X  X  |   100 | 180016938 |
| X  X  X  X  X  X  X  | X  X  X  X  X  X  X  X  X  X  | X  X  X  X  X  X  X  | X  X  X  X  X  X  |   100 | 180052845 |
| X  X  X  X  X  X  X  | X  X  X  X  X  X  -  -  X  X  | X  X  X  X  X  X  X  | X  X  X  X  X  X  |    93 | 170011267 |
| X  X  X  X  X  X  X  | X  X  X  X  X  X  X  -  -  -  | X  X  X  X  X  X  X  | X  X  X  X  X  X  |    90 | 170129411 |
| X  X  X  X  X  -  X  | X  X  X  X  X  X  X  X  X  X  | X  X  X  X  X  X  X  | X  X  X  X  X  X  |    96 | 180018159 |
| X  X  X  X  X  -  X  | X  X  X  X  X  X  -  X  -  -  | X  X  -  -  -  X  X  | X  X  -  X  X  X  |    73 | 200038141 |
| X  X  X  X  X  X  X  | X  X  X  X  X  X  X  X  X  X  | X  X  X  X  X  X  X  | X  X  X  X  X  X  |   100 | 180018574 |
| X  X  X  X  X  X  X  | X  X  X  X  X  X  X  X  -  -  | X  X  X  X  X  X  X  | X  X  X  X  X  X  |    93 | 180136925 |
| X  X  X  X  X  X  X  | X  X  X  X  X  X  X  X  X  X  | X  X  X  X  X  X  X  | X  X  X  X  X  X  |   100 | 180018604 |
| X  X  X  X  X  X  X  | X  X  X  X  X  X  X  X  X  X  | X  X  X  X  X  X  X  | X  X  X  X  X  X  |   100 | 180102087 |
| X  X  X  X  X  X  X  | X  X  X  X  X  X  X  X  X  X  | X  X  -  -  -  X  X  | X  X  -  X  X  X  |    86 | 180102613 |
| X  X  X  X  X  X  X  | X  X  X  X  X  X  X  X  X  X  | X  X  X  X  X  X  X  | X  X  X  X  X  X  |   100 | 180102656 |
| X  X  X  X  X  X  X  | X  X  X  X  X  -  X  X  X  X  | X  X  X  X  X  X  X  | X  X  X  X  X  X  |    96 | 170145514 |
| X  X  X  X  X  X  X  | X  X  X  X  X  X  X  X  X  X  | X  X  -  -  -  X  X  | X  X  X  X  X  X  |    90 | 170013651 |
| X  X  X  X  X  X  X  | X  X  X  X  X  X  X  X  X  X  | X  X  X  -  -  X  X  | X  X  X  X  X  X  |    93 | 180042238 |
| X  X  X  X  X  X  X  | X  X  X  X  X  X  X  X  X  X  | X  X  X  -  -  X  X  | X  X  X  X  X  X  |    93 | 170013812 |
| -  -  -  -  -  -  -  | -  -  -  -  -  -  -  -  -  -  | -  -  -  -  -  -  -  | -  -  -  -  -  -  |     0 | 160127327 |
| X  X  X  X  X  -  X  | X  X  X  X  X  X  X  X  -  -  | X  X  -  X  X  X  X  | X  X  X  X  X  X  |    86 | 160152615 |
| X  X  X  X  X  X  X  | X  X  X  X  X  X  -  -  -  -  | X  X  X  X  X  X  X  | X  X  X  X  X  X  |    86 | 170013910 |
| X  X  X  X  X  X  X  | X  X  X  X  X  X  X  X  X  X  | X  X  X  X  X  X  X  | X  X  X  X  X  X  |   100 | 190030879 |
| X  X  X  X  X  X  X  | X  X  X  X  X  X  X  X  X  X  | X  X  -  X  X  X  X  | X  X  X  X  X  X  |    96 | 180103431 |
| X  X  X  X  X  X  X  | X  X  X  X  X  X  X  X  X  X  | X  X  X  X  X  X  X  | X  X  X  X  X  X  |   100 | 180113861 |
| X  X  X  X  X  -  X  | X  X  X  X  X  X  -  -  -  -  | X  X  X  X  X  X  X  | X  X  X  X  X  X  |    83 | 180021974 |
| X  X  X  X  X  -  X  | X  X  X  X  X  -  -  X  X  X  | X  X  X  -  -  X  X  | X  X  X  X  X  X  |    83 | 150136862 |
| -  -  -  -  -  -  -  | -  -  -  -  -  -  -  -  -  -  | -  -  -  -  -  -  -  | -  -  -  -  -  -  |     0 | 170039501 |
| X  X  X  X  X  X  X  | X  X  X  X  X  X  X  X  X  X  | X  X  X  X  X  X  X  | X  X  X  X  X  X  |   100 | 180105256 |
| X  X  X  X  X  X  X  | X  X  X  X  X  X  X  X  X  X  | X  X  X  X  X  X  X  | X  X  X  X  X  X  |   100 | 180125770 |
| X  X  X  X  X  X  X  | X  X  X  X  X  X  X  X  X  X  | X  X  X  -  -  X  X  | X  X  X  X  X  X  |    93 | 170080102 |
| X  X  X  X  X  X  X  | X  X  X  X  X  X  X  X  X  X  | X  X  X  X  X  X  X  | X  X  X  X  X  X  |   100 | 180114077 |
| X  X  X  X  X  X  -  | -  -  -  -  X  X  X  X  X  X  | X  X  X  X  X  X  X  | X  X  X  X  X  X  |    83 | 180114093 |
| -  -  -  -  -  -  -  | -  -  -  -  -  -  -  -  -  -  | -  -  -  -  -  -  -  | -  -  -  -  -  -  |     0 | 150138202 |
| -  -  -  -  -  X  -  | -  -  -  -  -  -  -  -  -  -  | -  -  -  -  -  X  X  | X  X  -  X  X  X  |    26 | 190134623 |
| -  -  -  -  -  X  X  | X  X  X  X  X  X  -  -  -  -  | X  X  X  X  X  X  X  | X  X  -  X  X  X  |    66 | 180066382 |
| X  X  X  X  X  X  X  | X  X  X  X  X  X  -  X  X  X  | X  X  X  X  X  X  X  | X  X  X  X  X  X  |    96 | 170017885 |
| -  -  -  -  -  -  X  | X  X  X  X  X  X  X  X  X  X  | X  X  X  X  X  X  X  | X  X  X  X  X  X  |    80 | 170150747 |
| X  X  X  X  X  X  X  | X  X  X  X  X  X  X  X  X  X  | X  X  X  X  X  X  X  | X  X  X  X  X  X  |   100 | 180106970 |
| X  X  X  X  X  X  X  | X  X  X  X  X  X  X  -  X  X  | X  X  X  X  X  X  X  | X  X  X  X  X  X  |    96 | 180127969 |
| X  X  X  X  X  X  X  | X  X  X  X  X  X  -  X  X  X  | X  X  X  X  X  X  X  | X  X  X  X  X  X  |    96 | 170080366 |
| X  X  X  X  X  X  X  | X  X  X  X  X  X  X  X  X  X  | X  X  X  X  X  X  X  | X  X  X  X  X  X  |   100 | 180025601 |
| -  -  -  -  -  -  -  | -  -  -  -  -  -  -  -  -  -  | -  -  -  -  -  -  -  | -  -  -  -  -  -  |     0 | 140156909 |
| X  X  X  X  X  X  X  | X  X  X  X  X  X  X  X  X  X  | X  X  X  -  -  X  X  | X  X  X  X  X  X  |    93 | 170122549 |
| X  X  X  X  X  X  X  | X  X  X  X  X  X  X  -  X  X  | X  X  X  X  X  X  X  | X  X  X  X  X  X  |    96 | 180129058 |
| X  X  X  X  X  X  X  | X  X  X  X  X  X  X  -  X  X  | X  X  X  X  X  X  X  | X  X  X  X  X  X  |    96 | 180129147 |
| X  X  X  X  X  X  X  | X  X  X  X  X  X  -  X  X  X  | X  X  -  -  -  X  X  | X  X  -  X  X  X  |    83 | 170153975 |
| X  X  X  X  X  X  X  | X  X  X  X  X  X  X  X  X  X  | X  X  X  X  X  X  X  | X  X  X  X  X  X  |   100 | 180129287 |
| X  X  X  X  X  -  X  | X  X  X  X  X  -  -  -  -  -  | X  X  -  -  -  X  X  | X  X  X  X  X  X  |    70 | 170062686 |
| X  X  X  X  X  -  X  | X  X  X  X  X  X  -  -  -  -  | X  X  X  -  -  X  X  | X  X  X  X  X  X  |    76 | 180011308 |
| X  X  X  X  X  -  X  | X  X  X  X  X  X  -  X  X  X  | X  X  X  X  X  X  X  | X  X  X  X  X  X  |    93 | 160141842 |
| X  X  X  X  X  -  X  | X  X  X  X  X  X  X  X  X  X  | X  X  -  X  X  X  X  | X  X  X  X  X  X  |    93 | 180108344 |
| X  X  X  X  X  X  X  | X  X  X  X  X  X  -  -  X  X  | X  X  X  X  X  X  X  | X  X  X  X  X  X  |    93 | 190019158 |
| X  X  X  X  X  -  X  | X  X  X  X  X  -  X  X  X  X  | X  X  X  X  X  X  X  | X  X  X  X  X  X  |    93 | 140065547 |
| X  X  X  X  X  -  X  | X  X  X  X  X  X  -  -  X  X  | X  X  -  X  X  X  X  | X  X  X  X  X  X  |    86 | 180027352 |
| X  X  X  X  X  X  X  | X  X  X  X  X  X  -  X  X  X  | X  X  X  X  X  X  X  | X  X  X  X  X  X  |    96 | 160144485 |
| X  X  X  X  X  -  X  | X  X  X  X  X  X  -  X  X  X  | X  X  X  -  -  X  X  | X  X  X  X  X  X  |    86 | 180130722 |
| X  X  X  X  X  X  X  | X  X  X  X  X  X  -  X  X  X  | -  -  X  X  X  X  X  | X  X  X  X  X  X  |    90 | 180078224 |
| X  X  X  X  X  X  X  | X  X  X  X  X  X  X  -  X  X  | X  X  X  X  X  X  X  | X  X  X  X  X  X  |    96 | 180114689 |
| X  X  X  X  X  -  X  | X  X  X  X  X  X  -  X  -  -  | X  X  X  X  X  X  X  | X  X  -  X  X  X  |    83 | 180138596 |
| X  X  X  X  X  -  X  | X  X  X  X  X  X  X  X  X  X  | X  X  X  X  X  X  X  | X  X  X  X  X  X  |    96 | 180068229 |
| X  X  X  X  X  X  X  | X  X  X  X  X  X  X  X  X  X  | X  X  -  X  X  X  X  | X  X  X  X  X  X  |    96 | 170115500 |
| X  X  X  X  X  -  -  | -  -  -  -  -  X  X  -  -  -  | -  -  -  -  -  X  X  | X  X  -  X  X  X  |    46 | 170047326 |
| -  -  -  -  -  -  -  | -  -  -  -  -  -  -  -  -  -  | -  -  -  -  -  -  -  | -  -  -  -  -  -  |     0 | 130138304 |
| X  X  X  X  X  X  X  | X  X  X  X  X  X  X  X  X  X  | X  X  X  X  X  X  X  | X  X  X  X  X  X  |   100 |    MÁXIMO |

6 Notas

  • AVx são as avaliações
  • PP é a porcentagem de presença (consolidada nesta tabela no fim do semestre)
    • Na seção anterior você pode ver o acompanhamento das presenças
  • situação é a situação final na disciplina, gerada após todas avaliações
  • As penalidades nas avaliações são relativas às chamadas ao getlog do MojinhoBot
matricula PP AV1 AV2 AV3 AV4 MM situacao nome
190041871 93 017= 017 096= 096 100= 100 000= 000 50 MM **
180096991 100 100= 100 100= 100 100= 100 000= 000 60 MM **
150004796 76 041= 041 100= 100 000= 000 082= 082 56 MM **
190063441 80 073= 073 100= 100 100= 100 082= 082 90 SS **
180030264 100 018= 018 055= 055 045= 045 005= 005 28 MI **
160112974 96 017= 017 055= 055 100= 100 032= 032 55 MM **
170138798 86 100= 100 100= 100 100= 100 071= 071 88 MS **
170085023 80 000= 000 055= 055 000= 000 079= 079 43 MI **
190011602 40 000= 000 ** ** ** 0 SR **
190026243 93 000= 000 100= 100 005= 005 082= 082 54 MM **
170031438 93 100-05= 095 100= 100 100= 100 082= 082 92 SS **
180149687 100 100-05= 095 089= 089 100= 100 072= 072 86 MS **
190026600 93 100-10= 090 100= 100 070= 070 005= 005 52 MM **
190026758 90 100= 100 000= 000 000= 000 100= 100 50 MM **
140136355 83 100= 100 100= 100 010= 010 061= 061 57 MM **
180113151 100 100= 100 100= 100 100= 100 042= 042 76 MS **
180015834 100 100= 100 100= 100 100= 100 071= 071 88 MS **
180119508 46 000= 000 000= 000 ** ** 0 SR **
160006163 80 009= 009 100= 100 100= 100 000= 000 50 MM **
180100831 86 031= 031 000= 000 000= 000 ** 3 MI **
180100840 100 020-05= 015 100= 100 100-05= 095 100= 100 90 SS **
180145088 83 000= 000 099= 099 005= 005 082= 082 54 MM **
170010341 93 100= 100 073= 073 100= 100 082= 082 87 MS **
160120918 73 000= 000 055= 055 000= 000 ** 11 SR **
180148338 70 000= 000 096= 096 000= 000 ** 19 SR **
180016938 100 100-05= 095 100= 100 100= 100 071= 071 87 MS **
180052845 100 100= 100 055= 055 100= 100 093= 093 88 MS **
170011267 93 100= 100 100= 100 100= 100 082= 082 92 SS **
170129411 90 100= 100 100= 100 100= 100 071= 071 88 MS **
180018159 96 007= 007 006= 006 100= 100 100= 100 71 MS **
200038141 73 000-05= 000 008= 008 ** 000= 000 2 SR **
180018574 100 100= 100 100= 100 070= 070 100= 100 91 SS **
180136925 93 028-05= 023 055= 055 025= 025 079= 079 52 MM **
180018604 100 017-05= 012 100= 100 100= 100 082= 082 84 MS **
180102087 100 100= 100 100= 100 070= 070 000= 000 51 MM **
180102613 86 053= 053 000= 000 000= 000 ** 5 MI **
180102656 100 100= 100 100= 100 045= 045 082= 082 76 MS **
170145514 96 100= 100 100= 100 100= 100 082= 082 92 SS **
170013651 90 100= 100 000= 000 005= 005 100= 100 51 MM **
180042238 93 100-05= 095 095= 095 070= 070 082= 082 82 MS **
170013812 93 100-05= 095 063= 063 100= 100 085= 085 86 MS **
160127327 0 ** ** ** ** 0 SR **
160152615 86 000= 000 100= 100 000= 000 082= 082 52 MM **
170013910 86 100= 100 100= 100 100= 100 082= 082 92 SS **
190030879 100 019-10= 009 100= 100 070= 070 100= 100 81 MS **
180103431 96 019= 019 100= 100 000= 000 000= 000 22 MI **
180113861 100 029-05= 024 100= 100 100= 100 100= 100 92 SS **
180021974 83 001= 001 096= 096 100= 100 082= 082 82 MS **
150136862 83 000= 000 100= 100 075= 075 021= 021 50 MM **
170039501 0 ** ** ** ** 0 SR **
180105256 100 019-05= 014 100= 100 100= 100 082= 082 84 MS **
180125770 100 100= 100 100= 100 100= 100 100= 100 100 SS **
170080102 93 100= 100 100= 100 100= 100 005= 005 62 MM **
180114077 100 100= 100 100= 100 100= 100 100= 100 100 SS **
180114093 83 020-05= 015 100= 100 100= 100 100= 100 91 SS **
150138202 0 000= 000 ** ** ** 0 SR **
190134623 26 018= 018 ** ** ** 2 SR **
180066382 66 017= 017 100= 100 015= 015 ** 26 SR **
170017885 96 100= 100 100= 100 100= 100 000= 000 60 MM **
170150747 80 ** 055= 055 100= 100 045= 045 59 MM **
180106970 100 100= 100 100= 100 100= 100 082= 082 92 SS **
180127969 96 100= 100 100= 100 100= 100 082= 082 92 SS **
170080366 96 028= 028 100= 100 100= 100 021= 021 61 MM **
180025601 100 100-05= 095 100= 100 100= 100 093= 093 96 SS **
140156909 0 ** 000= 000 ** ** 0 SR **
170122549 93 100-05= 095 099= 099 100= 100 024= 024 68 MM **
180129058 96 100= 100 100= 100 100= 100 082= 082 92 SS **
180129147 96 099= 099 097= 097 100= 100 038= 038 74 MS **
170153975 83 100= 100 000= 000 000= 000 ** 10 MI **
180129287 100 019= 019 100= 100 100= 100 042= 042 68 MM **
170062686 70 000-05= 000 100= 100 000= 000 072= 072 49 SR **
180011308 76 000= 000 000= 000 015= 015 082= 082 37 MI **
160141842 93 000= 000 095= 095 045-20= 025 082= 082 59 MM **
180108344 93 000= 000 100= 100 000= 000 000= 000 20 MI **
190019158 93 017-05= 012 096= 096 100= 100 000= 000 50 MM **
140065547 93 002= 002 100= 100 045= 045 042= 042 50 MM **
180027352 86 ** 100= 100 000= 000 000= 000 20 MI **
160144485 96 100= 100 078= 078 015= 015 072= 072 58 MM **
180130722 86 000= 000 100= 100 100= 100 042= 042 66 MM **
180078224 90 059= 059 055= 055 045= 045 082= 082 63 MM **
180114689 96 020-10= 010 100= 100 100= 100 100= 100 91 SS **
180138596 83 ** 055= 055 045= 045 000= 000 24 MI **
180068229 96 005= 005 055= 055 045= 045 082= 082 57 MM **
170115500 96 020= 020 100= 100 005= 005 082= 082 56 MM **
170047326 46 ** 000= 000 ** ** 0 SR **
130138304 0 ** ** ** ** 0 SR **
média ** 50 79 64 62 ** ** Média da turma

Author: Bruno Ribas

Created: 2021-05-14 Fri 18:16

Validate