鱼龙混杂
如何求 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 算法,只要计算为当前权值的边可以放几条,实际放了几条,如果这两个值不一样,那么就说明这几条边与之前的边产生了一个环(这个环中至少有两条当前权值的边,否则根据并查集,这条边是不能放的),即最小生成树不唯一。