C++找最小成本二分检索树OBST

最优二叉搜索树相关内容 01 最优二叉搜索树概念 阅读详情

余祥宣, 崔国华, 邹海明. 计算机算法基础.3版[M]. 华中科技大学出版社, 2006.
P136 算法6.5
程序的输入是一个名字为input.txt的文件,保存时注意编码格式再VS上运行的话要保存为ANSI编码,如果需要的话我可以上传一份
4
P[1:4]=1 4 2 1
Q[1:5]=4 2 4 1 1

4
1 4 2 1
4 2 4 1 1

4
P[1:4]=3 3 1 1
Q[1:5]=2 3 1 1 1

4
3 3 1 1
2 3 1 1 1

#include<iostream>
#include<iomanip> 
#include<fstream>
using namespace std;
#define MAX 5

void Knuth(int &k, int i, int j, int W[][MAX], int R[][MAX], int C[][MAX])
{
    int min = C[i][j - 1] + C[j][j] + W[i][j];
    k = j ;
    for (int l = j - 1; l > i; l--)
    {  
        if (C[i][l - 1] + C[l][j] + W[i][j] < min)
        {
            min = C[i][l - 1] + C[l][j] + W[i][j];
            k = l;
        }
    }
}
void Show(int n, int W[][MAX], int R[][MAX], int C[][MAX])
{
    for (int i = 0; i <= n; i++)
    {
        for (int j = 0; j <= n - i; j++)
        {
            cout <<"(" << W[j][j + i] << "," << C[j][j + i] << "," <<R[j][j + i] << ")";
        }
        cout << endl;
    }
}
void OBST(int P[],int Q[],int n)
{
    int W[MAX][MAX];
    int R[MAX][MAX];
    int C[MAX][MAX];

    int j , k = 0;

    for (int i = 0; i <= n - 1; i++)
    {
        W[i][i] = Q[i];
        R[i][i] = 0;
        C[i][i] = 0;

        W[i][i + 1] = Q[i] + Q[i + 1] + P[i + 1];
        R[i][i + 1] = i+1;
        C[i][i + 1] = Q[i] + Q[i + 1] + P[i + 1];
    }
    W[n][n] = Q[n];
    R[n][n] = 0;
    C[n][n] = 0;

    for (int m = 2; m <= n; m++)
    {
        for (int i = 0; i <= n - m; i++)
        {
            j = i + m;
            W[i][j] = W[i][j - 1] + P[j] + Q[j];
            Knuth(k, i, j, W, R, C);
            C[i][j] = W[i][j] + C[i][k - 1] + C[k][j];
            R[i][j] = k;
        }
    }

    Show(n, W, R, C);
}

int main()
{
    int P[MAX];
    int Q[MAX];
    int n=0;

    ifstream in("input.txt");
    in >> n;
    for (int i = 1; i <= n; i++)
    {
        in >> P[i];
    }
    for (int i = 0; i <= n; i++)
    {
        in >> Q[i];
    }
    OBST(P, Q, n);

    system("pause");
    return 0;
}

运行结果
C++找最小成本二分检索树OBST运行结果1
C++找最小成本二分检索树OBST运行结果2

最优二叉搜索树-动态规划 #include using namespace std; void OptimalBinarySearchTree(double a[] , double b[] , int n , double **m , int **s , double **w) { //初始化构造无内部节点的情况 for(int i = 0 ; i <= n ; i++){ 阅读详情

相关推荐

PTA刷题必备:最优二叉搜索树实战解析(附C++代码)

本文针对PTA平台上的最优二叉搜索树算法难题,提供了从问题理解到代码实现的完整实战解析。文章深入剖析了动态规划中的区间DP思想,给出了清晰的C++代码实现,并重点讲解了浮点数精度处理、树结构重建等常见错误与调试技巧,帮助读者彻底掌握该算法,提升刷题效率。

pz890123的博客 728

算法设计与分析 chapter 3 动态规划复习

根据期末老师划的重点复习…=_=! (1)动态规划的算法思想 自底向上 将待求解的问题分解为若干个子问题,先求解子问题,再结合这些子问题的解得到原问题的解。 与分治法不同:动态规划分解的子问题往往不是相互独立的 (2)动态规划算法的基本要素 最优子结构性质 重叠子问题性质 (3)动态规划算法的基本步骤 1 找出最优解的性质,并刻画其结构特征 2 递归地定义最优值 3 以自底向上的...

qq_38558834的博客 406

OBST(Optimal Binary Search Tree,最优二叉搜索树)

构建最优二叉搜索树的目标是使得整棵树的搜索代价最小化,即搜索某个关键字时,需要从根节点开始向下查找,直到找到目标关键字,而这个搜索的代价取决于关键字在树中的深度。:使用动态规划的思想,定义一个二维数组 cost,其中 cost[i][j] 表示从关键字 ki 到 kj 的最小搜索代价。最优二叉搜索树算法是一个经典的动态规划问题,通过动态规划算法可以在高效的时间内计算出最优的搜索代价和树的结构。通过动态规划算法计算最优二叉搜索树的代价和结构,得到最终的最优二叉搜索树。

m0_73916791的博客 1791

找最小成本二分检索树

从文件读取成本,实现找出最小成本二分检索树的算法,并以树状结构输出#include stdio.h>#include stdlib.h>#define N 4typedef struct te...{        int node;        struct te *left,*right;    }tree;int findmin(int i,int j,int (*r)[N],in

boquan的专栏 1320

动态规划-最小二叉搜索树(OBST)

二叉查找树是按照二叉树结构来组织的,因此可以用二叉链表结构表示。二叉查找树中的关键字的存储方式满足的特征是:设x为二叉查找树中的一个结点。如果y是x的左子树中的一个结点,则key[y]≤key[x]。 递归解法(盗图~) 构造三个表,w表存储各节点出现频率,e表存储最优二叉搜索树的搜索成本期望值,root表存储最优子树的树根。 根据三个表,可以利用递归来构建最优二叉搜

Q1n6 5442

最小成本二分检索树_OBST

利用C++实现的最小成本二分检索树,能够根据double类型的成功检索P和不成功检索Q构造出最小成本二分检索树,利用一个二叉树类自动构造出该树,并打印到标准输出!

最优二叉搜索树动态规划

问题描述: 最优二叉搜索树问题是对于有序集S及其存取概率或权值(q0,p1,q1,p2,q2,p3,q3),在所有表示有序集S的二叉搜索树中找出一颗具有最小平均路长的二叉搜索树。 解决方法: 使用动态规划方法自底向上逐步构造最优二叉搜索树。 动态规划的两个重要要素是: 1、最优子结构。2、重叠子问题。 1)所谓最优化子结构是说若问题的一个最优解中包含了子问题的最优解,则该问题具有最

jiyang_1的博客 3874

OBST算法实现

算法导论的OBST算法实现加上显示路径的方法

初识OBST

现在给出123,请建立BST 我们可以有最坏的一种建立方法: 1 2 3 如果我要查找1,我需要访问1个节点; 如果我要查找2,我需要访问2个节点; 如果我要查找3,我需要访问3个节点; 如果我都要找,我要访问1+2+3个节点,6个节点。称这个6为cost。 现在看另一棵 2 1 3 如果我要查找2,我需要访问1个节点; 如果我要查找1,我需要访问2个节点; 如果我要查找3,我需要访问2个节点; 如果我都要找,我要访问1+2+2个节点.

u013474815的博客 440

遗传算法解决卡车货物运送成本最小C++

遗传算法解决卡车货物运送成本最小C++货物传送最优化算法:code.txt即为源代码.程序在VC6.0正常运行

最优二叉搜索树算法及代码

一个关于最优二叉搜索树的程序段 并且包含最后的生成结果的显示

算法---->分支限界

分支限界法    一、分支搜索  活结点:自己已经被生成,但还没有被检测的结点。 “分支”是采用广度优先的策略,依次生成E-结点所有分支,也就是所有的儿子结点。和回溯法一样,可以在生成的结点中,抛弃那些不满足约束条件的结点,其余结点加入活结点表。然后从表中选择一个结点作为下一个E-结点。 选择下一个E-结点方式的不同导致几种分支搜索方式: 搜索方式   ...

weixin_34313182的博客 416

最小费用最大流C++算法

最小费用最大流C++算法,有最小费用算法,最大流算法,最短路算法,C++代码。

数据结构实现 3.1:二分搜索树(C++版)

数据结构实现 3.1:二分搜索树(C++版)1. 概念及基本框架2. 基本操作程序实现2.1 增加操作2.2 删除操作2.3 查找操作2.4 遍历操作2.5 其他操作3. 算法复杂度分析3.1 增加操作3.2 删除操作3.3 查找操作4. 完整代码 1. 概念及基本框架 二分搜索树 是一种 半线性结构 ,而且存储上属于 链式存储(即内存的物理空间是不连续的),是树形结构的一种。二分搜索树结构如下图...

九霄星河的博客 883

数据结构C++二分搜索树

实现二分搜索树的查找、删除、输出 包含构造很析构函数

论文分享 - OctoMap八叉树建图原理

论文:OctoMap:An Efficient Probabilistic 3D Mapping Framework Based on Octrees。

一只废佐_的博客 2539

二分搜索树(Binary Search Tree) 笔记总结—— C++

查找问题的基础:二分查找法(对于有序数列,才能用二分查找法) 二分查找法:对于一个有序数组,我们想查找某一元素,先查看数组中间元素 v ,若 v 等于我们想查找的元素,那么我们找到了,否则的话,整个数组就被 v 这个元素分成了两个部分,小于 v 和大于 v 的部分,如果我们查找的元素是比 v 小的,我们就在小于 v 的这部分继续查找,要是比 v 大,就在大于 v 的部分查找。 二分查找法时间复杂度...

点滴博客 636

STM32实战:手把手教你移植CanFestival协议栈(附完整代码)

本文提供了一份详尽的STM32平台移植CanFestival协议栈的实战指南。文章从工程搭建、定时器驱动、CAN硬件适配到对象字典配置,手把手讲解核心步骤,并附完整代码示例。重点剖析了时间管理、报文收发等关键环节的实现与常见问题解决方案,旨在帮助开发者深入理解并成功实现CANopen通信。

kiwi8的博客 274

OBST(最优二叉搜索树)

  简述一下问题:假设有一颗词典二叉树,我们从中查找需要的单词,使用红黑树或平衡树这样的数据结构总是可以在O(lgN)时间内进行查找,但单词的出现频率是不同的,我们给每个单词加上一个搜索概率,然后通过这些带有概率的节点计算出整棵树的搜索期望E(T),找到一个最优节点作为根节点,重新建立一颗二叉树,称为最优二叉搜索树,其期望最低,使得所有搜索操作访问的节点总数最少。这样的一颗词典二叉树对于...

ding7530的博客 1844

5分钟搞定CST周期性结构仿真:共面波导色散曲线快速生成技巧

本文提供了一套在CST Studio Suite中快速仿真周期性结构并生成色散曲线的标准化流程。针对共面波导设计,重点解析了周期性边界条件的核心设置、本征模求解器(JDM算法)的优化技巧,以及通过参数扫描与后处理模板实现自动化,旨在帮助射频与微波工程师在5分钟内高效完成关键性能验证。

blue的专栏 1249

在 SAP 里,想让“同一笔业务”在多个账套(平行分类账)中生成不同编号的会计凭证,标准做法就是

摘要:SAP系统中实现同一业务在不同分类账生成独立凭证号的方法是为每个分类账配置独立的凭证类型-编号范围映射。通过FBN1/OBA7等事务码为各分类账分配专属编号段,系统过账时会按分类账自动取号,确保凭证号互不冲突。该方案适用于S/4HANA和ECC系统,支持标准过账(F-02)或分类账专属过账(FB01L)两种模式,最终实现"一业务多账套,各自独立编号"的目标。

金牌架构师 550
上一篇: C++多段图的向后处理算法BGRAPH
下一篇: C++判断双连通分图ART
小英雄Dui
博客等级 码龄11年 37粉丝 41原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值