2009-12-15 16 views
3

J'ai lutté avec ces questions depuis un certain temps maintenant. La question est la suivante: -trouver un triplet ayant une somme donnée

Nous avons n^2 nombres. Nous avons besoin de savoir s'il existe un triplet a, b, c tel que a + b + c = 0. Pour un cas plus générique, a + b + c = k. (k est donné)

Il existe une solution avec une complexité O (n^2log (n)).

Toute aide serait grandement appréciée.

grâce

+1

Vous voudrez peut-être lire la littérature existante sur le problème de la somme des sous-ensembles, qui est une version plus générale de ce que vous proposez. http://en.wikipedia.org/wiki/Subset_sum_problem – mquander

+0

Juste par curiosité, est-ce pour le projet Euler? –

+0

Non, ce n'est pas pour le projet euler. Ce problème a été posé dans un de mes examens il y a quelques années. – Pigol

Répondre

3

Pour obtenir ceci dans O (n²logn), vous devez trier les nombres. Trouvez toutes les combinaisons de 2 nombres, et faites une recherche binaire pour trouver la troisième.

La limite supérieure est beaucoup plus élevée pour la version générale du problème.

+0

le nombre de combinaisons serait O (n^4). nous recherchons une solution optimisée. – Pigol

+0

Donc, fondamentalement, pour reformuler, vous dites qu'il y a n éléments et qu'il y a une solution dans O (nlog√n)? – Anurag

+0

@Anurag, allez, log√n est égal à ½log n –

0

J'ai écrit une solution approximative.

On peut certainement le faire en O (n^2). Vous n'avez pas à trier cela.

C'est une extension du problème qui nécessite de sommer deux nombres en x et l'astuce consiste à utiliser la table de hachage.

def triplets(l, total): 
    """Sum of 3 numbers to get to total 
    Basically an extension of the 2 table 
    """ 
    l = set(l) 
    d = { } 

    for i in l: 
     remain = total - i 

     inside = {} 
     for j in l: 
      if i == j: 
       continue 
      inside[j] = remain -j 

     d[i] = inside 

    good = set() 

    for first, dic in d.iteritems(): 
     for second, third in dic.iteritems(): 
      if third in l: 
       good.add(tuple(sorted([first, second, third]))) 

    for each in good: 
     print each 

triplets([2, 3, 4, 5, 6], 3+4+5) 

NOTE: nous pouvons utiliser une méthode de tri rapide pour les triplets qui seront O (1).

+0

Pourriez-vous s'il vous plaît fournir C ou Java de votre Solution? – Hengameh

Questions connexes