trouver quatre éléments dans la gamme dont la somme est égale à un nombre donné X
J'ai besoin d'aide pour trouver un algorithme qui trouve:
- quatre éléments dans le tableau
- dont la somme est égale à un nombre donné X
- en O(n^2*log(n))
préfèrent en pseudo-code ou en c,c++
Les sons comme des devoirs
Sonne comme vous avez besoin d'une méthode de recherche de toutes les permutations de 4 index uniques.
Sont les nombres supérieurs à zéro? Sont tous les nombres uniques?
Toute restriction à X ou des chiffres?
Voulez-vous dire que vous voulez écrire une fonction qui prend un
Sonne comme vous avez besoin d'une méthode de recherche de toutes les permutations de 4 index uniques.
Sont les nombres supérieurs à zéro? Sont tous les nombres uniques?
Toute restriction à X ou des chiffres?
Voulez-vous dire que vous voulez écrire une fonction qui prend un
array
, son length
, et un value
et renvoyer un ensemble de 4 membres de la array
dont la somme est value
? Voulez-vous le retour de l'ensemble de tous les ensembles possibles de 4 membres dont la somme est value
? Que faire si aucun n'est trouvé?
OriginalL'auteur moti | 2010-08-25
Vous devez vous connecter pour publier un commentaire.
Vous pouvez le faire en O(n^2). Fonctionne très bien avec dupliqué et les nombres négatifs.
modifier comme André l'a noté dans le commentaire, le temps est avec l'utilisation de hachage, qui a "pire des cas" (même si il est moins probable que de gagner au loto). Mais vous pouvez également remplacer la table de hachage de l'équilibre de l'arbre (TreeMap en java) et d'obtenir la garantie stable O(n^2 * log(n)) de la solution.
Hashtable
sums
sera possible de stocker toutes les sommes de deux éléments différents. Pour chaque sommeS
il renvoie la paire d'indicesi
etj
tels quea[i] + a[j] == S
eti != j
. Mais au départ, c'est vide, nous allons le remplir sur le chemin.Disons,
X = a[1] + a[3] + a[7] + a[10]
. Cette somme sera trouvé quandi = 7
,j = 10
etrest = a[1] + a[3]
(indices 1 et 3 seront trouvés à partir de hachage)Je ne pense pas que nous devons envisager le pire des cas, le temps d'accès de hachage, il est extrêmement peu probable que cela arrive 🙂 Mais si c'est important, puis TreeMap est une solution, oui.
devriez également vérifier que vous n'êtes pas en utilisant un nombre plus d'une fois C'est déjà fait. i et j sont toujours égales, et de i < j. Et la table de hachage contient sommes tous différents indices k et l de moins que moi.
vous avez raison, je ne savais pas que la façon dont vous mettez à jour les montants de la carte et qu'il ne contient que des indices < je. +1 de moi.
En fait, nous avons seulement besoin d'une paire pour chaque somme, donc en cas d'égalité de nombre de table de hachage n'aura qu'un seul élément. Il est toujours possible que des lots de différentes sommes qui ont le même hash, juste difficile à imiter.
OriginalL'auteur Nikita Rybak
Comme quelques autres affiches, il peut être fait avec un hachage en O(n^2)
OriginalL'auteur Sibshops
Abuser du fait qu'aucune mémoire ne contraignent est spécifié. Et à l'aide de l'habitude de diviser et conquérir approche.
Nombre de toutes les permutations pour 4 nombre de sous-ensembles est C(n,4) et est O(n^4). Nombre de toutes les permutations de 2 nombres est C(n,2) et O(n^2). O(n^2) semble être OK pour la tâche.
A
avecn
éléments,X
.B
avec n^2 éléments (aussi se souvenir de la sous-ensembles). Nous allons désigner commeS[B[i]]
le sous-ensemble (composé de deux chiffres) dont la somme estB[i]
.B
, O(n^2*log(n^2)).À pied à travers le tableau
B
(O(n^2))i = [0,n^2)
et de recherche rapideO(log(n^2)) = O(log(n))
pour la valeur(X - B[i])
. Il existe peut-être plusieurs d'entre eux (mais pas plus de n^2).4.1. Marcher à travers tous les éléments dont la valeur de
(X - B[i])
, à l'aide de l'indice dek
.4.2. Ignorer les éléments
B[k]
oùS[B[k]]
croiseS[B[i]]
. Intersection de deux ensembles, avec deux numéros peut être calculé en temps O(1).4.3 Si
k
est l'indice d'un élément oùB[i] + B[k] == X
etS[B[k]]
ne coupe pas avecS[B[i]]
, alors la somme des ensemblesS[B[k]]
etS[B[i]]
sont les quatre cherché numéros.Performance est:
O( n^2 + n^2*log(n^2) + n^2*log(n^2) ) = O( n^2 * log(n^2) ) = O( n^2 * log(n) )
Sur l'étape quatre, lorsque nous itérer sur les multiples éléments correspondants de
B
à l'aide de boucles imbriquées. Pourtant, le nombre total d'itérations de deux boucles imbriquées est limitée par la|B|
qui est O(n^2). La recherche rapide n'est pas l'habitude de variation, mais celui qui trouve l'élément correspondant à l'indice le plus bas. (Alternativement, on peut utiliser l'habituelbsearch
et depuis nous pourrions avoir atterri dans le milieu, utiliser deux boucles adjacentes, en vérifiant les éléments dans les deux directions.)log(n^2)
est2log(n)
, de sorte que vous n'êtes pas le dépassement de la durée de la complexité. Ce sera, cependant, pas en compte les éléments en double. Des contrôles supplémentaires seront nécessaires pour cela, mais c'est possible. Par exemple, compte tenu de l'éventail[1, 2, 3]
et les sommes[ 1+2, 1+3, 2+3 ]
, une somme désirée de9
peut être trouvé avec la4 + 5
, mais nous comptons 3 deux fois ensuite.OMG. J'ai dû répéter les mathématiques.
Pouvez-vous détailler la 4ème étape? Comment voulez-vous traiter les doublons et de sur/sous-dénombrement?
J'ai essayé.
Comment voulez-vous vérifier si elles ont une intersection ou pas? (par exemple, comment voulez-vous vérifier S[B[k]] n'a pas d'intersection avec S[B[i]]?)
OriginalL'auteur Dummy00001
Un travail de Java solution de l'algo. fournis par Nikita Rybak ci-dessus..
Montre 53 + 8 + 4 + 3 = 68 et 8 + 4 + 53 + 3 = 68
pourriez-vous nous expliquer ce qu'est "la classe paire" et pourquoi l'utilisez-vous ici?
OriginalL'auteur Explorer
1) Créer un tableau de tous les possibles paire sommes [O(N^2)]
2) Trier ce tableau dans l'ordre croissant [O(N^2 * Log N)]
3) Maintenant, ce problème se réduit à trouver 2 nombres dans un tableau trié que la somme d'un nombre donné X, dans le temps linéaire. Utiliser 2 pointeurs: un FAIBLE pointeur à partir de la valeur la plus basse, et un HAUT pointeur à partir de la valeur la plus élevée. Si la somme est trop faible, FAIBLE avance. Si la somme est trop élevée, l'avance de HAUT (vers l'arrière). Ils finiront par trouver la paire ou de la croix les uns des autres (ce qui peut être facilement prouvé). Ce processus prend du temps linéaire en la taille du tableau, c'est à dire O(N ^ 2)
Cela donne un temps total de O(N^2 * log N).
NOTE : Cette méthode peut être généralisée pour résoudre le cas de M nombres en O(M * N^(M/2) * log N) fois.
-- EDIT --
En fait, ma réponse est très similaire à Dummy00001 de réponse, à l'exception de la finale de la recherche, où j'utilise une méthode plus rapide (bien que la complexité globale est la même chose...)
sum=18
. Eta = {2,3,4,5,7,9,10}
maintenanta[0]+a[1]=5
eta[2]+a[5]=13
, donca[0]+a[1]+a[2]+a[5]=18
. Maisa[1]+a[2]=7
eta[0]+a[5]=11
donca[0]+a[1]+a[2]+a[5]=18
. donc votre solution d'impression de ces deux au lieu de 1. Alors, comment allez-vous aborder la question. Merci.L'algorithme n'est pas nécessaire d'imprimer un ensemble de quatre; quatre numéros distincts avoir la somme requise sont ok. Le problème avec ma solution est unique. Il peut inclure un numéro d'ensemble deux fois. Cela peut être résolu en stockant les paires à l'intérieur de la carte, et l'acceptation d'un match entre deux paires seulement si ils n'ont aucune valeur en commun.
Vrai. Merci pour votre conformation. J'ai été le débogage de votre solution aujourd'hui et a trouvé cela, d'où voulait être conforme de l'auteur. Merci.
Comment trouvez-vous que "deux paires n'ont aucune valeur en commun"?
Pour chaque somme dans la somme tableau, vous pouvez également stocker les indices des 2 valeurs dans le tableau d'origine. Dans l'étape 3, pour éviter de trouver de fausses combinaisons, vérifiez que les 2 indices de FAIBLE ont aucune valeur commune avec les 2 indices de HAUT. Dans le cas où vous avez des K valeurs répétées de FAIBLE et de L de valeurs répétées de HAUT, et toutes les combinaisons de rendement de la somme à droite de X, il suffit de cocher toutes les combinaisons. Les frais généraux de l'exécution de cette vérification croisée une fois ou plus est au plus O(N^2), de sorte qu'il ne change pas la complexité globale.
OriginalL'auteur Eyal Schneider
Sonne comme devoirs à la maison pour moi. Mais voici ce que j'ai fais.
D'abord trier les nombres (il n*log(n)).
Maintenant, de créer des pointeurs à la liste, de l'initialiser avec les 4 premiers numéros. Une fois que vous avez cela, vous pouvez consulter la somme des 4 chiffres actuels au total. Il doit être inférieur ou égal à votre recherche somme (si elle ne l'est pas, vous pouvez quitter tôt). Maintenant, tout ce que vous devez faire est de parcourir le reste de votre liste en alternance pour le remplacement de vos pointeurs avec la valeur actuelle dans la liste. Cela ne doit se faire qu'une fois (ou vraiment au pire 4 fois) de sorte qu'il est de votre autre n, ce qui fait n^2*log(n)
Vous aurez besoin de garder la trace de certains de logique pour savoir si vous êtes au-dessus de/sous votre somme et quoi faire ensuite, mais je le laisse comme devoir à la maison.
Pouvez-vous donner les détails de la façon dont vous le parcours de la liste avec quatre pointeurs ? Ne vous laissez la première pointeur d'abord aller à la fin, puis le second, etc. ?
Par ailleurs, ce serait O(n) + O(n * log(n)) = O(n * log(n)), pas de O(n) * O(n * log(n))
donc, vous voulez dire qu'il peut être fait en O(nlogn)?
OriginalL'auteur miked
Je ne vais pas répondre à votre question complètement, car je pense que c'est les devoirs et pense aussi que c'est facile à faire. Mais je pense que je sais pourquoi vous avez de la difficulté à répondre, alors je vais vous aider un peu.
Tout d'abord, vous devez regarder dans la récursivité. Cela signifie que l'appel d'une fonction à partir de l'intérieur de lui-même.
Seconde, vous devriez utiliser une fonction d'assistance, qui est appelée par la fonction que vous voulez écrire. Cette fonction doit prendre comme arguments:
- un tableau de nombres
- la longueur du tableau
- la valeur que vous voulez trouver les membres de cette somme jusqu'à
- le nombre de membres de la matrice que vous voulez pour résumer
Cette fonction sera appelée par votre autre fonction et passé un 4 pour le dernier argument. Il va alors appeler lui-même en ajustant les arguments qu'il essaie de trouver des résultats en partie, d'essai et d'erreur.
edit 2
Sur la poursuite de la réflexion, j'ai réalisé que ce n'est pas O(n^2), comme je l'ai affirmé plus tôt (je mentalement omis de le moyen étapes). Elle est limitée par le n^4, mais peut avoir une limite inférieure à celle due à l'amplement l'occasion de couper court dans de nombreux cas. Je ne crois pas que ce court coupe améliore au point de n^2.
Mission accomplie 🙂
Si vous pensez que c'est facile à faire, et puis finissent par réaliser que vous ne savez pas comment le faire. Nice. -1.
J'ai peut-être supprimé la réponse et éviter une baisse de vote, mais au lieu de cela, je l'ai laissé en place, avec une note indiquant les défauts.
Merci à tous, après quelques heures aujourd'hui, j'ai atteint le même genre de réponses comme vous. Je n'ai pas besoin de tous les possibles 4 numéros, j'ai besoin d'une seule option. Ma solution a également O(n^2) le lieu de la complexité.
OriginalL'auteur nategoose
trouver quatre éléments dans la gamme dont la somme est égale à un nombre donné X
pour moi algorithme suivant fonctionne:
OriginalL'auteur Rashid
J'ai écrit un O(N^^2) temps d'exécution d'une fonction qui n'utilise pas de tables de hachage, mais les poignées de nombres négatifs et les nombres en double apparemment OK. J'gérer les nombres négatifs dans un tableau d'entiers par l'ajout d'un grand postive(par exemple 100) pour tous les entiers dans le tableau. Ensuite, je ajuster la cible par
target += (4 * 100)
. Puis, quand je trouve un résultat, je soustrais les 100 de les entiers dans le résultat. Voici mon code et des cas de test: s'il vous Plaît laissez-moi savoir si cela o(N^^2) le temps de la complexité.OriginalL'auteur Frank
Ce problème peut être réduit à trouver toutes les combinaisons de longueur 4. Pour chaque combinaison, ainsi obtenues, la somme des éléments et vérifier si elle est égale à X.
OriginalL'auteur Deepthi
Ce problème peut être considéré comme une variation de pascals identité,
voici le code complet :
s'il vous plaît excuser, comme le code est en java :
}
D'entrée d'échantillon :
De sortie : :
OriginalL'auteur sourav palmal