Comment écrire un algorithme permettant de vérifier si la somme de deux nombres dans un tableau/liste correspond à un nombre donné?
Comment puis-je écrire un algorithme pour vérifier si la somme de deux nombres dans un tableau/liste correspond à un nombre donné
avec une complexité de nlogn
?
- Qu'attendez-vous de la sortie? Les chiffres? Leur indice? Si plus d'un des résultats est-elle possible?
- Voulez-vous un vrai/faux "oui, il ya un couple" ou voulez-vous toutes les paires? Ou toutes les combinaisons possibles qui donne la somme demandée?
Vous devez vous connecter pour publier un commentaire.
Je suis sûr qu'il ya une meilleure façon, mais voici une idée:
Ces deux opérations sont
O(n log n)
.sum/2
(n'a pas d'impact sur le grand O, mais quand même :p)Cela peut être fait en
O(n)
à l'aide d'une table de hachage. Initialiser le tableau avec tous les chiffres dans le tableau, avec le numéro de la clé et de la fréquence que de la valeur. Marcher à travers chaque nombre dans le tableau, et de voir si(sum - number)
existe dans la table. Si c'est le cas, vous avez un match. Après avoir réitéré par le biais de tous les nombres dans le tableau, vous devez avoir une liste de toutes les paires que la somme jusqu'à la valeur souhaitée.Le cas où n et tableau[S-n] voir le même nombre deux fois peut être traitée avec un supplément de vérifier, mais la complexité reste
O(n)
.Utiliser un table de hachage. Insérez chaque numéro dans votre table de hachage, avec son index. Alors, laissez
S
être votre somme désirée. Pour chaque nombrearray[i]
dans votre premier tableau, voir siS - array[i]
existe dans votre table de hachage avec un indice différent dei
.Moyenne des cas est
O(n)
, dans le pire des cas estO(n^2)
, afin d'utiliser les binaires de recherche de la solution si vous avez peur de le pire des cas.O(1)
en matière d'insertion et de recherche (avec un peu de soin) ou de potentiel de hachage conflits ? De toute façon, cela semble même mieux que d'utiliser les binaires de recherche.{1, 1, 1, ..., 1, 1, 1, ...}
qui contientn
ceux. Nous voulons faire la somme de 20. Vous devez ajouter toutes celles qui sont dans la même position dans la table de hachage. Ensuite, pour chaque 1 que vous devriez vérifier si 19 est dans le tableau. Supposons que la valeur de 19 cartes au même endroit dans votre table de hachage que la valeur 1 ne. Cela signifie que, pour chacun desn
celles que vous nen
vérifie dans votre table de hachage, vous donnant complexité quadratique du temps. Des exemples similaires peuvent être trouvés pour les cas où il y a une solution (3 valeurs - une dominante)1 => 8
. Lorsque la somme de 2 est souhaitée, par exemple, vous placez un contrôle supplémentaire - si le nombre est égal au nombre cible(S - array[i])
, puis c'est la fréquence doit être au moins 2.Disons que nous voulons trouver deux nombres dans le tableau A qui, ensemble, représentent N.
Le tri peut être fait en O(n log n). La recherche se fait en temps linéaire.
C'est en Java : Ce même supprime les doublons éventuels.. Runtime -
O(n^2)
containsValue
s'exécute en temps linéaire, d'où le temps total d'exécution estO(n^2)
.Exemple:
[1]
et[1, 1]
cas.Voici un essai en C. Ce n'est pas marquée devoirs.
Voici quelques test de sortie à l'aide de
int a[] = { 3, 5, 6, 7, 8, 9, 13, 15, 17 };
La recherche est linéaire, donc O(n). Le genre de ce qui se passe derrière les scènes, c'est d'aller à O(n*logn) si vous utilisez l'un des bons sortes.
Parce que les mathématiques derrière Big-O, le plus petit terme additif conditions efficacement le décrochage de votre calcul, et vous vous retrouvez avec O(n logn).
Celui-ci est O(n)
Voici un algorithme qui s'exécute en O(n) si le tableau est déjà trié ou O(n log n) si ce n'est pas déjà triées. Prend des repères de beaucoup d'autres réponses ici. Le Code est en Java, mais ici, c'est un pseudo-code de la dérivée de nombreuses réponses, mais optimisé pour les doublons généralement
Utiliser ces variables pour calculer l'existence de la cible dans le tableau;
définir la currentValue à la matrice[ith];
ensemble newTarget à la cible de currentValue;
ensemble expectedCount 2 si currentValue est égal à newTarget ou 1 dans le cas contraire
ET renvoyer true seulement si
un. nous n'avons jamais vu cet entier avant ET
b. nous avons une certaine valeur pour la newTarget dans la carte que nous avons créé
c. et le comte de la newTarget est égale ou supérieure à la expectedCount
AUTREMENT
répétez l'étape 4 jusqu'à ce que nous arrivent en fin de tableau et renvoie la valeur false SINON;
Comme je l'ai mentionné à la meilleure utilisation possible pour une visité magasin c'est quand nous avons des doublons, il n'y aurait jamais de l'aide si aucun des éléments sont des doublons.
Code Java à https://gist.github.com/eded5dbcee737390acb4
Dépend Si vous voulez seulement une somme de O(N) ou O(N log N) ou de la totalité des sommes O(N^2) ou O(N^2 log N). Dans ce dernier cas, mieux utilise une FFT>
Étape 1 : Trier le tableau en O(n logn)
Étape 2 : Trouver deux indices
A) TimeComplexity => 0(n Log n) SpaceComplexity => 0(n).
B) TimeComplexity => 0(n^2) SpaceComplexity => 0(1).
C) TimeComplexity => 0(n) SpaceComplexity => 0(n)
Choisir la Solution A, B ou C selon le Compromis.