¿Cuál es la diferencia entre una secuencia y una cola?

13

¿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?

elliot42
fuente
Aparentemente, "corriente" se refiere a diferentes cosas en diferentes contextos. Existen diferencias en las características entre una secuencia de caracteres frente a la interfaz de Windows IStream en COM frente a una secuencia de eventos en arquitectura. ¿Puedes aclarar?
rwong
Un leñador recoge un poco de agua de un arroyo, pero no consume toda el agua. Por lo tanto, existe la sensación de reunir una cantidad de una transmisión sin consumirla por completo. Por otro lado, los elementos en una cola pueden estar agotados.
emallove

Respuestas:

11

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.

Ola de calor
fuente
En realidad, hay una estructura de datos llamada "flujo", con (efectivamente) una lista de datos para consumir, con una función de productor en su cola, invocable si necesita más elementos.
Vatine
El comando 'sí' de Unix parece una secuencia pero no tiene una fuente de datos en particular.
JBRWilkinson
@JBRWilkinson: se ejecuta sin un argumento, la fuente de datos yes(1)es la cadena predeterminada incrustada. Ejecutar con un argumento, es lo que proporcionó el argumento.
Blrfl
Sí, tienes razón: todos los datos tienen que venir de alguna parte. Quizás el punto real aquí es que una cola podría estar vacía y una secuencia, por definición, generalmente no lo está.
JBRWilkinson
2
@JBRWilkinson Ese no es el caso. En Scheme, (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.
niñera
5

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 Seekoperación, especialmente si está leyendo de ellas.

Mason Wheeler
fuente
3
FileStreamse puede abrir en ReadWritemodo
Robert Harvey
2
..y colas prioritarias da opciones sobre el orden
Petter Nordlander
5

En 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.

JBRWilkinson
fuente
5

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.

Mouviciel
fuente
En la transmisión de video adaptativa, el servidor se ajustará a una transmisión de menor fidelidad porque el cliente no está al día.
JBRWilkinson
@JBRWilkinson: en la transmisión de video adaptativa , el servidor solo envía múltiples variantes de una transmisión a diferentes velocidades de bits. Todavía es responsabilidad del cliente elegir entre estas transmisiones.
Mouviciel
Sí, la transmisión HTTP hace eso. Me refería a las videollamadas que son punto a punto y los datos no están codificados previamente. Lo malo, debería haber sido explícito.
JBRWilkinson
La intención de una secuencia de caracteres es que los datos se consuman más o menos a medida que se producen: es un flujo de datos en lugar de un medio para retenerlos. Sabemos que esto no es perfecta, en la práctica, pero desde un punto de vista metafórico se espera para ser verdad: el lector puede procesar el flujo tan rápido como se entra.
5

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:

  • Una fila de personas espera en la fila y son atendidas una por una. Más personas se unen a la cola en la cola. Todos esperan a medida que avanza el servicio y se espera que el tiempo de servicio varíe. Puede hablar de cuántas personas se atienden en total.
  • Una corriente de personas, por ejemplo, que salen de un edificio a través de una puerta, no reciben servicio uno por uno, simplemente pasan el punto de salida a un ritmo más o menos constante. No se esperan demoras y no se toleran bien. Puedes hablar de una tasa de personas: una por segundo.

Esa es la intención de estos términos. Son metáforas. (Como todo lo demás) (¡Shhh! ¡Arruinarás la historia!)


fuente
2

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.

Lie Ryan
fuente
Vale la pena agregar que la API para cola generalmente produce / consume un solo elemento a la vez, mientras que la API de transmisión generalmente produce / consume múltiples "palabras" a la vez. Aunque estoy de acuerdo, la característica definitoria es que una cola de alto nivel y estructurada, mientras que una secuencia es de bajo nivel y sin estructura.
Alexey
0

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 )

bbarker
fuente
-1

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.

usuario3423890
fuente