【问题标题】:Optimal Binary Search Tree for Successful and Unsuccessful Search成功和不成功搜索的最佳二叉搜索树
【发布时间】:2020-07-17 12:50:01
【问题描述】:

我正在研究用 C++ 语言优化二叉搜索树的动态编程算法。我已经建立了自己的程序,但我不知道我的程序是否找到了正确的答案。我试图在互联网上找到示例代码,但我只是找到了成功搜索的示例代码,因此,我不知道正确的答案。不仅如此,我认为我的编码方式有错误,但我无法指出。

如果有不明白的问题,可以看这里Optimal Binary Search Tree

简要说明:这是一个构建最佳二叉搜索树的问题。该问题给出了两组记录在二叉搜索树中找到和未找到对象的概率。根据给定的数据,我需要计算在二叉搜索树中搜索任意对象的最小成本

以下是我的源代码:

double OptimalBinarySearchTree(double Found[], double Unfound[], int n)
{
    double Cost[n + 2][n + 1], Freq[n + 2][n + 1];
    int i, j, k, l;
    double temp = 0;
    memset(Cost, 0, sizeof(Cost));
    memset(Freq, 0, sizeof(Freq));
    for (i = 1; i <= n; i++)
    {
        Cost[i][i - 1] = Unfound[i - 1];
        Freq[i][i - 1] = Unfound[i - 1];
    }
    for (l = 1; l <= n; l++)
    {
        for (i = 1; i <= n - l + 1; i++)
        {
            j = l + i - 1;
            Freq[i][j] = Freq[i][j - 1] + Found[j] + Unfound[j];
            Cost[i][j] = INT32_MAX;
            for (k = i; k <= j; k++)
            {
                temp = 0;
                if (k > i)
                    temp += Cost[i][k - 1];
                if (k < j)
                    temp += Cost[k + 1][j];
                temp += Freq[i][j];
                if (temp < Cost[i][j])
                    Cost[i][j] = temp;
            }
        }
    }
    return Cost[1][n];
}

例如,当我运行我的程序时

    double Found[7] = {0, 0.15, 0.10, 0.05, 0.10, 0.20};
    double Unfound[7] = {0.05, 0.10, 0.05, 0.05, 0.05, 0.10};

我的程序返回的值是 2.45,但也许“真正的”答案是 2.85。我不知道我的算法哪里出错了。我真的需要有人来检查我的程序或算法的正确性。如果你能指出来,我真的很感激。

【问题讨论】:

  • 这个函数应该做什么还不是很清楚。
  • 您能否解释一下为什么要使用动态编程来搜索 BST 中的值?这似乎很异国情调。
  • 很抱歉,也许你们都误解了我的问题。这是一个构建最佳二叉搜索树的问题。该问题给出了两组记录在二叉搜索树中找到和未找到对象的概率。根据给定的数据,我需要计算在二叉搜索树中搜索任意对象的最小成本。想了解更多,可以在网上搜索这个问题。
  • @molbdnilo 我认为您应该先阅读问题。它是DP,所以如果你不了解它的功能,你是不可能在这里找到错误的。如果有变量或参数等混淆不清的地方,请询问我,我会第一时间回答。
  • @HoangNam 您提供的唯一问题描述是“优化二叉搜索树”。这一点与这个问题有什么关系并不明显。请将描述添加到问题中,而不是在 cmets 中,也不是作为链接。

标签: c++ algorithm binary-search-tree dynamic-programming


【解决方案1】:

据我所见,两种算法在计算新候选子根 E_{i,j} = E_{i,r-1} + E_{r+1,j} + W_{ 的成本时有所不同我,j} 您的代码在 k = 1 时不添加左子树值,并且在 k=j 时不添加右子树值。

        temp = 0;
        if (k > i)
            temp += Cost[i][k - 1];
        if (k < j)
            temp += Cost[k + 1][j];
        temp += Freq[i][j];
        if (temp < Cost[i][j])
            Cost[i][j] = temp;

您有什么理由对这两种情况进行特定的递归实现? 如果不是,在 DP 算法的其他实现或您提供的链接中听起来就是这种情况,重复出现应该是:

        temp = Cost[i][k - 1] + Cost[k + 1][j] + Freq[i][j];
        if (temp < Cost[i][j])
            Cost[i][j] = temp;

【讨论】:

  • 哦,真的谢谢你。这个错误的原因是我考虑了它没有左子树或右子树的情况。但是当我重新阅读我的源代码时,我发现我已经将 i 更改为从 1 开始运行,而不是从 0 开始,所以没有必要。
猜你喜欢
  • 1970-01-01
  • 2023-03-30
  • 2019-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-15
  • 2020-11-07
  • 2020-09-03
相关资源
最近更新 更多