No hay un resumen disponible de la notación O grande para operaciones en las estructuras de datos más comunes, incluidas matrices, listas vinculadas, tablas hash, etc.¿Cuál es la complejidad del tiempo de indexación, inserción y eliminación de estructuras de datos comunes?
Respuesta
Supongo que comenzaré con la complejidad de tiempo de una lista vinculada:
Indexing ----> o (n)
Inserción/Eliminación en el extremo ----> o (1) o o (n)
Inserción/Eliminación en medio ---> o (1) con el iterador O (n) sin
La complejidad del tiempo para la inserción en el dep final finaliza si tiene la ubicación del último nodo, si lo hace, sería O (1) de otra manera tendrá que buscar a través de la lista vinculada y la complejidad del tiempo saltará a O (n).
amortizado Big-S para tablas hash:
- Insertar - O (1)
- Recuperar - O (1)
- Eliminar - O (1)
Nota que hay es un factor constante para el algoritmo hash, y la amortización significa que el rendimiento real medido puede variar drásticamente.
árboles¿Qué significa Big-O al insertar N elementos en el conjunto hash? Pensar dos veces. –
Amortizado, es N. Sin embargo, puede tener problemas para redimensionar la matriz de respaldo. Además, depende de su método para manejar conflictos. Si encadenas y tu algoritmo de inserción de encadenamiento es N (como en la cola de una lista con un solo enlace), puede convertirse en N^2. –
Esto está mal. Tiene la definición incorrecta de "amortizado". Amortizado significa el tiempo total para hacer un conjunto de operaciones dividido por el número de operaciones. El peor rendimiento del caso para insertar N elementos es definitivamente O (N^2), no O (N). Entonces las operaciones anteriores siguen siendo el O (n) peor caso, amortizado o no. Lo está confundiendo con la complejidad del tiempo "promedio" asumiendo una cierta distribución de funciones hash, que es O (1). – newacct
rojo-negro:
- Insertar - O (log n)
- Recuperar - O (log n)
- Eliminar - O (log n)
Tenga en Tenga en cuenta que a menos que esté escribiendo su propia estructura de datos (por ejemplo, la lista vinculada en C), puede depender drásticamente de la implementación de las estructuras de datos en su idioma/marco de referencia. Como ejemplo, eche un vistazo al benchmarks of Apple's CFArray over at Ridiculous Fish. En este caso, el tipo de datos, un CFArray del marco de CoreFoundation de Apple, en realidad cambia las estructuras de datos dependiendo de cuántos objetos hay realmente en la matriz, cambiando de tiempo lineal a tiempo constante en alrededor de 30,000 objetos.
Esto es realmente una de las cosas bellas acerca de la programación orientada a objetos - que no es necesario saber cómo funciona, solo que funciona, y el 'cómo funciona' puede cambiar dependiendo de los requerimientos .
información sobre este tema ya está disponible en la Wikipedia en: Search data structure
+----------------------+----------+------------+----------+--------------+
| | Insert | Delete | Search | Space Usage |
+----------------------+----------+------------+----------+--------------+
| Unsorted array | O(1) | O(1) | O(n) | O(n) |
| Value-indexed array | O(1) | O(1) | O(1) | O(n) |
| Sorted array | O(n) | O(n) | O(log n) | O(n) |
| Unsorted linked list | O(1)* | O(1)* | O(n) | O(n) |
| Sorted linked list | O(n)* | O(1)* | O(n) | O(n) |
| Balanced binary tree | O(log n) | O(log n) | O(log n) | O(n) |
| Heap | O(log n) | O(log n)** | O(n) | O(n) |
| Hash table | O(1) | O(1) | O(1) | O(n) |
+----------------------+----------+------------+----------+--------------+
* The cost to add or delete an element into a known location in the list (i.e. if you have an iterator to the location) is O(1). If you don't know the location, then you need to traverse the list to the location of deletion/insertion, which takes O(n) time.
** The deletion cost is O(log n) for the minimum or maximum, O(n) for an arbitrary element.
Hay una cierta confusión en la eliminación en la matriz. Algunos dicen: toma O (n) tiempo para encontrar el elemento que desea eliminar. Luego, para eliminarlo, debe desplazar todos los elementos a la derecha un espacio a la izquierda. Esto también es O (n), por lo que la complejidad total es lineal. Y también dicen algunos, no es necesario llenar el espacio en blanco, se puede llenar con el último elemento. –
Además, ¿qué ocurre si queremos insertar un elemento en una matriz en una primera posición? ¿Eso no causaría que toda la matriz se moviera? Entonces, ¿no debería O (n) ser el tiempo de inserción de una matriz? –
Tenga en cuenta que debe * distinguir * entre una ** ordenada ** y una ** matriz ordenada **. Cambiar/llenar los elementos de la matriz es solo una preocupación de una matriz ordenada, por lo tanto, la complejidad lineal en lugar de 'O (1)' en una matriz no ordenada. Con respecto a sus ideas sobre cómo encontrar el elemento que desea eliminar, nuevamente debe distinguir entre ** encontrar ** un elemento y ** eliminar **. La complejidad del borrado supone que ya conoce el elemento que va a eliminar, por eso tiene 'O (n)' en una matriz ordenada (requiere desplazamiento) y 'O (1)' en una matriz no ordenada. – Mobiletainment
- 1. Comparaciones de complejidad entre estructuras de datos
- 2. ¿Cuál es la complejidad del tiempo de cruce de árboles?
- 3. ¿Cuál es la complejidad de tiempo del método java.util.Collections.sort()?
- 4. ¿Cuál es la complejidad del tiempo de ejecución de las funciones de la lista de python?
- 5. Implementación de la eliminación de subexpresiones comunes
- 6. complejidad de set :: inserción
- 7. Complejidad del tiempo de consulta de la base de datos
- 8. ¿Cuál es la complejidad de tiempo de LinkedList.getLast() en Java?
- 9. ¿Cuál es la complejidad de tiempo de .NET list.sort()
- 10. ¿Cuál es la complejidad de tiempo de HashMap.containsKey() en java?
- 11. ¿Cuál es la complejidad de tiempo de HTML DOM búsquedas
- 12. Complejidad del tiempo de la tabla hash
- 13. Complejidad del tiempo del algoritmo de Euclides
- 14. Lo mejor de las estructuras de datos de indexación para series de tiempo extremadamente grandes
- 15. Complejidad del tiempo de consulta SQL
- 16. Complejidad del tiempo de la potencia()
- 17. Establecer el tiempo y la complejidad de la velocidad
- 18. TreeMap - Complejidad del tiempo de búsqueda
- 19. ¿Pruebas de unidades de referencia para estructuras de datos comunes?
- 20. Complejidad del tiempo del algoritmo de Prim
- 21. ¿Cuál es la complejidad del tiempo de iteración a través de un estándar :: set/std :: map?
- 22. ¿Cuál es la complejidad del tiempo de ejecución de una instrucción switch?
- 23. Gallop ¿Complejidad del tiempo de búsqueda?
- 24. ¿Cuál es la complejidad del tiempo para hacer estallar elementos de la lista en Python?
- 25. ¿Cuál es la complejidad del tiempo A * y cómo se deriva?
- 26. Complejidad del tiempo del algoritmo de Fleury
- 27. ¿Cuál es la complejidad de OrderedDictionary?
- 28. ¿Cuál es la complejidad de set_intersection en C++?
- 29. ¿La complejidad del tiempo de las operaciones del conjunto python?
- 30. Complejidad del tiempo de ejecución de la tabla hash (insertar, buscar y eliminar)
La complejidad de la inserción en el medio ** ** de una lista vinculada singularmente es O (n). Si la lista está doblemente enlazada y sabe que el nodo que desea insertar en ella es O (1) –
, olvidé agregar la parte del iterador. Gracias por señalarlo –
@Rob: puede ser una tonta duda, pero no soy capaz de entender cómo se puede insertar en la lista doblemente enlazada en O (1)? si tengo '1 4' y si tengo que insertar 5 entre 3 y 4, y todo lo que tengo es un puntero al nodo principal (es decir, 1) tengo que atravesar en O (n). ¿Me estoy perdiendo de algo? – Bhushan