¿Cómo se implementa la estructura de datos establecida en C?

Depende de si desea implementar un conjunto ordenado de objetos o un conjunto desordenado de objetos.

Un conjunto es una estructura de recopilación de datos que almacena ciertos valores de manera que los valores no se repiten. Dependiendo de si estos valores se almacenan en un orden o no, el conjunto se denomina conjunto ordenado o conjunto no ordenado. Es una implementación del concepto matemático de conjunto finito.

Implementación básica solo para tener una idea (no se recomienda para ningún caso de uso real)

Puede usar una matriz dinámica (ampliable) o una lista vinculada e insertar un nuevo objeto al final si aún no está disponible. El costo de inserción, eliminación y búsqueda de un elemento para dicho conjunto es O (N) tanto en el promedio como en el peor de los casos. Esta es una implicación de conjunto desordenada y la idea se amplía en hash set para que sea utilizable para resolver problemas de la vida real.

+ Extremadamente fácil de implementar

– El tiempo de acceso es muy alto, por lo que no se puede utilizar en la mayoría de los escenarios del mundo real.

Conjunto ordenado

Debido a que almacena los objetos en orden, puede encontrar si un objeto ya existe o no usando divide y vencerás en el tiempo O (log N). Dichos conjuntos se pueden implementar utilizando un árbol de búsqueda binaria autoequilibrado, por ejemplo, árbol Rojo-negro o Treap. Se recomienda el primero porque garantiza que el árbol tenga una altura equilibrada.

El costo de inserción, eliminación y búsqueda de un elemento para dicho conjunto es O (Log N) tanto en el promedio como en el peor de los casos.

+ Compacto (en comparación con otra implementación de conjunto)

+ Puede recorrer el conjunto para obtener contenidos en orden ordenado.

– La complejidad del tiempo de acceso es O (log N)

Conjunto desordenado (también conocido como conjuntos de hash)

Como dice el otro nombre, generalmente se implementan (casi siempre) como tablas hash. Si se utilizan buenas funciones hash y el tamaño de la tabla es correcto (factor de carga), puede esperar un tiempo O (1) para la inserción, eliminación y búsqueda de un elemento. Por lo general, se implementa tomando una matriz (llamada tabla hash) donde cada elemento es una lista vinculada para resolver colisiones.

+ El tiempo de acceso es rápido O (1) para el caso promedio

+ Es más fácil agregar seguridad de hilo en comparación con el conjunto de árboles discutido anteriormente

– No se garantiza el tiempo de búsqueda O (1). En el peor de los casos, puede ser tan peor como O (N)

– No compacto. es decir, el factor de carga casi nunca es 1.


Puede ampliar la idea para multiset (Permitir múltiples registros con el mismo valor clave)

[Paso 1] Para definir un conjunto, debe definir el Conjunto universal U. Esto generalmente se puede implementar como una matriz de X donde X es el tipo de datos de los miembros del conjunto.

[Paso 2] A continuación, cada conjunto se puede definir identificando qué elementos pertenecen al conjunto y cuáles no. Para esto, necesitamos una matriz de valores booleanos O una matriz de valores int en una implementación simple.

[Alternativa] Si el número de elementos en el Conjunto universal U es pequeño y menor que el número de bits en algún tipo de entero sin signo de su compilador de C, digamos 40 o 64, etc., podemos usar una representación de mapa de bits para los conjuntos (aquí un ¡La variable entera única representará un conjunto completo!). Un valor de bit de 0 que representa “elemento no en el conjunto” y 1 que representa “elemento pertenece al conjunto”. Cuando podemos hacer esto, obtenemos una representación altamente eficiente donde podemos realizar “operaciones de conjunto” utilizando los “operadores bit a bit” de C. Por ejemplo, una unión de conjunto es simple OR bit a bit.

More Interesting

¿Por qué la recursión me causa tantos problemas?

¿Hay alguna prueba de que los algoritmos de clasificación no pueden tener una complejidad mejor que O (Nlog (N))?

¿Por qué se han desarrollado los algoritmos de ordenamiento O (n ^ 2) (como el ordenamiento por inserción y el ordenamiento por burbuja) y para qué se utilizan?

¿Debería un ingeniero que no sea CS aprender programación, algoritmos y estructuras de datos?

¿Qué algoritmo usa Arrays.sort?

¿Qué tipo de algoritmos de visión por computadora se utilizan en los robots industriales?

¿Qué es un contador Loglog?

¿Puedo aplicar la optimización de algoritmos genéticos en un problema multivariable con 2 entradas frente a 2 salidas?

¿Qué algoritmo se usa para comprimir todos los tipos de archivos (es decir, archivos de imagen, texto, audio, video)?

¿Qué estructura de datos debo usar si estoy diseñando un algoritmo que clasifica las páginas por relevancia de acuerdo con la cantidad de veces que se ven?

¿Cuáles son algunos algoritmos interesantes que no tienen implementación conocida hasta la fecha?

Dado un componente fuertemente conectado, ¿puede determinar en tiempo lineal si la eliminación de un solo nodo convierte el SCC en un gráfico acíclico dirigido?

Cómo aprender a analizar algoritmos

¿Qué podemos aprender del algoritmo de 'optimización de colonias de hormigas' para mejorar nuestras habilidades de resolución de problemas?

¿Cuáles son algunos de los buenos libros sobre Algoritmos de aprendizaje automático de árbol de decisión?