[英]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.