大年夜,中午在姑姑家喝了些酒,头有些疼,晕乎乎的只想睡觉,还以为是酒精的力量,晚上在干妈家吃饭,愈发难受,意识到应该是感冒了,草草吃了些,就回家磕了点药睡觉,闹钟拨到11点,春晚就拜拜了,但岁还得守,老祖宗的规矩可不能破,^-^
最优二叉查找树
e[i][j]的值是在最优二叉查找树中的期望搜索代价。为有助于记录最优二叉查找树的结构,定义root[i][j]为k[r]的下标r,对1 <= i <= j <= n,k[r]是包含关键字k[i], ... , k[j]的一棵最优二叉查找树的根。
e[i][j] = q[i-1] if (j = i - 1)
e[i][j] = min(i <= r <= j){e[i][r-1] + e[r+1][j] + w[i][j]} if (i <= j)
w[i][j] = w[i][j-1] + p[j] + q[j]
Main.c
#include
<
stdio.h
>
#include < string .h >
#include < limits.h >
#define MAXLEN 100
void OptimalBST( float * p, float * q, int n, double e[][MAXLEN], int root[][MAXLEN])
... {
int i, j, L, t, r;
float w[MAXLEN][MAXLEN];
for(i = 1; i <= n + 1; i++)
...{
e[i][i-1] = q[i-1];
w[i][i-1] = q[i-1];
}
for(L = 1; L <= n; L++)
...{
for(i = 1; i <= n-L+1; i++)
...{
j = i + L - 1;
e[i][j] = INT_MAX;
w[i][j] = w[i][j-1] + p[j] + q[j];
for(r = i; i <= j; i++)
...{
t = e[i][r-1] + e[r+1][j] + w[i][j];
if(t < e[i][j])
...{
e[i][j] = t;
root[i][j] = r;
}
}
}
}
}
int main( int argc, char ** argv)
... {
float p[MAXLEN] = ...{0.00, 0.15, 0.10, 0.05, 0.10, 0.20};
float q[MAXLEN] = ...{0.05, 0.10, 0.05, 0.05, 0.05, 0.10};
double e[MAXLEN][MAXLEN];
int root[MAXLEN][MAXLEN];
int n;
n = 5;
OptimalBST(p, q, n, e, root);
return 0;
}
#include < string .h >
#include < limits.h >
#define MAXLEN 100
void OptimalBST( float * p, float * q, int n, double e[][MAXLEN], int root[][MAXLEN])
... {
int i, j, L, t, r;
float w[MAXLEN][MAXLEN];
for(i = 1; i <= n + 1; i++)
...{
e[i][i-1] = q[i-1];
w[i][i-1] = q[i-1];
}
for(L = 1; L <= n; L++)
...{
for(i = 1; i <= n-L+1; i++)
...{
j = i + L - 1;
e[i][j] = INT_MAX;
w[i][j] = w[i][j-1] + p[j] + q[j];
for(r = i; i <= j; i++)
...{
t = e[i][r-1] + e[r+1][j] + w[i][j];
if(t < e[i][j])
...{
e[i][j] = t;
root[i][j] = r;
}
}
}
}
}
int main( int argc, char ** argv)
... {
float p[MAXLEN] = ...{0.00, 0.15, 0.10, 0.05, 0.10, 0.20};
float q[MAXLEN] = ...{0.05, 0.10, 0.05, 0.05, 0.05, 0.10};
double e[MAXLEN][MAXLEN];
int root[MAXLEN][MAXLEN];
int n;
n = 5;
OptimalBST(p, q, n, e, root);
return 0;
}