在三元堆中实现trickledown操作的最有效方法

时间:2013-10-15 02:50:38

标签: c++ heap performance ternary ternary-tree

如果标题中的术语已关闭,请注意。我试图通过更频繁地使用它们来更好地理解这些术语。

无论如何,我目前正在数据结构类(使用C ++)中的实验室工作,我必须构建一个三元堆并将其与已经提供给我们的二进制堆进行比较。由于我有一些额外的时间,我想在我的代码中解决一些细节,以便它尽可能高效地运行。

我最关心的是我正在使用的if-else语句的数量。我实际上不得不花十分钟时间在纸上整理它们的布局,所以我没有感到困惑。 (我不是在抱怨,我只是不知道这是否是解决问题的最佳方式。)

template<class T>
void TernaryHeap<T>::trickleDown(int i) {
do {
    int j = -1;

    int r = right(i);
    if (r < n && compare(a[r], a[i]) < 0) {

        int l = left(i);
        if (compare(a[l], a[r]) < 0) {
            j = l;
        } else {
            j = r;
        }

        int m = mid(i);
        if (compare(a[m], a[r]) < 0) {
            j = m;
        } else { 
            j = r; 
        } 

    } else {

        int l = left(i);
        if (l < n && compare(a[l], a[i]) < 0) {

            int m = mid(i);
            if (compare(a[m], a[l]) < 0) {
                j = m;
            } else {
                j = l;
            }
        }
    }
    if (j >= 0) a.swap(i, j);
    i = j;
} while (i >= 0);
}

1 个答案:

答案 0 :(得分:0)

您将如何找到2元素阵列中的最小元素?您可能会发现单个if-else就足够了。

现在为3元素数组做同样的事情。你刚添加更多条件吗?或者你只是编写一个处理任何大小数组的通用算法?

你的&#34;筛选&#34;算法分两步完成:找到最小的元素,然后用当前元素交换它。通过简单地添加更多测试,您可以将二进制堆一般化为三元堆,而您可能应该使用更通用的解决方案。如果你去4-ary堆怎么办?你会添加更多的if-else测试吗?