Apa perbedaan antara aliran dan antrian? Mereka berdua memiliki konsep elemen yang teratur, tetapi cenderung memiliki implementasi yang berbeda dan kosakata yang berbeda dari 'sisipkan' / 'ekstrak' (stream) vs. 'enqueue' / 'dequeue' (antrian). Apakah ini bisa dipertukarkan? Apakah mereka menyarankan konsep atau pola yang berbeda? Jika demikian, apa perbedaannya?
data-structures
elliot42
sumber
sumber
Jawaban:
Sebuah aliran tidak benar-benar struktur data seperti itu (konseptual), tetapi urutan sinyal koheren dikodekan secara digital (paket data atau paket data) yang digunakan untuk mengirimkan atau menerima informasi". Jadi pada dasarnya urutan data.
Sebuah antrian adalah mekanisme FIFO sederhana yang memungkinkan Anda untuk menambahkan item ke belakang antrian atau mengambil dari depan.
Streaming selalu memiliki sumber, mis. File, lokasi jaringan, dll. Antrian tidak mengandung data apa pun.
Jadi pada dasarnya mereka sangat berbeda dalam konsep dan seperti yang ditunjukkan Mason, mereka digunakan secara berbeda.
sumber
yes(1)
adalah string bawaan yang tertanam. Jalankan dengan argumen, itu pun yang disediakan argumen.(stream)
mengembalikan aliran kosong. Juga, jawaban ini salah, stream adalah struktur data, stream mungkin tidak memiliki sumber, dan stream tidak mengandung data apa pun, mereka mungkin nihil atau nol atau daftar kosong. Lihat SRFI-41 untuk info lebih lanjut.Perbedaan mendasar adalah cara mereka digunakan. Dalam aliran, Anda biasanya hanya menggunakan satu sisi operasi: Anda membuka aliran untuk membaca, atau menulis, tetapi tidak keduanya. Sedangkan dengan antrian, Anda meletakkan barang dan melepasnya.
Juga, antrian sangat ketat tentang urutan di mana Anda meletakkan sesuatu dan melepasnya, sementara aliran sering (tetapi tidak selalu) mendukung
Seek
operasi, terutama jika Anda membaca dari mereka.sumber
FileStream
dapat dibuka dalamReadWrite
mode.Dalam pengalaman saya, aliran adalah urutan byte yang diproduksi / dikonsumsi pada tingkat yang sering ditentukan oleh data dalam aliran. Misalnya, aliran data MPEG akan memiliki bingkai header yang menggambarkan apa urutan byte berikutnya dan berapa banyak yang perlu dikonsumsi. Serialisasi biner dari suatu dokumen akan serupa. Ini tidak selalu menggambarkan diri sendiri: menulis ke STDOUT dapat dilakukan dengan cara yang bijaksana, tetapi mungkin berupa data yang bisa dibaca secara manusia / tidak dapat diurai.
Sebaliknya, antrian biasanya dari jenis objek yang terkenal (atau objek yang mendukung antarmuka) yang dikonsumsi secara keseluruhan. Contohnya mungkin berupa antrian pekerjaan basis data yang diproses oleh sejumlah pekerja basis data.
sumber
Perbedaan antara aliran dan antrian adalah cara laju data dikontrol:
dalam antrian, pengirim menyesuaikan dengan kecepatan pembaca. Pengirim memutuskan apa yang harus dilakukan jika antrian penuh: menunggu ketersediaan antrian atau membuang data.
dalam aliran, pembaca menyesuaikan dengan kecepatan pengirim, Pembaca memutuskan apa yang harus dilakukan jika data baru tiba sebelum yang lama dikonsumsi.
Dengan perspektif itu, stream karakter seperti pipa Unix tidak akan memenuhi syarat sebagai stream tetapi sebagai antrian.
sumber
Jika kita berpikir secara lebih visual tentang bagaimana kata-kata tersebut umum digunakan , kita dapat menghindari kekacauan penggunaan khusus oleh bahasa dan implementasi tertentu, sehingga istilah-istilah ini sebenarnya dapat berarti sesuatu:
Itulah maksud dari istilah-istilah ini. Itu adalah metafora. (Seperti yang lainnya) (Ssst! Anda akan merusak ceritanya!)
sumber
Antrian adalah konsep tingkat yang lebih tinggi daripada aliran. Elemen dasar dari antrian adalah pesan / objek, yang merupakan struktur data yang koheren (biasanya diketik) yang dapat ditafsirkan oleh konsumen sendiri. Di sisi lain, di dasar aliran , ada (biasanya ukuran tetap) bit / byte / karakter, yang, dengan sendirinya, biasanya tidak berarti bagi aplikasi. Urutan karakter-karakter ini dapat membentuk "pesan", tetapi aliran API membiarkannya ke aplikasi untuk membagi urutan karakter menjadi potongan-potongan yang masuk akal.
Aliran API biasanya juga memungkinkan sebagian membaca dan menulis, jika buffer aliran penuh dan pihak lain tidak membaca / menulis; aplikasi yang menangani antrian biasanya mengharapkan antrian untuk menangani ini secara internal.
Antrian dapat diterapkan di atas aliran, ini dilakukan dengan menerapkan pembingkaian pesan. Misalnya, TCP menyediakan antarmuka aliran, HTTP dibangun di atas TCP, dan menambahkan framing pesan menggunakan Content-Length / chunked transfer encoding. Pengguna API Koneksi HTTP diabstraksikan dari berurusan dengan pemisahan aliran koneksi HTTP ke permintaan HTTP.
Di sisi lain, biasanya, kurang masuk akal untuk mengimplementasikan stream API di atas antrian, karena penanganan framing pesan menambah overhead yang tidak perlu.
sumber
Dalam bahasa pemrograman fungsional (misalnya Scala), dan mungkin bahasa lain juga, stream benar-benar lebih mirip daftar fungsional dan mereka adalah antrian. Saya harus mencatat, bagaimanapun, antrian benar-benar dapat diimplementasikan menggunakan sepasang daftar . Dalam Scala dan mungkin di tempat lain, Stream hanyalah Daftar malas - lebih khusus, ekor daftar adalah a
lazy val
.Aliran fungsional dapat berbagi beberapa kesamaan dengan antrian, sebagai lawan dari, daftar, di mana Anda dapat menggunakannya dengan cara yang Anda tidak menyimpan referensi ke kepala aliran - tetapi Anda harus berhati-hati: https: // stackoverflow.com/a/5159356/3096687 . Ini agak analog dengan panggilan dequeue ke antrian (meskipun dalam kasus streaming, Anda melakukannya secara implisit: http://daily-scala.blogspot.com/2010/01/streams-2-stream-construction.html ).
sumber
Stream adalah konsep / kerangka kerja untuk menghasilkan dan mengkonsumsi urutan data tak terbatas secara serial atau paralel atau massal. Que adalah struktur data melalui mana aliran dapat diimplementasikan. seperti daftar atau seq di mana aliran dapat diimplementasikan.
sumber