最优检索二叉树
抛出问题:
![在这里插入图片描述](https://img-blog.csdnimg.cn/3caeaf75498d45f2ab969a8ffa899540.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAV29vcHNpb24=,size_20,color_FFFFFF,t_70,g_se,x_16)
![在这里插入图片描述](https://img-blog.csdnimg.cn/a697ccd108624094ae7d0da255f96ded.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAV29vcHNpb24=,size_20,color_FFFFFF,t_70,g_se,x_16)
算法的基本解决思路:
![在这里插入图片描述](https://img-blog.csdnimg.cn/03738355870a47fa965cf5ce640d4ce9.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAV29vcHNpb24=,size_20,color_FFFFFF,t_70,g_se,x_16)
空隙:
所谓的空隙也就是查找的数值在二叉树的结点中是不存在的,指向的是附近结点的左右子树两边。
![在这里插入图片描述](https://img-blog.csdnimg.cn/285eabfe4f4143659ed1854cf9da68dd.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAV29vcHNpb24=,size_20,color_FFFFFF,t_70,g_se,x_16)
![在这里插入图片描述](https://img-blog.csdnimg.cn/ce8bc518c4884421a31c5f55d86ea1e2.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAV29vcHNpb24=,size_20,color_FFFFFF,t_70,g_se,x_16)
![在这里插入图片描述](https://img-blog.csdnimg.cn/951d94de28b24eda9f41d17f7c0d0ac7.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAV29vcHNpb24=,size_20,color_FFFFFF,t_70,g_se,x_16)
检索数据的平均时间:
![在这里插入图片描述](https://img-blog.csdnimg.cn/179f7b28c24046f1aa96269db3fcdd87.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAV29vcHNpb24=,size_20,color_FFFFFF,t_70,g_se,x_16)
![在这里插入图片描述](https://img-blog.csdnimg.cn/4674736aefee4d0da8ab01fc1f47bbb1.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAV29vcHNpb24=,size_20,color_FFFFFF,t_70,g_se,x_16)
![在这里插入图片描述](https://img-blog.csdnimg.cn/cf5f5b4316b24c64baaa4cd93c128ee4.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAV29vcHNpb24=,size_20,color_FFFFFF,t_70,g_se,x_16)
对于工作量而言,结点的工作量就是等于其层数加1,因为二叉树是从0层开始的,对于空隙结点的工作量就是其层数。
![在这里插入图片描述](https://img-blog.csdnimg.cn/6b0c6f595f6e435585a5656a551f0fda.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAV29vcHNpb24=,size_20,color_FFFFFF,t_70,g_se,x_16)
小结:
![在这里插入图片描述](https://img-blog.csdnimg.cn/111e43f8378a4994ae7446f70ea3a2a6.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAV29vcHNpb24=,size_20,color_FFFFFF,t_70,g_se,x_16)
最优二叉检索树的实现算法分析:
关键问题:
![在这里插入图片描述](https://img-blog.csdnimg.cn/e4c499b3e524400fa32fd377210f8e95.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAV29vcHNpb24=,size_20,color_FFFFFF,t_70,g_se,x_16)
![在这里插入图片描述](https://img-blog.csdnimg.cn/1201ae6109bc4e4f8d6a29f3b09e99e5.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAV29vcHNpb24=,size_20,color_FFFFFF,t_70,g_se,x_16)
![在这里插入图片描述](https://img-blog.csdnimg.cn/86c96cba556c424f8428cb61f8be2858.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAV29vcHNpb24=,size_20,color_FFFFFF,t_70,g_se,x_16)
例如我们选取BCD为子问题
![在这里插入图片描述](https://img-blog.csdnimg.cn/d7facd469240448fa4581ec0cabde56f.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAV29vcHNpb24=,size_20,color_FFFFFF,t_70,g_se,x_16)
![在这里插入图片描述](https://img-blog.csdnimg.cn/ec1e9723cd244feb8606cded848e078d.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAV29vcHNpb24=,size_20,color_FFFFFF,t_70,g_se,x_16)
![在这里插入图片描述](https://img-blog.csdnimg.cn/6df48fd76c3042e5a96092f21fea1f81.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAV29vcHNpb24=,size_20,color_FFFFFF,t_70,g_se,x_16)
![在这里插入图片描述](https://img-blog.csdnimg.cn/5b7884d84ba34d61b8dcc81e92bb68c6.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAV29vcHNpb24=,size_20,color_FFFFFF,t_70,g_se,x_16)
![在这里插入图片描述](https://img-blog.csdnimg.cn/fae5dda1db2945d8a68e144fe539ebf3.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAV29vcHNpb24=,size_20,color_FFFFFF,t_70,g_se,x_16)
- 注意m[]的含义,平均比较次数,也就是其工作量乘以对应概率
关于优化函数的递推方程
在这里,我们会选取一个节点作为当前子问题的根节点,将此子问题的第i个节点到k-1个结点连接在左子树,将k+1到j的节点连接在右子树,因此这样形成的子问题树,其节点的普遍的操作次数全部加一,也就是说这个加一的体现可以在概率上面,等同于说是平均操作次数就是其对应子问题节点的检索概率全部乘以1,等同于其概率本身。这也就是为什么要进行加上所有节点的检索概率的原因。
![在这里插入图片描述](https://img-blog.csdnimg.cn/8a9e75283c174158a978fa5656179fbc.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAV29vcHNpb24=,size_20,color_FFFFFF,t_70,g_se,x_16)
![在这里插入图片描述](https://img-blog.csdnimg.cn/097e5ff577ed47d4a6343ba1607a8873.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAV29vcHNpb24=,size_20,color_FFFFFF,t_70,g_se,x_16)
所以在这个时候,我们已经搞清楚了最优检索二叉树的子问题的划分以及其平均操作次数的计算方法,那么接下来我们进行子问题中k取值的确定,子问题中不同的k的取值,也就是子问题根节点的选定对于整体子树的平均检索时间是不相同的,也就是说在子问题中可能存在一个最优的k的取值情况。
![在这里插入图片描述](https://img-blog.csdnimg.cn/1692174ccc344d199de33a8b72d8c721.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAV29vcHNpb24=,size_20,color_FFFFFF,t_70,g_se,x_16)
关于k的取值的极端情况:
![在这里插入图片描述](https://img-blog.csdnimg.cn/f441f452e00343bca88cbe12a4c7eb4f.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAV29vcHNpb24=,size_20,color_FFFFFF,t_70,g_se,x_16)
我们进行一个实例来计算平均计算次数。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZymGkZ70-1633842713368)(../../../../typora_images/java数据结构与算法/tree/image-20211010125030787.png)]](https://img-blog.csdnimg.cn/f23101b950724e6e954b95b3f4e40cfa.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAV29vcHNpb24=,size_20,color_FFFFFF,t_70,g_se,x_16)
对于这个公式解读一下,这也运用了递归的思想,将大问题细小化,从最小的问题进行计算求解,逐个击破求解。
![在这里插入图片描述](https://img-blog.csdnimg.cn/f6827514fbc44cbb8d078a86e547e7d5.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAV29vcHNpb24=,size_20,color_FFFFFF,t_70,g_se,x_16)
在这里是以k取二为根节点,也就是说以B为根节点,将B的前部分节点连接在左子树,也就是:
![在这里插入图片描述](https://img-blog.csdnimg.cn/a951198d9151428891cfc3803e9ce144.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAV29vcHNpb24=,size_20,color_FFFFFF,t_70,g_se,x_16)
再将剩下的归为右子树
![在这里插入图片描述](https://img-blog.csdnimg.cn/f4e55ae60b0a47d3b6707ff51cf16a4a.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAV29vcHNpb24=,size_20,color_FFFFFF,t_70,g_se,x_16)
将余下的划分为:
![在这里插入图片描述](https://img-blog.csdnimg.cn/3cae063e438d40e0a53691a20ffd92bb.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAV29vcHNpb24=,size_20,color_FFFFFF,t_70,g_se,x_16)
在m[3,5]的里面又可以划分为一个子问题。
通过这样的动态规划,进行子问题的划分,我们可以很方便的计算出其平均查找次数:
![42713370)(../../../../typora_images/java数据结构与算法/tree/image-20211010130641569.png)]](https://img-blog.csdnimg.cn/6443d4717ca3417f86469824ab2624e9.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAV29vcHNpb24=,size_20,color_FFFFFF,t_70,g_se,x_16)
- 这里的1是最高层公式里面的w[i,j]也就是整体的概率之和(节点的概率和空隙的概率)为1。
计算的结果和我们通过计算检索数据的平均时间的数值是一样的,也就是说,运用递推方程能够更合理快速的计算出其检索二叉树的效率,也就是检索的平均时间,平均查找次数。
复杂性估计:
![在这里插入图片描述](https://img-blog.csdnimg.cn/961f7cb4e5504cc2b3a3b845c03226f6.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAV29vcHNpb24=,size_20,color_FFFFFF,t_70,g_se,x_16)
总结:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QQJjWUsa-1633842713371)(../../../../typora_images/java数据结构与算法/tree/image-20211010130749633.png)]](https://img-blog.csdnimg.cn/76faa544405144be8590afdecbc672d5.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAV29vcHNpb24=,size_20,color_FFFFFF,t_70,g_se,x_16)
取k=2仅仅是我们算法中进行最优值求解中的一个方向而已,之后也会进行k=3…5
的计算,然后再对相应的平均计算时间进行记录,最后将最优的k值从底层向上据记录下来,就求解出了最优解,