2016-06-07 30 views
1

我想使用像「順序無關緊要的字符」之類的東西作爲在Python中構建字典的關鍵。什麼可以用Python替換元組(排序(my_string))?

像「abc」和「cba」可以給我相同的散列索引,「aab」和「ab」給我不同的散列索引。

我發現一種方法是使用tuple(sorted(my_string))來散列字符列表,但它可能需要O(NlogN)時間複雜度。

我試過使用Counter,但它不可散列。 Frozenset是可散列的,但它不允許重複。

是否有更好的方法(O(N)時間複雜度)來代替tuple(sorted(my_string))

如果上面有錯誤,請糾正我。謝謝!

+2

只需使用'''.join(sorted(my_string))'。元組是不必要的。 O(N log N)算法沒有問題 - 許多算法都是O(N log N),但我們仍然使用它們。 –

+0

什麼是'triple'?你的意思是'元組'嗎? – interjay

+0

@interjay對不起,這是一個錯字。是的,我的意思是'tuple' –

回答

3

您可以通過frozenset(Counter(my_string).items())獲得O(N)時間複雜度。不過,您可能需要確定這是否實際上在實踐中獲勝,因爲此代碼的常數因子可能足夠高以超過額外的對數因子''.join(sorted(my_string))

+0

謝謝!當我試圖測試時間時,我發現'frozenset(Counter(「bob」))== frozenset(Counter(「boo」))'會給我'真'。我不確定哪裏出了問題。 –

+0

@JayWong:你沒有叫'物品'。 – user2357112

+1

哇,我明白了!我仍然很好奇爲什麼'frozenset(Counter(「bob」))== frozenset(Counter(「boo」))'會返回'True'。 Counter(「bob」)和Counter(「boo」)是兩個不同的對象。 –