Étant donné deux ensembles a et b .Trouver toutes les paires d'éléments (a1,b1) tels que a1 appartient à la série A et b1 appartient à la Matrice B dont la somme a1+b1 = k
Je suis à la recherche de la solution de l'algorithme suivant avec un minimum de temps et de l'espace de la complexité.
Donnés deux ensembles a et b, trouver toutes les paires d'éléments (a1,b1) tels que a1 appartient à la série A et b1 appartient à la Matrice B dont la somme a1+b1 = k (tout entier).
J'ai été en mesure de venir avec O(n log n) approche où nous allons trier une matrice de dire et pour chacun de l'élément b de la matrice B, faire une recherche binaire sur Un tableau trié de valeur (K-b) .
Peut-on l'améliorer davantage?
- C'est probablement la manière la plus rapide solution générique que vous pouvez obtenir, puisque le facteur constant pour la recherche de
n
fois dans un tableau trié est plus faible que pour le tri d'un tableau non trié de longueurn
, généralement. Donc, vous probablement ne voulez trier un tableau (le court). - Si
a = {3, 3}
,b = {7, 7}
, etk = 10
, quel est le résultat attendu? - stackoverflow.com/questions/19175221/...
Vous devez vous connecter pour publier un commentaire.
Si vous avez une limite sur le nombre maximum possible (appelons le M), alors vous pouvez avoir une solution en O(M+n).
Booléen tableau de faux et marquez-le comme une véritable valeur pour l'élément de A. Ensuite, pour chaque élément b de B vérifier si le numéro d'élément de K-b est marqué comme vrai.
Vous pouvez l'améliorer si vous êtes en utilisant un hash-carte à la place d'un grand tableau. Mais je ne serais pas envisager que dans ce genre de questions de hachage de la carte est de la triche.
De toute façon, il serait de vous donner des O(n) pour l'insertion et puis O(n) pour les requêtes, O(n) au total.
EDIT :
Un cas où cela pourrait être utile.
À l'aide de mon idée de ne pas booléens mais entier (incrémenté à chaque exécution) vous donne une complexité de :
Vous utilisez plus d'espace, mais vous avez l'augmentation de la vitesse par un facteur log(n) ~=20 dans ce cas !
Si les tableaux sont triés, vous pouvez le faire dans le temps linéaire et constante de stockage.
Si ces tableaux sont d'abord triés puis vous pouvez d'abord les trier ensuite utiliser l'algorithme ci-dessus. Il y a quelques approches différentes pour le tri que l'on peut utiliser, selon le type de données que vous attendez:
Une comparaison de tri exigera O(n log n) en moyenne. Les deux dernières sont plus rapides que O(n log(n)) mais peut être pratique si la plage de valeurs possibles dans l'entrée de tableaux est très grand.
a[i] + b[j] = k
, ne pourriez-vous pas de mise à jour deux pointeurs? Ce n'est pas commea[i] + b[j-1] = k
saufb[j-1] = b[j]
, et dans ce cas, si aussia[i] = a[i+1]
, ce que vous êtes censé sortie? Plus concrètement, sia = [1, 1]
etb = [2, 2]
etk = 3
, si votre sortie ont une longueur de quatre? Si oui, de long terme d'encoder toutes les courses de l'égalité des valeurs de garantir éléments distincts. Il ajoute à la complication, mais: maintenant que vous avez à faire un peu d'arithmétique pour déterminer l'indice est le tableau d'origine si vous voulez de sortie par exemple[(0, 0), (0, 1), (1, 0), (1, 1)]
(dans mon exemple).Je voudrais créer une table de hachage contenant les éléments d'un tableau, puis effectuer une itération à l'autre de la matrice de recherche
k - a(n)
, la génération d'un élément de sortie si la recherche a réussi. Cela implique l'utilisation de O(n) l'espace et le temps.En C#, il pourrait ressembler à ceci:
J'ai utilisé le C++ et il semblait me donner le résultat souhaité. L'espoir c'est ce que vous cherchez.