Ceci est mon idée de la solution.
Je pense que cela devrait être beaucoup plus rapide que de tout calculer, et que vous devriez le considérer.
V
est triée la longueur du vecteur n
, et nous voulons trouver k
le plus grand nombre de produit cartésien de VxV = {v1+v2|,v1,v2∈V}
.
Nous allons utiliser la méthode de recherche similaire à la recherche binaire pour trouver le nombre voulu.
Notez ceci:
Pour chaque numéro M
, nous M = m+m, m < max{v|v∈ V}
définir un ensemble X = {x ∈ VxV, x<=m+m=M}
. Il est facile de trouver |X|
et max{X}
en utilisant ceci:
- boucle à travers le
V
avec un indice i
. Pour chaque v = V[i]
, v' = M-V[i]
. En utilisant la recherche binaire, trouver l'index j
ainsi: w = V[j] <= v'
et j+1>n OR V[j+1] > v'
.
- Pour chaque bouclage avec
i
, additionnez tous les chiffres j
calculés. Ce sont les éléments de numéro dans X
.
max{X}
est la plus grande valeur de v+w
calculée pour chaque paire de i
et j
, donc vous devez vous en souvenir aussi.
En sélectionnant des valeurs différentes de M
(utiliser la méthode de recherche binaire), vous pouvez trouver la valeur de M
pour laquelle |X| = k
. Lorsque vous l'avez trouvé, max{X}
est votre solution.
PS. J'ai supprimé ma réponse précédente car elle contenait une partie que je croyais avoir supprimée, et parce que je l'ai écrite pour des multiplications d'éléments de
V
au lieu d'ajouts. Désolé pour le dérangement, n'importe qui.
Si vous avez des exigences strictes en termes de performances, il est préférable de vous tourner vers un profileur et d'analyser le comportement d'exécution de votre code. Si vous pouvez identifier les "hotspots" là-bas, vous pouvez poster le code correspondant ici pour aider à l'améliorer. Avec juste une description de l'algorithme, que devons-nous faire pour "réparer" les performances de votre implémentation? – GhostCat
L'inclusion de «V [k] + V [k]» («i = k = j») est-elle intentionnelle? (Voir le libellé dans la réponse de tbukic.) Quelle est la complexité temporelle de l'approche de tbukic? Le premier élément de 'S' est' 2V [0] '(ou' V [0] + V [1] 'définition en attente) - quelles sont les combinaisons possibles pour la seconde? Comment pourrait-on les énumérer efficacement? – greybeard