我将数据存储在树的叶子中。使用作为对象元组的键访问叶子。树可能很大,我想浓缩它。例如:
*
/ \
a b
/|\ \
1 2 5 1
/ /| |\ |\
x x y x z y z <-- Leaves
| | | | | | |
1 2 7 1 3 1 1 <-- Values at leaves
元组(*, a, 1, x)
和(*, a, 5, x)
都会在树叶处产生1
的值,因此树可以缩小为:
*
/ \
a b
/ \ \
A 2 1
/| /| |\
x z x y y z
| | | | | |
1 3 2 7 1 1
其中A
代表1
或5
。当然,通过检查集合A
中的成员资格来减慢查找速度。我正在寻找描述这种数据结构和相关程序的来源。
我正在使用c ++,以防任何人受到鼓舞,分享相关的代码问题。
答案 0 :(得分:0)
在不知道您使用树的情况下,很难提出建议,但我相信这样的树结构在实践中实际上永远不会有用,因为使用某种排序集或关联更容易地图比这个。
但是,如果您已经拥有树结构并且希望保持与当前完全一致的效率,则可以代替合并分支,将所有叶子替换为指向数据的指针。这样,您可以存储每个数据对象一次并使多个叶子指向同一个数据对象。它也是最灵活的解决方案,因为您仍然可以通过简单地更改指针来更改任何叶子的值,而在合并分支的想法中,如果没有持久的数据结构,则无法撤消它。