J'ai une liste de> 10.000 éléments int. Les valeurs des articles peuvent être très élevées, jusqu'à 10^27. Maintenant, je veux créer toutes les paires d'objets et calculer leur somme. Ensuite, je veux chercher différentes paires avec la même somme.Python: dictionnaire rapide des grandes touches int
Par exemple:
l[0] = 4
l[1] = 3
l[2] = 6
l[3] = 1
...
pairs[10] = [(0,2)] # 10 is the sum of the values of l[0] and l[2]
pairs[7] = [(0,1), (2,3)] # 7 is the sum of the values of l[0] and l[1] or l[2] and l[3]
pairs[5] = [(0,3)]
pairs[9] = [(1,2)]
...
Le contenu de pairs[7]
est ce que je cherche. Cela me donne deux paires avec la même somme de valeur.
Je l'ai implémenté comme suit - et je me demande si cela peut être fait plus rapidement. Actuellement, pour 10.000 articles, il faut> 6 heures sur une machine rapide. (Comme je l'ai dit, les valeurs de l
et que les clés de pairs
sont ints jusqu'à 10^27.)
l = [4,3,6,1]
pairs = {}
for i in range(len(l ) ):
for j in range(i+1, len(l)):
s = l[i] + l[j]
if not s in pairs:
pairs[s] = []
pairs[s].append((i,j))
# pairs = {9: [(1, 2)], 10: [(0, 2)], 4: [(1, 3)], 5: [(0, 3)], 7: [(0, 1), (2, 3)]}
Edit: Je veux ajouter un peu de fond, comme demandé par Simon Stelling .
L'objectif est de trouver Analogies formelles comme
lays : laid :: says : said
dans une liste de mots comme
[ lays, lay, laid, says, said, foo, bar ... ]
J'ai déjà une fonction analogy(a,b,c,d)
donnant True
si a : b :: c : d
. Cependant, je devrais vérifier tous les quadruples possibles créés à partir de la liste, ce qui serait une complexité autour de O ((n^4)/2).
En tant que pré-filtre, je souhaite utiliser la propriété char-count. Il est dit que chaque char a le même nombre en (a, d) et en (b, c). Par exemple, dans « layssaid » nous avons 2 A, et nous le faisons dans « laidsays »
L'idée était jusqu'à présent
- pour chaque mot pour créer un « nombre omble chevalier vecteur » et représentent en entier (les éléments de la liste
l
) - créer tous les appariements en
pairs
et de voir s'il y a des «groupes de paires», c'est-à-dire plus d'une paire pour une somme de vecteur de compte de caractères particulière.
Et ça marche, c'est juste lent. La complexité est proche de O ((n^2)/2) mais c'est encore beaucoup, et surtout la recherche de dictionnaire et l'insertion se font souvent.
Le problème n'est pas la taille des ints, il est le fait que vous avez une boucle double imbriquée sur tous les éléments qui est dans 'O (n^2)' – blubb
As-tu vraiment attendu 6 heures avant de finir? cependant, je suggère de jeter un oeil à PEP8 :) – Ant
... également la plage renvoie une liste complète avec tous les éléments étendus, utilisez xrange à la place –