Dada uma matriz inteira (tamanho máximo 50000), tenho que encontrar o mínimo e o máximo de tal modo que para alguns , com .
Eu tentei este processo: para todos . Eu pré-calculei em e então o valor de para alguns , de tal modo que é: . Portanto:
Mas esse processo é de . Como posso fazer isso de forma mais eficiente?
Respostas:
Se é o tamanho de bits dos números inteiros, é possível calcular o tempo máximo em .k O(nk)
Basicamente, o problema é que, dados , bits inteiros , localizem modo que seja máximo.n k Si i,j Si⊕Sj
Você trata cada como uma sequência binária (observando a representação binária) e cria um teste com essas seqüências. Isso leva tempo .Si O(nk)
Agora, para cada , você está tentando percorrer o complemento de na você criou (tomando basicamente a melhor ramificação em cada etapa), encontrando um tal que seja o máximo.Sj Sj j′ Sj⊕Sj′
Faça isso para cada , e você encontrará a resposta no tempo .j O(nk)
Como seus números inteiros são limitados, esse algoritmo para max é basicamente linear, assim como o algoritmo para min obtido pela classificação (como a classificação pode ser feita em tempo linear).
Aliás, se não houvesse limites, você poderá reduzir a distinção do elemento para a versão mínima.
fonte
A classificação também ajuda com . Um pouco, pelo menos. Claramente, o máximo seria alcançado por . Portanto, para cada faça uma pesquisa binária por . Esse é o tempo , o mesmo que a classificação, de modo que permanece a complexidade de todo o procedimento.max x⊕¬x x=sumi ¬x O(nlogn)
fonte
Eis por que a sugestão da Strilanc funciona por . Considere sua matriz e suponha que o mínimo seja alcançado por , onde . De qualquer (caso em que ), ou , para alguns . Suponha e deixe . Se então , enquanto que se então . Portanto .min sum ap,aq p<q ap=aq ap=ap+1 ap=x0y aq=x1z x,y,z q>p+1 ap+1=xbw b=0 ap⊕ap+1<ap⊕aq b=1 ap+1⊕aq<ap⊕aq q=p+1
fonte