¿Cuál es la diferencia entre una secuencia y una cola? Ambos tienen el concepto de un conjunto ordenado de elementos, pero tienden a tener implementaciones diferentes y un vocabulario diferente de 'insertar' / 'extraer' (secuencias) frente a 'enqueue' / 'dequeue' (cola). ¿Son estos intercambiables? ¿Sugieren diferentes conceptos o patrones? Si es así ¿Cuáles son las diferencias?
data-structures
elliot42
fuente
fuente
Respuestas:
Una secuencia no es realmente una estructura de datos como tal (conceptualmente), sino una secuencia de señales coherentes codificadas digitalmente (paquetes de datos o paquetes de datos) que se utilizan para transmitir o recibir información ". Así que, básicamente, una secuencia de datos.
Una cola es un mecanismo FIFO simple que le permite agregar elementos al final de la cola o tomarlos desde el frente.
Las secuencias siempre tienen una fuente, por ejemplo, un archivo, ubicación de red, etc. Una cola no contiene ningún dato inherentemente.
Esencialmente, son bastante diferentes en concepto y, como señaló Mason, se usan de manera diferente.
fuente
yes(1)
es la cadena predeterminada incrustada. Ejecutar con un argumento, es lo que proporcionó el argumento.(stream)
devuelve una secuencia vacía. Además, esta respuesta es incorrecta, una secuencia es una estructura de datos, las secuencias pueden no tener una fuente y las secuencias no contienen ningún dato inherentemente, pueden ser nulas o nulas o la lista vacía. Ver SRFI-41 para más información.La diferencia básica está en la forma en que se usan. En una secuencia, generalmente solo usa un lado de la operación: abre una secuencia para leer o escribir, pero no ambas. Mientras que con una cola, estás poniendo artículos y quitándolos.
Además, las colas son muy estrictas sobre el orden en el que se colocan las cosas y se las quitan, mientras que las secuencias a menudo (pero no siempre) admiten una
Seek
operación, especialmente si está leyendo de ellas.fuente
FileStream
se puede abrir enReadWrite
modoEn mi experiencia, una secuencia es una secuencia de bytes que se producen / consumen a una velocidad determinada a menudo por los datos dentro de la secuencia. Por ejemplo, un flujo de datos MPEG tendrá encabezados de trama que describen qué hace la siguiente secuencia de bytes y cuántos deben consumirse. La serialización binaria de un documento sería similar. No siempre se describe a sí mismo: la escritura en STDOUT se puede hacer de manera inteligente, pero puede tratarse de datos legibles / no analizables.
Por el contrario, una cola suele ser de un tipo de objeto bien conocido (u objetos de soporte de interfaz) que se consumen en su totalidad. Un ejemplo podría ser una cola de trabajos de base de datos que son procesados por varios trabajadores de la base de datos.
fuente
Una diferencia entre una secuencia y una cola es la forma en que se controla la velocidad de datos:
en una cola, el remitente se adapta a la velocidad del lector. El remitente decide qué hacer si la cola está llena: espere la disponibilidad de la cola o deseche los datos.
En una secuencia, el lector se adapta a la velocidad del remitente. El lector decide qué hacer si llegan nuevos datos antes de que se hayan consumido los antiguos.
Con esa perspectiva, las secuencias de caracteres como las canalizaciones de Unix no calificarían como secuencias sino como colas.
fuente
Si pensamos más visualmente sobre cómo se usan comúnmente las palabras , podemos evitar el desorden de usos específicos por parte de lenguajes e implementaciones particulares, de modo que estos términos pueden significar algo:
Esa es la intención de estos términos. Son metáforas. (Como todo lo demás) (¡Shhh! ¡Arruinarás la historia!)
fuente
Una cola es un concepto de nivel más alto que una secuencia. Los elementos base de una cola son un mensaje / objeto, que es una estructura de datos coherente (generalmente escrita) que el consumidor puede interpretar por sí mismo. Por otro lado, en la base de una secuencia , hay bits / bytes / caracteres (generalmente de tamaño fijo) que, por sí solos, generalmente no tienen sentido para la aplicación. Una secuencia de estos caracteres puede componer un "mensaje", pero una API de flujo deja que la aplicación divida la secuencia de caracteres en fragmentos sensibles.
Una API Stream generalmente también permite lecturas y escrituras parciales, si los buffers de flujo están llenos y el otro lado no está leyendo / escribiendo; las aplicaciones que manejan colas generalmente esperan que la cola las maneje internamente.
Se puede implementar una cola en la parte superior de una secuencia, esto se realiza mediante la implementación de la trama del mensaje. Por ejemplo, TCP proporciona una interfaz de flujo, HTTP se construye sobre TCP y agrega el encuadre de mensajes utilizando la codificación Content-Length / transferencia fragmentada. Los usuarios de una API de conexión HTTP no pueden lidiar con la división de la secuencia de conexión HTTP a las solicitudes HTTP.
Por otro lado, por lo general, tiene menos sentido implementar una API de flujo en la parte superior de una cola, ya que el manejo de la trama de mensajes agrega una sobrecarga innecesaria.
fuente
En los lenguajes de programación funcional (p. Ej., Scala), y quizás también en otros lenguajes, las transmisiones son realmente más como listas funcionales y son colas. Sin embargo, debo señalar que las colas pueden implementarse realmente usando un par de listas . En Scala y probablemente en otros lugares, un Stream es solo una lista perezosa; más específicamente, la cola de la lista es a
lazy val
.Las secuencias funcionales pueden compartir algunas similitudes con las colas, en oposición a las listas, en el sentido de que puede usarlas de manera que no mantenga una referencia al encabezado de la secuencia, pero debe tener cuidado: https: // stackoverflow.com/a/5159356/3096687 . Esto es algo análogo a una llamada en cola a una cola (aunque en el caso de una secuencia, lo hace implícitamente: http://daily-scala.blogspot.com/2010/01/streams-2-stream-construction.html )
fuente
Stream es un concepto / marco para producir y consumir una secuencia infinita de datos en serie o en paralelo o en masa. Que es una estructura de datos a través de la cual se puede implementar la secuencia. al igual que list o seq a través del cual se puede implementar la secuencia.
fuente