代码之家  ›  专栏  ›  技术社区  ›  user3244591

用于测试的半填充二叉搜索树的最佳方法

  •  0
  • user3244591  · 技术社区  · 9 年前

    我想设置一个测试,看看多个线程改变树的速度有多快。为了做到这一点,我需要设置一个初始树,其中键在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^(2-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]);
    

    有更好的方法吗?

    1 回复  |  直到 9 年前
        1
  •  0
  •   MSalters    9 年前

    如果您不关心以后更改树,则最简单的方法可能是首先创建骨架树图,然后输入适合该位置的值。

    也就是说,由于您希望值介于0和 INT_MAX ,根将是 INT_MAX/2 . 如果 INT_MAX/4 ; 如果 有一个合适的孩子 3*INT_MAX/4 位模式应该是明显的: 100.... , 010 ... , 110...`. 显然,这仅限于N个级别,因为在深度D处必须设置第(N-D)位。