1
給定range(n)
從對象範圍中獲取對的最快方法是按列表中每個對象的距離排序,即對於兩個元素列表A
和B
的距離是abs(A-B)
。 這是我想出了實現:從列表中獲取對的最快方法
sorted(combinations(range(n), 2), key=lambda a: -abs(a[0]-a[1]))
,但我想這是一個發電機,更高效。
給定range(n)
從對象範圍中獲取對的最快方法是按列表中每個對象的距離排序,即對於兩個元素列表A
和B
的距離是abs(A-B)
。 這是我想出了實現:從列表中獲取對的最快方法
sorted(combinations(range(n), 2), key=lambda a: -abs(a[0]-a[1]))
,但我想這是一個發電機,更高效。
如果你想要一臺發電機:
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"
在距離外環將工作:
((a, a + d) for d in range(1, n) for a in range(n - d))
你可以排序'combinations'的情況下直接轉化成榜第一。你爲什麼要發電機? – 2014-12-02 13:13:18
更改爲不先轉換爲列表。我相信它作爲一個發電機會更有效率。 – vfxGer 2014-12-02 14:17:16
基本上,兩個答案都會生成具有給定距離(n,n-1,n-2,...)的所有數字對,而不是生成所有對,測量距離並排序:通過使用更好的算法,它們避免所有的減法_和_結果上的排序。任何其他節省都是微不足道的。 – alexis 2014-12-02 14:43:57