2014-12-02 29 views
1

給定range(n)從對象範圍中獲取對的最快方法是按列表中每個對象的距離排序,即對於兩個元素列表AB的距離是abs(A-B)。 這是我想出了實現:從列表中獲取對的最快方法

sorted(combinations(range(n), 2), key=lambda a: -abs(a[0]-a[1])) 

,但我想這是一個發電機,更高效。

+0

你可以排序'combinations'的情況下直接轉化成榜第一。你爲什麼要發電機? – 2014-12-02 13:13:18

+0

更改爲不先轉換爲列表。我相信它作爲一個發電機會更有效率。 – vfxGer 2014-12-02 14:17:16

+0

基本上,兩個答案都會生成具有給定距離(n,n-1,n-2,...)的所有數字對,而不是生成所有對,測量距離並排序:通過使用更好的算法,它們避免所有的減法_和_結果上的排序。任何其他節省都是微不足道的。 – alexis 2014-12-02 14:43:57

回答

2

如果你想要一臺發電機:

def distant_pairs(n): 
    for d in range(n, 0, -1): 
     for i in range(n-d): 
      yield (i, i+d) 

或者散文:對於每一個可能的距離,從最大到最小,找到每個將它們分開一段距離並將其收割。

這裏有一個小的測試工具來證明它的工作原理:

for n in range(12): 
    answer = list(distant_pairs(n)) 
    prev_answer = sorted(combinations(range(n), 2), key=lambda a: -abs(a[0]-a[1])) 

    print "SIZE", n 
    print answer 
    print prev_answer 
    assert answer == prev_answer 
    print "---" 
print "done" 
1

在距離外環將工作:

((a, a + d) for d in range(1, n) for a in range(n - d)) 
相關問題