最优二叉搜索树

一、二叉搜索树(二叉查找树)

          所有根节点大于左子树的节点,小于右子树的节点的二叉树

满足以下性质

         1.如果左子树不为空,则左子树上的所有节点都小于根节点

         2.如果右子树不为空,则右子树上的所有节点都大于根节点

         3. 左右子树也为二叉搜索树

 二、最优二叉搜索树

        给定一个 n 个关键字的已排序的序列K=<k1,k2,k3......kn> (k1<k2<k3....<kn),对于每个关键字 ki ,都有一个概率 pi 表示其搜索频率,根据 ki 和 pi 构建一个二叉搜索树T,每个ki 对应树中一个节点,若搜索对象 x 等于某个 ki ,则可以在树T中找到该节点 ki 。

        若 x<ki 或者 x>kn 或者  ki < x < ki+1 (1≤i<n),则在T中搜索失败,此时引入外部节点 d0,d1,d2,.... dn,用来表示不在序列K中的值,称为伪节点每个di 代表一个区间,即 d0 表示所有小于 k1 的值,dn 表示所有大于 kn 的值,对于剩下的 di 则表示在 ki 和 ki+1 之间的值,同时每个 di 也有一个概率 qi 表示搜索对象 x 落入区间 di 的概率。

       将伪节点插入二叉搜索树中 ( n=5 时),有多种形式

        对于最优二叉搜索树,不同树的形式会产生不同的平均检索时间,求一颗平均比较次数最少的二叉搜索树。  

        平均检索时间: 即检索遍历树中每个节点(K D序列)的时间期望

        对于节点集 S=< k1,k2,,,kn,d0,d1,,,,dn>  和概率分布 P=<p1,p2,,,,pn,q0,q1,,,,,qn>

规定树根的深度为 0 则节点 xi 在树中的深度为 depth(xi) i=0~n  空隙 dj 的深度为 depth(dj)  j=0~n

平均比较次数公式(期望)

                                m(T)=\sum_{i=1}^{n} p_{i}*(1+depth[k_{i}])+\sum_{j=0}^{n} q_{j}*depth(d_{j})

        公式理解: 对于搜寻节点 ki ,从根节点到该节点需要 ( 1+depth[ki] ) 的步骤(包括根节点),对于搜寻空隙 di,则只需要(depth[di])的步骤(搜寻到 di 的父节点即可)

 三、最优二叉搜索树算法(动态规划)

        1.分析子问题 (i,j)

        找到含有节点 S=<ki,ki+1,,,kj,di-1,di,,,,dj>  概率分布P=<pi,pi+1,,,pj,qi-1,qi,,,qj> 的二叉搜索树

        建立关系: 以 ky 作为树的根,树被划为三部分

        左子树: 节点S [ i , y-1 ],对应 P [ i , y-1 ]

        根: ky

        右子树 :  节点 S [ y+1 , j ],对应 P [ y+1 , j ]

        m[i,j]表示从节点 ki ~ kj 的最优二叉搜索树的平均比较次数(期望),则与(ky为当前树的根) m[i,y-1] m[y+1,j] 有递推关系:

                        m[i,j]=min(m[i,y-1]+m[y+1,j]+w(i,j)) \, \, \, \, \, \, \, \, \, \, \, \, i\leq y\leq j

                        m[i,i-1]=q_{i-1} \, \, \, \, \, \, \, \, \, \, \, i=1,2,,,n     (此时子树只有伪节点 代价为 q[i-1])

        1.m[i,y-1] 表示从节点 ki ~ ky-1 的最优二叉搜索树的平均比较次数

        2.m[y+1,j] 表示从节点 ky+1 ~ kj 的最优二叉搜索树的平均比较次数

        3. w(i,j) 对于给定的搜索数据 x,先要与 ky (根) 进行比较后才可以进入其左右子树查询,需要将 ky 与左右子树链接起来,子树的每个节点深度均增加1,所以比较次数需要加1,即 w(i,j)是由增加的左子树的比较次数,右子树的比较次数,和根的比较次数之和

        w(i,j)=w(i,k-1)+w(k+1,j)+1*q_{k} 

        w(i,j)=\sum_{a=i}^{j}p_{a}+\sum_{b=i-1}^{j}q_{b}

        w(i,j)=w(i,j-1)+p_{j}+q_{j}

        2.推广至原问题,求最优二叉搜索树

        以 1,2,3,4 这四个节点为例,分别以这四个节点作为根节点计算。

        则此时计算出最优二叉搜索树从下面四个结果中取最小。 

          代码思想:

        这里可以得出结论: m[i,j] 的计算是根据树中节点的个数判断的,首先需要一个循环记录节点的个数N通过循环记录出起始节点i,同时得出末尾节点j=i+N-1,再循环i~j之间的根节点k,即可得出结论.因此时间复杂度为 O(n^{3})

           3.寻找最优方案

          和之前的切割问题一样,只需要记录下当 m [ i , j ] 在最小时取到的根节点 k 即可 x [ i , j ] = k

        在寻找最优方案时,从 x[1,n] 出发,通过递归将其分成  i~x[1,n]-1  与 x[1,n]+1~n,再依次类推,得出最优方案.

 代码:

#include<stdio.h>
#include<iostream>
using namespace std;
int n,k[10001],d[10001],s[1001][1001];
double p[10001],q[10001];
double m[1001][1001],w[1001][1001];
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++)  scanf("%lf",&p[i]);
	for(int i=0;i<=n;i++)  scanf("%lf",&q[i]);
	for(int i=1;i<=n+1;i++)  
	{
		m[i][i-1]=q[i-1];  // 初始化默认伪节点 
		w[i][i-1]=q[i-1];
	}
	for(int l=1;l<=n;l++)
	for(int i=1;i<=n-l+1;i++)
	{
		int j=i+l-1;
		m[i][j]=100001;
		w[i][j]=w[i][j-1]+p[j]+q[j];  // W 的递推公式 
		for(int k=i;k<=j;k++)
		{
			if(m[i][k-1]+m[k+1][j]+w[i][j]<m[i][j])
			{
				s[i][j]=k;
				m[i][j]=m[i][k-1]+m[k+1][j]+w[i][j];
			}
		}
	}
	printf("%lf",m[1][n]);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/584901.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Web-SpringBootWeb

创建项目 后面因为报错&#xff0c;所以我把jdk修改成22&#xff0c;仅供参考。 定义类&#xff0c;创建方法 package com.start.springbootstart.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotati…

实验8 NAT配置

实验8 NAT配置 一、 原理描述二、 实验目的三、 实验内容1.实验场景2.实验要求 四、 实验配置五、 实验步骤2.静态NAT配置3.NAT Outbound配置4.NAT Easy-IP配置 一、 原理描述 2019年11月26日&#xff0c;全球43亿个IPv4地址正式耗尽&#xff0c;这意味着没有更多的IPv4地址可…

基于SSM的“航空机票预订系统”的设计与实现(源码+数据库+文档+PPT)

基于SSM的“航空机票预订系统”的设计与实现&#xff08;源码数据库文档PPT) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SSM 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 系统首页 公告管理 用户注册 留言评论 会员管理 航班管理 订…

uniApp+Vue3+vite+Element UI或者Element Plus开发学习,使用vite构建管理项目,HBuilderX做为开发者工具

我们通常给小程序或者app开发后台时&#xff0c;不可避免的要用到可视化的数据管理后台&#xff0c;而vue和Element是我们目前比较主流的开发管理后台的主流搭配。所以今天石头哥就带大家来一起学习下vue3和Element plus的开发。 准备工作 1&#xff0c;下载HBuilderX 开发者…

IDEA插件-通义灵码 VS ChatGPT-EasyCode

智能编码助手新时代&#xff1a;通义灵码 vs ChatGPT-EasyCode 随着人工智能技术的飞速发展&#xff0c;智能编码助手逐渐成为程序员的必备工具。它们可以帮助程序员提高编码效率&#xff0c;降低代码缺陷率&#xff0c;并解放创造力。 目前市场上涌现出了众多智能编码助手&a…

npm install 卡住不动不执行解决方法

npm install 卡住不动不执行解决方法&#xff0c;先是想到的切淘宝镜像&#xff0c;于是》》》 走淘宝镜像&#xff0c;结果淘宝镜像挂了,于是》》》》》 切成这个 https://registry.npmmirror.com/ 大功告成&#xff01;

访问公共盘时提示:你不能访问此共享文件夹,因为你组织的安全策略阻止未经身份验证的来宾访问。这些策略可帮助保护你的电脑免受网络上不安全设备或恶意设备的威胁。

原因&#xff1a;未启动启用策略&#xff1a;不安全的来宾登录 办法&#xff1a; 1&#xff0c;WindowsR键&#xff0c;打开运行&#xff0c;输入gpedit.msc&#xff0c;打开本地组策略编辑器&#xff1b;2&#xff0c;计算机配置>管理模板>网络>Lanman 工作站>启…

KUKA机器人如何给IO信号或寄存器添加中文注释信息?

KUKA机器人如何给IO信号或寄存器添加中文注释信息? 如下图所示,首先,我们需要登录专家以上用户权限(默认密码KUKA), 如下图所示,点击“投入运行”—“网络配置”, 如下图所示,此时机器人的IP地址为192.168.1.10, 如下图所示,用一根网线连接机器人控制柜到笔记…

第1章 手写WebServer

1.1 Web原理 1.1.1 Web概述 Web是指互联网上的万维网&#xff08;World Wide Web&#xff09;&#xff0c;是一个由超文本、超链接和多媒体内容组成的信息空间。Web的基础技术是HTTP协议、URL、HTML、CSS和JavaScript等。Web被广泛应用于信息检索、在线购物、社交媒体、在线游…

kettle将excel表数据导入到oracle表中

上一篇已经介绍过kettle8.2的安装。 之前一直使用的sqlldr导入外部表&#xff0c;导入比较耗时&#xff0c;这次想使用一下kettle试试。 1.新建转换 2.新建输入 3.新建输出 4.转换新建完成 5.配置输入 加载表格文件 配置工作表 加载字段 6.配置输出 测试数据库连接 这…

指标完成情况对比查询sql

指标完成情况对比查询sql 1. 需求 2. SQL select--部门dept.name as bm,--年度指标任务-新签&#xff08;万元&#xff09;ndzbwh.nxqndzbrw as nxqndzbrw,--年度指标任务-收入&#xff08;万元&#xff09;ndzbwh.nsrndzbrw as nsrndzbrw,--年度指标任务-回款&#xff08;万…

大数据中的项目数据采集

Datax介绍 官网&#xff1a; DataX/introduction.md at master alibaba/DataX GitHub DataX 是阿里云 DataWorks数据集成 的开源版本&#xff0c;在阿里巴巴集团内被广泛使用的离线数据同步工具/平台。 DataX 实现了包括 MySQL、Oracle、OceanBase、SqlServer、Postgre、HDFS…

C、Minimizing the Sum(线性dp)

思路&#xff1a; 用dp[i][j] 来表示前i个数操作了j次的最小和&#xff0c;然后对于每个a[i]&#xff0c;我们分别枚举i前面操作了x次以及后面操作了j次&#xff0c;对于每次操作&#xff0c;都是将一段区间全换位区间最小值. 代码&#xff1a; void solve(){int n, k;cin &…

基于SpringBoot+Vue大学生兼职管理系统的设计与实现

目录 一、前言介绍 二、功能需求 三、功能结构设计 四、管理员功能实现 招聘单位管理 用户管理 论坛管理 公告信息管理 五、招聘单位功能实现 职位招聘管理 职位留言管理 简历投递管理 六、用户功能实现 在线论坛 职位招聘信息 简历投递 简历 七、部分核心代码 …

代码随想录算法训练营第二十六天||39. 组合总和、40.组合总和II、131.分割回文串

文章目录 一、39. 组合总和 思路 二、40.组合总和II 思路 三、131.分割回文串 思路 一、39. 组合总和 给定一个无重复元素的数组 candidates 和一个目标数 target &#xff0c;找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的数字可以无限制重复被选取…

活性炭复合纳米纤维膜

活性炭复合纳米纤维膜是一种结合了活性炭和纳米纤维技术的新型复合材料。这种材料通常通过特定的制备工艺&#xff0c;如静电纺丝技术&#xff0c;将活性炭纳米纤维与其他材料&#xff08;如TiO2、聚合物等&#xff09;结合在一起&#xff0c;形成具有良好结构和功能的薄膜。 活…

【SpringBoot】数据脱敏

文章目录 什么是数据脱敏JsonSerialize自定义Jackson注解定制脱敏策略定制JSON序列化实现脱敏工具类 定义Person类&#xff0c;对其数据脱敏模拟接口测试总结 什么是数据脱敏 数据脱敏&#xff0c;也称为数据的去隐私化或数据变形&#xff0c;是一种技术手段&#xff0c;用于对…

【酱浦菌-爬虫技术细节】解决学术堂爬虫翻页(下一页)问题

首先我们通过css选择器获取页码信息&#xff0c;这里的css选择器&#xff0c;选择的是含有a标签的所有li标签&#xff0c;代码如下&#xff1a; li html_web.css(div.pd_c_xslb_left_fenye ul li>a) for li in li:li_url li.css(a::attr(href)).get()li_num li.css(a::t…

排序算法:插入、希尔、选择、推排、冒泡、快速、归并排序

排序算法 目录 前言 一、排序的概念 1.1排序的概念 1.2 常见的排序算法 二、常见排序算法的实现 2.1 插入排序 2.2 希尔排序 2.3 选择排序 2.4 堆排序 2.5 冒泡排序 2.6 快速排序 2.6.1 hoare版本 2.6.2 前后指针版本 2.6.3 非递归版本 2.7 归并排序 归并排序 2.8 计数排序 三、…

【c++】优先级队列与仿函数:C++编程的强大组合

&#x1f525;个人主页&#xff1a;Quitecoder &#x1f525;专栏&#xff1a;c笔记仓 朋友们大家好&#xff0c;本篇文章我们来讲解优先级队列priority_queue 目录 1.priority_queue的介绍和使用函数使用仿函数的使用与介绍greater和less 2.priority_queue的模拟实现基本框架…