2013-11-20 122 views
5

首先,我的目的是隨機獲得兩個已知集合中的一個元素。所以我原來的方法是先交叉兩組。然後從相交集合中隨機選取一個元素。但這是愚蠢的,因爲我只需要一個元素,但是一個相交的集合。python中'set.intersection()'的算法是什麼?

所以我需要找到set.intersection的算法()。

我比較的方法「set.intersection()」之間的時間成本「爲{爲{}}」。 Set.intersection()比另一個(100次)更快。因此,使用'for {for {}}'來隨機取出元素並不是一個明智的想法。

背後有什麼在python set.intersection()的算法?

+4

CPython的一個,Jython的,IronPython的一個或pypy一個? :p ...只要調用'set.intersection'時返回正確的結果,那麼任何實現都可以自由地執行它的感覺。你可以免費下載/查看任何實現的源代碼,看看它們是如何實現的...... –

+1

你的真實使用模式是什麼?真正的問題是'從兩組交集中得到一個隨機元素的最快方法是什麼?'這可能取決於你的數據是否最初是一個集合。 –

回答

8

The algorithm如下:較小的集循環結束,每一個元素被複製取決於無論是在做大集中找到。因此,它是等價的C的

def intersect(a, b): 
    if len(a) > len(b): 
     a, b = b, a 

    c = set() 
    for x in a: 
     if x in b: 
      c.add(x) 
    return c 

(或者:return set(x for x in a if x in b)

+0

這其中'set.intersection'設有非集iterables雖然有點不同(凡有不止一個迭代器) –

+0

@JonClements:在這種情況下,它只是跳過交換。第一個參數必須是「set」。 –

+0

有趣。有什麼方法可以確保x來自特定的集合,還是始終是大集合? – mjacksonw