Las matrices estáticas son de tamaño fijo. Las matrices dinámicas son de tamaño variable y, por lo tanto, son más flexibles. Esta flexibilidad tiene un costo.
Las matrices fijas tienen O (1) inserción, eliminación y lectura. También son trivialmente fáciles de implementar (¡es parte del lenguaje!), Son completamente predecibles con el tiempo y son muy conscientes de la memoria caché. Por lo tanto, al elegir una implementación de matriz alternativa, debe preguntar qué va a renunciar. Eso probablemente consistirá en renunciar a una combinación de:
- Eficiencia de la memoria
- Eficiencia de la CPU
- Caché
- Facilidad de implementación (esto no se puede descartar …)
- Costo de lecturas
- Costo de escrituras
- Costo de eliminaciones
- Previsibilidad del costo a lo largo del tiempo (a medida que mi matriz dinámica crece, ¿cómo va a cambiar su consumo de memoria / CPU de una operación a otra)?
Hay más factores dependiendo de lo que esté haciendo (p. Ej., Simplemente agregue “paralelizabilidad” o “distribuido” a cada uno de estos para obtener un conjunto completamente nuevo de requisitos, y luego algunos …)
- ¿Cuáles son los algoritmos básicos de aprendizaje automático que todo principiante debe saber antes de comenzar el aprendizaje automático?
- ¿Cuáles son los mejores libros sobre algoritmos que usan C ++?
- ¿Qué es lo necesario para dar el tamaño de una matriz en una declaración de matriz?
- ¿Qué son los treaps con claves implícitas?
- ¿Cómo imprimir todos los N dígitos (N es un número par) de un número Torn con una complejidad menor que O (N ^ 2)? ¿Qué algoritmo debo usar?
Por supuesto, la mayor compensación con la que se enfrenta cuando se utilizan la mayoría de las implementaciones de matriz dinámica es la memoria. Cuando haya llenado su matriz, debe seguir creciendo, por lo que la matriz debe asignar más memoria. A menudo, una clase de vector estándar asignará una gran cantidad de memoria que nunca usará. Dado que los cambios de tamaño generalmente ocurren de manera transparente cuando agrega un elemento más de lo que la matriz puede admitir, significa que una sola operación de inserción puede ser significativamente más costosa que otra.
STD :: vector de STL es probablemente la implementación más extendida de arreglos dinámicos en C ++. Aunque los vectores son objetos de matriz dinámica, también tienen la propiedad interesante de que garantizan la contigüidad de la memoria para permitir que los punteros iteren sobre ellos de la misma manera que iterarían sobre una matriz estática. Esta garantía hace que el cambio de tamaño sea especialmente doloroso y potencialmente más costoso, ya que podría tener que copiar la matriz existente si no puede simplemente extender el espacio asignado existente (aunque personalmente no estoy muy claro sobre los detalles de cómo se implementa el cambio de tamaño) ) Ver: http://stackoverflow.com/questio…
Si está interesado en leer más, Wikipedia también tiene referencias a algunas estructuras más interesantes (aunque no necesariamente de uso popular) implementaciones de matrices dinámicas, como árboles hash y vectores de varios niveles: http: //en.wikipedia. org / wiki / Dyn …