一、Java学习
变量:(当某个数据经常改变时,可用变量存储,数据变化时只用修改变量里面记录的值)
定义:在程序的执行过程中,值有可能发生改变的量
变量的使用场景:登陆界面的用户名与用户密码
定义格式: 数据类型 变量名=数据值;
数据类型:限定数据类型
变量名:空间名
数据值:存放在空间中的值
变量的使用方式:
- 输出打印
- 参与计算
- 修改记录值
二、数据结构复习:哈夫曼树
定义:哈夫曼树又称最优树,是一类带权路径长度最短的树
(1)路径:从书中一个结点到另一个结点之间的分支构成这两个结点之间的路径
(2)路径长度:路径上的分支数目称作路径长度
(3)树的路径长度:从树根到每一结点的路径长度之和
(4)权:赋予某个实体的一个量,是对实体的某个或某些属性 的数值化描述
(5)节点的带权路径长度:从该结点到树根之间的路径长度与结点上权值的乘积
(6)树的带权路径长度:树中所有叶子节点的带权路径长度之和
( 7 )哈夫曼树:假设有m个权值,可以构造一 棵含n个叶子结点的二叉树,每个叶子结点的权值为w,则其中带权路径长度WPL最小的二叉树称作最优二叉树或哈夫曼树。
哈夫曼树的构造算法:
哈夫曼树的构造过程:
(1)根据给定的n个权值{w1, w.," wn},构造n棵只有根结点的二叉树,这n棵二又树构成森林F。
(2)在森林F中选取两棵根结点的权值最小的树作为左右子树构造一棵新的二叉树, 且置新的二叉树的根结点的权值为其左、右子树上根结点的权值之和。
(3)在森林F中删除这两棵树,同时将新得到的二叉树加入F中。
(4)重复(2)和(3),直到F只含一棵树为止。这棵树便是哈夫曼树。
在构造哈夫曼树时,首先选择权值小的,这样保证权值大的离根较近,这样-来, 在计算树的带权路径长度时,自然会得到最小带权路径长度,这种生成算法是一种典型的贪心法。
哈夫曼算法的实现:
哈夫曼树是一一种二叉树,当然可以采用前面介绍过的通用存储方法,而由于哈夫曼树中没有度为1的结点,则-棵有n个叶子结点的哈夫曼树共有2n-1个结点,可以存储在一个大小为2n-1的一-维数组中。
存储表示:
typedef struct{
int weight;//结点的权值
int parent,lchild,rchild;//结点的双亲,左右孩子的下标
}HTNode,*HTree;
构造哈夫曼树:
void createHafTree(HTree &HT,int n)
{
if(n<=1)
{
return ;
}
m=2*n-1;
HT=new HTNode[m+1];
for(i=1;i<=n;i++)
{
HT[i].parent=0;
HT[i].lchild=0;
HT[i].rchild=0;
}
for(i=1;i<=n;i++)
{
cin>>HT[i].weight;
}
for(i=n+1;i<=m;i++)
{
Select(HT,i-1,s1,s2);
HT[s1].parent=i;
HT[s2].parent=i;
HT[i].lchild=s1;
HT[i].rchild=s2;
HT[i].weight=HT[s1].weight+HT[s2].weight;
}
}