go实现哈夫曼编码

package main
 
import (
    "bytes"
    "fmt"
)
 
// 定义节点类型
type Node struct {
    Weight int
    Left   *Node
    Right  *Node
}
 
// 构建哈夫曼树
func buildHuffmanTree(weights []int) *Node {
    var nodes []*Node
    for _, weight := range weights {
        nodes = append(nodes, &Node{Weight: weight})
    }
 
    for len(nodes) > 1 {
        // 排序节点,按照权重从小到大
        sortNodes(nodes)
 
        // 取出最小的两个节点创建新节点
        a, b := nodes[0], nodes[1]
        newNode := &Node{Weight: a.Weight + b.Weight, Left: a, Right: b}
 
        // 删除已经处理的两个节点
        nodes = append(nodes[:0], nodes[2:]...)
 
        // 将新节点加入到节点列表中
        nodes = append(nodes, newNode)
    }
 
    return nodes[0]
}
 
// 对节点列表进行排序
func sortNodes(nodes []*Node) {
    for i := range nodes {
        for j := i; j > 0 && nodes[j].Weight < nodes[j-1].Weight; j-- {
            nodes[j], nodes[j-1] = nodes[j-1], nodes[j]
        }
    }
}
 
// 哈夫曼编码
func huffmanEncoding(root *Node, encoding map[byte]string) {
    var traverse func(node *Node, code string)
    traverse = func(node *Node, code string) {
        if node.Left == nil && node.Right == nil {
            encoding[byte(node.Weight)] = code
            return
        }
        traverse(node.Left, code+"0")
        traverse(node.Right, code+"1")
    }
 
    traverse(root, "")
}
 
// 哈夫曼解码
func huffmanDecoding(root *Node, data string) string {
    var result bytes.Buffer
    current := root
    for i := range data {
        if current.Left == nil && current.Right == nil {
            result.WriteByte(byte(current.Weight))
            current = root
            continue
        }
        if data[i] == '0' {
            current = current.Left
        } else if data[i] == '1' {
            current = current.Right
        }
    }
    return result.String()
}
 
func main() {
    // 示例:文本"aaabbbbccccddddeeeee"的哈夫曼编码和解码
    text := "aaabbbbccccddddeeeee"
    weights := make([]int, 27) // 字母从'a'到'z'的权重
 
    // 统计每个字符的权重
    for _, char := range text {
        weights[char-'a']++
    }
 
    // 构建哈夫曼树
    root := buildHuffmanTree(weights)
 
    // 生成哈夫曼编码
    encoding := make(map[byte]string)
    huffmanEncoding(root, encoding)
 
    // 示例:打印每个字符的哈夫曼编码
    for char, code := range encoding {
        fmt.Printf("%c: %s\n", char, code)
    }
 
    // 使用哈夫曼编码对文本进行编码
    var encoded bytes.Buffer
    for _, char := range text {
        encoded.WriteString(encoding[byte(char)])
    }
    encodedText := encoded.String()
    fmt.Printf("Encoded text: %s\n", encodedText)
 
    // 使用哈夫曼树对编码文本进行解码
    decodedText := huffmanDecoding

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/779962.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

鸿蒙OS开发教学:【编程之重器-装饰器】

HarmonyOS 有19种装饰器 必须【2】 绘制一个页面&#xff0c;这两个肯定会用到 EntryComponent 可选【17】 StatePropLinkObjectLinkWatchStylesStoragePropStorageLinkProvideConsumeObservedBuilderBuilderParamLocalStoragePropLocalStorageLinkExtendConcurrent 如果…

Redis--缓存常用的 3 种读写策略

Cache Aside Pattern旁路缓存模式 Cache Aside Pattern 是平时使用较多的一个缓存读写模式&#xff0c;比较适合读请求比较多的场景。 Cache Aside Pattern 中服务端需要同时维系 db 和 cache&#xff0c;并且是以 db 的结果为准。 缓存读写步骤&#xff1a; 写&#xff1a…

python3将exe 转支持库错误 AssertionError: None does not smell like code

exe -> pyc包(*.exe_extracted) 安装反编译工具 exe反编译工具&#xff1a;pyinstxtractor.py下载&#xff1a;https://sourceforge.net/projects/pyinstallerextractor/ python pyinstxtractor.py hello.exe包反编译 懒的写&#xff01;&#xff01;&#xff01; 这有详…

如何使用Zabbix监控MySQL的MGR群集状态

MySQL的MGR&#xff08;MySQL Group Replication&#xff09;是MySQL官方提供的一种高可用性和高可靠性的集群解决方案。MGR通过使用基于组复制的方式&#xff0c;实现了多个MySQL实例之间的数据同步和故障转移&#xff0c;从而提供了自动故障恢复和负载均衡的功能。本文将介绍…

安装uim-ui插件不成功,成功解决

安装&#xff1a;这种安装&#xff0c;umi4 不支持&#xff0c;只有umi3才支持。而我发现官网现在默认使用的umi4。 yarn add umijs/preset-ui -D 解决&#xff1a;更改umi版本重新安装umi3 npm i ant-design/pro-cli3.1.0 -g #使用umi3 (指定umi3版本) pro create user-ce…

【YOLOv8 代码解读】数据增强代码梳理

1. LetterBox增强 当输入图片的尺寸和模型实际接收的尺寸可能不一致时&#xff0c;通常需要使用LetterBox增强技术。具体步骤是先将图片按比例缩放&#xff0c;将较长的边缩放到设定的尺寸以后&#xff0c;再将较短的边进行填充&#xff0c;最终短边的长度为stride的倍数即可。…

爬虫(Web Crawler)逆向技术探索

实战案例分析 为了更好地理解爬虫逆向的实际应用&#xff0c;我们以一个具体的案例进行分析。 案例背景 假设我们需要从某电商网站上获取商品价格信息&#xff0c;但该网站采取了反爬虫措施&#xff0c;包括动态Token和用户行为分析等。 分析与挑战 动态Token&#xff1a;…

海豚【货运系统源码】货运小程序【用户端+司机端app】源码物流系统搬家系统源码师傅接单

技术栈&#xff1a;前端uniapp后端vuethinkphp 主要功能&#xff1a; 不通车型配置不通价格参数 多城市定位服务 支持发货地 途径地 目的地智能费用计算 支持日期时间 预约下单 支持添加跟单人数选择 支持下单优惠券抵扣 支持司机收藏订单评价 支持订单状态消息通知 支…

Photoshoot 2(Java)

Photoshoot 2 题目描述 在一个似曾相识的场景中&#xff0c;Farmer John 正在将他的 N 头奶牛&#xff08;1≤N≤10^5&#xff09;排成一排&#xff08;为了方便将它们按 1⋯1⋯N 编号&#xff09;&#xff0c;以便拍照。 最初&#xff0c;奶牛从左到右按照 a1,a2,⋯,aN 的顺…

【C/C++】从零开始认识C++历程-启航篇

文章目录 &#x1f4dd;前言&#x1f320; 什么是C&#xff1f;&#x1f309;C的发展史 &#x1f320;C的重要性&#x1f309;语言的使用广泛度 &#x1f320;在工作领域&#x1f309; 岗位需求 &#x1f320;相关笔试题&#x1f309; 公司怎样面试C &#x1f6a9;总结 &#x…

用grafana+prometheus+cadvisor监控容器指标数据,并查询当前容器的网速网络用量

前言 整理技术&#xff0c;在这篇文章中&#xff0c;将会搭建grafanaprometheuscadvisor监控容器&#xff0c;并使用一个热门数据看板&#xff0c;再监控容器的性能指标 dashboard效果 这个是node-exporter采集到的数据&#xff0c;我没装node-exporter&#xff0c;而且这也…

Vitis AI——FPGA学习笔记<?>

参考资料&#xff1a; Xilinx/Vitis-AI-Tutorials (github.com) Xilinx/Vitis-AI: Vitis AI is Xilinx’s development stack for AI inference on Xilinx hardware platforms 【03】ALINX Zynq UltraScale MPSoC XILINX FPGA视频教程Vitis AI开发 一. 简介 1.简介 边缘计…

CCF-CSP认证考试 202212-4 聚集方差 100分题解

更多 CSP 认证考试题目题解可以前往&#xff1a;CSP-CCF 认证考试真题题解 原题链接&#xff1a; 202212-4 聚集方差 时间限制&#xff1a; 2.0s 内存限制&#xff1a; 512.0MB 问题背景 通常而言&#xff0c;对一组数据 A a 1 , . . . , a n A{a_1,...,a_n} Aa1​,...,an…

【物联网】Qinghub opc-ua 连接协议

基础信息 组件名称 &#xff1a; opcua-connector 组件版本&#xff1a; 1.0.0 组件类型&#xff1a; 系统默认 状 态&#xff1a; 正式发布 组件描述&#xff1a;通过OPCUA连接网关&#xff0c;通过定时任务获取OPCUA相关的数据或通过执行指令控制设备相关参数。 配置文件&a…

卸载原有的cuda,更新cuda

概述&#xff1a;看了一下自己的gpu&#xff0c;发现驱动可能装低了&#xff0c;随即尝试更新驱动&#xff0c;写下此篇 注&#xff1a;我原先是10.2的版本&#xff0c;改了之后是11.2&#xff0c;下面的图都用11.2的&#xff0c;不过不碍事 目录 第一步&#xff1a;查看现在…

计算机网络目录

北航计算机网络 chapter1 北航计算机网络 chapter2 物理层 北航计算机网络 chapter3 数据链路层 北航计算机网络 chapter4 网络层 北航计算机网络chapter5 传输层 北航计算机网络chapter6 应用层 北航计算机网络 chapter7 IPv6 北航计算机网络 chapter 8 VLAN

sqli第五关报错注入

源码&#xff08;单引号闭合但是没有回显&#xff09; $sql"SELECT * FROM users WHERE id$id LIMIT 0,1"; $resultmysql_query($sql); $row mysql_fetch_array($result);if($row){echo <font size"5" color"#FFFF00">; echo You are in…

位运算算法(2)

目录 面试题 01.01. 判断字符是否唯一 一、题目描述 二、思路解析 三、代码 268.丢失的数字 一、题目描述 二、思路解析 三、代码 371.两整数之和 一、题目描述 二、思路解析 三、代码 137.只出现一次的数字 II 一、题目描述 二、思路解析 三、代码 面试题 01.0…

力扣刷题题解注意(13

力扣560和为k的子数组 其实这道题固定一边的边界&#xff0c;枚举左右边界就可&#xff0c;时间复杂度为On2。 但是由于我在代码中的画蛇添足&#xff0c;对于每一个元素的判断&#xff0c;导致了最终的结果无法通过[0,0] k0&#xff0c;ans3&#xff0c;其实这个用例也。 i…