Atas pertanyaan tentang penghitungan inversi ini , saya menemukan makalah yang membuktikan batas bawah pada kompleksitas ruang untuk semua algoritma streaming (pasti) . Saya telah mengklaim bahwa batasan ini meluas ke semua algoritma waktu linier. Ini agak berani seperti pada umumnya, algoritma waktu linier dapat melompat-lompat sesuka hati (akses acak) dimana algoritma streaming tidak bisa; harus menyelidiki elemen-elemen secara berurutan. Saya dapat melakukan beberapa lintasan, tetapi hanya terus-menerus banyak (untuk runtime linier).
Karena itu pertanyaan saya:
Dapatkah setiap algoritma linear waktu dinyatakan sebagai algoritma streaming dengan banyak lintasan yang terus-menerus?
Akses acak tampaknya mencegah konstruksi (sederhana) yang membuktikan jawaban positif, tetapi saya belum dapat memberikan contoh balasan.
Bergantung pada model mesin, akses acak bahkan mungkin tidak menjadi masalah, karena runtime. Saya akan tertarik pada jawaban untuk model-model ini:
- Mesin turing, input datar
- RAM, masukan sebagai array
- RAM, masukan sebagai daftar tertaut
Jawaban:
Agar algoritma streaming menjadi bermakna, mereka harus bekerja dengan jumlah ruang kerja yang jauh lebih kecil daripada input itu sendiri. Misalnya, jika Anda mengizinkan jumlah ruang kerja yang sama dengan input, maka Anda dapat dengan mudah menyatakan algoritme apa pun sebagai “algoritme streaming satu-pass” yang pertama-tama menyalin input ke ruang kerja dalam satu pass dan kemudian hanya menggunakan karya tersebut ruang.
Saya pikir itu tipikal untuk membatasi ruang kerja paling banyak polylogarithmic dalam ukuran input ketika berbicara tentang algoritma streaming. Berdasarkan asumsi ini, pemilihan median tidak memiliki algoritma streamingpass O (1) oleh hasil Munro dan Paterson [MP80]: algoritma streaming P- pass untuk seleksi median pada elemen N harus disimpan Ω ( N 1 / P ) elemen. Di sisi lain, pemilihan median memiliki algoritma linear-time deterministik yang terkenal [BFPRT73].
[BFPRT73] Manuel Blum, Robert W. Floyd, Vaughan Pratt, Ronald L. Rivest, dan Robert E. Tarjan. Batas waktu untuk seleksi. Jurnal Ilmu Komputer dan Sistem , 7 (4): 448–461, Agustus 1973. DOI: 10.1016 / S0022-0000 (73) 80033-9
[MP80] J. Ian Munro dan Mike S. Paterson. Seleksi dan penyortiran dengan penyimpanan terbatas. Theoretical Computer Science , 12 (3): 315–323, November 1980. DOI: 10.1016 / 0304-3975 (80) 90061-4
sumber
Dalam model streaming, Anda hanya diperbolehkan menyimpan data ekstra konstan atau poli-logaritmik saat memindai melalui input. Jika Anda mempertimbangkan algoritma waktu linear
yang mengikuti paradigma divide and conquer , Anda perlu menyimpan lebih banyak informasi dan / atau Anda harus memindai data Anda sebanyak kedalaman rekursi.
Salah satu contoh adalah algoritma DC3 untuk membangun array sufiks teks (diberikan sebagai array dalam model RAM). Untuk membangun susunan sufiks, Anda mengelompokkan karakter ke dalam triplet, sehingga Anda mendapatkan teks dengan karakter super baru . Anda dapat melakukan ini dengan offset 0 , 1 , 2 , yang menghasilkan tiga teks baru T 1 , T 2 , T 3 . Menariknya, Anda dapat menghitung array sufiks jika Anda memiliki array sufiks T 1 ⋅ T 2 dalam waktu linier. Oleh karena itu kebutuhan algoritmaT 0,1,2 T1,T2,T3 T1⋅T2
waktu. Rekursi ini diselesaikan dengan jelas untuk . Saya tidak melihat bagaimana ini dapat diubah menjadi algoritma streaming.t(n)=O(n)
Contoh lain yang terkenal adalah algoritma pemilihan linear-time klasik .
sumber
sumber
Bahkan dalam definisi paling sederhana dari "algoritma streaming" (sebuah algoritma yang, setelah setiap iterasi tambahan pada sumber, menghasilkan pengetahuan langsung dari potongan tambahan selanjutnya dari hasil), saya dapat memikirkan beberapa algoritma linier yang tidak berperilaku seperti itu. Algoritma Hashing adalah yang besar; FNV-1a linier dengan jumlah byte di sumber, tetapi kami tidak tahu bagian dari hash terakhir sampai sumber penuh telah diproses.
RadixSort alias BucketSort adalah O (N) (secara teknis O (NlogM) di mana M adalah nilai maksimum dalam item N, yang dianggap kecil), dan harus dijalankan secara keseluruhan untuk menjamin bahwa setiap item individual ada di tempat akhirnya.
Untuk menjadi algoritma "streaming", yang paling sederhana, suatu algoritma harus memiliki dua properti berikut, yang keduanya tidak terikat waktu:
Oleh karena itu, kelas utama dari algoritma yang melakukan streaming adalah algoritma yang melakukan "proyeksi" (transformasi tambahan dari satu input ke output X> 0).
sumber