2013-11-20 7 views
5

Zuallererst ist mein Ziel, nur ein Element in beiden bekannten Mengen zufällig zu erhalten. Meine ursprüngliche Methode ist also, zuerst zwei Sätze zu schneiden. Und dann nach dem Zufallsprinzip ein Element aus der geschnittenen Menge aufnehmen. Aber das ist töricht, denn ich brauche nur Elemente, aber eine geschnittene Menge.Was ist der Algorithmus von 'set.intersection()' in Python?

Also muss ich den Algorithmus von set.intersection() finden.

Ich vergleiche die Kosten Zeit zwischen den Methoden von 'set.intersection()' und 'für {für {}}'. Set.intersection() ist schneller als andere (100 Mal). Die Verwendung von 'für {für {}}', um Elemente zufällig auszuwählen, ist also keine kluge Idee.

Was ist der Algorithmus hinter set.intersection() in Python?

+4

Die CPython ein, die Jython, die Ironpython eine oder die PyPy ein? : p ... Solange ein korrektes Ergebnis zurückgegeben wird, wenn 'set.intersection' aufgerufen wird, ist es jeder Implementierung freigestellt, es so zu machen, wie es sich anfühlt. Sie können den Quellcode für jede der Implementierungen herunterladen/anschauen, um zu sehen, wie sie es machen ... –

+1

Was ist Ihr echtes Anwendungsmodell? Die eigentliche Frage lautet: "Wie kommt man am schnellsten zu einem zufälligen Element aus einer Schnittmenge von zwei Mengen?" und das hängt wahrscheinlich davon ab, ob deine Daten ursprünglich ein Set sind oder nicht. –

Antwort

8

The algorithm ist wie folgt: der kleinere Satz wird überschliffen und jedes Element wird kopiert, je nachdem, ob es im größeren Satz gefunden wird. Also, es ist das C-Äquivalent von

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 

(Oder:. return set(x for x in a if x in b))

+0

Es ist etwas anders, wo 'set.intersection' mit nicht gesetzten iterables zur Verfügung gestellt wird (und wo es mehr als iterable gibt) –

+0

@JonClements: in diesem Fall wird nur das Swapping übersprungen. Das erste Argument muss ein 'Set' sein. –

+0

Interessant. Gibt es eine Möglichkeit sicherzustellen, dass x von einer bestimmten Menge kommt, oder ist es immer die größere? – mjacksonw