鱼龙混杂

如何求 huffman 编码。

  • 设需要编码的字符集为 \(d_1,d_2,\dots,d_n\),他们在字符串中出现的频率为 \(w_1,w_2,\dots,w_n\)

  • \(d_1,d_2,\dots,d_n\) 作为叶结点,\(w_1,w_2,\dots,w_n\) 作为叶结点的权值,构造一棵霍夫曼树。

  • 规定哈夫曼编码树的左分支代表 0,右分支代表 1,则从根结点到每个叶结点所经过的路径组成的 0、1 序列即为该叶结点对应字符的编码。

实质上我们会发现,假如集合内部可以划分 huffman 编码,合并两个集合就是一个加上前缀 0 一个加上前缀 1,所以总长度贡献是这个样子的。
然后相同前缀其实对应完全二叉树上面的一条链,所以不会重复取到 /kel

如果想要 \(k\) 叉的,可能会不太刚好,直接补 \(w_x=0\) 这种东西直到 \((k-1)|(n-1)\)


考虑最小生成树的唯一性。如果一条边 不在最小生成树的边集中,并且可以替换与其 权值相同、并且在最小生成树边集 的另一条边。那么,这个最小生成树就是不唯一的。

对于 Kruskal 算法,只要计算为当前权值的边可以放几条,实际放了几条,如果这两个值不一样,那么就说明这几条边与之前的边产生了一个环(这个环中至少有两条当前权值的边,否则根据并查集,这条边是不能放的),即最小生成树不唯一。

posted @ 2023-10-09 18:31  Hypoxia571  阅读(6)  评论(0编辑  收藏  举报