Inilah masalah yang sudah diketahui.
Diberikan array dari bilangan bulat positif, menghasilkan bilangan bulat positif terkecil tidak dalam array.
Masalah dapat diselesaikan dalam ruang dan waktu: membaca array, keep track di ruang apakah terjadi, memindai untuk elemen terkecil.
Saya perhatikan Anda dapat bertukar ruang untuk waktu. Jika Anda memiliki hanya memori, Anda dapat melakukannya dalamputarandan mendapatkan waktu. Dalam kasus khusus, jelas ada algoritma waktu kuadrat ruang konstan.
Pertanyaanku adalah:
Apakah ini tradeoff yang optimal, yaitu apakah ? Secara umum, bagaimana seseorang membuktikan batasan semacam itu?
Asumsikan model RAM, dengan aritmatika terbatas dan akses acak ke array di O (1).
Inspirasi untuk masalah ini: tradeoff ruang-waktu untuk palindrom dalam model satu-pita (lihat misalnya, di sini ).
Jawaban:
Ini dapat dilakukan dalam operasi kataO(nlogn) dan O(1) kata memori (masing-masing memori O(nlog2n) dan memori O(logn) dalam model RAM bit-level). Memang, solusinya akan didasarkan pada pengamatan berikut.
Katakanlah adan0 bahkan dan n1 angka ganjil dalam rentang [1,n+1] (sehingga n0≈n1 dan n0+n1=n+1 ). Kemudian ada b∈{0,1} sedemikian rupa sehingga ada paling banyak nilai nb−1 dengan paritas b pada input. Memang, jika tidak ada setidaknya n0 bahkan dan setidaknya n1 nilai aneh di input, yang berarti bahwa setidaknya ada n0+n1=n+1 nilai dalam input, kontradiksi (hanya ada n dari mereka). Ini berarti bahwa kita dapat terus mencari nomor yang hilang hanya di antara angka ganjil atau genap saja. Algoritma yang sama dapat diterapkan pada bit notasi biner yang lebih tinggi juga.
Jadi algoritma kami akan terlihat seperti itu:
Misalkan kita sudah sekarang bahwa hanya ada nilaix dalam input dengan modulo 2b sisanya sama dengan r∈[0,2b) tetapi ada setidaknya x+1 angka dalam rentang [1,n+1] yang memiliki sisanya r modulo 2b (pada awalnya kita tahu pasti untuk b=0,r=0 ).
Katakanlah ada nilaix0 pada input dengan sisa r modulo 2b+1 dan nilai x1 pada input dengan sisa r+2b modulo 2b+1 (kita dapat menemukan angka-angka ini dalam sekali jalan melalui input). Jelas, x0+x1=x . Selain itu, karena ada setidaknya x+1 angka dalam input dengan sisa r modulo 2b , setidaknya satu dari pasangan(r,b+1),(r+2b,b+1) memenuhi persyaratan langkah1 .
Kami telah menemukan angka yang hilang ketika2b⩾n+1 : hanya ada satu angka dalam rentang [1,n+1] yang mungkin memiliki sisa r modulo 2b ( r sendiri jika berada dalam kisaran), jadi ada pada sebagian besar nilai nol dalam input yang memiliki sisa seperti itu. Jadi r memang hilang.
Jelas, algoritme berhenti pada langkah-langkahO(logn) , masing-masing membutuhkan waktu O(n) (satu kali melewati array input). Selain itu, hanya O(1) kata memori yang diperlukan.
sumber
Jika saya memahami definisi Anda, ini dapat dilakukan dalam waktu linier dengan ruang konstan. Ini jelas merupakan batas terendah, karena kita harus setidaknya membaca seluruh input.
Jawaban yang diberikan dalam pertanyaan ini memuaskan.
Tidak mungkin menjalankan ini dengan sedikit waktu atau ruang, dan menambahkan waktu atau ruang tambahan tidak berguna, jadi tidak ada pertukaran ruang-waktu di sini. (Amati bahwa , jadi pengorbanan yang Anda amati tidak berlaku asimptotik, dalam hal apa pun.)n=O(n/k)
Dalam hal pertanyaan umum Anda, saya tidak tahu teorema bagus apa pun yang akan membantu Anda membuktikan pengorbanan ruang-waktu. Pertanyaan ini tampaknya menunjukkan bahwa tidak ada jawaban yang mudah diketahui. Pada dasarnya:
tidak diketahui, dan jawaban yang kuat akan memecahkan banyak masalah terbuka (terutama tentang SC), menyiratkan bahwa tidak ada solusi yang mudah.
EDIT: Ok, dengan pengulangan (tapi aku masih mengasumsikan bahwa dengan masukan dari ukuran jumlah maksimum yang mungkin adalah n + 1 ).n n+1
Perhatikan bahwa algoritma kami harus dapat membedakan antara setidaknya jawaban yang mungkin. Misalkan pada setiap melewati data kita bisa mendapatkan paling banyak k potongan data. Maka kita akan memerlukan n / k pass untuk membedakan semua jawaban. Dengan asumsi k = n / s maka kita jalankan di nn k n/k k=n/s waktu. Jadi saya pikir ini membuktikan apa yang Anda inginkan.nn/sn=sn
Kesulitannya adalah dalam menunjukkan bahwa setiap kali melalui kita hanya mendapatkan bit. Jika Anda menganggap bahwa satu-satunya operasi hukum kami adalah =, maka kami baik-baik saja. Namun, jika Anda mengizinkan operasi yang lebih rumit, maka Anda akan dapat memperoleh lebih banyak informasi.k
sumber