【问题标题】:data structure advice on c++关于 C++ 的数据结构建议
【发布时间】:2015-04-30 09:06:30
【问题描述】:

我正在寻找 c++ 中的数据结构,我需要一个建议。

我有节点,每个节点都有 unique_id 和 group_id:

1 1.1.1.1
2 1.1.1.2
3 1.1.1.3

4 1.1.2.1
5 1.1.2.2
6 1.1.2.3

7 2.1.1.1
8 2.1.1.2

我需要一个数据结构来回答这些问题:

  1. 节点 4 的 group_id 是什么
  2. 给我属于组 1.1.1 的 unique_id 的列表(可能是向量)
  3. 给我属于组 1.1 的 unique_id 的列表(可能是向量)
  4. 给我属于第 1 组的 unique_id 的列表(可能是向量)

是否有可以回答这些问题的数据结构(插入和回答的复杂时间是多少)?还是我应该实现它?

我会很感激一个例子。

编辑:

一开始,我需要构建这个数据结构。大部分操作是按组 ID 读取。插入会发生,但会少于读取。

时间复杂度比内存空间更重要

【问题讨论】:

  • 我们在这里谈论多少对象,这是以某种方式标记的数据库,这意味着该结构不适合内存?
  • hmm 不超过 500 个节点。它应该适合内存
  • 相关:stackoverflow.com/questions/13721522/… 真的你应该首先使用向量,除非你发现它很慢,这意味着分析。那我推荐一张地图

标签: c++ data-structures


【解决方案1】:

对我来说,像组 ID 这样的分层数据需要树状结构。 (我假设对于 500 个元素,这并不是必需的,但它看起来很自然并且可以很好地扩展。)

树的前两级中的每个元素将只包含子 ID 的向量(如果它们是有序的)或映射(如果它们是无序的)。

树层次结构中的第三层将保存指向叶子的指针,同样在向量或映射中,其中包含第四组 ID 部分和唯一 ID。

通过导航树可以轻松快速地回答问题 2-4。

对于问题 1,需要一张从唯一 ID 到树中叶子的附加映射;插入到树中的每个元素也都有一个指向它的指针插入到地图中。

【讨论】:

    【解决方案2】:

    首先,如果您将只有少量节点,那么不要弄乱高级数据结构可能是有意义的。简单的线性搜索就足够了。

    接下来,这对于 SQL 来说似乎是一项不错的工作。因此,将其合并到您的应用程序 SQLite 库中可能是一个好主意。但即使您真的想在没有 SQL 的情况下执行此操作,它仍然是一个很好的提示:您需要两个索引树来支持快速搜索您的数组。复杂性(如果使用平衡树)对于所有操作都是对数的。

    【讨论】:

    • 您好,谢谢您的回答。树木将如何回答问题 2、3、4?
    • @userd 就像在 SQL 中一样 LIKE ('1%') 工作。与在这里搜索简单数字不同,每个其他数字都将搜索减少到较小的子树中。要找到一个数据列表,您需要遍历一个 subtree 从最左边的叶子开始到最右边的叶子结束(通常为了速度 DBMS 使用附加链表,即每个树节点也有 next/prev指针)。
    • @user4419802 - 请注意 LIKE (...) 非常昂贵,并且很可能会破坏您所有的索引使用... DB 没问题,但请查看 CONNECT 级别语句.
    • @MarioTheSpoon 这取决于 LIKE 的表达方式。 LIKE('abc%') 允许 索引使用,而LIKE('%xyz') 不允许。 use-the-index-luke.com/sql/where-clause/searching-for-ranges/…
    【解决方案3】:

    取决于...

    您多久插入一次?还是你主要阅读? 您多久通过 Id 或 GroupId 访问一次?

    最多有 500 个节点,我会将它们放在一个简单的 Vector 中,其中 Id 是数组的偏移量(如果 Id 确实如图所示)。然后可以通过遍历数组并比较部分 gtroup-id 来实现组搜索。

    如果这太贵了,并且您确实需要大量访问结构并且需要非常高的性能,或者您做了很多插入,我会为 Id 实现 treeHashMap

    如果数据存储在数据库中,您可以使用SELECT/ CONNECT BY(如果您的系统支持)并直接从数据库中查询信息。

    很抱歉没有提供明确的答案,但解决方案取决于太多因素;-)

    【讨论】:

    • 然后我会使用简单的数组/向量和辅助函数或树,因为部分 GroupId 的比较可能会变得非常昂贵。而 HashMap 对这个问题没有帮助。
    【解决方案4】:

    听起来您需要一个在unique_idgroup_id 上有两个独立索引的容器。问题 1 将由第一个索引处理,问题 2-4 将由第二个索引处理。

    不妨看看Boost Multi-index Containers Library

    【讨论】:

      【解决方案5】:

      我不确定这方面的完美 DS。但我想使用地图。 它将为问题 1 以及插入 O(logn) 和删除提供 O(1) 效率。问题出现在问题 2,3,4 中,您的效率将是 O(n),其中 n 是节点数。

      【讨论】:

      • 抱歉,您从哪里获得O(1) 用于查找、插入和删除地图?
      • 任何哈希图都会为您提供 O(1) 的查找时间,因为您将使用键来查找值。在插入/删除方面,由于您没有遵循任何插入顺序并且在删除时没有移动元素,因此性能将非常接近 O(1)
      • 对不起,插入将被登录
      猜你喜欢
      • 1970-01-01
      • 2017-09-01
      • 1970-01-01
      • 2011-06-22
      • 2011-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多