【问题标题】:Fast, sorted data structure with random access?具有随机访问的快速、排序数据结构?
【发布时间】:2013-01-05 16:21:23
【问题描述】:

我想在一个允许这样做的结构中添加几个对象:

  1. 插入对象,在添加时立即对整个结构进行排序,所以我有一个 int 的降序;

  2. 能够更改排序对象的 int(我的意思是:假设对象编号 2,现在的 int 为 5,因此它重新排序结构);

  3. 快速结构,因为它会每秒完全迭代60次;

  4. 能够按位置直接访问对象;

  5. 只需要从上到下迭代:INT高到INT低

  6. 不需要删除,但以后可能会变得有用。

关于如何使用该结构的一些指示会很棒,因为我对 C++ 标准库了解不多。

【问题讨论】:

  • 您可以只使用std::map 或平衡二叉树的任何实现,这使您可以快速(O(logN))访问键以及有序键。更改顺序只需删除旧密钥并插入新密钥即可。
  • 谢谢,我去查地图!
  • 你存储了多少元素?如果代码写得相当好的话,你会惊讶于在现代处理器上可以在 1/60 秒内进行多少插入/删除。
  • 每个对象有多大?你每个人都在做什么?
  • 你对每张图片做了什么?把它放到屏幕上,还是别的什么?

标签: c++ data-structures


【解决方案1】:

您列出的所有操作(按索引查找除外)都可以由标准二叉搜索树支持,以整数值作为键。这使您能够按排序顺序迭代元素并在任何插入过程中保持对象的排序。正如@njr 提到的,您还可以通过从二叉搜索树中删除对象、更改它们的优先级,然后将它们重新插入二叉搜索树来更新优先级。

要支持按索引进行随机访问,您应该考虑查看 order statistic trees,这是一种二叉搜索树的变体,除了所有其他操作外,它还支持非常快速 (O(log n)) 的查找一个元素的索引。也就是说,您可以非常有效地查询排序序列中的第 15 个元素,或第 17 个等。顺序统计树不是 C++ 标准库的一部分,但 this older question 包含的答案可以将您链接到一个实现。

【讨论】:

    【解决方案2】:

    使用集合或地图

    对于需求 1 - 提供自定义排序功能

    对于 2 - 删除项目并再次添加(或提供执行此操作的包装器)

    3 没有意义(列表有多大,处理器/内存有多快)

    对于 4 - 你确定你需要那个吗?当位置突然改变(添加或删除某些项目)时尝试按位置访问它似乎有点奇怪

    5 - 与 1 相同

    【讨论】:

    • 3 - 如同为快速迭代而设计的结构。 4 - 位置很少改变
    • 快有多快?让代码尽可能简单,必要时进行优化。
    • 其实,这就够了,我会像查尔斯指出的那样看地图。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-16
    • 2013-11-22
    • 1970-01-01
    • 2013-01-29
    • 2017-09-08
    • 1970-01-01
    相关资源
    最近更新 更多