信息论-----哈夫曼编码实验

简介: 信息论-----哈夫曼编码实验

哈夫曼编码

  1. 实验目的

理解信源编码的意义;

熟悉MATLAB程序设计;

掌握哈夫曼编码的方法及计算机实现;

  1. 实验要求

给定一个一维的数字信号[0.4 0.2 0.1 0.15 0.15],编出相应的哈夫曼码。

  1. 主要仪器设备

计算机一台

Matlab软件平台

  1. 实验原理

赫夫曼编码的具体方法:

1、先按出现的概率大小排队,把两个最小的概率相加,作为新的概率和剩余的概率重新排队

2、再把最小的两个概率相加,再重新排队,直到最后变成1。每次相加时都将“0”和“1”赋与相加的两个概率,读出时由该符号开始一直走到最后的“1”

3、将路线上所遇到的“0”和“1”按最低位到最高位的顺序排好,就是该符号的赫夫曼编码。

  1. 实验内容
    (1)将信源消息(符号)按其出现的概率由大到小依次排列;
    (2)取两个概率最小的字母分配以“0”和“1”两个码元,并将这两个概率相加作为一个新字母的概率,与未分配的二进制符号的字母重新排队;
    (3)对重排后的两个概率最小符号重复步骤(2)的过程;
    (4)不断重复上述过程,直至最后两个符号配以0和1为止;
    (5)从最后一级开始,向前返回得到各个信源符号所对应的码元序列,即相应的码字。

(2) 实验代码

clear
p = [0.2 0.4 0.1 0.15 0.15];
disp(p);
len = size(p,2);
rank = zeros(len,len+1);%定义一个矩阵用来存储每次的概率排序及合并的结果
rank(:,1:2) = [p' (1:len)'];%定义一个矩阵用来存储每次的概率排序及合并的结果,第1列为概率,从第2列开始为此概率对应的符号标号  
cw = ones(len,len-1);%定义一个矩阵用于记录码字中0,1分配过程
cw = 2*cw;
for i=1:len-1  %编码次数比符号个数少1
    %%%%%%%%(1)概率排序%%%%%%%%%%%%%
    rank =
sortrows(rank,-1);%概率降序排序
    %%%%%%%%%%(2)给信源符号分配0,1码元%%%%%%%%%%%%
    R_L_0 =
rank(len-i,2:len);%确定分配0码元的符号标号所在行
    R_L_1 =
rank(len+1-i,2:len);%确定分配1码元的符号标号所在行
    num_0 = R_L_0(R_L_0~=0);%num表示本次分配0的概率对应哪些信源符号。rank中的0元素不是符号标号,去除0。num_0存储的数据为此次分配0的符号标号
    num_1 =
R_L_1(R_L_1~=0);
cw(num_0,len-i) = 0 ;%在cw矩阵中给相应的符号分配码元0
cw(num_1,len-i) = 1;
    %%%%%%%%%%%(3)将概率最小的两个概率相加%%%%%%%%%%%%%%%%%%
    rank(len-i,1)
= rank(len+1-i,1)+rank(len-i,1);%概率相加
rank(len+1-i,:) = 0;%两个概率合并后,其中下面的概率所在行要置零,防止下一轮概率排序时产生干扰。
rank(len-i,2:length([num_1 num_0])+1) = [num_1 num_0];%将合并的概率(即前面分配0和1码元的符号)所对应的符号标号记录在rank矩阵中
end
cw2 = cell(len,1);%定义一个len*1的元胞数组,它的每个单元可以储存不同的数据类型。
for i=1:len
    tmp =
cw(i,:);
    cw2{i} =
num2str(tmp(tmp~=2));%将cw中的0和1取出来(2不是分配的码元),并转换为字符串类型
disp(cw2{i});
end

通过本次实验我们了解到哈夫曼编码完全依据字符出现概率来构造异字头的平均长度最短的码字,哈夫曼编码所形成的码字不是唯一的,但编码效率是唯一的 在对最小的两个概率符号赋值时,可以规定为大的为“1”、小的为“0”,反之也可以。如果两个符号的出现概率相等时,排列时无论哪个在前都是可以的,所以哈夫曼所构造的码字不是唯一的,对于同一个信息源,无论上述的前后顺序如何排列,它的平均码长是不会改变的,所以编码效率是唯一的。对于老师上课讲的有关习题和内容有了更深的理解,不在限制于表面。

相关文章
|
6月前
|
存储 人工智能 自然语言处理
AI大模型潜力无限,构建高效架构为何却困难重重?
本文三桥君系统介绍了AI大模型应用架构的完整体系,从多模态数据接入、预处理与特征提取,到知识与模型中台建设,再到业务应用落地和持续优化。产品专家三桥君通过架构图和工作流程说明,为AI大模型的实际应用提供了系统化的解决方案和技术选型参考。
419 0
|
8月前
|
SQL 存储 关系型数据库
第一篇:数据库基础与概念
这篇文档面向数据库初学者,系统介绍了数据库的基础概念、类型、管理工具及实践方法。内容涵盖数据库定义、应用场景(如电商、银行系统)、数据库管理系统(DBMS)的功能与常见系统(MySQL、PostgreSQL等),以及关系型与非关系型数据库的区别。同时,文章详细解析了基本术语(表、记录、字段、主键、外键)和ER图设计,并提供了实践建议,包括创建简单数据库、学习SQL语言、使用管理工具等。最后推荐了学习资源和书籍,鼓励读者通过实际项目巩固知识,逐步掌握数据库的核心技能。
1154 11
|
机器学习/深度学习 人工智能 算法
Python中实现简单神经网络
【9月更文挑战第2天】本文将通过Python编程语言,介绍如何从零开始构建一个简单的神经网络。我们将使用纯Python代码,不依赖任何外部库,来展示神经网络的核心概念和工作原理。文章将详细解释每个步骤,并最终实现一个能够进行基本模式识别的神经网络模型。通过这篇文章,读者可以对神经网络有一个直观的理解,并为进一步学习深度学习打下坚实的基础。
|
自然语言处理 数据管理 数据挖掘
阿里云百炼知识检索应用评测:构建智能问答助手【开发者评测|阿里云百炼】
阿里云百炼是基于大模型的一站式开发平台,支持快速构建智能问答助手。评测中,通过上传企业数据创建知识库,并配置应用参数如温度系数、最长回复长度等,最终通过API实现问答功能。实操难点包括数据上传限制及参数配置复杂度。建议增加上传灵活性、提供更多配置指南和功能扩展插件。总体而言,阿里云百炼提供了强大且灵活的工具,有助于高效开发大模型应用。
|
数据采集 安全 测试技术
kookeey代理ip适用于那些行业
Kookeey代理IP,以其高效稳定安全特性,成为多行业网络解决方案优选。助力数据采集规避封锁,保障爬虫高效运行;支持广告验证与品牌保护,优化营销策略;服务跨境电商,深入全球市场调研;管理社交媒体多账号,实现地域化精准营销;加强网络安全测试,保护隐私。选择Kookeey,提升工作效率,降低风险成本。
|
文字识别 块存储 Python
Python 图片文字识别和 tesseract 问题解决
Python 图片文字识别和 tesseract 问题解决
2057 1
|
机器学习/深度学习 存储
数据结构学习记录——哈夫曼树(什么是哈夫曼树、哈夫曼树的定义、哈夫曼树的构造、哈夫曼树的特点、哈夫曼编码)
数据结构学习记录——哈夫曼树(什么是哈夫曼树、哈夫曼树的定义、哈夫曼树的构造、哈夫曼树的特点、哈夫曼编码)
566 1
|
数据采集 文字识别 测试技术
神器!使用Python 轻松识别验证码
本文介绍了使用Python进行验证码识别,主要包括安装Tesseract OCR和相关Python库,如`pytesseract`和`opencv-python`。通过Pillow加载验证码图片,使用`pytesseract`进行简单数字验证码识别。对于数字字母混合的验证码,先进行二值化和降噪处理,然后使用`cv2.findContours`分割字符并分别识别。这种方法适用于自动化测试和爬虫中的验证码处理。
|
安全 搜索推荐 Java
小白如何挖到自己的第一个漏洞
首先声明本篇文章采用的漏洞案例均已上报并且已修复,本篇文章使用案例介绍以及如何进行搜集的方法进行介绍小白如何挖到第一漏洞,旨在帮助白帽子快速度过前期没有实战经历的难题
1158 0
|
机器学习/深度学习 TensorFlow 算法框架/工具
TensorFlow中的自定义层与模型
【4月更文挑战第17天】本文介绍了如何在TensorFlow中创建自定义层和模型。自定义层通过继承`tf.keras.layers.Layer`,实现`__init__`, `build`和`call`方法。例如,一个简单的全连接层`CustomDenseLayer`示例展示了如何定义激活函数。自定义模型则继承自`tf.keras.Model`,在`__init__`中定义层,在`call`中实现前向传播。这两个功能使TensorFlow能应对特定需求和复杂网络结构,增强了其在深度学习应用中的灵活性。