Ich versuche, Konstante-Zeit-Lookup für Werte im Zusammenhang mit den Teilmengen einer bestimmten Menge, wo Reihenfolge nicht garantiert ist.Python effiziente Lookup-Struktur für dynamische Teilmengen?
Ich werde aktiv mit dem ursprünglichen Satz arbeiten, Entfernen/Hinzufügung von Elementen, und würde gerne assoziierte Werte der übrigen Elemente nachsehen, wie ich entlang gehe.
Zum Beispiel, wenn mein gegebenen Satz ist given = {1, 2, 3}
, vielleicht würde ich ein dict bauen, der so aussieht ...
{
frozenset([]): 'apple',
frozenset([1]): 'orange',
frozenset([2]): 'ice bear',
frozenset([3]): 'peach',
frozenset([1, 2]): 'grizzly',
frozenset([2, 3]): 'pear',
frozenset([1, 3]): 'panda',
frozenset([1, 2, 3]): 'banana',
}
nehme ich ein Element entfernen über given.remove(2)
gesetzt gegeben und ließ mich mit {1, 3}
, und ich wollte den zugehörigen Wert sehen. Ich müsste mein Set auf "eingefroren" setzen, um es im Diktat nachzuschlagen und den Wert 'panda'
abzurufen. Folglich, wenn ich das Element über given.add(2)
zurücksetze, das ursprüngliche {1, 2, 3}
wieder herstellend, würde ich wieder gezwungen werden, zu gefrorenem set vor dem Abrufen banana
vom dict.
Ich fühle mich wie gezwungen, zu einem Frozenset zu zwingen ist eine O (n) -Operation, die den Zweck eines O (1) Lookup vereitelt.
Gibt es eine Möglichkeit, diese Art der Suche in Python effizienter zu implementieren? Oder gibt es irgendwelche Datenstrukturen, die mir hier helfen können?
Ich bin auf Py2.7, aber wenn Py3 dafür besser ist, lass es mich wissen. Vielen Dank!
Es ist 'O (n)' wobei 'n' die Größe des Schlüsselsatzes ist, nicht die Größe Ihres Wörterbuchs, was ein wichtiger Unterschied ist. Wie groß sind diese Sets? In jedem Fall erfordert das Nachschlagen in einem Wörterbuch immer noch das Hashing des Schlüssels, der ebenfalls 'O (n)' sein muss. –
Danke Alex, das ist absolut richtig. Ich habe über den falschen Weg nachgedacht. Die Sets sind ziemlich groß, aber theoretisch muss das Hashing selbst auch die Länge des Schlüssels durchlaufen. –