Tengo un problema simple: reunir objetos en una lista y recorrer esta lista al revés. Parece bastante fácil, pero este código es parte del cálculo de alta carga. Es bastante natural usar conses porque toma O (1) al agregar un nuevo elemento y en el acceso secuencial. Pero, ¿qué debo hacer si necesito una lista efectiva de doble enlace para atravesarla fácilmente en ambas direcciones? Use (reversa)? Toma O (n) la memoria y el tiempo, por lo que tomará O (n^2) en mi caso (que es realmente malo). ¿Usar (último) o (agregar)? La misma historia: O (n). Realmente no entiendo dónde encontrar (excepto el código fuente) información sobre la complejidad computacional de las funciones estándar de la biblioteca. ¿Depende de la implementación? ¿Y qué debo hacer para la implementación de varias estructuras de datos estándar? ¿Hay alguna guía sobre el uso de conses de manera efectiva?Estructuras de datos en lisp
Respuesta
Si usa Common Lisp, puede usar vectores en su lugar. Los vectores pueden tener un puntero de relleno y/o pueden ser ajustables. Entonces puedes usar el vector-push para agregar elementos a un vector. El puntero de relleno crecerá. Si el vector es ajustable, también será más grande si es necesario. Como los vectores son matrices unidimensionales, puede acceder a los elementos con un índice a su gusto.
Consulte las opciones de MAKE-ARRAY para crear dicho vector.
VECTOR-PUSH y VECTOR-PUSH-EXTEND son las funciones para agregar elementos.
Como veo **: ajustable ** solo permite ** ajustar-matriz **. Cuando ** vector-push ** alcanza el conjunto de matrices, devuelve ** NIL ** en lugar de la asignación automática de espacio adicional. – lumberjack
Ok. Ahora veo. ** VECTOR-PUSH-EXTEND ** extiende el vector en tiempo y espacio constantes. Gracias. – lumberjack
Si hace (reverse)
una vez y luego recorre la lista invertida en orden secuencial, el total debe ser solo O (2n) tiempo (O (n) para la configuración, y luego otra O (n) para atravesar) y O (n) memoria.
Una lista doblemente enlazada no es terriblemente complicada. Como usted sabe, se hace una lista de las células de cons donde el automóvil apunta al objeto que el cdr apunta a la siguiente celda de cons en la lista.
Una manera de hacer una lista doblemente enlazada es tener lugar el punto de CDR a otra celda contras cuya CDR puntos a la siguiente celda contras de la lista y cuyo automóvil puntos a la célula desventajas anteriores la lista. Luego usa cddr para avanzar y cdar para retroceder.
No sé que las funciones de la biblioteca estándar tienen cualquier complejidad garantizada. A menos que la especificación especifique, sería definido por la implementación.
- 1. Estructuras de datos autorreferenciales en Lisp/Scheme
- 2. Estructuras de datos en Python
- 3. Delphi estructuras de datos
- 4. Estructuras de datos pregunta
- 5. C# estructuras de datos
- 6. Erlang estructuras de datos persistentes
- 7. Algoritmos y estructuras de datos
- 8. Estructuras de datos Trie - Java
- 9. Estructuras de datos para bioinformática
- 10. Estructuras de datos complejas Redis
- 11. Estructuras de datos persistentes en Scala
- 12. Estructuras de datos avanzadas en la práctica
- 13. Estructuras de datos funcionales en C++
- 14. Estructuras de datos importantes en la búsqueda
- 15. estructuras de datos fundamentales en C#
- 16. Estructuras de datos persistentes en C++
- 17. Guardar estructuras de datos en C#
- 18. Estructuras de datos espaciales en C
- 19. Estructuras de datos funcionales en Java
- 20. Lisp seguridad/validación de datos
- 21. Algoritmos de aprendizaje y estructuras de datos Fundamentos
- 22. ¿cómo puedo convertir estructuras de datos ruby a estructuras de datos javascript con .js.erb?
- 23. biblioteca de estructuras de datos de JavaScript
- 24. ¿Cuál es el equivalente idiomático de las estructuras C en Lisp?
- 25. Principales estructuras de datos de JavaScript
- 26. Algoritmo de mosaico/Estructuras de datos?
- 27. Definición de estructuras de datos recursivas
- 28. ¿Comparar estructuras de dos bases de datos?
- 29. Estructuras de datos equivalentes de contenedores STL
- 30. estructuras de datos cíclicos inmutables Generación de
[Estructuras de Datos Puramente Funcionales] (http://www.amazon.com/dp/0521663504/) es probablemente una buena lectura. –