我想设置一个测试,看看多个线程能够以多快的速度修改一棵树,这样我就需要设置一个初始树,它的键范围是0-(2^n)-1,也就是说插入的所有偶数节点都是为了形成平衡的树。
对于n=4,我们需要插入0,2,4,6,8,10,12,14,但按这个顺序;8,4,12,0,2,6,10,14,或6,2,10,0,4,8,14,12将产生一个同样平衡的树。
目前,我只加2^(n-1),即8,然后2^(n-2)的每秒倍数,即4,12,然后2^(n-3)的每秒倍数,即2,6,10,14等等,然后在末尾加0。
下面是C++中的代码,但我并不太担心语言细节,更多的是算法本身。
BST tree = BST();
INT64 diff = HMK;//HMK = Half Max Key
INT64 arrayN[HMK];
INT64 cur = diff;
INT64 i = 0;
Node aNode[HMK];
while (diff >= 2) {
cur = diff;
while (cur < MAX_KEY) {
aNode[i] = Node();
aNode[i].key=cur;
tree.add(&aNode[i]);
i++;
cur += 2*diff;
}
diff = diff / 2;
}
aNode[i] = Node();
aNode[i].key = 0;
tree.add(&aNode[i]);有更好的办法吗?
发布于 2016-12-19 15:32:26
如果您不关心稍后更改树,那么首先创建一个骨架树形图,然后放入适合该位置的值,这可能是最简单的。
也就是说,由于您希望0和INT_MAX之间的值,根目录将是INT_MAX/2。如果有一个左子,它就是INT_MAX/4;如果有一个右子,它就是3*INT_MAX/4。比特模式应该是显而易见的:100....,010.,110.`。显然,这仅限于N级,因为在深度D处,必须设置(N)第四位。
https://stackoverflow.com/questions/41222818
复制相似问题