簡體   English   中英

查找列表中不同於x的所有數字對的最快方法

[英]The fastest way to find all pairs of numbers in a list that differ not more than x

我現在擁有的:

d = 0
res = 0
newlist = []
l = [4, 1, 6, 1, 1, 1]

for el in range(len(l)):
    for j in range(len(l)):
        if abs(l[el] - l[j]) <= d and el != j and el not in newlist and j not in newlist:
            newlist.append(el)
            newlist.append(j)
            res += 1

print(res)

它運作良好並返回2是正確的(1,1; 1,1),但需要太多時間。 如何讓它更快地工作? 謝謝。

例如,如果list = [1,1,1,1]和d = 0,則會有2對,因為您只能使用每個數字一次。 不允許使用(a,b)和(b,c),(a,b)與(b,a)是同一對...

對列表進行排序,然后瀏覽它。

一旦你對列表進行了排序,你就可以貪婪:采用最早的一對,然后是下一個,然后是下一個......你將得到最大數量的有效對。

def get_pairs(lst, maxdiff):
    sl = sorted(lst) # may want to do lst.sort() if you don't mind changing lst
    count = 0
    i = 1
    N = len(sl)
    while i < N:
        # no need for abs -- we know the previous value is not bigger.
        if sl[i] - sl[i-1] <= maxdiff:
            count += 1
            i += 2 # these two values are now used
        else:
            i += 1
    return count

這里有一些代碼可以對它進行基准測試:

print('generating list...')
from random import randrange, seed
seed(0) # always same contents
l = []
for i in range(1000000):
    l.append(randrange(0,5000))

print('ok, measuring...')

from time import time

start = time();
print(get_pairs(l, 0))
print('took', time()-start, 'seconds')

結果(列表中有100萬個值):

tmp$ ./test.py 
generating list...
ok, measuring...
498784
took 0.6729779243469238 seconds

您可能希望單獨計算所有對,然后收集所需的對。

def get_pairs(l, difference):
    pairs = []
    # first compute all pairs: n choose 2 which is O(n^2)
    for i in xrange(len(l)):
        for j in xrange(i+1, len(l)):
            pairs.append((l[i], l[j]))

    # collect pairs you want: O(n^2)
    res = []
    for pair in pairs:
        if abs(pair[0] - pair[1]) <= difference:
            res.append(pair)
    return res

>>> get_pairs([1,2,3,4,2], 0)
>>> [(2, 2)]
>>> get_pairs([1,2,3,4,2], 1)
>>> [(1, 2), (1, 2), (2, 3), (2, 2), (3, 4), (3, 2)]

如果要從結果中刪除重復項,可以在使用set(res)返回res列表之前將其轉換為set(res)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM