【动态规划】最优二叉搜索树——算法设计与分析

这篇具有很好参考价值的文章主要介绍了【动态规划】最优二叉搜索树——算法设计与分析。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


一、问题定义

1.1 二叉搜索树

二叉搜索树或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉搜索树。

最优二叉查找树,算法设计与分析,算法,动态规划,数据结构

规定树根为第0层,圆结点为数据,方结点为数据之间的空隙。


1.2 概率分布

实际上每个数据出现的概率是不同的,给定序列 S = < x 1 , x 2 , . . . , x n > S=<x_1,x_2,...,x_n> S=<x1,x2,...,xn>,构造二叉搜索树,形成了 n n n个结点 x 1 , x 2 , . . . , x n x_1,x_2,...,x_n x1,x2,...,xn,和 n + 1 n+1 n+1个空隙 ( x 0 , x 1 ) , ( x 1 , x 2 ) , . . . , ( x n − 1 , x n ) , ( x n , x n + 1 ) (x_0,x_1),(x_1,x_2),...,(x_{n-1},x_n),(x_n,x_{n+1}) (x0,x1),(x1,x2),...,(xn1,xn),(xn,xn+1),其中 x 0 = − ∞ , x n + 1 = + ∞ x_0=-\infin,x_{n+1}=+\infin x0=,xn+1=+

x x x x i x_i xi出现的概率为 b i b_i bi,在空隙 ( x i , x i + 1 ) (x_i,x_{i+1}) (xi,xi+1)的概率为 a i a_i ai,则 S S S的存取概率分布为 P = < a 0 , b 1 , a 1 , b 2 , a 2 , . . . , b n , a n > P=<a_0,b_1,a_1,b_2,a_2,...,b_n,a_n> P=<a0,b1,a1,b2,a2,...,bn,an>


1.3 检索数据的平均时间

对于数据集 S = < x 1 , x 2 , . . . , x n > S=<x_1,x_2,...,x_n> S=<x1,x2,...,xn>和存取概率分布 P = < a 0 , b 1 , a 1 , b 2 , a 2 , . . . , b n , a n > P=<a_0,b_1,a_1,b_2,a_2,...,b_n,a_n> P=<a0,b1,a1,b2,a2,...,bn,an>

规定树根为第0层,结点 x i x_i xi T T T中的深度是 d ( x i ) , i = 1 , 2 , … , n d(x_i), i=1,2,…,n d(xi),i=1,2,,n,空隙 L j L_j Lj的深度为 d ( L j ) , j = 0 , 1 , … , n d(L_j),j=0,1,…,n d(Lj),j=0,1,,n,平均比较次数为:
m ( T ) = ∑ i = 1 n b i ( 1 + d ( x i ) ) + ∑ j = 0 n a j d ( L j ) m(T)=\sum_{i=1}^{n}b_i(1+d(x_i))+ \sum_{j=0}^{n}a_jd(L_j) m(T)=i=1nbi(1+d(xi))+j=0najd(Lj)
例如,给定树:

最优二叉查找树,算法设计与分析,算法,动态规划,数据结构

S = < 1 , 2 , 3 , 4 , 5 , 6 > S = < 1, 2, 3, 4, 5, 6 > S=<1,2,3,4,5,6> P = < 0.04 , ∗ 0.1 ∗ , 0.01 , ∗ 0.2 ∗ , 0.05 , ∗ 0.2 ∗ , 0.02 , ∗ 0.1 ∗ , 0.02 , ∗ 0.1 ∗ , 0.07 , ∗ 0.05 ∗ , 0.04 > P = < 0.04, *0.1*, 0.01, *0.2*, 0.05,*0.2*, 0.02, *0.1*, 0.02, *0.1*,0.07, *0.05*, 0.04 > P=<0.04,0.1,0.01,0.2,0.05,0.2,0.02,0.1,0.02,0.1,0.07,0.05,0.04> p x i p_{x_i} pxi用**包围)

则平均检索时间为:

m ( T 1 ) = [ 1 × 0.1 + 2 × ( 0.2 + 0.05 ) + 3 × ( 0.1 + 0.2 + 0.1 ) ] + [ 3 × ( 0.04 + 0.01 + 0.05 + 0.02 + 0.02 + 0.07 ) + 2 × 0.04 ] = 2.51 m (T_1)= [1×0.1+2×(0.2+0.05) +3×(0.1+0.2+0.1)]+[3×(0.04+0.01+0.05+0.02+ 0.02+0.07)+2×0.04 ]= 2.51 m(T1)=[1×0.1+2×(0.2+0.05)+3×(0.1+0.2+0.1)]+[3×(0.04+0.01+0.05+0.02+0.02+0.07)+2×0.04]=2.51


1.4 最优二叉搜索树问题

对于数据集 S = < x 1 , x 2 , . . . , x n > S=<x_1,x_2,...,x_n> S=<x1,x2,...,xn>和存取概率分布 P = < a 0 , b 1 , a 1 , b 2 , a 2 , . . . , b n , a n > P=<a_0,b_1,a_1,b_2,a_2,...,b_n,a_n> P=<a0,b1,a1,b2,a2,...,bn,an>,不同的树的组织形式会产生不同的平均检索时间,如何求一棵平均比较次数最少的二叉搜索树?



二、算法

2.1 分析问题结构

( i , j ) (i,j) (i,j)为界划分子问题:

S [ i , j ] = < x i , x i + 1 , … , x j > S [i, j] = < x_i , x_{i+1}, … , x_j > S[i,j]=<xi,xi+1,,xj>,存取概率分布: P = < a i − , b i , a i , b i + 1 , . . . , b j , a j > P=<a_{i-},b_i,a_i,b_{i+1},...,b_j,a_j> P=<ai,bi,ai,bi+1,...,bj,aj>


2.2 建立递推关系

假设以 x k x_k xk作为树的根,则树被划分为三部分:

左子树: S [ i , k − 1 ] , P [ i , k − 1 ] S[ i, k−1], P[ i, k−1] S[i,k1],P[i,k1]

根: x k x_k xk

右子树: S [ k + 1 , j ] , P [ k + 1 , j ] S[ k+1, j ], P[ k+1, j ] S[k+1,j],P[k+1,j]

w [ i , j ] = ∑ p = i − 1 j a p + ∑ q = i j b q {w[i,j]=\sum_{p=i-1}^{j}a_p+ \sum_{q=i}^{j}b_q } w[i,j]=p=i1jap+q=ijbq,表示 x i x_i xi x j x_j xj之间所有概率(数据和空隙)之和;设 m [ i , j ] m[i,j] m[i,j]是相对于输入 S [ i , j ] S[i,j] S[i,j] P [ i , j ] P[i,j] P[i,j]的最优二叉搜索树的平均比较次数

则可建立递推方程:
m [ i , j ] = min ⁡ i ≤ k ≤ j { m [ i , k − 1 ] + m [ k + 1 , j ] + w [ i , j ] } 1 ≤ i ≤ j ≤ n m [ i , i − 1 ] = 0 , i = 1 , 2 , . . . , n m[i,j]=\min_{i\leq k\leq j}\left \{ m[i,k-1]+m[k+1,j]+w[i,j] \right \} \quad 1\leq i\leq j\leq n \\ m[i,i-1]=0, \quad i=1,2,...,n m[i,j]=ikjmin{m[i,k1]+m[k+1,j]+w[i,j]}1ijnm[i,i1]=0,i=1,2,...,n
最优二叉查找树,算法设计与分析,算法,动态规划,数据结构

(1)为了不遗漏最优解,所以需要从 x 1 x_1 x1 x k x_k xk依次选取做根尝试,选出最小值

(2) m [ i , k − 1 ] m[i,k-1] m[i,k1]表示以 x k x_k xk做根的最优左子树的比较次数

(3) m [ k + 1 , j ] m[k+1,j] m[k+1,j]表示以 x k x_k xk做根的最优右子树的比较次数

(4)对于给定的数据 x x x,需要先与根 x k x_k xk进行比较后才可以进入到左子树或右子树;而由于使用根 x k x_k xk将左子树和右子树连接起来,子树的每个结点高度均增加了一层,所以在比较次数上也要加1,所以 w [ i , j ] w[i,j] w[i,j]是由增加的左子树的比较次数、增加的右子树的比较次数、和根的比较次数之和

w [ i , j ] w[i,j] w[i,j]的证明:

由根 x k x_k xk引起的比较次数增加为:
最优二叉查找树,算法设计与分析,算法,动态规划,数据结构


2.3 自底向上计算

初始化:当左子树或右子树为空时,其平均查找数为0
m [ i , i − 1 ] = 0 , i = 1 , 2 , . . . , n m[i,i-1]=0, \quad i=1,2,...,n m[i,i1]=0,i=1,2,...,n

不妨以 m [ 1 , 4 ] m[1,4] m[1,4]来观察:
m [ 1 , 4 ] = m i n { m [ 1 , 0 ] + m [ 2 , 4 ] + w [ 1 , 4 ] k = 1 m [ 1 , 1 ] + m [ 3 , 4 ] + w [ 1 , 4 ] k = 2 m [ 1 , 2 ] + m [ 4 , 4 ] + w [ 1 , 4 ] k = 3 m [ 1 , 3 ] + m [ 5 , 4 ] + w [ 1 , 4 ] k = 4 m[1,4]=min\left\{\begin{matrix} m[1,0]+m[2,4]+w[1,4] & k=1\\ m[1,1]+m[3,4]+w[1,4] & k=2\\ m[1,2]+m[4,4]+w[1,4]& k=3\\ m[1,3]+m[5,4]+w[1,4]& k=4 \end{matrix}\right. m[1,4]=min m[1,0]+m[2,4]+w[1,4]m[1,1]+m[3,4]+w[1,4]m[1,2]+m[4,4]+w[1,4]m[1,3]+m[5,4]+w[1,4]k=1k=2k=3k=4

0 1 2 3 4
0 NULL NULL NULL NULL NULL
1 0
2 NULL 0
3 NULL NULL 0
4 NULL NULL NULL 0
5 NULL NULL NULL NULL

显然,要计算一个值,我们需要计算它一行一列的数据,因此确定计算顺序:

最优二叉查找树,算法设计与分析,算法,动态规划,数据结构


2.4 追踪最优方案

构造追踪数组 R e c [ 1.. n , 1.. n ] Rec[1..n,1..n] Rec[1..n,1..n] R e c [ i , j ] Rec[i,j] Rec[i,j]表示 S [ i , j ] S[i,j] S[i,j]的根节点 x k x_k xk

在计算 m [ i , j ] m[i,j] m[i,j]的过程中,选出最小的 k k k,记录 R e c [ i , j ] = k Rec[i,j]=k Rec[i,j]=k

追踪时,从 R e c [ 1 , n ] Rec[1,n] Rec[1,n]出发,假设 R e c [ 1 , n ] = k Rec[1,n]=k Rec[1,n]=k,则说明在 x k x_k xk处进行了分割,分为子树 m [ 1 , k ] m[1,k] m[1,k] m [ k + 1 , n ] m[k+1,n] m[k+1,n],再分别查看 R e c [ 1 , k ] Rec[1,k] Rec[1,k] R e c [ k + 1 , n ] Rec[k+1,n] Rec[k+1,n]

如此寻找直至对角线部分。


2.5 复杂度分析

时间复杂度 O ( n 3 ) O(n^3) O(n3)

空间复杂度 O ( n 2 ) O(n^2) O(n2)文章来源地址https://www.toymoban.com/news/detail-597272.html

到了这里,关于【动态规划】最优二叉搜索树——算法设计与分析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 最优二叉搜索树(Optimal Binary Search Tree)_20230401

    前言 如果有序数组或有序表中的各个元素查找概率相等,那么采用二叉搜索树(BST)进行折半查找,性能最优。如果有序表中各个记录的查找概率不相等,情况又如何呢? 先看一个具体例子。已知有序表keys, 同时给出各个元素的查询频率,注意到各个元素的查询频率不相同。

    2024年02月12日
    浏览(51)
  • 【数据结构与算法】哈夫曼编码(最优二叉树)实现

    哈夫曼编码 等长编码:占的位置一样 变长编码(不等长编码):经常使用的编码比较短,不常用的比较短 最优:总长度最短 最优的要求:占用空间尽可能短,不占用多余空间,且不能有二义性 这里给出哈夫曼二叉树的实现: HuffmanTree.h: 测试数据(主函数): 运行结果截图

    2024年02月16日
    浏览(46)
  • 【数据结构与算法】哈夫曼编码(最优二叉树实现

    哈夫曼编码 等长编码:占的位置一样 变长编码(不等长编码):经常使用的编码比较短,不常用的比较短 最优:总长度最短 最优的要求:占用空间尽可能短,不占用多余空间,且不能有二义性 这里给出哈夫曼二叉树的实现: HuffmanTree.h: 测试数据(主函数): 运行结果截图

    2024年02月16日
    浏览(44)
  • 数据结构-哈夫曼树(最优二叉树)

    目录 一、引言 二、哈夫曼树的概念 三、哈夫曼树的构建 1. 构建步骤 2. 构建示例 四、哈夫曼编码 1. 编码规则 2. 编码示例 五、哈夫曼树的应用 1. 数据压缩 2. 文件加密 六、总结 在计算机科学中,数据结构是指计算机中数据组织、管理和存储的方式。数据结构是计算机科学的

    2024年02月07日
    浏览(42)
  • LeetCode算法题解(动态规划)|LeetCode343. 整数拆分、LeetCode96. 不同的二叉搜索树

    题目链接:343. 整数拆分 题目描述: 给定一个正整数  n  ,将其拆分为  k  个  正整数  的和(  k = 2  ),并使这些整数的乘积最大化。 返回  你可以获得的最大乘积  。 示例 1: 示例 2: 提示: 2 = n = 58 算法分析: 定义dp数组及下标含义: dp[i]表述正整数i拆分成k个正整数

    2024年02月04日
    浏览(38)
  • 算法训练day41|动态规划 part03(LeetCode343. 整数拆分、96.不同的二叉搜索树)

    题目链接🔥🔥 给定一个正整数 n,将其拆分为至少两个正整数的和,并使这些整数的乘积最大化。 返回你可以获得的最大乘积。 示例 1: 输入: 2 输出: 1 解释: 2 = 1 + 1, 1 × 1 = 1。 示例 2: 输入: 10 输出: 36 解释: 10 = 3 + 3 + 4, 3 × 3 × 4 = 36。 说明: 你可以假设 n 不小于 2 且不大于

    2024年02月10日
    浏览(39)
  • 算法分析与设计--动态规划

    一、动态规划简介 二、动态规划求解步骤 三、动态规划典型应用 数字三角形问题 最大子段和问题 0-1背包问题 四、最长公共子序列问题 动态规划求解 五、总结 算法语言--java语言 动态规划算法通常用于求解具有某种最优性质的问题。动态规划与分治算法类似,其基本思想也

    2024年02月07日
    浏览(67)
  • 算法分析与设计---分治+动态规划

    1.分治法 适用条件: 问题规模缩小到一定程度容易求解 问题可以分解为若干个规模较小的 相同 子问题,即问题具有最优子结构( 使用分治法前提 ) 可以利用子问题的解合并为该问题的解( 决定是否使用分治法 ) 各个子问题 相互独立 ,即子问题之间不包含公共子问题(

    2024年02月07日
    浏览(42)
  • 算法设计与分析实验---动态规划

    任务描述 沿着河岸摆放 N 堆石子,现要将石子有次序地合并成一堆,规定每次只能选相邻的 2 堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分。 例如: 4 堆石子 4,5,9,4 ,可以按 (((4,5),9),4) 合并。 第一次合并得分是 9 分,合并之后石子堆是 9,9,4 第二次合并得

    2024年02月08日
    浏览(46)
  • 算法设计与分析复习--动态规划

    算法设计与分析复习–递归与分治(二) 与分析法类似:将原问题分解为子问题 不同点:不是通过递归的方式,而是自底向上的求解问题 矩阵连乘的次数是左矩阵行列,右矩阵行列取出左右中进行相乘。 由于矩阵乘积需要满足左矩阵列等于右矩阵的行,所以可以用一维数组

    2024年02月04日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包