Menemukan nilai XOR maksimum dan minimum berturut-turut

8

Diberikan array integer (ukuran maksimum 50000), saya harus menemukan minimum dan maksimum sehingga untuk beberapa , dengan .XX=apap+1aqpqpq

Saya telah mencoba proses ini: untuk semua . Saya pra-menghitungnya dalam dan kemudian nilai untuk beberapa , sedemikian rupa sehingga adalah: . Jadi:sumi=a0a1aiiO(n)Xpq(pq)X=sumqsump1

MinAns=min(p,q) s.t. pqsumqsump1MaxAns=max(p,q) s.t. pqsumqsump1

Tetapi proses ini dari . Bagaimana saya bisa melakukannya dengan lebih efisien?O(n2)

palatok
sumber
1
Sudahkah Anda mempertimbangkan untuk mengurutkan daftar 'jumlah' Anda? Sepertinya nilai yang berdekatan akan lebih cenderung membatalkan banyak bit dan berakhir di dekat 0.
Craig Gidney

Jawaban:

7

Jika adalah bitsize dari bilangan bulat, maka Anda dapat menghitung waktu Maks dalam .kO(nk)

Pada dasarnya, masalahnya adalah, mengingat , bit integer , temukan sehingga maksimum.nkSii,jSiSj

Anda memperlakukan setiap sebagai string biner (melihat representasi biner), dan membuat trie dari string tersebut. Ini membutuhkan waktu .SiO(nk)

Sekarang untuk setiap , Anda mencoba menjalankan pelengkap dalam trie yang Anda buat (mengambil cabang terbaik pada setiap langkah pada dasarnya), menemukan sedemikian rupa sehingga maksimum.SjSjjSjSj

Lakukan ini untuk setiap , dan Anda menemukan jawabannya dalam waktu .jO(nk)

Karena bilangan bulat Anda dibatasi, algoritma ini untuk max pada dasarnya linier, dan begitu pula algoritma untuk min didapat dengan menyortir (karena penyortiran dapat dilakukan dalam waktu linier).

Kebetulan, jika tidak ada batasan, maka Anda dapat mengurangi perbedaan elemen ke versi min.

Aryabhata
sumber
"Pada dasarnya, masalahnya adalah, mengingat n, bilangan bulat k-bit Si, temukan i, j sedemikian rupa sehingga Si⊕Sj maksimum." Saya tidak mengerti baris ini. saya ingin Si⊕Si + 1⊕ ... ⊕ Sj menjadi maksimum? koreksi saya jika saya kehilangan sesuatu
palatok
1
@Aryabhata, tidak adil untuk mempertimbangkan linear. Lagi pula, , (kecuali daftar dapat memiliki duplikat). Ini masih merupakan solusi yang bagus. O(nk)klog2n
Karolis Juodelė
1
@ Aryabhata, karena itu Anda mungkin mengatakan algoritma adalah . Itu tidak terlalu deskriptif. O(1)
Karolis Juodelė
1
Pertanyaannya tidak mengatakan bahwa bilangan bulat dibatasi; ia mengatakan bahwa array memiliki ukuran paling banyak 50.000. Jadi sebenarnya adalah konstan, bukan !! nk
JeffE
1
@ Jeff: Oh! Dan sekarang setelah Anda tunjukkan (dan saya setuju dengan interpretasi itu), komentar Karolis semuanya masuk akal bagi saya sekarang. Terima kasih!
Aryabhata
5

Penyortiran juga membantu dengan . Sedikit, setidaknya. Jelas, maksimum akan dicapai oleh . Jadi untuk setiap lakukan pencarian biner untuk . Itu waktu, sama dengan penyortiran, sehingga tetap menjadi kerumitan seluruh prosedur.maxx¬xx=sumi¬xO(nlogn)

Karolis Juodelė
sumber
bagaimana dengan nilai min?
palatok
bagaimana jika saya tidak menemukan ¬x?
palatok
@palatok, nilai min sudah dijelaskan. Jika Anda tidak menemukan , periksa dua jumlah yang paling dekat dengan tempat itu. ¬x
Karolis Juodelė
sumi,sumj harus 0 atau 1. Tabel hash sudah cukup.
Strin
@ Strin, saya tidak mengerti maksud Anda. adalah bit panjang. Bagaimana tabel hash berguna - tutup, bukan nilai yang tepat diperlukan. sumik
Karolis Juodelė
4

Inilah mengapa saran Strilanc bekerja untuk min. Pertimbangkan susunan Andasum, dan anggap minimum dicapai oleh ap,aqdimana p<q. Antaraap=aq (dalam hal ini ap=ap+1), atau ap=x0y, aq=x1z untuk beberapa x,y,z. Seharusnyaq>p+1, dan biarkan ap+1=xbw. Jikab=0 kemudian apap+1<apaq, sedangkan jika b=1 kemudian ap+1aq<apaq. Karena ituq=p+1.

Yuval Filmus
sumber