Tìm tối đa và tối thiểu các giá trị XOR liên tiếp


8

Cho một mảng số nguyên (kích thước tối đa 50000), tôi phải tìm tối thiểu và tối đa sao cho cho một số , với .X = một pmột p + 1một q p q p qXX=apap+1aqpqpq

Tôi đã thử quy trình này: cho tất cả . Tôi đã tính trước nó bằng và sau đó giá trị của đối với một số , sao cho là: . Như vậy: i O ( n ) X p q ( p q ) X = tổng qtổng p - 1sumi=a0a1aiiO(n)Xpq(pq)X=sumqsump1

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

Nhưng quá trình này là của O(n2) . Làm thế nào tôi có thể làm điều đó hiệu quả hơn?


1
Bạn đã xem xét sắp xếp danh sách 'tổng' của mình chưa? Có vẻ như các giá trị liền kề sẽ có khả năng hủy rất nhiều bit và kết thúc gần 0.
Craig Gidney

Câu trả lời:


7

Nếu là bitize của các số nguyên, thì bạn có thể tính thời gian Max theo .kO(nk)

Về cơ bản, vấn đề là, với các số nguyên , -bit , tìm sao cho là tối đa.nkSii,jSiSj

Bạn coi mỗi là một chuỗi nhị phân (nhìn vào biểu diễn nhị phân) và tạo ra một chuỗi từ các chuỗi đó. Điều này mất thời gian .SiO(nk)

Bây giờ với mỗi , bạn đang thử đi bộ bổ sung của trong bộ ba bạn đã tạo (lấy nhánh tốt nhất ở mỗi bước về cơ bản), tìm một sao cho là tối đa.SjSjjSjSj

Làm điều này cho mỗi , và bạn tìm thấy câu trả lời trong thời gian .O ( n k )jO(nk)

Vì các số nguyên của bạn bị giới hạn, thuật toán tối đa này về cơ bản là tuyến tính và thuật toán cho min có được bằng cách sắp xếp (vì việc sắp xếp có thể được thực hiện trong thời gian tuyến tính).

Ngẫu nhiên, nếu không có giới hạn, thì bạn có thể giảm độ khác biệt của phần tử thành phiên bản min.


"Về cơ bản, vấn đề là, với các số nguyên n, k-bit Si, tìm i, j sao cho Si⊕Sj là tối đa." Tôi không hiểu dòng này. tôi muốn SiSi + 1⊕ ... Sj là tối đa? sửa tôi nếu tôi thiếu thứ gì
palatok

1
@Aryabhata, thật không công bằng khi xem tuyến tính. Rốt cuộc, , (trừ khi danh sách có thể có các bản sao). Đó vẫn là một giải pháp tốt. k log 2 nO(nk)klog2n
Karolis Juodelė

1
@Aryabhata, vì ràng buộc đó, bạn cũng có thể nói thuật toán là . Đó không phải là mô tả mặc dù. O(1)
Karolis Juodelė

1
Câu hỏi không nói rằng các số nguyên bị giới hạn; nó nói rằng mảng có kích thước tối đa 50000. Vì vậy, trên thực tế là hằng số, không phải !! knk
JeffE

1
@JeffE: Ồ! Và bây giờ khi bạn chỉ ra (và tôi đồng ý với cách giải thích đó), tất cả các ý kiến ​​của Karolis đều có ý nghĩa với tôi. Cảm ơn!
Aryabhata

5

Sắp xếp cũng giúp với . Một chút, ít nhất. Rõ ràng, tối đa sẽ đạt được bởi . Vì vậy, với mỗi hãy thực hiện tìm kiếm nhị phân cho . Đó là thời gian , giống như sắp xếp, do đó vẫn là sự phức tạp của toàn bộ thủ tục.x ¬ x x = tổng i ¬ x O ( n log n )maxx¬xx=sumi¬xO(nlogn)


Giá trị tối thiểu thì sao?
palatok

Nếu tôi không tìm thấy ¬x thì sao?
palatok

@palatok, giá trị tối thiểu đã được giải thích. Nếu bạn không tìm thấy , hãy kiểm tra hai khoản tiền gần nhất với vị trí của nó. ¬x
Karolis Juodelė

sumi,sumj nên là 0 hoặc 1. Bảng băm sẽ đủ.
Strin

@Strin, tôi không hiểu ý bạn. là bit dài. Làm thế nào một bảng băm sẽ hữu ích - đóng, không cần các giá trị chính xác. ksumik
Karolis Juodelė

4

Đây là lý do tại sao đề xuất của Strilanc hoạt động cho . Hãy xem xét mảng của bạn và giả sử mức tối thiểu đạt được bằng , trong đó . Hoặc (trong trường hợp ) hoặc , cho một số . Giả sử và cho . Nếu thì , trong khi nếu thì . Do đó .s u m a p , a q p < q a p = a q a p = a p + 1 a p = x 0 y a q = x 1 z x , y , z q > p + 1 a p + 1 = x b w b = 0 a paminsumap,aqp<qap=aqmộtp= =mộtp+1mộtp= =x0yaq=x1zx,y,zq>p+1ap+1=xbwb=0apap+1<apaqb=1ap+1aq<apaqq=p+1

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.