Estructuras de Datos y Algoritmos en Programación Funcional con SML

Enviado por Programa Chuletas y clasificado en Informática y Telecomunicaciones

Escrito el en español con un tamaño de 3,74 KB

Implementación de Estructuras de Datos en SML

A continuación se presentan diversas implementaciones de estructuras de datos fundamentales utilizando el paradigma de programación funcional, específicamente en Standard ML (SML).

1. Estructura de Datos: Lista

Definición de un tipo de dato recursivo para una lista de enteros y sus operaciones básicas:


datatype lista = vacio
| nodo of int * lista;

load "Int";

fun mostrar (vacio) = ""
| mostrar (nodo (a, b)) = Int.toString(a) ^ "," ^ mostrar (b);

fun agregar (vacio, i) = nodo (i, vacio)
| agregar (nodo(d, vacio), i) = nodo (d, nodo(i, vacio))
| agregar (nodo(d, m), i) = nodo(d, agregar(m, i)); // m es un nodo (nodo(x, vacio))

fun buscar (vacio, i) = false
| buscar (nodo(a, b), i) = if a = i then true else buscar (b, i);

fun eliminar (n, vacio) = vacio
| eliminar (n, nodo(a, b)) = if n = a then b else agregar(eliminar(n, b), a);

2. Estructura de Datos: Árbol Binario

Operaciones para la gestión de árboles binarios de búsqueda:


fun agregar vacio j = (nodo(vacio, j, vacio))
| agregar (nodo(izq, d, der)) j = if d = j then (nodo(izq, d, der)) else if d

fun buscar vacio j = false
| buscar (nodo(izq, d, der)) j = if d = j then true else if d

fun mostrar vacio = ""
| mostrar (nodo(izq, d, der)) = Int.toString(d) ^ mostrar(izq) ^ mostrar(der);

fun listar vacio = []
| listar (node(izq, d, der)) = [d] @ listar(izq) @ listar(der);

fun busca_lista(x, []) = false
| busca_lista(x, y::ys) = if x = y then true else busca_lista(x, ys);

fun comparar(vacio, vacio) = true
| comparar(x::xs, ys) = if buscar_lista(x, ys) then comparar(xs, ys) else false;

3. Estructura de Datos: Tabla Hash

Implementación de una tabla hash utilizando listas de pares clave-valor:


datatype tabla = vacia 
| hash of (int * string) list;

// Ejemplo de instancia: [(3, "asd"), (4, "lcdtmAB")];

fun buscar (vacia, x) = false
| buscar(hash[], x) = false
| buscar(hash((r, t)::y), z) = if r = z then true else buscar(hash y, z);

fun agregar(vacia, (a, b)) = hash[(a, b)]
| agregar(hash[], (a, b)) = hash[(a, b)]
| agregar(hash x, (a, b)) = if buscar(hash x, a) then hash x else hash((a, b)::x);

fun eliminar (vacia, x) = vacia
| eliminar(hash[], x) = vacia
| eliminar(hash((w, h)::z), x) = if w = x then hash z else agregar(eliminar(hash z, x), (w, h));

4. Variante de Árbol Binario

Definición alternativa de un árbol con nodos y hojas diferenciadas:


datatype arbol = vacio
| hoja of int
| nodo of arbol * arbol;

// Ejemplos de construcción:
vacio;
hoja(5);
nodo(hoja(5), hoja(7));
nodo(nodo(hoja(5), hoja(7)), hoja(8));

fun contar

fun listar (vacio) = []
| listar(hoja(x)) = [x] 
| listar(nodo(y, z)) = listar(y) @ listar(z);

fun contar([]) = 0
| contar (h::t) = contar(t) + 1;

5. Cola de Prioridades

Implementación de una cola de prioridades basada en una lista de tuplas:


datatype cola = vacio
| work of (int * int) list;

fun agregar ((a, b), vacio) = work[(a, b)]
| agregar((a, b), work[]) = work[(a, b)]
| agregar((a, b), work((z, x)::y)) = if a < z then work((a, b)::(z, x)::y) else agregar ((a, b), work

Entradas relacionadas: