簡體   English   中英

成功和不成功搜索的最佳二叉搜索樹

[英]Optimal Binary Search Tree for Successful and Unsuccessful Search

我正在研究用 C++ 語言優化二叉搜索樹的動態編程算法。 我已經建立了自己的程序,但我不知道我的程序是否找到了正確的答案。 我試圖在互聯網上找到示例代碼,但我只是找到了成功搜索的示例代碼,因此,我不知道正確的答案。 不僅如此,我認為我的編碼方式有錯誤,但我無法指出。

如果你不明白這個問題,你可以在這里閱讀Optimal Binary Search Tree

簡要說明:這是一個構建最優二叉搜索樹的問題。 該問題給出了兩組記錄在二叉搜索樹中找到和未找到對象的概率。 根據給定的數據,我需要計算在二叉搜索樹中搜索任意 object 的最小成本

下面是我的源代碼:

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。 我不知道我的算法哪里出錯了。 我真的需要有人來檢查我的程序或算法的正確性。 如果你能指出來,我真的很感激。

據我所知,計算新候選子根 E_{i,j} = E_{i,r-1} + E_{r+1,j} + W_{i,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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM