Diberikan array integer (ukuran maksimum 50000), saya harus menemukan minimum dan maksimum sehingga untuk beberapa , dengan .
Saya telah mencoba proses ini: untuk semua . Saya pra-menghitungnya dalam dan kemudian nilai untuk beberapa , sedemikian rupa sehingga adalah: . Jadi:
Tetapi proses ini dari . Bagaimana saya bisa melakukannya dengan lebih efisien?
Jawaban:
Jika adalah bitsize dari bilangan bulat, maka Anda dapat menghitung waktu Maks dalam .k O(nk)
Pada dasarnya, masalahnya adalah, mengingat , bit integer , temukan sehingga maksimum.n k Si i,j Si⊕Sj
Anda memperlakukan setiap sebagai string biner (melihat representasi biner), dan membuat trie dari string tersebut. Ini membutuhkan waktu .Si O(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.Sj Sj j′ Sj⊕Sj′
Lakukan ini untuk setiap , dan Anda menemukan jawabannya dalam waktu .j O(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.
sumber
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.max x⊕¬x x=sumi ¬x O(nlogn)
sumber
Inilah mengapa saran Strilanc bekerja untukmin . Pertimbangkan susunan Andasum , dan anggap minimum dicapai oleh ap,aq dimana 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 ap⊕ap+1<ap⊕aq , sedangkan jika b=1 kemudian ap+1⊕aq<ap⊕aq . Karena ituq=p+1 .
sumber