求解电文哈弗曼加权路径大小
路径 大小 求解 加权
2023-09-27 14:26:36 时间
void InitHuffmanTree(HuffmanTree ,int );
void Select(HuffmanTree HT ,int n,int s1,int s2);
int Min_Weight(HuffmanTree HT ,int n );
void InitHuffmanTree(HuffmanTree HT ,int n);
void HuffmanCoding(HuffmanTree HT , int n);
int Weight_Length(HuffmanTree HT , int n);// 计算带权路径长度
int Find_length(HuffmanTree HT ,int n);// 计算每个叶子节点到根节点的路径长度
int main(void)
int datanum ; // 数据的组数
scanf ("%d", datanum);
while (datanum)
HuffmanTree HT;
int n ; // 每组数据的个数
scanf("%d",
InitHuffmanTree(HT,n); // 初始化哈弗曼树为编码做准备
HuffmanCoding(HT,n); // 开始编码
/*for (int i = 1; i = 2*n-1 ; i ++) // 此处用于查看内存中的值,检查编码是否正确
printf ("%5d%5d%5d%5d%5d\n",i,HT[i].weight ,HT[i].lchild ,HT[i].rchild ,HT[i].parent);
printf("%d\n",Weight_Length(HT,n));
datanum -- ;
return 0 ;
int Weight_Length(HuffmanTree HT , int n)
int len = 0 ;
while (n)
len = len + Find_length(HT,n) * HT[n].weight ;
n -- ;
return len ;
// 因为从根节点到叶子的路径长度不好找,难以确定走的方向,此处才用的是从叶子到根节点走的方式,每走一步记下,更新长度
int Find_length(HuffmanTree HT ,int n)
int distance = 0 ;
int f ;
for (f = HT[n].parent ;f != 0 ; f = HT[f].parent)
distance ++ ;
return distance ;
void HuffmanCoding(HuffmanTree HT , int n)
int m = 2 * n - 1 ;
for (int i = n + 1 ; i = m ; i ++)
int s1,s2;
Select(HT,i-1,s1,s2); // 在HT中选择两个权值parent为0的相对较小的元素,返回的值中满足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 ;
return ;
// 找到两个相对较小的元素并返回
void Select(HuffmanTree HT ,int n,int s1,int s2)
s1 = Min_Weight(HT,n);
s2 = Min_Weight(HT,n);
return ;
int Min_Weight(HuffmanTree HT ,int n ) // 找到相对小的元素并将其标记以表示将其从集合中删去
unsigned int k = 1000 ;
unsigned int min = 0 ;
int i = 1;
while (i = n )
if (!HT[i].parent HT[i].weight k)
k = HT[i].weight ;
min = i ;
i ++ ;
HT[min].parent = -1 ; // 标示找到的较小的元素的位置
return min;
void InitHuffmanTree(HuffmanTree HT ,int n)
int m = 2*n-1;
HT = (HuffmanTree)malloc( (m+1) * sizeof(HTNode)); // 此处因为不用0号单元所以得多申请一块内存空间
if (!HT)
exit(-1);
for(int i = 1 ; i = n ; i ++ )
scanf("%d", HT[i].weight);
HT[i].lchild = 0;
HT[i].parent = 0;
HT[i].rchild = 0;
for (i = n + 1 ;i = m ;i ++)
HT[i].lchild = 0 ;
HT[i].parent = 0 ;
HT[i].rchild = 0 ;
HT[i].weight = 0 ;
return ;
}
加权随机设计与实现 加权随机,是指当我们从某种容器中随机选择一个元素,每个元素被选中的机会并不相等,而是由相对“权重”(或概率)被选中的,也就是说我们想要有“偏心”的得到某种随机结果。
梯度下降算法主要通过哪两个控制因子实现最优参数选择?这两个因子分别起到什么作用?为什么计算损失函数最优值采用梯度下降算法而不是直接对损失函数求导数等于0时的最优解?如何判断梯度下降算法是否正确工作? 梯度下降算法主要通过哪两个控制因子实现最优参数选择?这两个因子分别起到什么作用?为什么计算损失函数最优值采用梯度下降算法而不是直接对损失函数求导数等于0时的最优解?如何判断梯度下降算法是否正确工作? 梯度下降算法有两个重要的控制因子:一个是步长,由学习率控制;一个是方向,由梯度指定。 1.在梯度下降算法中,步长决定了每一次迭代过程中,会往梯度下降的方向移动的距离。试想一下,如果步长很大,算法会在局部最优点附近来回跳动,不会收敛(如下图);但如果步长太短,算法每步的移动距离很短,就会导致算法收敛速度很慢。
加权随机设计与实现 加权随机,是指当我们从某种容器中随机选择一个元素,每个元素被选中的机会并不相等,而是由相对“权重”(或概率)被选中的,也就是说我们想要有“偏心”的得到某种随机结果。
梯度下降算法主要通过哪两个控制因子实现最优参数选择?这两个因子分别起到什么作用?为什么计算损失函数最优值采用梯度下降算法而不是直接对损失函数求导数等于0时的最优解?如何判断梯度下降算法是否正确工作? 梯度下降算法主要通过哪两个控制因子实现最优参数选择?这两个因子分别起到什么作用?为什么计算损失函数最优值采用梯度下降算法而不是直接对损失函数求导数等于0时的最优解?如何判断梯度下降算法是否正确工作? 梯度下降算法有两个重要的控制因子:一个是步长,由学习率控制;一个是方向,由梯度指定。 1.在梯度下降算法中,步长决定了每一次迭代过程中,会往梯度下降的方向移动的距离。试想一下,如果步长很大,算法会在局部最优点附近来回跳动,不会收敛(如下图);但如果步长太短,算法每步的移动距离很短,就会导致算法收敛速度很慢。
相关文章
- 剑指 offer 面试题精选图解面试题 12. 矩阵中的路径
- How to run python interactive in current file's directory in Visual Studio Code? Python路径问题
- 如何获取配置文件的路径
- 【Vue】Vue-cli(脚手架)导入组件路径报错的正确方法
- 基于create-react-app的打包后文件路径问题
- vue 组件 模板中根数据绑定需要指明路径并通信父
- 《JavaScript框架设计》——2.2 加载器所在路径的探知
- P3371 【模板】单源最短路径(弱化版)
- 接入网NFV引入路径:CPE、OLT和BNG或将率先云化
- Unity Android 之 url 访问网址( zip )下载和读取数据 路径注意 (UnauthorizedAccessException) Application.xxxPath路径说明
- MySql视频教程——百度云下载路径
- [LeetCode] 1091. Shortest Path in Binary Matrix 二进制矩阵中的最短路径
- [LeetCode] Coin Path 硬币路径
- SpringBoot设置全局上传文件路径并上传文件
- python从路径中获取文件名的三种方式