quinta-feira, 13 de setembro de 2018

Questões 7 e 8


Questão 07:
    É uma estrutura na qual as chaves são tratadas caractere a caractere , implementada por estruturas dinâmicas , na qual cada letra é mantida numa variável dinâmica. Abaixo temos a construção de uma Trie com as palavras do enunciado.
Questão 08:
    - Constrói-se um vetor de registros que contém dois campos: dado e apontadorPalavra. Esse vetor tem o tamanho do número de letras do alfabeto, de forma ordenada.
    - A palavra a ser pesquisada é lida e a partir do seu primeiro caracter sabe-se a sua respectiva posição no vetor.
    - Acessa-se diretamente essa posição no vetor. A associação da letra com a posição no vetor seria através do seu respectivo valor na tabela ASCII.
    - No nó os caracteres são percorridos e comparados com o da palavra buscada, caso resulte em verdadeiro uma variável contadora é incrementada e o próximo caracter é comparado, caso falso apenas passa para outro caracter.
    - Se ao fim da palavra a variavél contadora for igual ao número de letras da palavra buscada a consulta resulta em sucesso, caso contraŕio a palavra buscada não está armazenada.

Questões 5 e 6.


         5) A árvore de pesquisa TRIE, também conhecida como árvore digital ou árvore de prefixos, é uma estrutura de dados construída a partir dos caracteres da string que define uma chave, o que permite usá-los no processo de busca do valor desejado, seja um valor que a chave guarda, que é armazenado no nó referente ao último caractere da chave, ou uma palavra.
            É possível implementar a árvore por meio de duas estruturas básicas: array e variáveis dinâmicas.

            Trie estática

Implementada por meio de array. Contém uma matriz entre números (colunas) e letras (linhas). Ex.:


1
2
3
4
5
6
...
...
a
2







b

3






c


abc





d








e

aedo
abert





....










Exemplo do funcionamento dessa implementação:
Adicionando a palavra aedo, colocamos ela na posição 1-a a princípio, pois ela começa com a letra a. Posteriormente, adicionando abert, observamos que ocorreu um conflito entre aedo e abert, pois ambas começam com a mesma letra. Para contornar essa situação, adicionamos uma nova coluna, e movemos ambas as palavras para ele, onde a posição de cada string será definida pela SEGUNDA letra da palavra, portanto essa segunda coluna irá conter todas as palavras que começam com a e não colidem com a posição de nenhuma outra. A antiga posição irá receber um apontador para a coluna que recebeu as palavras.
Para reforçar, ao adicionarmos abc observamos uma colisão com abert, portanto criamos uma nova coluna, colocamos um ponteiro na antiga posição de abert para a nova coluna, e transferimos ambas as palavras, que serão posicionadas conforme o seu TERCEIRO caractere, portanto a coluna 3 irá conter todas as palavras que começam com ab e que não colidem com nenhuma outra.
Podemos observar que não é uma boa forma de implementação, pois o número de colunas criados seria tão grande quanto as combinações possíveis de todos os caracteres considerados.

            Trie dinâmica



                                                                                   

Nessa implementação, o primeiro caractere da primeira palavra será a raiz da árvore e sua implementação responderá as seguintes regras: Cada nó “vertical/ esquerdo” representará os filhos/próximos caracteres da palavra inserida, ou seja, ao inserir BABY, teremos a estrutura B-A-B-Y, onde cada letra é conectada pelo nó esquerdo do nó pai. O nó direito corresponde a um próximo valor, o que leva a outra palavra que começa com um caractere diferente não. Sendo uma árvore binária ela segue as demais regras referentes a sua própria natureza.
Observe que, ao inserir uma palavra com prefixos semelhantes, como por exemplo BOX, é necessário fazer um ajuste na inserção, para manter a composição da estrutura. A inserção funciona da seguinte maneira:
I - Compara o primeiro caractere com a raiz, se não for igual segue a direita até encontrar um igual (1) ou até encontrar um apontador NULL (2), caso (1) siga para o passo II, caso (2) insira o caractere a direita do último nó verificado e prossiga com a inserção dos demais caracteres, com respectivos nós para cada um, verticalmente usando o filho esquerdo de cada nó inserido.
II – Ao encontrar um valor igual, comparamos o segundo caractere da string a ser inserida com o caractere do nó esquerdo, se for igual, prosseguimos a busca comparando o terceiro caractere com o filho esquerdo do nó anterior usado na comparação, e assim sucessivamente. Caso todo os caracteres forem iguais, não há necessidade de inserir a palavra, porém se a busca chegou num nó “vertical” igual ao valor do respectivo caractere na string e sem filho a esquerda, adicionamos “verticalmente” o restante da string, ou seja, inserimos os caracteres restantes da palavra a esquerda de cada nó inserido.
III – Caso no meio da busca dos caracteres semelhantes, após n caracteres iguais um não for semelhante, inserimos o próximo caractere da palavra a direita de do nó não semelhante, caso a direita esteja ocupada, percorremos todos os nós direitos dos filhos direitos até encontrar um ponteiro nulo e adicionamos a respectiva letra, por fim, adicionamos o restante da palavra verticalmente.
Exemplo: Adicionar BAD na figura acima. Separamos BAD em B-A-D, comparamos B com a raiz da árvore, que por coincidência é B, avançamos para o nó esquerdo da raiz ne1. Comparamos A com o valor em ne1, que é igual, então avançamos para o nó esquerdo de ne1, ne2, e comparamos D com o valor desse nó. Como o valor é diferente percorremos para direita de ne2, nd2, que é vazio, portanto adicionamos as letras restantes, que no caso é somente D.

Árvore de N Nós filhos para cada nó





                                 

        
           Uma das implementações possíveis é usando uma árvore em que cada nó tem N filhos, sendo N o número de caracteres do alfabeto utilizado.

            Listas de Palavras Separadas por tamanho

            Para otimizar o processo de busca de uma trie bem construída podemos criar um array ou uma lista encadeada em que cada índice da estrutura indica o tamanho de todas as palavras contidas na posição. Basicamente, na implementação cada posição irá conter uma trie, seja implementada por meio de variáveis dinâmicas ou não, em que cada palavra tem no total i caracteres, sendo i o índice da posição da raiz no array ou lista encadeada.

             6)  Em um arquivo, sendo um campo para o nó e outro para o endereço no arquivo, podendo ter acesso direto ao arquivo que mantém as informações. São mantidas em arquivos devido à grande quantidade de informações que precisam ser guardadas.


Questões 3 e 4 - Grupo 02

Grupo 02 
3. Há 2 classes de soluções voltadas para busca em texto: algoritmos e estruturas. Apresente 2 algoritmos voltados para busca em texto, sendo um deles o da força bruta. 

Conta Palavras:  

     Definição: Um conta palavras é basicamente a verificação da existência de uma palavra dada em um texto dado. A cada ocorrência de existência é somado um ao contador. Ao final da verificação de todo o texto é apresentado quantas vezes aquela palavra buscada aparece ao decorrer do texto. 
  •  Força Bruta:  Inicialmente será comparado caractere à caractere da palavra com o texto, não tendo diferença no resultado na maneira implementada para verificação (começar da direita para a esquerda, ou da esquerda para a direita).  Tendo como implementação da esquerda para a direita, por exemplo, poderia ser fixada o último caractere da palavra dada, e esta seria comparada com o caractere no texto que tivesse, considerando uma situação inicial, na mesma posição do vetor. Caso estas não sejam iguais, então é somado um na posição do texto, fazendo uma nova comparação. Ao ser encontrado caracteres iguais, é então varrido os caracteres, da direita para a esquerda, fazendo uma sequência de comparações de caractere à caractere, ao terminar as posições da vetor ––palavra, é validado que esta palavra está no texto, e então, é somado um no contador de palavras. E todo o processo recomeça.

int contaPalavrasBruteForce(char palavra[], int tamPalavra-1, char texto[], int tamTexto){     int i=0, j=0, ocorrencias=0, k=0;

     for(k=tamPalavra;k<tamTexto;k++){
         i=tamPalavra;
         j=k;
         printf("\n%s", texto);
         for(int a=1;a<j-2;a++)
             printf(" ");
         printf("%s %d\n", palavra, ocorrencias);
         while(i>=0 && palavra[i] == texto[j]){
             i--;
             j--;
         }
         if(i<0){
             ocorrencias++;
         }
     }
     return ocorrencias;
 } 

  • Boyer-Moore:  Como o método de pesquisa Força Bruta, o método Boyer-Moore também terá varreduras e comparações de caracteres. Porém neste, é economizado tempo, pois o seu maior diferencial é que serão feitos “saltos” durante as comparações obedecendo uma tabela alfabética anteriormente processada.  A tabela é basicamente as letras do alfabeto, onde serão colocados valores, de acordo a posição daquela letra no vetor da palavra buscada. Por exemplo, caso a palavra buscada seja “CASA”. Então, inicialmente será definido que todas as letras da tabela terão valor 0. Após completar o alfabeto, serão então definidos os valores para as letras que estão no vetor palavras seguindo a sequência da esquerda para a direita. Continuando o exemplo da palavra ser “CASA”, ‘C’ receberia o valor de 1, ‘A’ receberia valor 2, ‘S’ receberia valor 3 e ‘A’ receberia valor 4. Assim, quando ao testar um caractere, e ele não corresponder ao esperado, será feito o salto através do valor que aquela palavra contém. Caso seja, por exemplo em uma situação inicial de comparação, comparado o último ‘A’ de “CASA” com um ‘E’, então serão avançadas 4 posições no vetor texto, pois ‘A’ terá valor 4, depois disso será feita uma nova comparação do ‘A’ com o caractere do vetor do texto localizado na nova posição, depois do pulo. Caso o caractere da palavra seja comparado com um caractere do texto que pertence a palavra, é feito um ajuste para alinhar a palavra ao texto e em seguida verificado caractere a caractere da direita para a esquerda se a sequência de caracteres do texto condiz com a sequência da palavra buscada. Após concluído que condiz, é somado um no contador e pulado 4 posições no texto.
 int contaPalavrasBoyerMoore(char palavra[], int tamPalavra-1, char texto[], int tamTexto){
        int alfabeto[256], i, pos, ocorrencias=0,y,z,ent=0; 
    //Pré-processamento
     for(i=0;i<256;i++){
         alfabeto[i]=0;
     }
     for(i=1;i<=tamPalavra;i++){
         alfabeto[palavra[i]] = i;
     }
    //Busca por Ocorrências
     pos = tamPalavra;
     while(pos <= tamTexto){
         printf("\n%s", texto);
         for(int a=1;a<pos-2;a++)
             printf(" ");
         printf("%s %d\n", palavra, ocorrencias);
         y=tamPalavra;
         z=pos;
         while(y>=0 && palavra[y] == texto[z]){
             y--;
             z--;
         }
         if(y<0){ 
            ocorrencias++;
         }
         if(pos==tamTexto){
             pos+=1;
         }else{
             pos += tamPalavra-alfabeto[texto[pos+1]]+1;
         }
     }
     return ocorrencias; 

4. Em complemento à questão 3, apresente (nome e características e ilustração) de estruturas de dados voltadas para busca em texto. 

Estrutura Tries
  • TRIE vem de RETRIEVAL – RECUPERAÇÃO;
  • Pronúncia: TRI ou TRAI;  É um tipo de árvore de busca;
  • Ideia geral: usar partes das CHAVES como caminho busca;
  • Origem: anos 60 por Edward Fredkin;
  • Cada chave formada por palavras sobre um alfabeto;
  • Palavras com tamanho variável e ilimitado;
  • Em geral associam-se chaves a elementos ou registros, como na tabela Hash;
  • Cada chave é formada a partir de alfabeto de símbolos;
  • Exemplos de alfabetos: {0,1}, {A, B, C, D, E,...Z}, {0,1,2,3,4,5,...,9};
  • Exemplos de chaves: ABABBBABABA 19034717 Maria 010101010000000000101000000001010;
  • Chaves parcialmente partilhadas entre os elementos;
  • Chaves em geral caracteres;
  • Ao contrário da árvore de busca binária nenhum nó armazena a chave;
  • Chave determinada pela posição na árvore;
  • Descendentes de mesmo nó com mesmo prefixo;
  • Raiz: cadeia vazia;
  • Valores ou elementos associados a folhas ou a alguns nós internos de interesse;
  • O caminho da raiz para qualquer outro nó é um prefixo de uma string. 
Exemplo de uma trie para um alfabeto de 26 caracteres: 


  • Nesse exemplo, o conjunto de chaves é sea, sells, she.  (As strings sh e sell, por exemplo, estão representadas na trie, mas não são chaves.)
  • Subtries.  Cada nó x da trie é a raiz de uma subtrie, digamos X.  A subtrie X representa o conjunto de todas as chaves da trie que têm como prefixo a string que leva da raiz da trie até x.

Árvore de Pesquisa Digital (Digital Search Tree)

Uma árvore de pesquisa digital é uma árvore binária que é formada com base na frequência de ocorrência dos registros e nos padrões de bits dos campos-chave associados. Quando consideramos as árvores AVL e IPR (arvore de redução do caminho interno), as rotações aplicadas para melhorar o desempenho moveram alguns nós para cima na árvore, mas moveram simultaneamente um número menor de nós para baixo na árvore. Dessa forma, o número total de acessos na árvore foi reduzido, embora um registro individual possa ter mais acessos que outros. Embora a suposição de acessos iguais seja apropriada em muitas aplicações, ela não é adequada para todas as aplicações. Considerando uma árvore na qual os registros têm diferentes frequências de ocorrência. Nesse caso, queremos que os registros acessados com mais frequência sejam os armazenados perto da raiz da árvore. Uma árvore de busca digital é uma árvore binária na qual os registros são armazenados com base em suas frequências de ocorrência. Para conseguir isso, os registros são inseridos na árvore em ordem decrescente de frequência de ocorrência. Obviamente, precisamos de alguma informação prévia sobre a probabilidade relativa de reavaliação em cada registro. Em vez de usar os caracteres das chaves para fins de comparação, o processo de inserção usa os padrões de bits dos caracteres das chaves. Usando os padrões de bits em vez dos caracteres reais, a árvore resultante tende a ser mais equilibrada, pois os 1s e 0s ocorrem com igual frequência. Temos dois símbolos para comparar em vez de 2i, onde i é o comprimento de bit de um caractere. Ao percorrer uma árvore de busca digital, vamos para a esquerda no bit zero e para a direita no um bit. Cada bit pesquisado será compatível com um nível distinto na árvore de busca digital.
Ilustrando um exemplo: chaves numéricas de dois dígitos com sua representação binária de 6 bits:
27 ≡ 011011, 18 ≡ 010010, 29 ≡ 011101, 28 ≡ 011100, 39 ≡ 100111, 13 ≡ 001101, 16 ≡ 010000
Nós iremos inserir os registros com a ordem dada assumida como estando em frequência decrescente:


Referências:
https://www.ime.usp.br/~pf/algoritmos/aulas/strma.html
https://www.youtube.com/watch?v=W1cUnGYS1uE
https://www.ime.usp.br/~pf/estruturas-de-dados/aulas/tries.html http://www.ufjf.br/jairo_souza/files/2009/12/6-Strings-Pesquisa-Digital.pdf 


9ª Questão - 


10ª Questão - É possível utilizar a estrutura trie encadeado para realizar a função de autocompletar. Dado um caractere c como parâmetro, a estrutura é percorrida de modo a procurar pelo prefixo c, caso não encontre, não retorna nenhuma sugestão, caso encontre, ele divide a estrutura em subtries e devolve todas as chaves da subtrie cuja raiz é o char c.

quinta-feira, 6 de setembro de 2018

1ªQuestão:
R:È uma pesquisa de uma subsequência de simbolos em uma sequência destes mesmos simbolos, seus sinônimos são : Pesquisa digital ,Casamento de cadeias , Casamento de padrões.

2ªQuestão:
R:É aplicado em editores de textos , como o Notepad++ ,Bend , Bluefish entre outros .Pode ser aplicado tambem em dicionarios e recuperação de dados.

Aula Invertida 03 - Roteiro - Busca em Texto


U n i v e r s i d a d e F e d e r a l d e S e r g i p e
Centro de Ciencias Exatas e Tecnologia
Departamento de Computacao
Prof. Kenia Kodel
E s t r u t u r a d e D a d o s
AULA INVERTIDA – BUSCA EM TEXTO

DINÂMICA – 1o Dia – 0,5 ponto:
  • Compor 5 grupos com, inicialmente, 3 alunos, cada. Quando todos os grupos estiverem completos, podem ser adicionado 1 aluno a cada gupo.
  • Os grupos definem um líder que é responsável por orquestrar as discussões e registrar as respostas.
  • Cada grupo responsabiliza-se por responder 2 questões, baseadas nas informações que constam no livro de Tharp (THARP. File Organizations and Processing. John Wiley and Sons, 1988), acerca de Busca em Texto.
  • Caso o grupo opte por apresentar resposta sem base no livro de Tharp, apresentar as fontes.

1. O que é busca em texto? E quais seus sinônimos?

2. Em quais contextos se aplica busca em texto?

3. Há 2 classes de soluções voltadas para busca em texto: algoritmos e estruturas. Apresente 2 algoritmos voltados para busca em texto, sendo um deles o da força bruta.

4. Em complemento à questão 3, apresente (nome e características e ilustração) de estruturas de dados voltadas para busca em texto.

5. Apresentar formas de implementação (arquivo, array, variáveis dinâmicas...) de tries. Inicialmente apresentar a citada estrutura.

6. Sendo uma trie usada para manter um dicionário (com palavras e respectivas definições), onde manter as definições? Justifique sua resposta.

7. Construir trie dinâmica contendo: pinha, jaca, coco, açai, caja, cajarana, jacaré e pinhão; sendo usada para manter dicionário de definição (de palavras). Inicialmente apresentar a citada estrutura.

8. Descrever passos gerais (pensamento computacional) para consultar uma dada palavra na estrutura proposta em resposta à questão anterior.

9. Construir trie sequencial (conforme proposto por Tharp) contendo: aldo, bel, beto, diro, dino, davi, marco, marcos e rui; sendo esta usada para manter logins dos usuários de um sistema.

10. Que estrutura de dados usar para implementar recurso de autocompletar em editor de texto? Descrever os passos gerais da operação em que dado 1 caractere, é dado como retorno as possibilidades (de autocompletar) existentes na estrutura.

DINÂMICA – 2o Dia – 0,5 ponto:
  • Líderes publicam as conclusões em EduBlog.
  • Individualmente os alunos comentam postagens de 2 (dois) grupos alheios. Somente serão aceitos comentários que complementem o conteúdo apresentado, aponte um erro, ou apresente um dúvida.