Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 寻找最优树的最坏搜索代价_Algorithm_Tree_Binary Search Tree - Fatal编程技术网

Algorithm 寻找最优树的最坏搜索代价

Algorithm 寻找最优树的最坏搜索代价,algorithm,tree,binary-search-tree,Algorithm,Tree,Binary Search Tree,这是我的问题。我有一个整数的排序列表。我的目标是找到最优二叉搜索树的最坏搜索代价。成本的计算方法是将用于查找该编号的每个节点的编号相加。(我们不加数字) 例如,前4个方块中OBST的最差成本如下所示:。(注意:树叶不计入成本) 最优树的最坏代价是10 我已经尝试了很多东西,但我找不到一个好的算法(我需要最好的,但不能使用暴力) long-long maxRootLeafSum(常量向量&v){ 长和=0; 开关(v.size()) { 案例0: 总和=0; 打破 案例1: 总和=0; 打破 案例

这是我的问题。我有一个整数的排序列表。我的目标是找到最优二叉搜索树的最坏搜索代价。成本的计算方法是将用于查找该编号的每个节点的编号相加。(我们不加数字)

例如,前4个方块中OBST的最差成本如下所示:。(注意:树叶不计入成本) 最优树的最坏代价是10

我已经尝试了很多东西,但我找不到一个好的算法(我需要最好的,但不能使用暴力)

long-long maxRootLeafSum(常量向量&v){
长和=0;
开关(v.size())
{
案例0:
总和=0;
打破
案例1:
总和=0;
打破
案例2:
总和=v[0];
打破
案例3:
总和=v[1];
打破
案例4:
总和=v[0]+v[2];
打破
违约:
long-leftCost=0,rightCost=v[v.size()-2],i=0,j=0;
对于(i=v.size()-4;i>=j;i-=2)
{
rightCost+=v[i];
对于(;leftCost
}

这可能适用于某些情况,但并不总是如此。我发现在4个节点下,我可以立即计算结果。我相信有一种方法可以为给定的数据集找到最佳的根节点。如果是这样,我可以使用递归函数来查找最佳树的最坏代价。也许我也完全不在正确的轨道上


谢谢大家!

我们能假设一个完整的二叉树吗?也就是说,二叉树的所有级别都被完全填充,最后一个级别可能例外,它被左填充。有关完整二叉树的示例,请参见。@JimMischel-为什么要做出这样的假设?要求非常明确,不包括此功能。这可能是所有输入的情况,但这需要证明,而不是假设。正如阿米特所说,我们不能假设一个完整的二叉树。非常感谢。你说得对。我假设是一个标准的二叉搜索树。我忽略了“最佳”部分,在这种情况下,完整的树不是一个有效的假设。提示:最坏情况下的搜索时间等于BST的什么简单属性?现在,假设我们实际上不知道n个数字是什么,只知道其中有n个,而不是试图将给定的n个数字组合成一个BST来最小化这个属性。现在(a)将这n个节点打包到一个BST形状的树中,使属性最小化,然后(b)表明,给定任意一组n个数,它们的一些排列可以排列成具有相同形状的有效BST。
long long maxRootLeafSum(const vector<long long>& v ){
long long sum = 0;

switch (v.size())
{
case 0:
    sum = 0;
    break;
case 1:
    sum = 0;
    break;
case 2:
    sum = v[0];
    break;
case 3:
    sum = v[1];
    break;
case 4:
    sum = v[0] + v[2];
    break;
default:
    long long leftCost = 0, rightCost = v[v.size() - 2], i = 0, j = 0;

    for (i = v.size() - 4; i >= j; i -= 2)
    {
        rightCost += v[i];
        for (; leftCost < rightCost; ++j)
            leftCost += v[j];

    }
    sum = min(leftCost, rightCost);
    break;
}

return sum;