Você está na página 1de 10
Universidade Federal de Minas Gerais – UFMG Instituto de Ciências Exatas - ICEx Departamento de

Universidade Federal de Minas Gerais UFMG Instituto de Ciências Exatas - ICEx Departamento de Ciência da Computação

Documentação TP 02

Processamento de texto:

Pesquisa por árvore binária desbalanceada

MINAS GERAIS

Outubro/2013

Saulo Araújo do Nascimento

INTRODUÇÃO

Este trabalho tem como intenção reportar a implementação de um processador de texto simples, e que este possa ser usado posteriormente para análise e tratamento de dados. A partir de tal, é possível obter uma gama de aplicações em diversas áreas como sistemas de procura, ou até em métodos de compressão de dados. Este último possui extrema importância quando trabalhamos com o trafego de dados pela rede, onde quantidades cada vez maiores de informação criam as estruturas chamadas de BigData [1] . Esta estrutura, devido à quantidade de dados não catalogados e corretamente indexados, dificulta o uso pelos métodos tradicionais de processamento de dados, especialmente no cenário nacional onde somente uma pequena parte das empresas de T.I. possui o capital tecnológico, humano e técnico para lidar com esse tipo de informação.

A estrutura de procura escolhida para tratar o texto foi a BST (Binary search tree) ou árvore de procura binária, que possui um baixo custo para inserção de dados e um código simples. A versão desbalanceada foi escolhida como proposta na especificação do trabalho. Esta escolha se deu provavelmente com o intuito didático, pois o processo de inserção e remoção contínuas em uma árvore binária desbalanceada aleatória levaria a perda de eficiência [2] . Este processo acaba por criar ramos internos com grau de assimetria elevado aumentando cada vez mais o caminho para busca dos dados, tornando este tipo de árvore mais ineficaz que uma árvore onde a inserção e remoção não são aleatórios [2] . Para contrapor este problema seria necessária a criação de um processo não aleatório de inserção, onde se sabe previamente todos os termos a serem dispostos na árvore, implicando numa pré-análise do texto o que tornaria o projeto excessivamente trabalhoso. Algo fora do escopo da disciplina.

projeto excessivamente trabalhoso. Algo fora do escopo da disciplina. Figura 1: Estrutura da árvore desbalanceada típica

Figura 1: Estrutura da árvore desbalanceada típica

IMPLEMENTAÇÃO

A implementação seguiu o padrão já utilizado nos outros TP’s da disciplina de AEDs II, onde temos três arquivos:

Cabeçalho:

arvore.h

Estrutura do cabeçalho:

arvore.c

Parte principal:

main.c

Os Tipos abstratos de dados utilizados no cabeçalho seguem abaixo:

TAD’s:

de dados utilizados no cabeçalho seguem abaixo: TAD’s: Código 1: TAD’s A estrutura padrão da árvore

Código 1: TAD’s

A estrutura padrão da árvore possui o nó básico desta com seu TAD registrador e os vetores para os próximos nós. Dentro do TAD Registrador temos a chave que servirá como contador de recorrência para um dado valor que ficará presente na string “palavra”, onde o comprimento máximo escolhido para tal foi de 200 caracteres, levando em consideração a maior palavra típica para um texto padrão.

Funções:

levando em consideração a maior palavra típica para um texto padrão. Funções: Código 2: Funções em

Código 2: Funções em arvore.h

A implementação das funções foi feita no arquivo arvore.c, não apresentando muita dificuldade pois a estrutura padrão desta árvore é largamente conhecida [3] .

a estrutura padrão desta árvore é largamente conhecida [ 3 ] . Código 3:Função Busca Código

Código 3:Função Busca

a estrutura padrão desta árvore é largamente conhecida [ 3 ] . Código 3:Função Busca Código

Código 4:Função Insere

Código 5:Funções acha_menor e Remove Ao contrário das funções de inserção e busca as funções

Código 5:Funções acha_menor e Remove

Ao contrário das funções de inserção e busca as funções de remoção retornam uma árvore, pois ao liberarmos um nó da mesma outra árvore é criada em seu lugar.

um nó da mesma outra árvore é criada em seu lugar. Figura 2: Remoção de um

Figura 2: Remoção de um elemento na árvore - remove(30)

Programa Principal Código 6:Função Imprime O comando freopen ("entrada.txt","r",stdin) foi utilizado

Programa Principal

Código 6:Função Imprime

O comando freopen ("entrada.txt","r",stdin) foi utilizado para transferir a estrada de dados stdin para os arquivos de teste. As funções minuscula e mudachar tratam os dados antes da inserção na árvore

teste. As funções minuscula e mudachar tratam os dados antes da inserção na árvore Código 7:Função

Código 7:Função main 1ª parte

Código 8:Função main 2ª parte

Código 8:Função main 2ª parte

ESTUDO DE COMPLEXIDADE

Ao analisarmos a estrutura da árvore de busca percebemos que a análise de complexidade do

pior e melhor caso é elementar [4] :

Pior caso:

O(h), onde h é a altura máxima da árvore. Existe ainda a situação remota

onde a árvore está totalmente desbalanceada, levando ao estado com O(n).

Este caso é muito improvável considerando a função de nosso código.

Melhor caso:

O(1), onde o elemento procurado está na raiz.

caso: O(1), onde o elemento procurado está na raiz. Figura 3: Estrutura para procura O entendimento

Figura 3: Estrutura para procura

O entendimento do caso médio exige uma análise mais profunda:

Considerando a árvore com profundidade

descrita na figura ao lado, onde o comprimento

do caminho interno é a soma das profundidades

de cada nó.

do caminho interno é a soma das profundidades de cada nó. Figura 4: Estrutura para análise

Figura 4: Estrutura para análise de complexidade

Caso o nó contenha a raiz, o nó de índice i esquerda e o (n-i-1) nó da direita possuem para a

procura:

T(n) = n - 1 + T(i) + T(n - i - 1)

A raiz contribui com o valor de 1 para o comprimento do caminho de cada um dos n-1 nós.

Se compararmos com a estrutura do “QuickSort” temos de forma análoga:

n-1 nós. Se compararmos com a estrutura do “QuickSort” temos de forma análoga: o que leva

o que leva a:

T(n) = O( log(n) ).

TESTES Os testes foram realizados em um Intel i5 com 6GB de memória RAM, e a plataforma utilizada foi o Windows 8. Vários testes foram realizados no ambiente de execução do IDE CodeBlocks .

realizados no ambiente de execução do IDE CodeBlocks . Figura 5: Exemplo de programa de teste

Figura 5: Exemplo de programa de teste - CodeBlocks

Para comparação dos resultados dos textos mais longos a forma mais rápida encontrada foi com o uso do software notepad++.

forma mais rápida encontrada foi com o uso do software notepad++. Figura 6: Exemplo de programa

Figura 6: Exemplo de programa de teste Notepad++

CONCLUSÃO

Este trabalho apresentou uma situação interessante quanto à produção do código. Enquanto a repetição

da estrutura padrão para a árvore binária foi uma tarefa simples, a acomodação das funções com os

pedidos específicos de Busca, Inserção e Impressão apresentou um nível de dificuldade elevado.

Apesar disto a experiência da implementação da árvore não foi desperdiçada, sendo esta capaz de

fornecer uma situação realista sobre a produção de algoritmos e softwares. Em um ambiente empresarial

típico, as ferramentas disponíveis para a resolução dos problemas será comumente conhecida, mas sua

adequação as características pedidas pelo cliente é que elevam a dificuldade do projeto e

consequentemente a seleção entre bons e maus profissionais.

BIBLIOGRAFIA

[1] White, Tom (10 May 2012). Hadoop: The Definitive Guide. O'Reilly Media. p. 3. ISBN 978-1-1-4493-

3877-0

[2] Jeffery L. Eppinger. An empirical study of insertion and deletion in binary trees. Communications of the ACM vol. 26, September 1983.

[3] N. Ziviani. Projeto de Algoritmos: com implementações em Pascal e C. Cengage Learning

(Thomson / Pioneira), São Paulo, 2nd edition, 2004.

[4] Knuth, Donald M. (1973), "6.2.2 Binary Tree Searching", The Art of Computer Programming III,

Addison-Wesley, pp. 422451

Anexo

Lista de programas utilizados:

main.c

lista.c

lista.h