【问题标题】:Is there a structure in Python similar to C++ STL map?Python中是否有类似于C++ STL map的结构?
【发布时间】:2010-09-06 23:12:17
【问题描述】:

Python 中是否有一个结构支持与C++ STL map 类似的操作,并且操作的复杂性对应于C++ STL map

【问题讨论】:

  • 你检查过 Python 3.1 中的有序字典吗?
  • 调查他们。谢谢,这对我的目的应该足够了。哈希插入/删除是 O(1),但我想这将需要比 O(logN) 的树更多的内存。
  • 树和哈希表都需要 O(n) 内存。

标签: c++ python


【解决方案1】:

dict 通常足够接近 - 你想要它不做什么?

如果答案是“提供订单”,那么for k in sorted(d.keys()) 到底有什么问题?使用太多内存,也许?如果您正在执行大量插入插入的有序遍历,那么好吧,点,您确实想要一棵树。

dict 实际上是一个哈希表而不是 b 树。但是map 没有定义 为 b 树,因此它不允许您将子树分离为新的 map,它只是具有相同的性能复杂性。真正需要担心的是,当存在大量哈希冲突时,dict 会发生什么,但在需要严格的最坏情况性能保证的情况下使用 Python 肯定是非常罕见的。

【讨论】:

  • 是的,dict 应该足够了。谢谢!
  • dict 没有为map::lower_bound 提供等效项,因此我无法在dict 中搜索与已知键最近的元素。
  • @lvella:是的,这是“提供订单”的一部分(尽管在 C++ 中称为“有序容器”的东西在 Python 中通常称为“有序容器”)。如果您需要一个排序的容器,那么它可以是一个库,或者(出于学习目的)点击教科书并自己动手。
  • python dict 没有涵盖一个重要的用例。即对于比较相等的两个元素stl map 将只包含其中一个,即map 将它们粘合在一起。您想要使用它的情况是,例如,如果您想缓存某些对象上的函数调用结果。不同的对象散列不同,但我们希望参数的单个条目应该给出相同的值。 Python dict 作为 hashmap 不适合这种用法。
【解决方案2】:

Python SortedDict 是一个类似于 C++ STL 的映射。你可以阅读它herehere

SortedDict 是键值对的容器,其中的顺序是 根据它们彼此之间的有序关系强加在键上。 与 Python 内置的 dict 数据类型一样,SortedDict 支持快速 按键插入、删除和查找。

【讨论】:

  • 谷歌搜索时,注意不要使用 Django 调用的 SortedDict,因为它更像 OrderedDict,保留插入顺序而不是键顺序。
【解决方案3】:

我相信标准的 python 类型 dict() 在大多数情况下都可以解决问题。与 C++ 的 std::map 的区别在于 dict 是作为哈希映射实现的,而 C++ 的映射是基于树的。

【讨论】:

    【解决方案4】:

    【讨论】:

      【解决方案5】:

      你看过Python dictionaries吗?

      【讨论】:

        【解决方案6】:

        查看 bintrees 模块(pip install bintrees)。这个包提供了用 Python 和 Cython/C 编写的 Binary-RedBlack- 和 AVL-Trees。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-05-20
          • 1970-01-01
          相关资源
          最近更新 更多