Professional Documents
Culture Documents
DEFINIO E EXEMPLOS
Bruno Maffeo
Departamento de Informtica
PUC-Rio
TERMINOLOGIA BSICA
ALGORITMO
Um algoritmo pode ser visto como uma seqncia de aes expressas em termos de uma linguagem de
programao, constituindo parte da soluo de um tipo determinado de problema. Ou seja, um algoritmo
corresponde descrio do padro de comportamento associado aos elementos funcionais ativos de um
processamento e deve ser expresso em termos de um conjunto finito de aes especificadas por meio de uma
linguagem de programao.
ESTRUTURAS DE DADOS
Na linguagem de programao adotada, estruturas de dados do suporte descrio dos elementos
funcionais passivos do padro de comportamento acima referido, complementando o algoritmo que
constitui parte da soluo do problema considerado. Ambos, algoritmo e estruturas de dados, compem o
programa a ser executado pelo computador.
No til estudar estruturas de dados sem considerar os algoritmos bsicos a elas associados. Da mesma
forma, a escolha de um algoritmo depende, em geral, da estrutura de dados associada.
PROGRAMA
Programar , basicamente, estruturar dados e construir algoritmos.
Um programa uma formulao concreta, em termos de uma linguagem de programao, de um
procedimento abstrato que atua sobre um modelo de dados tambm abstrato. Ambos, procedimento e
modelo de dados, so representaes abstratas de algoritmo e estruturas de dados, respectivamente, e no
devem ser expressos em termos de uma linguagem de programao.
TIPOS DE DADOS
Em uma linguagem de programao, importante classificar constantes, variveis e valores gerados por
expresses/funes de acordo com o seu tipo de dados. Um tipo de dados deve caracterizar o conjunto de
valores a que uma constante pertence ou o conjunto de valores que pode ser assumido por uma varivel ou
gerado por uma expresso/funo.
Um tipo de dados elementar (ou simples) caracterizado por um conjunto domnio de valores
indivisveis, tais como os definidos pelos tipos numeral, texto e smbolo da linguagem de programao
Scheme.
Um tipo de dados estruturado (ou complexo) define, em geral, uma coleo homognea (de mesmo tipo) de
valores elementares/estruturados ou um agregado de valores de tipos diferentes. Um exemplo o tipo lista de
Scheme.
Qualquer processamento a ser realizada sobre os dados encapsulados em um TAD s poder ser executada
por intermdio dos procedimentos definidos no modelo matemtico do TAD, sendo esta restrio a
caracterstica operacional mais til dessa estrutura.
Nesses casos, um programa baseado em TAD dever conter algoritmos e estruturas de dados que
implementem, em termos da linguagem de programao adotada, os procedimentos e os modelos de dados
dos TADs utilizados pelo programa.
Assim, a implementao de cada TAD pode ocupar pores bem definidas do programa: uma para a
definio das estruturas de dados e outra para a definio do conjunto de algoritmos.
Nessas condies, quaisquer alteraes realizadas na estrutura de um dado TAD no afetaro as partes do
programa que utilizam esse TAD.
Uma coleo de atividades, tais como inserir, suprimir e consultar, encapsulada junto com uma estrutura
passiva, como um dicionrio (conjunto de verbetes), pode ser considerada um tipo abstrato de dados
(TAD).
Definido dessa forma, o TAD DICIONRIO fica representado no nvel de abstrao mais alto possvel: o
nvel conceitual.
Em um nvel de abstrao mais baixo, denominado nvel de design, a estrutura passiva deve ser representada
por um modelo de dados (por exemplo: seqncia ou rvore binria de busca) e as operaes devem ser
especificadas atravs de procedimentos cuja representao no dependa de uma linguagem de programao.
Em um nvel de abstrao ainda mais baixo, denominado nvel de implementao, deve-se tomar como
base o design do TAD e estabelecer representaes concretas para os elementos de sua estrutura em termos
de uma linguagem de programao especfica.
No exemplo do TAD DICIONRIO, se o design escolhido para a estrutura passiva for a rvore binria de
busca, ser possvel implementar esse modelo de dados em Scheme, por exemplo, em termos de uma
estrutura de dados do tipo lista correspondendo representao prefixada (raiz sub-rvore-esquerda sub-
rvore-direita). Os procedimentos sero implementados por meio dos algoritmos apropriados s operaes
raiz, esquerda, direita etc. utilizando-se os recursos disponveis em Scheme para codificar estruturas ativas
(operaes e controle). As duas estruturas, a ativa e a passiva, do TAD podero eventualmente constituir um
encapsulamento (mdulo) especfico e identificvel no programa construdo.
Uma razo importante para programar em termos de TAD o fato de que os elementos da estrutura passiva
do TAD so acessveis somente atravs dos elementos da estrutura ativa.
No caso do TAD DICIONRIO, por exemplo, o acesso a qualquer elemento da estrutura de dados pode
ocorrer apenas via os algoritmos correspondentes s operaes inserir, eliminar e consultar.
Essa restrio conduz a uma forma eficiente de programao defensiva, protegendo os dados encapsulados
no TAD contra manipulaes inesperadas por parte de outros algoritmos.
Uma segunda razo, tambm importante, para programar em termos de TAD o fato de que seu uso permite
introduzir alteraes nas estruturas definidas no nvel de implementao visando, por exemplo, aumento de
eficincia livre da preocupao de gerar erros no restante do programa. Tais erros no ocorrem porque a
nica conexo entre o TAD e o restante do programa aquela constituda pela interface imutvel dos
algoritmos que implementam a estrutura ativa do TAD.
Por fim, pode-se dizer que um TAD bem construdo pode tornar-se uma poro de cdigo confivel e
genrica, permitindo e aconselhando seu reso em outros programas. Dessa forma, aumenta-se a
produtividade na construo de programas e, sobretudo, garante-se a qualidade dos produtos gerados.
Qualquer operao a ser realizada sobre dados definidos por meio dessa
estrutura s poder ser executada por intermdio dos algoritmos definidos no
TAD.
Um TAD dever ocupar uma poro bem definida do programa, a qual conter
uma estrutura com dois componentes:
um, associado definio das estruturas de dados que implementam a
representao dos valores que constituem o domnio do modelo matemtico
de dados considerado
RECAPITULANDO
No nvel de abstrao correspondente implementao em termos de uma linguagem de programao
especfica, um tipo abstrato de dados, TAD, uma estrutura de programa contendo:
uma representao de dados de um conjunto de valores (domnio do tipo), expressa em termos da
linguagem de programao adotada
o conjunto de algoritmos que atuam com exclusividade sobre essa representao de dados e
implementam, na linguagem de programao adotada, as operaes bsicas que processam os valores
do domnio considerado.
Assim sendo, quaisquer outras reas de um programa que contenha um TAD no possuiro, e portanto no
utilizaro, o conhecimento relativo aos detalhes da representao de dados especfica associada quele
domnio de valores, bem como aos detalhes da implementao das operaes bsicas tornadas disponveis
externamente.
Nessas condies, as reas do programa usurias do TAD s podero processar os valores do domnio
associado ao tipo por intermdio das operaes bsicas contidas no TAD. Portanto, essas reas
permanecero invariantes em relao a qualquer alterao efetuada seja na representao de dados seja nos
algoritmos que implementam as operaes bsicas do TAD.
REPRESENTAO DO DOMNIO
um conjunto vazio representado pela lista vazia: { } ( )
(define conj-vazio ( ))
um conjunto no vazio representado por uma lista, sem itens repetidos, contendo os
elementos do conjunto
OPERAES BSICAS
teste de conjunto vazio
(define conj-vazio? null?)
teste de conjunto
(define conjunto? list?)
cardinalidade de conjunto
(define card (lambda (conj) (comprimento-lista conj)))
REPRESENTAO DO DOMNIO
O conceito matemtico de conjunto est na base da definio de rvore binria.
Em Scheme, a representao de dados empregada para conjuntos a lista, tipo de dados predefinido nessa
linguagem.
Assim sendo, e tendo em vista a estrutura de uma rvore binria constituda por um nodo raiz, uma sub-
rvore esquerda e uma sub-rvore direita , h trs alternativas para a representao de dados do
domnio do tipo rvore binria:
representao prefixada, por meio da lista (raiz sub-rvore-esquerda sub-rvore-direita)
representao infixada, por meio da lista (sub-rvore-esquerda raiz sub-rvore-direita)
representao ps-fixada, por meio da lista (sub-rvore-esquerda sub-rvore-direita raiz).
Admite-se a existncia de uma rvore vazia e, visando proporcionar maior legibilidade aos programas, define-
se a constante arv-bin-vazia: (define arv-bin-vazia ( )).
Visando simplificar a representao de rvores binrias, adota-se a conveno de representar uma rvore
cujas sub-rvores esquerda e direita so ambas vazias apenas pelo elemento associado a sua raiz. Ou
seja, uma folha representada pelo elemento associado ao nodo correspondente:
n1
a rvore binria representada, utilizando-se a forma prefixada, pela
lista (n1 n2 n3), e no pela lista
n2 n3 (n1 (n2 ( ) ( )) (n3 ( ) ( ))).
REPRESENTAO DO DOMNIO
constante arv-bin-vazia que designa uma rvore binria vazia
(define arv-bin-vazia ( ))
estrutura recursiva de lista ternria
(sub-rvore-esquerda raiz sub-rvore-direita )
para representar uma rvore binria no vazia
conveno de representar um nodo-folha pelo elemento a ele associado
OPERAES BSICAS
testar folha
(define folha? (lambda (ab)
(not (list? ab)) ))
funo que receba uma rvore binria e verifique se um dado item est
associado a um de seus nodos
funo que receba uma rvore binria no vazia e retorne quantos nodos so
folhas
verso 1
(define conta-folhas-aux (lambda (ab)
(cond ( (arv-bin-vazia? ab) 0)
( (folha? ab) 1)
(else (+ (conta-folhas-aux (esquerda ab))
(conta-folhas-aux (direita ab)) )) ) ))
verso 2
(define conta-folhas (lambda (ab)
(cond ( (folha? ab) 1)
( (arv-bin-vazia? (esquerda ab)) (conta-folhas (direita ab)) )
( (arv-bin-vazia? (direita ab)) (conta-folhas (esquerda ab)) )
(else (+ (conta-folhas (esquerda ab))
(conta-folhas2 (direita ab)) )) ) ))
REPRESENTAO DE DADO
OPERAES BSICAS
Funo para criar e retornar uma matriz de dimenso m x n onde cada elemento
seja igual a uma funo de seus ndices.