【问题标题】:What can I replace tuple(sorted(my_string)) with in Python?我可以在 Python 中用什么替换 tuple(sorted(my_string)) ?
【发布时间】:2016-06-07 20:24:37
【问题描述】:

我想使用诸如“顺序无关紧要的字符”之类的东西作为在 Python 中构建字典的关键。

就像 "abc" 和 "cba" 可以给我相同的哈希索引,而 "aab" 和 "ab" 给我不同的哈希索引。

我发现一种方法是使用tuple(sorted(my_string)) 对字符列表进行哈希处理,但它可能需要 O(NlogN) 时间复杂度。

我尝试使用Counter,但它不是可散列的。 Frozenset 是可散列的,但它不允许重复。

有没有更好的方法(O(N) 时间复杂度)来替换tuple(sorted(my_string))

以上如有错误请指正。谢谢!

【问题讨论】:

  • 只需使用''.join(sorted(my_string))。元组是不必要的。 O(N log N) 算法没有任何问题——许多算法都是 O(N log N),但我们仍然使用它们。
  • 什么是triple?你的意思是tuple
  • @interjay 对不起,这是一个错字。是的,我的意思是tuple

标签: python algorithm sorting data-structures set


【解决方案1】:

您可以使用frozenset(Counter(my_string).items()) 获得O(N) 时间复杂度。不过,您可能需要计算这是否真的在实践中获胜,因为此代码的常数因子可能高到足以超过 ''.join(sorted(my_string)) 的额外对数因子。

【讨论】:

  • 谢谢!当我尝试测试时间时,我发现frozenset(Counter("bob")) == frozenset(Counter("boo")) 会给我True。我不确定哪里出了问题。
  • @JayWong:你没有打电话给items
  • 哇,我明白了!我仍然很好奇为什么frozenset(Counter("bob")) == frozenset(Counter("boo")) 会返回TrueCounter("bob")Counter("boo") 是两个不同的对象。
  • @JayWong 在Counter 上迭代会给出没有计数的键。调用 items() 会给出键和计数。
猜你喜欢
  • 2014-11-30
  • 1970-01-01
  • 2017-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-28
相关资源
最近更新 更多