Solusi 65 byte sebelumnya:
r->{for(int a,b=0,z,i=0;;b=a)if((a=b|1<<(z=r[i++]))==b)return z;}
Solusi baru. 19 byte termasuk untukimport java.math.*;
-8 byte berkat @Nevay
r->{int z,i=0;for(BigInteger c=BigInteger.ZERO;c.min(c=c.setBit(z=r[i++]))!=c;);return z;}
Cobalah online!
Edit
Algoritme dalam program asli saya baik-baik saja, tetapi ukuran statis dari tipe data yang digunakan berarti bahwa itu pecah cukup cepat setelah ukurannya pergi di atas ambang batas tertentu.
Saya telah mengubah tipe data yang digunakan dalam perhitungan untuk meningkatkan batas memori program untuk mengakomodasi ini (digunakan BigInteger
untuk presisi sewenang-wenang alih-alih int
atau long
). Namun, ini membuatnya diperdebatkan apakah ini dianggap sebagai O(1)
kompleksitas ruang atau tidak .
Saya akan membiarkan penjelasan saya di bawah ini tetap utuh, tetapi saya ingin menambahkan bahwa sekarang saya percaya tidak mungkin mencapai O(1)
kompleksitas ruang tanpa membuat beberapa asumsi.
Bukti
Tentukan N
sebagai bilangan bulat sedemikian rupa sehingga 2 <= N
.
Membiarkan S
menjadi daftar yang mewakili serangkaian bilangan bulat acak [x{1}, ..., x{N}]
, di mana x{i}
memiliki kendala 1 <= x{i} <= N
.
Kompleksitas waktu (dalam notasi O-Besar) yang diperlukan untuk beralih melalui daftar ini tepat sekali per elemen O(n)
Tantangan yang diberikan adalah menemukan nilai duplikat pertama dalam daftar. Lebih khusus lagi, kami sedang mencari nilai pertama S
yang merupakan duplikat dari item sebelumnya dalam daftar.
Biarkan p
dan q
jadilah posisi dua elemen dalam daftar sedemikian rupa sehingga p < q
dan x{p} == x{q}
. Tantangan kita menjadi menemukan yang terkecil q
yang memenuhi kondisi tersebut.
Pendekatan yang jelas untuk masalah ini adalah untuk beralih melalui S dan memeriksa apakah kami x{i}
ada di daftar lain T
: Jika x{i}
tidak ada T
, kami menyimpannya di T
. Jika x{i}
ada T
, itu adalah nilai duplikat pertama dan oleh karena itu yang terkecil q
, dan karena itu kami mengembalikannya. Efisiensi ruang iniO(n)
.
Untuk mencapai O(1)
kompleksitas ruang sambil mempertahankan O(n)
kompleksitas waktu, kita harus menyimpan informasi unik tentang setiap objek dalam daftar dalam jumlah ruang terbatas. Karena itu, satu-satunya cara algoritma dapat bekerjaO(1)
kompleksitas ruang adalah jika: 1. N diberi batas atas yang sesuai dengan memori yang diperlukan untuk menyimpan jumlah maksimum dari nilai yang mungkin untuk tipe data terbatas tertentu. 2. Penugasan ulang variabel tidak berubah tunggal dihitung terhadap kompleksitas, hanya jumlah variabel (daftar menjadi beberapa variabel). 3. (Berdasarkan jawaban lain) Daftar ini (atau setidaknya, elemen-elemen dari daftar) dapat berubah, dan tipe data dari daftar tersebut telah ditetapkan sebagai bilangan bulat yang ditandatangani, memungkinkan untuk perubahan dilakukan pada elemen lebih jauh dalam daftar. tanpa menggunakan memori tambahan.
1 dan 3 keduanya membutuhkan asumsi dan spesifikasi tentang tipe data, sementara 2 mensyaratkan bahwa hanya jumlah variabel yang dipertimbangkan untuk perhitungan kompleksitas ruang, daripada ukuran variabel-variabel tersebut. Jika tidak ada asumsi ini yang diterima, mustahil untuk mencapai O(n)
kompleksitas waktu dan juga O(1)
kompleksitas ruang.
Penjelasan
Whoo boy, yang ini butuh waktu lama untuk memikirkan sedikit kekuatan otak.
Jadi, mencari bonus itu sulit. Kita perlu keduanya beroperasi di atas seluruh daftar tepat satu kali dan melacak nilai mana yang sudah kita iterasi tanpa kompleksitas ruang tambahan.
Manipulasi bit memecahkan masalah tersebut. Kami menginisialisasi O(1)
'penyimpanan' kami, sepasang bilangan bulat, lalu iterate melalui daftar, ATAU-bit engan di integer pertama kami dan menyimpan hasil itu ke yang kedua.
Misalnya, jika sudah 1101
, dan kami melakukan operasi ATAU 10
, kami dapat 1111
. Jika kita melakukan ATAU dengan yang lain 10
, kita masih punya 1101
.
Ergo, setelah kami melakukan operasi ATAU dan berakhir dengan nomor yang sama, kami telah menemukan duplikat kami. Tidak ada duplikat dalam array yang menyebabkan program untuk menjalankan dan melemparkan pengecualian.