次优二叉树

简介:   在有序序列的查找中,如果各个元素的查找概率都是一样的,那么二分查找是最快的查找算法,但是如果查找元素的查找概率是不一样的,那么用二分查找就不一定是最快的查找方法了,可以通过计算ASL来得知。所以基于这种查找元素概率不想等的有序序列,可以通过构造最优二叉树的方法,使得该二叉树的带权路径长度最小,这样的二叉树的构造代价是非常大的,所以用一种近似的算法,构造次优查找树,该树的带权路径长度近似达到最小。

  在有序序列的查找中,如果各个元素的查找概率都是一样的,那么二分查找是最快的查找算法,但是如果查找元素的查找概率是不一样的,那么用二分查找就不一定是最快的查找方法了,可以通过计算ASL来得知。所以基于这种查找元素概率不想等的有序序列,可以通过构造最优二叉树的方法,使得该二叉树的带权路径长度最小,这样的二叉树的构造代价是非常大的,所以用一种近似的算法,构造次优查找树,该树的带权路径长度近似达到最小。

  数据结构中算法描述为:

  

  1 #include <iostream>
  2 #include <cmath>
  3 #include <cstdlib>
  4 #include <iomanip>
  5 
  6 using namespace std;
  7 
  8 typedef struct treenode
  9 {
 10     char data;
 11     int weight;
 12     treenode *left;
 13     treenode *right;
 14 }Treenode,*Treep;
 15 
 16 //初始化二叉树
 17 void init_tree(Treep &root)
 18 {
 19     root=NULL;
 20     cout<<"初始化成功!"<<endl;
 21 }
 22 
 23 //创建二叉树
 24 void SecondOptimal(Treep &rt, char R[],int sw[], int low, int high)
 25 {
 26     //由有序表R[low....high]及其累积权值表sw(其中sw[0]==0)递归构造次优查找树T
 27     int i = low;
 28     //int min = abs(sw[high] - sw[low]);
 29     int dw = sw[high] - sw[low-1];
 30     int min = dw;
 31     for(int j=low+1; j<=high; ++j)        //选择最小的ΔPi值
 32     {
 33         if(abs(dw-sw[j]-sw[j-1]) < min)
 34         {
 35             i=j;
 36             min=abs(dw-sw[j]-sw[j-1]);
 37         }
 38     }
 39     rt=new Treenode;
 40     rt->data=R[i];        //生成节点
 41     if(i==low)            //左子树为空
 42         rt->left = NULL;
 43     else                //构造左子树
 44         SecondOptimal(rt->left, R, sw, low, i-1);
 45 
 46     if(i==high)            //右子树为空
 47         rt->right = NULL;
 48     else                //构造右子树
 49         SecondOptimal(rt->right, R, sw, i+1, high);
 50 }//SecondOptimal
 51 
 52 //前序遍历二叉树
 53 void pre_order(Treep rt)
 54 {
 55     if(rt)
 56     {
 57         cout<<rt->data<<"  ";
 58         pre_order(rt->left);
 59         pre_order(rt->right);
 60     }
 61 }
 62 
 63 //中序遍历二叉树
 64 void in_order(Treep rt)
 65 {
 66     if(rt)
 67     {
 68         in_order(rt->left);
 69         cout<<rt->data<<"  ";
 70         in_order(rt->right);
 71     }
 72 }
 73 
 74 //后序遍历二叉树
 75 void post_order(Treep rt)
 76 {
 77     if(rt)
 78     {
 79         post_order(rt->left);
 80         post_order(rt->right);
 81         cout<<rt->data<<"  ";
 82     }
 83 }
 84 
 85 //查找二叉树中是否存在某元素
 86 int seach_tree(Treep &rt,char key)
 87 {
 88     if(rt==NULL) 
 89         return 0; 
 90     else 
 91     { 
 92         if(rt->data==key) 
 93         {
 94             return 1;
 95         }
 96         else
 97         {
 98             if(seach_tree(rt->left,key) || seach_tree(rt->right,key))
 99                 return 1;    //如果左右子树有一个搜索到,就返回1
100             else
101                 return 0;    //如果左右子树都没有搜索到,返回0
102         }
103     }
104 }
105 
106 int main()
107 {
108     Treep root;
109     init_tree(root);        //初始化树
110     int low=1, high=10;
111     int *weight, *sw;
112     char *R;
113     
114     R=new char[high];
115     for(int i=low; i<high; i++)
116         R[i]='A'+i-1;
117     cout<<"构造次优查找树的点R[]:"<<endl;
118     for(int i=low; i<high; i++)
119         cout<<setw(3)<<R[i]<<"  ";
120     cout<<endl;
121     
122     weight=new int[high];
123     weight[0]=0;
124     weight[1]=1;
125     weight[2]=1;
126     weight[3]=2;
127     weight[4]=5;
128     weight[5]=3;
129     weight[6]=4;
130     weight[7]=4;
131     weight[8]=3;
132     weight[9]=5;
133     cout<<"构造次优查找树的点的权值weight[]:"<<endl;
134     for(int i=low; i<high; i++)
135         cout<<setw(3)<<weight[i]<<"  ";
136     cout<<endl;
137         
138     sw=new int[high];
139     sw[0]=0;
140     for(int i=low; i<high; i++)
141     {
142         sw[i]=sw[i-1]+weight[i];
143     }
144     cout<<"构造次优查找树的点累积权值sw[]:"<<endl;
145     for(int i=low; i<high; i++)
146         cout<<setw(3)<<sw[i]<<"  ";
147     cout<<endl;
148         
149     //创建二叉树
150     SecondOptimal(root, R, sw, low, high-1);
151     
152     cout<<"前序遍历序列是:"<<endl;
153     pre_order(root);
154     cout<<endl;
155     
156     cout<<"中序遍历序列是:"<<endl;
157     in_order(root);
158     cout<<endl;
159 
160     cout<<"后序遍历序列是:"<<endl;
161     post_order(root);
162     cout<<endl;
163 
164     //查找二叉树中是否存在某元素
165     cout<<"输入要查找的元素!"<<endl;
166     char ch;
167     cin>>ch;
168     if(seach_tree(root,ch)==1)
169         cout<<"Yes"<<endl;
170     else
171         cout<<"No"<<endl;
172     while(1);
173     return 0;
174 }

  运行结果如下:
  

目录
相关文章
|
机器学习/深度学习 分布式计算 数据处理
分布式计算框架:并行力量的交响乐章
分布式计算框架如Apache Spark解决单机计算挑战,通过拆分任务到多机并行处理提升效率。Spark以其内存计算加速处理,支持批处理、查询、流处理和机器学习。以下是一个PySpark统计日志中每日UV的示例,展示如何利用SparkContext、map和reduceByKey进行数据聚合分析。这些框架的运用,正改变大数据处理领域,推动数据分析和机器学习的边界。【6月更文挑战第18天】
475 2
|
Linux 开发工具 git
10 推荐免费 Git 仓库
Git 免费仓库 Gitee 开源中国-基于 Git 的代码托管和研发协作平台【推荐】 https://gitee.com/
2253 0
10 推荐免费 Git 仓库
|
SQL 关系型数据库 MySQL
MySQL 定时备份的几种方式,这下稳了!
在MySQL中提供了命令行导出数据库数据以及文件的一种方便的工具mysqldump,我们可以通过命令行直接实现数据库内容的导出dump,首先我们简单了解一下mysqldump命令用法:
MySQL 定时备份的几种方式,这下稳了!
|
11月前
|
Java 编译器 程序员
【c++】基础知识——快速入门c++
本文介绍了C++的基础知识,包括C++相对于C语言的新特性,如面向对象编程、引用、函数重载、模板库STL等。文章通过“Hello World”程序展示了C++的基本语法,并详细解释了命名空间、输入输出、缺省参数、函数重载、内联函数和空指针的概念。通过实例代码和运行结果,帮助读者快速掌握C++的核心知识点。
258 9
|
算法 Python
群智能算法:灰狼优化算法(GWO)的详细解读
在优化问题中,寻找最优解是核心目标。灰狼优化算法(GWO)受到自然界灰狼狩猎行为和社会等级结构的启发,通过模拟Alpha(头狼)、Beta(助手狼)、Delta(支配狼)和Omega(普通狼)的角色,高效搜索最优解。本文详细解析GWO的原理与步骤,并提供Python代码实现,帮助读者理解并应用这一算法。
|
文字识别 API
印刷文字识别操作报错合集之如何解决报错:The image type does not match the API operation.
在使用印刷文字识别(OCR)服务时,可能会遇到各种错误。例如:1.Java异常、2.配置文件错误、3.服务未开通、4.HTTP错误码、5.权限问题(403 Forbidden)、6.调用拒绝(Refused)、7.智能纠错问题、8.图片质量或格式问题,以下是一些常见错误及其可能的原因和解决方案的合集。
|
敏捷开发 测试技术 持续交付
阿里云云效产品使用合集之流水线构建出现问题,连接不到nuget,该如何处理
云效作为一款全面覆盖研发全生命周期管理的云端效能平台,致力于帮助企业实现高效协同、敏捷研发和持续交付。本合集收集整理了用户在使用云效过程中遇到的常见问题,问题涉及项目创建与管理、需求规划与迭代、代码托管与版本控制、自动化测试、持续集成与发布等方面。
|
存储 缓存 分布式计算
You Only Cache Once:YOCO 基于Decoder-Decoder 的一个新的大语言模型架构
YOCO是一种新的解码器-解码器架构,旨在解决大型语言模型推理时的内存限制问题。通过只缓存一次键值对,YOCO显著减少了GPU内存占用,与Transformer相比,内存使用降低了约L倍。模型由自解码器和交叉解码器组成,自解码器使用滑动窗口注意力,而交叉解码器利用全局KV缓存。实验表明,YOCO在保持竞争力的性能同时,提高了推理速度,尤其是在处理长序列时。此外,YOCO还减少了预填充时间,提升了吞吐量。
533 3
|
数据可视化 物联网 测试技术
零一万物Yi-1.5系列模型发布并开源!34B/9B/6B 多尺寸魔搭社区推理微调最佳实践教程来啦!
Yi-1.5是Yi的升级版本。 它使用 500B tokens的高质量语料库在 Yi 上持续进行预训练,并在 3M 个多样化的微调样本上进行微调。
|
存储 分布式计算 Hadoop
基于Hadoop分布式存储的网盘系统实现(简易粗糙版)(上)
基于Hadoop分布式存储的网盘系统实现(简易粗糙版)(上)
753 0