2010-03-29 19 views
7

Quiero implementar un conjunto en C. ¿Está bien utilizar una lista vinculada, al crear el SET, o debería usar otro enfoque?¿Cómo implementar un conjunto?

¿Cómo se suele implementar su propio conjunto (si es necesario).

NOTA: Si utilizo el enfoque de lista enlazada, probablemente tendrá las siguientes complejidades de Set mis operaciones:

  • init: O (1);
  • destroy: O (n);
  • inserte: O (n);
  • eliminar: O (n);
  • unión: O (n * m);
  • intersección: O (n * m);
  • diferencia: O (n * m);
  • ismember: O (n);
  • issubset: O (n * m);
  • setisequal: O (n * m);

O (n * m) parece que puede ser un poco grande especialmente para datos enormes ... ¿Hay alguna manera de implementar mi Set más eficiente?

+0

Sin saber lo que quiere lograr es difícil de ayudar. Si solo quieres tener una matriz como estructura, entonces Vector es probablemente tu camino a seguir.Supuse que estás usando C++. El STL tiene muchas cosas que te ayudarán. – thecoshman

+2

C++ implementa su clase de conjunto como un árbol binario equilibrado; esa es probablemente una buena opción. –

+4

@thecoshman Como su pregunta fue etiquetada como C, creo que podemos suponer que no está usando C++. –

Respuesta

4

He usado árboles rojos y negros en el pasado para construir juegos.

Aquí están las complejidades de tiempo del artículo de Wikipedia.

espacio O (n)
Buscar O (log n)
Insertar O (log n)
Eliminar O (log n)

+0

¿Puede darme algunas pistas sobre la complejidad de O (n)? –

+0

publicado en la edición –

3

Hay muchas formas de implementar conjuntos. Here son algunos de ellos. Además de MSDN tiene muy buen artículo sobre él.

+0

Gracias por mencionar el artículo de MSDN, artículo muy entretenido. –

2

Como usted ya tiene una lista enlazada en práctica, lo más fácil es a skip list. Si desea utilizar árboles equilibrados, el más fácil en mi opinión es un treap. Estas son estructuras de datos aleatorias, pero en general son tan eficientes como sus contrapartes deterministas, si no más (y una lista de omisiones puede hacerse determinista).

+0

Gracias por mencionar la lista de omisiones (no la conocía). Probablemente lo use en otro contexto. (¡Multumesc!) –

8

Los conjuntos se implementan típicamente como árboles rojo-negro (que requiere que los elementos tengan un orden total), o como una tabla hash de cambio de tamaño automático (que requiere una función hash).

Esto último se implementa normalmente teniendo la tabla doble de tamaño y reinsertando todos los elementos cuando se supera un cierto umbral de capacidad (75% funciona bien). Esto significa que las operaciones de inserción individuales pueden ser O (n), pero cuando se amortizan en muchas operaciones, en realidad es O (1).

Cuestiones relacionadas