Étant donné un tableau entier (taille maximale 50000), je dois trouver le minimum et le maximum tel que pour certains , avec .
J'ai essayé ce processus: pour tous . Je l'ai pré-calculé en puis la valeur de pour certains , tel que est: . Donc:
Mais ce processus est de . Comment puis-je le faire plus efficacement?
Réponses:
Sik est la taille des bits des entiers, alors vous pouvez calculer le temps Max en O(nk) .
Fondamentalement, le problème est, étant donnén , k entiers Si , trouver i,j tels que Si⊕Sj est maximum.
Vous traitez chaque comme une chaîne binaire (en regardant la représentation binaire) et créez un trie à partir de ces chaînes. Cela prend du temps .Si O(nk)
Maintenant, pour chaque , vous essayez de parcourir le complément de dans le trie que vous avez créé (en prenant la meilleure branche à chaque étape en gros), en trouvant un tel que est maximum.Sj Sj j′ Sj⊕Sj′
Faites cela pour chaque , et vous trouverez la réponse en temps .j O(nk)
Puisque vos entiers sont bornés, cet algorithme pour max est fondamentalement linéaire, tout comme l'algorithme pour min obtenu par tri (car le tri peut être effectué en temps linéaire).
Soit dit en passant, s'il n'y avait pas de limites, vous pouvez réduire la distinction des éléments à la version min.
la source
Le tri est également utile avec . Un peu au moins. De toute évidence, le maximum serait atteint par . Donc pour chaque faites une recherche binaire pour . Il s'agit du temps , identique au tri, de sorte que la complexité de toute la procédure reste à régler.max x⊕¬x x=sumi ¬x O(nlogn)
la source
Voici pourquoi la suggestion de Strilanc fonctionne pour . Considérez votre tableau , et supposez que le minimum est atteint par , où . Soit (auquel cas ), soit , pour certains . Supposons , et laissons . Si alors , tandis que si alors . Donc .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
la source