找出段落中每个字母 构造哈夫曼树

根据字符出现的频率构造哈夫曼编码 例:要传输的字符集D={C,A,S,T,;},字符出现频率分别为w={2,4,2,3,3},写出其哈夫曼编码。 方法: 第一步:将每个字符的频率作为权值,构造哈夫曼树; 第二步:将哈夫曼树每个结点的左分支标为0,右分支标为1; 第三步:把从根到每个叶子的路径上的标号连接起来,作为该叶子代表的字符的编码。 两个问题帮助你理解哈夫曼编码 1.为什么哈夫曼编码能够保证时前缀编码? 因为没有一片树叶是另一片树叶的祖先,所以每个叶子结点的编码就不可能... 阅读详情

过程

算出字母的频率

计算出每个英文字母出现的概率,无论大小写,忽略其他字符。并以概率作为权重。

  • 利用Java的Hash Map数据类型计算出次数。

    • hash map是基于哈希表的 Map 接口的实现。hash map有两个元素一个是key(键名),一个是value(键值)。实现的原理:将这段文字中出现的字母,作为键值(key),出现的次数作为键值(value),hash map中的键名是不能重复的,那么统计这些字母数量,就变成了统计这些相同键名得数量。我的实现方式是从第一个字母开始,把字母存到哈希表去,第一个就是a :1,然后按顺序存第二个字母f :1,如果出现跟前面有的字母重复的话,前面的字母键值就 + 1,例如aba,遍历到第3个字母的时候,a的键值就变成2,就是a :2了,如果遇到空格数字,标点符号,及其他特殊字符就排除掉,不插入,如果标点符号也统计则不需要判断此条件,全部都插入即可。以此类推其他字母也是一样的。

    • import java.util.HashMap;
      
      public class Hashmap{
          public static void main(String[] args){
              HashMap <String, Integer> map = new HashMap <String, Integer> ();
              String str = "Effificient and robust facial landmark localisation is crucial for the deployment of real-time face analysis systems. This paper presents a new loss function, namely Rectiffied Wing (RWing) loss, for regression-based facial landmark localisation with Convolutional Neural Networks (CNNs). We fifirst systemically analyse different loss functions, including L2, L1 and smooth L1. The analysis suggests that the training of a network should pay more attention to small-medium errors. Motivated by this finding, we design a piece-wise loss that amplififies the impact of the samples with small-medium errors. Besides, we rectify the loss function for very small errors to mitigate the impact of inaccuracy of manual annotation";
              for(int i = 0; i < str.length(); i++){
                  char ch = str.charAt(i);
                  String key = String.valueOf(ch);
                  if(map.containsKey(key)){
                      //Integer value = map.get(key).intValue();
                      Integer value = map.get(key);
                      map.put(key, value + 1);
                  }else{
                      // map.put(key, 1);可以统计所有字符,包括中文
                      //利用ascii码去除字符串中的数字,空格,标点符号,特殊字符。限定只统计标点符号
                      if(ch >= 'A' && ch <= 'Z' || ch >= 'a' && ch <= 'z'){
                          map.put(key, 1);
                      }
                  }
              }
              System.out.println(map);
          }
      }
      
    • 结果
      运行结果

      {B=1, C=2, E=1, L=3, M=1, N=4, R=2, T=2, W=3, a=52, b=3, c=21, d=16, e=54, f=27, g=10, h=15, i=55, k=4, l=36, m=22, n=41, o=41, p=10, r=31, s=53, t=48, u=14, v=3, w=8, y=13}

    • 人力统计 算出各字母出现的概率

      字母次数概率
      V30.006
      B40.007
      K40.007
      G100.018
      P100.018
      W110.020
      Y130.024
      U140.026
      H150.028
      D160.029
      C230.042
      M230.042
      F270.050
      R330.061
      L390.072
      O410.076
      N450.083
      T500.092
      A520.096
      E550.101
      I550.101

构造哈夫曼树

根据哈夫曼树构造原理构造出哈夫曼树:规定小的结点在左边,大的在右边。左边的编码为‘0’,右边的编码为‘1’。
哈夫曼树

代码以及结果

代码

#include <stdio.h>
#include <stdlib.h>
#define MAXBIT  50
#define MAXLEAF 50
#define MAXNODE 2 * MAXLEAF - 1
#define INFINITY 65535

//编码结构体
typedef struct HCodeType{
	int start;
	int bit[MAXBIT];
}HCodeType;

//结点结构体
typedef struct HNode{
	int parent, lchild, rchild;
	double weight;
	char data;
}HNode;

//构造哈夫曼树 
void HuffmanTree(HNode HN[MAXNODE], int n){
	int i = 0, j;
	int x1, x2;
	double s1, s2;
	char ch;
	
	printf("请输入各种字母\n");
	//初始化哈夫曼树的叶子结点 
	while(i < n){
		HN[i].parent = -1;
		HN[i].lchild = -1;
		HN[i].rchild = -1;
		HN[i].weight = 0;
		scanf("%c", &ch);
		scanf("%c", &HN[i].data);
		i++;
	}
	
	printf("请依次输入字母的权重\n");
	i = 0;
	while(i < n){
		scanf("%lf", &HN[i].weight);
		i++;
	} 
	
	//初始化哈夫曼树中其他结点 
	for(i = n; i < 2 * n - 1; i++){
		HN[i].parent = -1;
		HN[i].lchild = -1;
		HN[i].rchild = -1;
		HN[i].weight = 0;
		HN[i].data = '0';
	}
	
	//选出最小权重的两个结点 
	for(i = 0; i < n - 1; i++){
		s1 = s2 = INFINITY;
		x1 = x2 = 0;
		
		for(j = 0; j < n + i; j++){
			if(HN[j].weight < s1 && -1 == HN[j].parent){
				s2 = s1;
				x2 = x1;
				s1 = HN[i].weight;
				x1 = j;
			}else if(HN[j].weight < s2 && -1 == HN[j].parent){
				s2 = HN[j].weight;
				x2 = j;
			}
		}
		HN[x1].parent = n + i;
		HN[x2].parent = n + i;
		HN[n + i].weight = HN[x1].weight + HN[x2].weight;
		HN[n + i].lchild = x1;
		HN[n + i].rchild = x2;
	}
}

int main(){
	HNode HN[MAXNODE];
	HCodeType HC[MAXLEAF], cd;
	int i, j, k, p;
	int n;
	printf("请输入字母的总数\n");
	scanf("%d", &n);
	HuffmanTree(HN, n);
	
	//自下而上获取编码,逆序存入
	for(i = 0 ; i < n; i++){
		cd.start = n - 1;
		k = i;
		p = HN[k].parent;
		while(p != -1){
			if(k == HN[p].lchild){
				cd.bit[cd.start] = 0;
			}else{
				cd.bit[cd.start] = 1;
			}
			cd.start--;
			k = p;
			p = HN[k].parent; 
		}
		
		for(j = cd.start + 1; j < n; j++){
			HC[i].bit[j] = cd.bit[j];
			HC[i].start = cd.start;
		}
	}
	
	//输出编码
	for(i = 0; i < n; i++){
		printf("%c  ", HN[i].data);
		for(j = HC[i].start + 1; j < n; j++){
			printf("%d", HC[i].bit[j]);
		}
		printf("\n");
	} 
	
	return 0;
}

运行结果

结果

数据结构-树结构的实际应用 package com.chb.tree; import java.util.Arrays; public class HeapSort { public static void main(String[] args) { // 要求将数组进行升序排序 int arr[] = { 4, 6, 8, 5, 9 }; System.out.println("排序前=" + Ar... 阅读详情

相关推荐

数据结构综合应用题:Huffman数的应用

所选题目:哈夫曼树的应用 题目描述:要传输一则报文内容如下: “AAAAAAAAAAAAAAABBBBBBBBBCCCCCCCCDDDDDDDDDDDDEEEEEEEEEEFFFFF” 请为这段报文设计哈夫曼编码,要求如下: 请计算出每个字符出现的概率,并以概率为权重来构造哈夫曼树,写出构造过程、画出 最终的哈夫曼树,得到每个字符的哈夫曼编码。 ①计算每个字符出现的概率 由报文内容分析知 共有A:15个 B:9个 C:8个 D:12个 E:10个 F:5个 共计59个字符 故每个字符出现的概率如下 A:

weixin_45039972的博客 1622

统计文件中英文字母频率,并生成哈夫曼树(含编码和解码)

统计文件中英文字母出现次数进行赋权值,根据字母权值生成最小哈夫曼树,并通过哈夫曼树进行编码,以及根据得到的编码本对二进制文件进行解码

qq_55425006的博客 1824

用哈夫曼编码统计一段英文中字母的频率

输入任意一段英文,自动统计其中各字母出现的频率及次数,并在屏幕上输出结果

复习数据结构day1.哈夫曼树的java实现

构成哈夫曼树的步骤: 1)从小到大进行排序,将每一个数据,每一个数据都是一个结点,每个结点可以看成是一棵最简单的二叉树。 2)去除根结点最小的两棵二叉树。 3)组成一棵新的二叉树,该新的二叉树的根节点的权值是前面两颗二叉树根节点权值的和。 4)再将这棵新的二叉树,以根节点的权值大小再次排序,不断重复上述步骤,直到所有数据都被处理,即可得到一颗哈夫曼树 package huffmantree; import java.util.ArrayList; import java.util.Collections;

qq_45533618的博客 350

《跨界杂谈》华为印象(五):高度集权的矩阵式架构

高度集权的矩阵式架构 “高度集权的矩阵式架构”不是官方术语。是笔者的一位同事非常经典的总结。解释这个句话还是有点困难的,笔者入职华为三年也没彻底搞明白,在这里只能尝试性的解释一下。 矩阵 我们先看一下“矩阵”。华为有两套部门职能体系,华为内部术语,叫实线部门和虚线部门。由实线与虚线部门交叉构成矩阵。大部分(但不是所有)华为员工都由两个部门(两个领导)进行管理。对员工而言,所谓的实线部

《云计算架构技术与实践》 2996

MR2数据集实战:5步搞定多模态谣言检测模型训练(附完整代码)

本文详细介绍了如何使用MR2多模态数据集构建高精度谣言检测系统,涵盖环境配置、数据准备、多模态特征工程、模型架构设计、训练调优及部署优化等5个关键步骤。通过双线性融合技术处理文本、图像和网页三模态数据,解决特征对齐和模态冲突等工程难题,并提供完整代码实现和性能优化方案。

weixin_42657024的博客 241

数据结构(C)实验:哈夫曼编码和译码(附完整代码配套严蔚敏版教材)

1.实验内容 (1)输入一段100—200字的英文短文,存入一文件a中。 (2)写函数统计短文出现的字母个数n及每个字母的出现次数 (3)写函数以字母出现次数作权值,建Haffman树(n个叶子),给出每个字母的Haffman编码。 (4)用每个字母编码对原短文进行编码,码文存入文件b中。 (5)用Haffman树对文件b中码文进行译码,结果存入文件c中,比较a,c是否一致,以检验编码、译码的正确...

i6223671的博客 1万+

OpenVPN 新增 windows 客户端

虚拟私人网络(Virtual Private Network,简称VPN)是一种网络技术,它允许用户通过公共网络(如互联网)建立一个安全的连接通道。本文介绍如何添加 windows 客户端。

利昂的技术存档 3772

哈夫曼压缩(二叉树的使用)

本章博文用来使用二叉树的知识来对文件进行压缩与解压缩,这种压缩专门针对 ASCII 码(英文及英文标点)的压缩技术,希望这篇博文能帮助到正在学习或者想要练习二叉树方面知识的同学!!! 开篇我来介绍一下什么是二叉树: 二叉树是每个结点最多有两个子树的树结构。通常子树被称作“左子树”和“右子树”。(示意图如下) 如上图所示,二叉树的“度”小于等于2 那么,什么是哈夫曼压缩呢?这里,我先引进一个知识点...

Java我们右转见 646

VC Spyglass CDC实战:从TCL脚本到SDC约束的完整避坑指南

本文是一份针对数字IC验证工程师的VC Spyglass CDC实战指南。文章详细阐述了从TCL脚本环境搭建、SDC约束编写到典型CDC违规(如SETUP_PORT_UNCONSTRAINED)诊断与修复的完整流程,旨在帮助读者高效避坑,深入理解工具逻辑,从而完成可靠的时钟域交叉验证。

go5gopher的博客 385

108、AWB 时间滤波器:帧间白平衡平滑,防止色彩跳变与过冲

摘要: 文章探讨了AWB(自动白平衡)时间滤波器的设计与优化,以解决帧间白平衡跳变和过冲问题。通过自适应状态机(STABLE/TRANSITION/JUMP)动态调整平滑系数alpha,结合帧率归一化和过冲保护(方向检测+限幅),实现场景切换快速响应与静态稳定性的平衡。作者分享了工程经验:避免固定阈值、联动AE/AF、真实场景验证,并推荐简化卡尔曼滤波替代IIR。最终方案在旗舰机前置摄像头中成功消除“闪白”现象,强调参数需动态适应光照与色温变化。

sundong_81的博客 65

C语言K&R习题系列——统计一段文字中各个字母出现的频率

原题: /*Write a program to print a histogram of the frequencies of   *difficent characters in it inputs  */ 这个和上一个类似 输入部分 #include #define NUM_CHARS 256 main ( voi

my_adu的专栏 3164

YOLOv11改进策略【卷积层】| TIP 2025 MFA 多阶段特征聚合 大核扩感受 + 多梯度融合,强效增强弱小目标特征

红外弱小目标尺寸极小、信噪比低,在特征传递中极易丢失信息;常规卷积感受野单一、梯度源不足,难以同时捕捉局部细节与全局上下文,导致小目标特征表达弱、检测漏检。因此提出多阶段特征聚合 MFA,用大核卷积+多分支+通道注意力强化小目标特征提取。

Limiiiing的博客 587

HTTPS+Gzip组合下的BREACH漏洞:原理、复现与纵深防御实战

在Web安全领域,TLS/SSL加密为HTTP通信提供了机密性保障,而Gzip压缩则是提升传输效率的通用技术。其原理在于通过算法消除数据冗余,但这也引入了一个隐蔽风险:压缩率会随内容重复度变化。攻击者可利用这一特性,通过观察加密响应包长度的细微差异,实施旁路攻击,从而推断出响应体中的敏感信息,如CSRF Token或API密钥。这种攻击凸显了即使加密也无法完全隐藏元数据(如长度)所带来的安全挑战。在工程实践中,对于涉及用户输入与机密数据共存的场景(例如动态页面或API响应),必须采用多层防御策略,包括在应用

ithome 410

SAP 52策略测试简介

我们看下下层物料的需求,可以看到物料的需求已经跑出来了,我们双击计划订单,发现是没有办法将计划订单转换为采购申请的,这里是否还记得我们在前面创建主数据的时候独立集中我们填写的是1,所以物料继承了上层物料的策略,所以不能将计划订单进行转换。我们在前面测试了50策略按单生产,创建完计划独立需求后,通过主数据中的独立集中的字段控制下层物料是否能通过计划订单转成生产订单和采购订单。可以看到下层物料的计划订单就可以转采购申请了,到这里可以看到52策略和50策略的计划独立需求完全是一样的。

我小时候很黑的博客 1272

uniapp [安卓苹果App端] - 在“安卓app/苹果app“平台端打包编译后,微信授权登录报错 login:fail [:-1]未能完成操作。(PGWXAPI错误-1。)错误码code:-10

uni-app,安卓Android,苹果ios,安卓app端,苹果App端,uniapp苹果安卓app,微信授权登录,uniAppAPP端微信登录报错,出现微信确认登录界面后点击登录报错,BundleID,应用ID,微信登录,app微信一键登录,微信登录绑定点确定就出错,AppSecrect,login:fail[:-1]未能完成操作。(PGWXAPI错误-1。),"errCode":-100,"code":-100,在uniappmanifest.json配置了AppSecrect还是报错无

🏆 前端领域优质创作者 3765

05阶段:NLP自然语言处理基础(2)

本文系统讲解了NLP中的迁移学习,重点介绍了fastText工具的使用及其模型原理。主要内容包括: fastText工具概述:fastText是Facebook开发的NLP工具包,具有文本分类和词向量训练两大功能,优势在于速度快、精度高。其安装简单,通过pip即可完成。 fastText模型架构:基于类似CBOW的三层结构,使用层次softmax和负采样提升效率。层次softmax通过哈夫曼树实现多类别高效分类;负采样通过随机选择部分负样本来降低计算量。 应用实践:详细演示了使用fastText进行文本分类

专注前端开发领域,深耕 Python AI Agent应用开发,热爱探索 Web 与人工智能的前沿技术。 503

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

哈夫曼树

一、哈夫曼树的概念和定义   什么是哈夫曼树? 让我们先举一个例子。 判定树:         在很多问题的处理过程中,需要进行大量的条件判断,这些判断结构的设计直接影响着程序的执行效率。例如,编制一个程序,将百分制转换成五个等级输出。大家可能认为这个程序很简单,并且很快就可以用下列形式编写出来:   [cpp] view plaincopy

搞么子小子 1654

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

c语言随机产生字母,并统计其中字母出现的概率,做成赫夫曼树,利用赫夫曼树求得的用于通信的二进制编码称为赫夫曼编码(C语言)...

利用赫夫曼树求得的用于通信的二进制编码称为赫夫曼编对输入的一串电文字符实现赫夫曼编码,在对赫夫曼编码生成的代码进行译码,输出电文字符串。利用赫夫曼树求得的用于通信的二进制编码称为赫夫曼编码。树中从根到每个叶子都有一条路径,对路径上的各分支约定:指向左子树德分之表示“0”码,指向右子树分支表示“1”码,取每条路径上的“0”或“1”的序列作为和各个叶子对应的字符的编码,这就是赫夫曼编码。设计电文总长最...

weixin_42521649的博客 847

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

c语言随机产生字母,并统计其中字母出现的概率,做成赫夫曼树,c语言实现赫夫曼树的构建以及生成赫夫曼编码(《数据结构》算法6.12)...

这个程序是根据《数据结构》算法6.12用c语言实现的程序,赫夫曼树就不多说了,直接看代码,代码上都有注释。下面代码:#include#include#include#include#include#define MAX_NUM 100#define inf 2000000000using namespace std;typedef struct {unsigned int weight;//权值u...

weixin_42664597的博客 454

输入字符串,统计使用频率,并根据频率创建哈夫曼树

void Select(HuffmanTree HT,int n,int &s1,int &s2) //s1,s2要取地址。//动态分配数组存储哈夫曼编码表。printf("字符%c出现%d次\n",(char)i,num[i]);//分配存储n个字符编码的编码表空间。++i) //逐个字符求哈夫曼编码。//根据哈夫曼树求哈夫曼编码,存储在编码表HC中。{ // (1)统计字符串各字符的频率。//(1)统计字符串各字符的频率。//哈夫曼编码表的存储表示。//哈夫曼树的存储表示。

m0_72398927的博客 4444

c语言随机产生字母,并统计其中字母出现的概率,做成赫夫曼树,数据结构哈夫曼树及其几个应用题!1.设A.B.C.D.E.F六个字母出现的的概率为{7,19,2,6,32,3}试写出为这六个字母设计的hu...

优质解答1 69/ \32 37/ \19 18/ \7 11/ \5 6/ \2 3哈弗曼编码就是32 :119 :017:0016:00002::000113:000102.此为大堆法~初始化:23/ \ 从非叶子节点的最左边看~(同一层)99 16-------------------------------------/ \ / \ 99比子节点大,不用交换,16却小,跟最大的交换55 ...

weixin_33924688的博客 1297

哈夫曼树实现:统计文本信息,构造哈夫曼树,并对其进行编码与解码

哈夫曼树的大部分内容都在上一篇博客中讲解了,在这里重点说一下如何统计的文本数据。 基本思想:首先从文件中读取数据,按行读取,保存在String类型的遍历中。 在统计信息的时候,使用的数据结构是HashMap,字符作为key,个数作为value。 为了能与我之前写的程序相结合,需要将HashMap的数据转换成Huffman结点类型数据。然后按照之前的程序就可以操作了! 读取文本: 在public S...

m0_37683327的博客 3097

二叉排序树、AVL树、红黑树、B树、B+树、Hash树、

二叉排序树 1.基本应用 二叉排序树也称为也叫二叉查找树,二叉搜索树, BST。 满足二叉查找树的一般性质,是指一棵空树具有如下性质: 对于二叉树中的任何一个非叶子节点,要求左子节点比当前节点值小,右子节点比当前节点值大。 任意节点的左右子树也分别是二叉查找树. 没有键值相等的节点. 中序遍历二叉排序树得到递增有序序列 2. 局限性及应用 一个二叉排序树是由n个节点随机构成,所以,对于某些情况,二...

qq_36222714的博客 1643

无冲突hash-字母树

字母树 字母树的概念 字母树实现的数据结构 字母树的概念 字母树也称字典树,Trie,根结点为空,主要的思想就是向下插入结点,如果该节点存在就共享,不存在就新建一个节点,下面举一个简单的例子: 例:对b, abc, abd, bcd, abcd, efg, hii 建立Trie树 插入的字符串将位于根结点,查询的时间复杂度为O(len),len为待查询的字符...

qq_36113917的博客 800

数据结构:哈夫曼树,哈夫曼编码与译码系统

将文本文件利用哈夫曼树进行编码,存储成压缩文件

idevede的博客 1万+
上一篇: MySQL
下一篇: 数据结构知识点
ZoeLandia
博客等级 码龄6年 734粉丝 183原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值