3.9 - FaMAF

Anuncio
Ejercicio 3.9. Supongamos que el diccionario se implementa como un puntero al siguiente tipo nodo, que genera una representación poco eficiente en
donde abundan tuplas llenas de punteros nil:
type nodo = tuple
letra : char
def : char
char a : pointer to node
char b : pointer to node
char c : pointer to node
..
.
En tal caso la estructura del algoritmo de búsqueda serı́a simple: mientras
no se agoten los caracteres de la palabra w, hagamos descender p por la rama
que corresponde al primer caracter de w. Si llegamos a p = nil entonces no
hay definición para tal palabra, y si agotamos todos los caracteres arribando a
una tupla definida (o sea p 6= nil) entonces en el campo p → def apunta al
significado buscado (que eventualmente también puede ser nil).
func def inición(p : pointer to nodo, w : palabra)
dev pointer to signif icado
while p 6= nil ∧ w 6= [] do
if head(w) = ’a’ → p := p → char a
¤ head(w) = ’b’ → p := p → char b
..
.
fi
w := tail(w)
if p 6= nil then return(p → def )
if p = nil then return(nil)
Para nuestro caso sólo debemos reemplazar el if del interior del ciclo por
un programa que búsque el puntero descendiente correspondiente al caracter
en cuestión. Para esto inicializamos p mediante p → primerHijo, y luego
recorremos la lista de hermanos.
p := p → primerHijo
while p 6= nil ∧ head(w) 6= p → letra do p := p → hermano
Luego el algoritmo completo es:
func def inición(p : pointer to nodo, w : palabra)
dev pointer to signif icado
while p 6= nil ∧ w 6= [] do
p := p → primerHijo
while p 6= nil ∧ head(w) 6= p → letra do p := p → hermano
1
w := tail(w)
if p 6= nil then return(p → def )
if p = nil then return(nil)
2
Descargar