8609 哈夫曼树

news2024/9/28 13:38:25

### 思路
1. **选择最小权值节点**:在哈夫曼树构建过程中,选择两个权值最小且父节点为0的节点。
2. **构建哈夫曼树**:根据权值构建哈夫曼树,确保左子树权值小于右子树权值。
3. **生成哈夫曼编码**:从叶子节点到根节点逆向生成每个字符的哈夫曼编码。

### 伪代码
1. **选择最小权值节点**:
   - 遍历节点,找到两个权值最小且父节点为0的节点。
2. **构建哈夫曼树**:
   - 初始化哈夫曼树节点。
   - 输入��值。
   - 迭代构建哈夫曼树,选择两个最小权值节点,更新父节点和子节点信息。
3. **生成哈夫曼编码**:
   - 从叶子节点到根节点逆向生成编码,存储在编码数组中。

### C++代码

#include "stdio.h"
#include "string.h"
#include <iostream>
using namespace std;

typedef struct {
    unsigned int weight;
    unsigned int parent, lchild, rchild;
} HTNode, *HuffmanTree;

typedef char **HuffmanCode;

void select(HuffmanTree &HT, int n, int &s1, int &s2) {
    int min1 = 0xFFFFFFFF, min2 = 0xFFFFFFFF; // Use large initial values
    s1 = s2 = 0;
    for (int i = 1; i <= n; ++i) {
        if (HT[i].parent == 0) {
            if (HT[i].weight < min1) {
                min2 = min1;
                s2 = s1;
                min1 = HT[i].weight;
                s1 = i;
            } else if (HT[i].weight < min2) {
                min2 = HT[i].weight;
                s2 = i;
            }
        }
    }
}

void createHuffmanTree(HuffmanTree &HT, int n) {
    int i, m, s1, s2;
    if (n <= 1) return;
    m = 2 * n - 1;
    HT = new HTNode[m + 1];  // 0号单元未用
    for (i = 1; i <= m; i++) { // 初始化HT数组
        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;
    }
}

void createHuffmanCode(HuffmanTree HT, HuffmanCode &HC, int n) {
    char *cd = new char[n];    // 分配求编码的工作空间
    cd[n - 1] = '\0';  // 编码结束符。
    int i, c, f, start;
    for (i = 1; i <= n; ++i) {
        start = n - 1;
        c = i, f = HT[i].parent;
        while (f) { // 从叶子到根逆向求编码
            --start;
            if (HT[f].lchild == c) cd[start] = '0';
            else cd[start] = '1';
            c = f, f = HT[f].parent;
        }
        HC[i] = new char[n - start]; // 为第i个字符编码分配空间
        strcpy(HC[i], &cd[start]);    // 从cd复制编码(串)到HC
    }
    delete[] cd;
}

int main() {
    int i, n;
    HuffmanTree HT;
    HuffmanCode HC;
    scanf("%d", &n);  // 权值个数
    HC = new char*[n + 1]; // 0空间未用
    createHuffmanTree(HT, n);
    createHuffmanCode(HT, HC, n);
    for (i = 1; i <= n; i++)
        printf("%s\n", HC[i]);  // 输出哈夫曼编码
    for (i = 1; i <= n; i++)
        delete[] HC[i];
    delete[] HC;
    delete[] HT;
    return 0;
}

### 总结
1. **选择最小权值节点**:通过遍历找到两个��值最小且父节点为0的节点。
2. **构建哈夫曼树**:��始化节点,输入权值,迭代构建哈夫曼树。
3. **生成哈夫曼编码**:从叶子节点到根节点逆向生成编码,存储在编码数组中。

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

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

相关文章

瓶子类型检测系统源码分享

瓶子类型检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vis…

一张照片生成会动的3D模型,这个AI工具有点厉害!

分享一个实用的3D模型生成工具。 这个工具甚至还可以让你的模型动起来&#xff01; 不需要懂建模技术&#xff0c;只需要输入提示词或者或者上传图片&#xff0c;AI就可以在1分钟内帮你生成3D模型。 你可以用它来制作各种手办或者实物的3D模型&#xff0c;以后真的可以不用学…

记一次停车场后台管理系统漏洞挖掘

漏洞描述 停车场后台管理系统是一种专为停车场管理者设计的综合管理平台&#xff0c;旨在提供全面、高效、智能的停车场运营管理解决方案&#xff0c;系统利用现代信息技术&#xff0c;如物联网、大数据、云计算等&#xff0c;实现对停车场内车辆进出、车位管理、费用结算、安…

shell脚本使用==判断相等报错

文章目录 方法 1&#xff1a;使用 比较符方法 2&#xff1a;强制使用 bash 这个错误的原因是你使用了 比较符&#xff0c;而 /bin/sh (或一些系统的默认 sh 解释器) 可能不支持它。对于 POSIX 兼容的 shell&#xff08;如 /bin/sh&#xff09;&#xff0c;应该使用单个等号…

3分钟掌握大模型训练全流程

之前有小伙伴私信我&#xff0c;想了解下大模型比如 chatGPT 是如何进行训练的。 和他们聊了一下&#xff0c;发现有一个点一直在困惑着大家&#xff0c;那就是—— 大模型的训练是无监督学习还是有监督学习&#xff1f;在大模型训练过程中&#xff0c;数据的标签是什么&…

安利!4款录屏神器,2024年你用过几款?

如今在线教育越来越流行&#xff0c;老师们和教育工作者急需一个好用的录屏工具。到了2024年&#xff0c;OBS录屏软件因其强大的功能和稳定性&#xff0c;成了大家特别关注的焦点。那它到底有啥亮点呢&#xff1f;还有没有其他录屏软件也值得一看呢&#xff1f; 1. 福昕专业录…

反距离加权插值(IDW)讲解与MATLAB代码

文章目录 反距离加权插值(IDW)基本原理1.权重分配:2.插值计算:代码构成代码讲解已知数据点定义:创建查询点:IDW 插值参数:IDW 插值函数:计算插值值:绘图:源代码运行结果反距离加权插值(IDW) 反距离加权插值(IDW,Inverse Distance Weighting)是一种常用的空间插…

影视站群程序大对比,苹果cmsv10 vs海洋cms

在影视站群程序领域&#xff0c;苹果CMSv10和海洋CMS是两款备受站长们青睐的程序。它们分别具备各自的优势&#xff0c;适合不同需求的站群管理和优化。以下是两者的详细对比&#xff0c;并重点介绍苹果CMS的主要优势和插件功能。 苹果CMSv10简介 maccmscn 苹果CMSv10&#x…

解决银河麒麟V10向日葵远程连接断开问题

解决银河麒麟V10向日葵远程连接断开问题 方法一&#xff1a;重启系统方法二&#xff1a;执行xhost 命令 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 当你在银河麒麟桌面操作系统V10上使用向日葵进行远程连接时&#xff0c;如果遇到频繁断…

小爱心换着玩

使用Python画出小人发射爱心的代码 from turtle import * from time import sleepdef go_to(x, y):up()goto(x, y)down()def head(x,y,r):go_to(x,y)speed(1)circle(r)leg(x,y)def leg(x,y):right(90)forward(180)right(30)forward(100)left(120)go_to(x,y-180)forward(100)ri…

大模型与智能体的市场调研分析

2024年&#xff0c;很多人都在谈论智能体&#xff0c;我老婆这样的美术老师&#xff0c;也让我给她科普一下&#xff0c;于是我花了几天时间&#xff0c;系统学习和深入调研了一下&#xff0c;在此分享给大家。 时代背景 人工智能就像电力一样&#xff0c;如果你的竞争对手正…

【二十七】【QT开发应用】VS如何复制项目,QT无边窗窗口Pro版本,信号与信号槽的应用,背景图片自适应控件大小

VS复制项目 在使用VS的过程中,有的时候我们需要复制我们已经存在的项目. 我们可以先创建一个新的项目. 接着把需要复制的项目的文件复制粘贴到新的项目文件夹中. 不要忘记添加现有项目. CFrameLessWidgetBase.h #pragma once #include <QWidget> class CFrameLessWi…

2025秋招内推--招联金融

【投递方式】 直接扫下方二维码&#xff0c;或点击内推官网https://wecruit.hotjob.cn/SU61025e262f9d247b98e0a2c2/mc/position/campus&#xff0c;使用内推码 igcefb 投递&#xff09; 【招聘岗位】 后台开发 前端开发 数据开发 数据运营 算法开发 技术运维 软件测试 产品策…

【AHK】打造炒股利器系列——用数组和循环来简化语音报时器

上一篇文章&#xff0c;【AHK】打造炒股利器系列——语音报时器 作为AHK入门&#xff0c;讲解了 注释、赋值、if语句、逻辑运算符、定时器等基本知识。本篇将引入Array和Loop语句来简化化这个语音报时器&#xff0c;让代码更优雅&#xff0c;代码越简单越不容易出错误&#xff…

JavaWeb——Vue组件库Element(2/6):常见组件:Table表格、Pagination分页(介绍,属性,事件)

目录 常见组件-表格 介绍 属性 常见组件-分页 介绍 属性 事件 了解完了 Element 的快速入门程序之后&#xff0c;接下来要了解 Element 当中所提供的一些常见组件。对于 Element 当中常见组件的学习非常简单&#xff0c;基本上就是 CtrlC 复制、CtrlV 粘贴的过程。学习…

在 CentOS 8 服务器上运行 Selenium 代码

1.安装依赖包 sudo dnf update -y sudo dnf install -y wget unzip2. 安装 Google Chrome wget https://dl.google.com/linux/direct/google-chrome-stable_current_x86_64.rpm sudo dnf localinstall google-chrome-stable_current_x86_64.rpm -y3. 安装 ChromeDriver 3.1首…

【深度学习】05-Rnn循环神经网络-01- 自然语言处理概述/词嵌入层/循环网络/文本生成案例精讲

循环神经网络&#xff08;RNN&#xff09;主要用于自然语言处理的。 循环神经网络&#xff08;RNN&#xff09;、卷积神经网络&#xff08;CNN&#xff09;和全连接神经网络&#xff08;FCN&#xff09;是三种常见的神经网络类型&#xff0c;各自擅长处理不同类型的数据。下面…

转做大模型开发,能不能挽救职业生涯?

大模型算是当之无愧最火的一个方向了&#xff0c;算是新时代的风口。有小伙伴觉得&#xff0c;既然是新领域、新方向&#xff0c;那么&#xff0c;人才需求肯定比较大&#xff0c;相应的人才缺乏&#xff0c;竞争也会更少&#xff0c;那转行去做大模型是不是一个更好的选择呢&a…

Leetcode 2320. 统计放置房子的方式数

原题链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 一条街道上共有 n * 2 个 地块 &#xff0c;街道的两侧各有 n 个地块。每一边的地块都按从 1 到 n 编号。每个地块上都可以放置一所房子。 现要求街道同一侧不能存在两所房子相邻的情况&#xff0c;请你计算并…

高并发内存池(五):ThreadCache、CentralCache和PageCache的内存回收机制 及 释放内存过程的调试

目录 ThreadCache的内存回收机制 补充内容1 补充内容2 补充内容3 新增关键函数ListTooLong CentralCache的内存回收机制 补充内容1 新增关键函数MapObjectToSpan 新增关键函数ReleaseListToSpans PageCache的内存回收机制 补充内容1 补充内容2 新增关键函数Releas…