2016-06-07 5 views
1

Ich möchte etwas wie "Zeichen, bei denen die Reihenfolge keine Rolle spielt" als Schlüssel zum Erstellen eines Wörterbuchs in Python verwenden.Was kann ich Tuple (sortierte (my_string)) in Python ersetzen?

Wie "abc" und "cba" kann mir den gleichen Hash-Index geben, und "aab" und "ab" geben mir verschiedene Hash-Indizes.

Ich fand eine Möglichkeit ist tuple(sorted(my_string)) zu verwenden, um eine Liste von Zeichen zu hashable, aber es kann O (NlogN) Zeit Komplexität erfordern.

Ich habe versucht, Counter zu verwenden, aber es ist nicht waschbar. Frozenset ist zwar hashbar, erlaubt jedoch keine Duplikate.

Gibt es einen besseren Weg (O (N) Zeit Komplexität) zu ersetzen tuple(sorted(my_string))?

Wenn oben Fehler auftreten, bitte korrigieren Sie mich. Vielen Dank!

+2

Verwenden Sie einfach ''' .join (sortierte (my_string))'. Das Tupel ist unnötig. Es ist nichts falsch mit O (N log N) Algorithmen - viele Algorithmen sind O (N log N), und dennoch benutzen wir sie immer noch. –

+0

Was ist 'triple'? Meinst du Tupel? – interjay

+0

@interjay Sorry, es ist ein Tippfehler. Ja, ich meine 'Tuple' –

Antwort

3

Sie können O(N) Zeitkomplexität mit frozenset(Counter(my_string).items()) erhalten. Vielleicht möchten Sie Zeit, ob dies tatsächlich in der Praxis gewinnt, weil der konstante Faktor dieses Codes hoch genug sein kann, um den zusätzlichen logarithmischen Faktor ''.join(sorted(my_string)) aufzuwiegen.

+0

Danke! Als ich versuchte die Zeit zu testen, fand ich 'frozenset (Counter (" bob ")) == frozenset (Counter (" boo "))' würde mir 'True' geben. Ich bin mir nicht sicher, wo falsch gelaufen ist. –

+0

@JayWong: Du hast 'Items' nicht aufgerufen. – user2357112

+1

Wow, ich verstehe! Ich bin immer noch neugierig, warum 'frozenset (Counter (" bob ")) == frozenset (Counter (" boo "))' 'True' zurückgeben würde. 'Counter (" bob ")' und 'Counter (" boo ")' sind zwei verschiedene Objekte. –