2008-11-13 15 views
10

Supongamos que estamos atravesando un gráfico y queremos determinar rápidamente si un nodo se ha visto antes o no. Tenemos algunas precondiciones establecidas.Búsqueda rápida de elementos para un lenguaje funcional (Haskell)

  1. nodos han sido marcadas con números enteros valores 1..N
  2. Graph se implementa con nodos que tiene una lista de adyacencia
  3. Cada valor entero de 1..N se produce en el gráfico, que es de tamaño N

¿Alguna idea para hacer esto de una manera puramente funcional? (No se permiten tablas ni matrices Hash).

Quiero una estructura de datos con dos funciones trabajando en ella; agregar (agrega un entero encontrado) y buscar (verifica si se ha agregado un entero). Ambos deberían tomar preferentemente O (n) tiempo amortizado para N repeticiones.

¿Esto es posible?

Respuesta

8

Puede usar un Data.Set. Agregue un elemento creando un nuevo conjunto desde el anterior con insert y pase el nuevo conjunto. Busca si un elemento es miembro del conjunto con member. Ambas operaciones son O (log n).

Quizás, podría considerar usar una mónada de estado para enhebrar el paso del conjunto.

+0

Supongo que Data.Set dará un rendimiento logarítmico o cuasi-constante en AddToSet y miembro, en comparación con el rendimiento esperado en tiempo constante con tablas hash. –

+0

Chris, tienes razón. Las operaciones de inserción y búsqueda de datos son O (log n). – namin

+3

Si sus enteros son lo suficientemente pequeños para el tipo Int, puede usar Data.IntSet, que es la versión optimizada de Set. – mattiast

1

La búsqueda eficiente de elementos en lenguajes funcionales es bastante difícil. Data.Set (como se muestra arriba) se implementa usando un árbol binario que se puede construir de una manera puramente funcional proporcionando operaciones de búsqueda en O (log n). HashTables (que no son puramente funcionales) tendrían O (1).

0

Creo que Data.BitSet podría ser O (n).

0

Eche un vistazo a judy hashtables, si no le importa envolver su código en la mónada IO.

Cuestiones relacionadas