关于c ++的数据结构建议

时间:2015-04-30 09:06:31

标签: c++ data-structures

我正在寻找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
  3. 的unique_id的列表(可能是矢量)
  4. 给我属于组1.1的unique_id的列表(可能是矢量)
  5. 给我属于group 1的unique_id的列表(可能是vector)
  6. 是否有可以回答这些问题的数据结构(插入和回答的复杂时间是多少)?或者我应该实施它?

    我很感激一个例子。

    修改

    一开始,我需要构建这个数据结构。大部分动作都是按组ID阅读。插入会发生但不会再读。

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

5 个答案:

答案 0 :(得分:5)

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

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

树层次结构中的第三个级别将保留指向叶子的指针,同样在向量或地图中,其中包含第四个组ID部分和唯一ID。

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

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

答案 1 :(得分:3)

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

接下来,它看起来像SQL一样好。因此,将您的应用程序SQLite库合并到一起可能是一个好主意。但即使你真的想在没有SQL的情况下这样做,它仍然是一个很好的暗示:你需要的是两个索引树来支持快速搜索你的数组。所有操作的复杂性(如果使用平衡树)都是对数的。

答案 2 :(得分:2)

...取决于

您多久插入一次?或者你大部分都读过? 您多久访问一次ID或GroupId?

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

如果这太昂贵而且你真的很多地访问了strcuture并且需要非常高的性能,或者你做了很多插入,我会为Id的tree实现HashMap。 / p>

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

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

答案 3 :(得分:0)

我不确定这个完美的DS。但我想利用一张地图。 它将为问题1和插入O(logn)和删除提供O(1)效率。问题2,3,4出现问题,你的效率将是O(n),其中n是节点数。

答案 4 :(得分:0)

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

也许看看Boost Multi-index Containers Library