我想将“TreeView”实现为树到列表的可视化映射,列表中的缩进由映射节点的深度提供。我的具体问题是一个2层深的树,第一层有100 000个节点,每个节点包含20个节点(即100 000个文件夹,每个文件夹包含20个文件)。目前,我在std::map
中维护树的映射,对于完全展开的树(“TreeView”中有2 000 000个可能可见的项目),它看起来像这样:
key value
0 pointer to parent node 0
20 pointer to parent node 1
40 pointer to parent node 2
...
这意味着列表项[0,19]由父节点0覆盖,[20,39]由父节点1覆盖,...如果我折叠节点0,则需要更新映射:
key value
0 pointer to parent node 0
1 pointer to parent node 1
21 pointer to parent node 2
...
此处,列表项0由父节点0覆盖,列表项[1,20]由父节点1覆盖,...这意味着std::map
中99 000个值的键需要更新时折叠节点0.这意味着99000次删除和插入到地图中,否则无法更新密钥。什么数据结构和/或容器允许我更新映射树 - >列出更少的努力?
答案 0 :(得分:2)
这看起来像你可以使用增强树。这将使更新这些键占用对数时间,按键查找也将是对数时间。
不幸的是,我不能在这里写一个完整的答案,因为我需要出去,但希望这篇文章会有所帮助:http://je4d.blogspot.co.uk/2013/01/boostintrusive-annotated-trees-part-1.html