c++ - 在三元堆中实现滴流操作的最有效方法

标签 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);
}

最佳答案

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

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

您的“筛选”算法分两步完成:找到最小的元素,然后将其与当前元素交换。当您可能应该使用更通用的解决方案时,您通过简单地添加更多测试将二元堆概括为三元堆。如果你去一个 4 元堆呢?你会添加更多的 if-else 测试吗?

关于c++ - 在三元堆中实现滴流操作的最有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19372514/

相关文章:

c++ - 为什么 c++ 中的堆被实现为算法而不是容器?

c# - 使用 WPF 绘制数千个数据点的最高效方法?

c++ - 为SIMD分配内存对齐的缓冲区; | 16如何给出16的奇数倍,为什么呢?

c - 提取最小元素后的最小堆问题

c++ - 如何为非模板类​​定义模板方法?

java - 如何为hadoop mapreduce配置Java内存堆空间?

c - openmp 在指针数组和指向数组的指针之间的性能差异有什么问题?

java - 记录复杂性和对 MessageFormat 性能的关注

c++ - 为什么我们要设置/MT在另一台电脑上运行可执行文件

C++使用标准输入的大小初始化数组