2013-11-20 14 views
5

まず、私の目的は、両方の既知のセットで1つの要素だけをランダムに取得することです。だから私の元の方法は最初に2つのセットを交差させる。そして交差した集合から要素をランダムに拾い上げる。しかし、これは愚かです。なぜなら、私は要素だけでなく交差したセットしか必要としないからです。pythonで 'set.intersection()'のアルゴリズムは何ですか?

だから私はset.intersection()のアルゴリズムを見つける必要があります。

「set.intersection()」と「for {for {}}」の間のコスト時間を比較します。 Set.intersection()は他のものよりも高速です(100回)。だから、 'for {for {}}'を使って要素をランダムに選ぶのは賢明ではありません。

pythonでset.intersection()の後ろにあるアルゴリズムは何ですか?

+4

CPythonの1、Jythonの、IronPythonの1またはpypy 1? :p ... 'set.intersection'が呼び出されたときに正しい結果が返される限り、どのような実装でも、どのように感じるかは自由です。あなたはどのような実装のためのソースコードをダウンロードしたり、見たりすることが自由です... –

+1

あなたの本当の使用モデルは何ですか?実際の質問は「2つのセットの交差点からランダムな要素を取得する最も速い方法は何ですか?」おそらくあなたのデータがもともとセットであるかどうかによって決まります。 –

答えて

8

The algorithmは次のとおりです。小さなセットがループされ、すべての要素がより大きなセットに含まれるかどうかによってコピーされます。だから、それは

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 

のCと同等(または:return set(x for x in a if x in b)

+0

'set.intersection'が設定されていないiterablesで提供されています(複数のiterableがある場合) –

+0

@JonClements:この場合、スワッピングはスキップされます。最初の引数は 'set'である必要があります。 –

+0

興味深い。 xが特定の集合から来ていることを保証する方法はありますか、それとも常により大きなものでしょうか? – mjacksonw

関連する問題