C'est un classique de la question de l'entrevue de Microsoft research Asia.
Comment Trouver 2 nombres dans un tableau non trié égal à une somme donnée.
[1]la force brute de la solution
Cet algorithme est très simple. Le temps de la complexité est O(N^2)
[2]à l'Aide de la recherche binaire
À l'aide de bianry à la recherche de la Somme-arr[i] avec tous les arr[i], Le temps de la complexité peut être réduite à O(N*logN)
[3]À L'Aide De Hachage
De Base [2] de l'algorithme et de l'utilisation de hachage, le temps de la complexité peut être réduite à O(N), mais cette solution permettra d'ajouter le O(N) l'espace de hachage.
[4]algorithme Optimal:
Pseduo-code:
for(i=0;j=n-1;i<j)
if(arr[i]+arr[j]==sum) return (i,j);
else if(arr[i]+arr[j]<sum) i++;
else j--;
return(-1,-1);
ou
If a[M] + a[m] > I then M--
If a[M] + a[m] < I then m++
If a[M] + a[m] == I you have found it
If m > M, no such numbers exist.
Et c'Est en quesiton complètement résolu? Pas de. Si le nombre est N. Ce problème va devenir très complexe.
La quesiton alors:
Comment puis-je trouver toutes les combinaison des cas, avec un nombre donné?
C'est un classique NP-Complets problème qui est appelé sous-ensemble-somme.
Pour comprendre NP/NPC/NP-Difficile vous feriez mieux de lire quelques livres professionnels.
Références:
[1]http://www.quora.com/Mathematics/How-can-I-find-all-the-combination-cases-with-a-given-number
[2]http://en.wikipedia.org/wiki/Subset_sum_problem