我正在寻找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
我需要一个数据结构来回答这些问题:
是否有可以回答这些问题的数据结构(插入和回答的复杂时间是多少)?或者我应该实施它?
我很感激一个例子。
修改
一开始,我需要构建这个数据结构。大部分动作都是按组ID阅读。插入会发生但不会再读。
时间复杂度比内存空间更重要
答案 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_id
和group_id
上有两个独立索引的容器。问题1将由第一个索引处理,问题2-4将由第二个索引处理。