当前位置: 首页 > news >正文

哈夫曼树和哈夫曼编码

哈夫曼编码一般用来对字符串进行编码格式的表示。其中要克服的最大问题,莫过于就是一串由0或者1组成的编码,你无法区分哪些01组成的编码部分是属于哪些字符的,因此哈夫曼编码的出现解决了这个问题。

在介绍哈夫曼编码之前,先介绍以下哈夫曼树:

哈夫曼树(Huffman Tree),又称最优二叉树,是一种带权路径长度最短的二叉树,由美国数学家大卫·哈夫曼(David A. Huffman)在1952年提出。以下从基本概念、构建过程和应用场景等方面进行介绍:

  • 基本概念

    • 路径和路径长度:在一棵树中,从一个结点到另一个结点所经过的分支序列称为路径,路径上的分支数目称为路径长度。

    • 结点的权和带权路径长度:若将树中结点赋给一个有着某种含义的数值,则这个数值称为该结点的权。结点的带权路径长度为从根结点到该结点的路径长度与该结点权值的乘积。

    • 树的带权路径长度:树中所有叶子结点的带权路径长度之和,记为WPL。哈夫曼树就是WPL最小的二叉树。

  • 构建过程

    • 假设有n个权值,将这些权值看成是有n棵树的森林(每棵树仅有一个结点)。

    • 从森林中选出根结点权值最小的两棵树作为左右子树构造一棵新的二叉树,新二叉树的根结点权值为其左右子树根结点权值之和。

    • 从森林中删除这两棵树,同时将新得到的二叉树加入森林中。

    • 重复上述步骤,直到森林中只剩下一棵树为止,这棵树就是哈夫曼树。

  • 特点

    • 哈夫曼树是一棵二叉树,且所有的非叶子结点都有两个子树,不存在度为1的结点。

    • 权值越大的叶子结点越靠近根结点,而权值越小的叶子结点越远离根结点。

  • 应用场景

    • 数据压缩:哈夫曼编码是一种常用的无损数据压缩算法。通过对数据中不同字符出现的频率进行统计,构造哈夫曼树,为每个字符分配一个唯一的二进制编码,频率高的字符编码短,频率低的字符编码长,从而实现数据的压缩。

    • 信息检索:在一些需要快速检索的数据结构中,可以利用哈夫曼树的思想来优化查找过程,提高查找效率。

    • 霍夫曼编码:在通信领域,用于构造一种编码方式,使得通信中传输的数据量最小,提高信道的利用率。

通过应用场景我们可以发现哈夫曼树就是主要实现单个字符唯一编码的功能。

我们来用举例的方法来讲解哈夫曼树:

一句话:

        i like bananas

    • 在句子“i like bananas”中,统计每个字母的出现次数如下:

      • a:3

      • b:1

      • i:2

      • k:1

      • l:1

      • n:2

      • s:1

      • 空格:2

      • e:1

然后开始搭建哈夫曼树:

  1. 初始节点(叶子节点):

    • 节点 a,权重(出现次数)为 3

    • 节点 b,权重为 1

    • 节点 i,权重为 2

    • 节点 k,权重为 1

    • 节点 l,权重为 1

    • 节点 n,权重为 2

    • 节点 s,权重为 1

    • 节点 e,权重为 1

  2. 第一次合并:

    • 取出权重最小的 b(权重 1)和 k(权重 1),创建新节点 N1,权重为 1 + 1 = 2 。

    • N1 的左子节点为 b,右子节点为 k

    • 此时节点情况:

      • 节点 a,权重 3

      • 节点 i,权重 2

      • 节点 l,权重 1

      • 节点 n,权重 2

      • 节点 s,权重 1

      • 节点 e,权重 1

      • 节点 N1,权重 2

  3. 第二次合并:

    • 取出权重最小的 l(权重 1)和 s(权重 1),创建新节点 N2,权重为 1 + 1 = 2 。

    • N2 的左子节点为 l,右子节点为 s

    • 此时节点情况:

      • 节点 a,权重 3

      • 节点 i,权重 2

      • 节点 n,权重 2

      • 节点 e,权重 1

      • 节点 N1,权重 2

      • 节点 N2,权重 2

  4. 第三次合并:

    • 取出权重最小的 e(权重 1)和 N1(权重 2),创建新节点 N3,权重为 1 + 2 = 3 。

    • N3 的左子节点为 e,右子节点为 N1

    • 此时节点情况:

      • 节点 a,权重 3

      • 节点 i,权重 2

      • 节点 n,权重 2

      • 节点 N2,权重 2

      • 节点 N3,权重 3

  5. 第四次合并:

    • 取出权重最小的 i(权重 2)和 N2(权重 2),创建新节点 N4,权重为 2 + 2 = 4 。

    • N4 的左子节点为 i,右子节点为 N2

    • 此时节点情况:

      • 节点 a,权重 3

      • 节点 n,权重 2

      • 节点 N3,权重 3

      • 节点 N4,权重 4

  6. 第五次合并:

    • 取出权重最小的 a(权重 3)和 N3(权重 3),创建新节点 N5,权重为 3 + 3 = 6 。

    • N5 的左子节点为 a,右子节点为 N3

    • 此时节点情况:

      • 节点 n,权重 2

      • 节点 N4,权重 4

      • 节点 N5,权重 6

  7. 第六次合并:

    • 取出权重最小的 n(权重 2)和 N4(权重 4),创建新节点 N6,权重为 2 + 4 = 6 。

    • N6 的左子节点为 n,右子节点为 N4

    • 此时节点情况:

      • 节点 N5,权重 6

      • 节点 N6,权重 6

  8. 第七次合并:

    • 取出 N5(权重 6)和 N6(权重 6),创建新节点 Root(根节点),权重为 6 + 6 = 12 。

    • Root 的左子节点为 N5,右子节点为 N6

通过上述步骤我们得到了哈夫曼树:

然后我们将向左移动的路径设置为0,向右的为1

我们的哈夫曼树就变为:

有了哈夫曼树,我们的哈夫曼编码也就得到了,每个字符的编码就为从根路径到指定字符的叶子节点:

  • a:出现次数为 3,编码是 00

  • n:出现次数为 2,编码是 100

  • i:出现次数为 2,编码是 110

  • 空:出现次数为 2,编码是 111

  • l:出现次数为 1,编码是 0110

  • k:出现次数为 1,编码是 1011

  • e:出现次数为 1,编码是 0111

  • b:出现次数为 1,编码是 010

  • s:出现次数为 1,编码是 1010

相关文章:

哈夫曼树和哈夫曼编码

哈夫曼编码一般用来对字符串进行编码格式的表示。其中要克服的最大问题,莫过于就是一串由0或者1组成的编码,你无法区分哪些01组成的编码部分是属于哪些字符的,因此哈夫曼编码的出现解决了这个问题。 在介绍哈夫曼编码之前,先介绍…...

基于 AI 的人像修复与编辑技术:CompleteMe 系统的研究与应用

概述 加利福尼亚大学默塞德分校与 Adobe 的新合作在人像补全领域取得了突破性进展——人像补全是一项备受关注的任务,旨在“揭示”人像中被遮挡或隐藏的部分,可用于虚拟试穿、动画制作和照片编辑等场景。 除了修复损坏的图像或根据用户意愿更改图像外&a…...

spring 使用FactoryBean注入bean

spring 使用FactoryBean注入bean 1、介绍 ​ 通常是ApplicationContext,就是IOC容器,ApplicationContext是BeanFactory的实现类,是spring最核心的接口。用getBean来加载bean。BeanFactory相当于是IOC的基础类。而FactoryBean是另一个东西&a…...

AI 编程日报 · 2025 年 5 月 04 日|GitHub Copilot Agent 模式发布,Ultralytics 优化训练效率

1、OpenAI 确认 GPT-4o“谄媚”个性更新已完全回滚 OpenAI 官方已确认,先前推送的一项旨在改进 GPT-4o 模型个性的更新已被完全撤销。该更新最初目标是提升模型的智能与个性,使其交互更直观有效,但实际效果却导致模型表现出过度“谄媚”和“…...

C++ STL简介:构建高效程序的基石

0. 引言 在现代软件开发领域,C语言凭借其强大的性能和灵活性占据着重要地位。而C标准模板库(Standard Template Library,简称STL)作为C标准库的核心组件,更是开发者手中不可或缺的利器。它犹如一座知识宝库&#xff0…...

大模型(LLMs)RAG 版面分析——文本分块面

大模型(LLMs)RAG 版面分析——文本分块面 一、为什么需要对文本分块? 二、能不能介绍一下常见的文本分块方法? 2.1 一般的文本分块方法 2.2 正则拆分的文本分块方法 2.3 Spacy Text Splitter 方法 2.4 基于 langchain 的 Cha…...

系统思考:核心价值与竞争力

最近,设计师的小伙伴跟我提到,行业内竞争越来越激烈,大家都开始拼命降价。但从系统思考的角度来看,我想说一句话:“人多的地方,不要去。” 为什么这么说?在竞争愈发激烈的环境中,我…...

【RocketMQ Broker 相关源码】- broker 启动源码(2)

文章目录 1. 前言2. 创建 DefaultMessageStore3. DefaultMessageStore#load3.1 CommitLog#load3.2 loadConsumeQueue 加载 ConsumeQueue 文件3.3 创建 StoreCheckpoint3.4 indexService.load 加载 IndexFile 文件3.5 recover 文件恢复3.6 延时消息服务加载 4. registerProcesso…...

mysql中int(1) 和 int(10) 有什么区别?

困惑 最近遇到个问题,有个表的要加个user_id字段,user_id字段可能很大,于是我提mysql工单​​alter table xxx ADD user_id int(1)​​。领导看到我的sql工单,于是说:这int(1)怕是不够用吧,接下来是一通解…...

jetson orin nano super AI模型部署之路(八)tensorrt C++ api介绍

我们基于tensorrt-cpp-api这个仓库介绍。这个仓库的代码是一个非常不错的tensorrt的cpp api实现,可基于此开发自己的项目。 我们从src/main.cpp开始按顺序说明。 一、首先是声明我们创建tensorrt model的参数。 // Specify our GPU inference configuration optio…...

渗透测试中扫描成熟CMS目录的意义与技术实践

在渗透测试领域,面对一个成熟且“看似安全”的CMS(如WordPress、Drupal),许多初级测试者常陷入误区:认为核心代码经过严格审计的CMS无需深入排查。然而,目录扫描(Directory Bruteforcing&#x…...

数字信号处理学习笔记--Chapter 1 离散时间信号与系统

1 离散时间信号与系统 包含以下内容: (1)离散时间信号--序列 (2)离散时间系统 (3)常系数线性差分方程 (4)连续时间信号的抽样 2 离散时间信号--序列 为了便于计算机对信号…...

LeetCode 热题 100 994. 腐烂的橘子

LeetCode 热题 100 | 994. 腐烂的橘子 大家好,今天我们来解决一道经典的算法题——腐烂的橘子。这道题在LeetCode上被标记为中等难度,要求我们计算网格中所有新鲜橘子腐烂所需的最小分钟数,或者返回不可能的情况。下面我将详细讲解解题思路&…...

软考-软件设计师中级备考 11、计算机网络

1、计算机网络的分类 按分布范围分类 局域网(LAN):覆盖范围通常在几百米到几千米以内,一般用于连接一个建筑物内或一个园区内的计算机设备,如学校的校园网、企业的办公楼网络等。其特点是传输速率高、延迟低、误码率低…...

NHANES指标推荐:LC9

文章题目:Association between lifes crucial 9 and kidney stones: a population-based study DOI:10.3389/fmed.2025.1558628 中文标题:生命的关键 9 与肾结石之间的关联:一项基于人群的研究 发表杂志:Front Med 影响…...

使用 Azure DevSecOps 和 AIOps 构建可扩展且安全的多区域金融科技 SaaS 平台

引言 金融科技行业有一个显著特点:客户期望能够随时随地即时访问其财务数据,并且对宕机零容忍。即使是短暂的中断也会损害用户的信心和忠诚度。与此同时,对数据泄露的担忧已将安全提升到整个行业的首要地位。 在本文中,我们将探…...

原子单位制换算表

速度 0.12.1880.24.3760.36.5640.48.7520.510.940.613.1280.715.3160.817.5040.919.692121.881.532.82243.762.554.7...

【C++重载操作符与转换】下标操作符

目录 一、下标操作符重载基础 1.1 什么是下标操作符重载 1.2 默认行为与需求 1.3 基本语法 二、下标操作符的核心实现策略 2.1 基础实现:一维数组模拟 2.2 多维数组实现:矩阵类示例 三、下标操作符的高级用法 3.1 自定义索引类型:字…...

文章记单词 | 第62篇(六级)

一,单词释义 noon [nuːn] n. 中午,正午clothes [kləʊz] n. 衣服,衣物reward [rɪˈwɔːd] n. 报酬,奖赏;vt. 奖励,奖赏newly [ˈnjuːli] adv. 最近,新近;以新的方式premier [ˈ…...

《CUDA:解构GPU计算的暴力美学与工程哲学》

《CUDA:解构GPU计算的暴力美学与工程哲学》 ​ CUDA 的诞生,宛如在 GPU 发展史上划下了一道分水岭。它不仅赋予了 GPU 走出图形处理的 “舒适区”,投身通用计算的 “新战场” 的能力,更是一场对计算资源分配与利用逻辑的彻底重构。在这场技术革命中,CUDA 以它犀利的架构设…...

Linux ACPI - ACPI系统描述表架构(2)

ACPI系统描述表架构 1.概要 ACPI defines a hardware register interface that an ACPI-compatible OS uses to control core power management features of a machine, as described in ACPI Hardware Specification ACPI also provides an abstract interface for controlli…...

实时在线状态

以下是一个完整的 OnlineUsers 类实现,包含线程安全的在线用户管理功能: import java.util.*; import java.util.concurrent.ConcurrentHashMap; import java.util.stream.Collectors;/*** 在线用户管理器(线程安全)* 功能&#…...

《算法导论(第4版)》阅读笔记:p6-p6

《算法导论(第4版)》学习第 4 天,p6-p6 总结,总计 1 页。 一、技术总结 无。 二、英语总结(生词:1) 1. disposal (1)dispose: dis-(“aprt”) ponere(“to put, place”) vt. dispose literally means “to put apart(to separate sth…...

录播课制作技术指南

1.技术版本选择策略 优先采用长期支持版本作为课程开发基础,此类版本在企业级应用中普及度高且稳定性强。技术选型直接影响课程生命周期,稳定的底层框架可降低后续维护成本,避免因技术迭代导致教学内容快速过时。建议定期查看技术社区官方公告…...

【2025软考高级架构师】——知识脑图总结

摘要 本文是一份关于 2025 年软考高级架构师的知识脑图总结。整体涵盖系统工程与信息系统基础、软件工程、项目管理等众多板块,每个板块又细分诸多知识点,如系统工程部分提及系统工程方法、信息系统生命周期等内容,旨在为备考人员提供系统全…...

Allegro23.1新功能之如何设置高压爬电间距规则操作指导

Allegro23.1新功能之如何设置高压爬电间距规则操作指导 Allegro23.1升级到了23.1之后,新增了一个设置高压爬电间距的规则 如下图,不满足爬电间距要求,以DRC的形式报出来了...

**电商推荐系统设计思路**

互联网大厂Java面试实录:马小帅的生死时速 第一轮提问 面试官(严肃地):马小帅,请你先简单介绍一下你过往的项目经验,特别是你在项目中使用的技术栈。 马小帅(紧张地搓手)&#xff…...

BC19 反向输出一个四位数

题目&#xff1a;BC19 反向输出一个四位数 描述 将一个四位数&#xff0c;反向输出。&#xff08;有前导零的时候保留前导零&#xff09; 输入描述&#xff1a; 一行&#xff0c;输入一个整数n&#xff08;1000 < n < 9999&#xff09;。 输出描述&#xff1a; 针对每组…...

【前端】【面试】在 Vue-React 的迁移重构工作中,从状态管理角度来看,Vuex 迁移到 Redux 最大的挑战是什么,你是怎么应对的?

在从 Vue&#xff08;Vuex&#xff09;迁移到 React&#xff08;Redux&#xff09;时&#xff0c;状态管理无疑是重构中最具挑战性的部分之一。两者虽本质上都实现了全局状态集中式管理&#xff0c;但在思想、结构与实现方式上存在显著差异。 Vuex 到 Redux 状态管理迁移的挑战…...

ActiveMQ 与其他 MQ 的对比分析:Kafka/RocketMQ 的选型参考(一)

消息队列简介 在当今的分布式系统架构中&#xff0c;消息队列&#xff08;Message Queue&#xff0c;MQ&#xff09;扮演着举足轻重的角色&#xff0c;已然成为构建高可用、高性能系统不可或缺的组件。消息队列本质上是一种异步通信的中间件&#xff0c;它允许不同的应用程序或…...

OPENGLPG第九版学习 -视口变换、裁减、剪切与反馈

文章目录 5.1 观察视图5.1.1 视图模型—相机模型OpenGL的整个处理过程中所用到的坐标系统&#xff1a;视锥体视锥体的剪切 5.1.2 视图模型--正交视图模型 5.2 用户变换5.2.1 矩阵乘法的回顾5.2.2 齐次坐标5.2.3 线性变换与矩阵SRT透视投影正交投影 5.2.4 法线变换逐像素计算法向…...

大连理工大学选修课——图形学:第一章 图形学概述

第一章 图形学概述 计算机图形学及其研究内容 计算机图形学&#xff1a;用数学算法将二维或三维图形转化为计算机显示器的格栅形式的科学。 图形 计算机图形学的研究对象为图形广义来说&#xff0c;能在人的视觉系统形成视觉印象的客观对象都可称为图形。 既包括了各种几何…...

雅思听力--75个重点单词/词组

文章目录 1. in + 一段时间2. struggle with + doing sth.3. due to + n. / doing sth.4. all kinds of + n.5. supply6. get sb. down7. sth. be a hit8. ups and downs1. in + 一段时间 “in ten minutes”表示“10分钟内”,“in + 一段时间”表示“在一段时间之内”。 You…...

dubbo 参数校验-ValidationFilter

org.apache.dubbo.rpc.Filter 核心功能 拦截RPC调用流程 Filter是Dubbo框架中实现拦截逻辑的核心接口&#xff0c;作用于服务消费者和提供者的作业链路&#xff0c;支持在方法调用前后插入自定义逻辑。如参数校验、异常处理、日志记录等。扩展性机制 Dubbo通过SPI扩展机制动态…...

Fine Structure-Aware Sampling(AAAI 2024)论文笔记和启发

文章目录 本文解决的问题本文提出的方法以及启发 本文解决的问题 传统的基于Pifu的人体三维重建一般通过采样来进行学习。一般选择的采样方法是空间采样&#xff0c;具体是在surface的表面随机位移进行样本的生成。这里的采样是同时要在XYZ三个方向上进行。所以这导致了一个问…...

股票单因子的检验方法有哪些?

股票单因子的检验方法主要包括以下四类方法及相关指标&#xff1a; 一、统计指标检验 IC值分析法 定义&#xff1a;IC值&#xff08;信息系数&#xff09;衡量因子值与股票未来收益的相关性&#xff0c;包括两种计算方式&#xff1a; Normal IC&#xff1a;基于Pearson相关系数…...

Android第三次面试总结之activity和线程池篇(补充)

一、线程池高频面试题 1. 为什么 Android 中推荐使用线程池而非手动创建线程&#xff1f;&#xff08;字节跳动 / 腾讯真题&#xff09; 核心考点&#xff1a;线程池的优势、资源管理、性能优化答案要点&#xff1a; 复用线程&#xff1a;避免重复创建 / 销毁线程的开销&…...

【Trae+LucidCoder】三分钟编写专业Dashboard页面

AI辅助编码作为一项革命性技术&#xff0c;正在改变开发者的工作方式。本文将深入探讨如何利用Trae的AI Coding功能构建专业的Dashboard页面&#xff0c;同时向您推荐一个极具价值的工具——Lucids.top&#xff0c;它能够将页面截图转换为AI IDE的prompt&#xff0c;从而生成精…...

CUDA Toolkit 12.9 与 cuDNN 9.9.0 发布,带来全新特性与优化

NVIDIA 近日发布了 CUDA Toolkit 12.9&#xff0c;为开发者提供了一系列新功能和改进&#xff0c;旨在进一步提升 GPU 加速应用的性能和开发效率。CUDA Toolkit 是创建高性能 GPU 加速应用的关键开发环境&#xff0c;广泛应用于从嵌入式系统到超级计算机的各种计算平台。 新特…...

chrome 浏览器怎么不自动提示是否翻译网站

每次访问外国语网页都会弹出这个对话框&#xff0c;很是麻烦&#xff0c;每次都得手动关闭一下。 不让他弹出来方法&#xff1a; 设置》语言》首选语言》添加语言&#xff0c;搜索英语添加上 如果需要使用翻译&#xff0c;就点击三个点&#xff0c;然后选择翻译...

编程速递-RAD Studio 12.3 Athens四月补丁:关注软件性能的开发者,安装此补丁十分必要

2025年4月22日&#xff0c;Embarcadero发布了针对RAD Studio 12.3、Delphi 12.3以及CBuilder 12.3的四月补丁。此更新旨在提升这些产品的质量&#xff0c;特别关注于Delphi编译器、C 64位现代工具链、RAD Studio 64位IDE及其调试器、VCL库和其他RAD Studio特性。强烈建议所有使…...

Linux54 源码包的安装、修改环境变量解决 axel命令找不到;getfacl;测试

始终报错 . 补充链接 tinfo 库时报错软件包 ncurses-devel-5.9-14.20130511.el7_4.x86_64 已安装并且是最新版本 没有可用软件包 tinfo-devel。 无须任何处理 make LDLIBS“-lncurses"报错编译时报错make LDLIBS”-lncurses" &#xff1f; /opt/rh/devtoolset-11/roo…...

驱动开发硬核特训 · Day 27(上篇):Linux 内核子系统的特性全解析

在过去数日的练习中&#xff0c;我们已经深入了解了字符设备驱动、设备模型与总线驱动模型、regulator 电源子系统、I2C 驱动模型、of_platform_populate 自动注册机制等关键模块。今天进入 Day 27&#xff0c;我们将正式梳理 Linux 内核子系统的核心特性与通用结构&#xff0c…...

【学习笔记】深度学习:典型应用

作者选择了由 Ian Goodfellow、Yoshua Bengio 和 Aaron Courville 三位大佬撰写的《Deep Learning》(人工智能领域的经典教程&#xff0c;深度学习领域研究生必读教材),开始深度学习领域学习&#xff0c;深入全面的理解深度学习的理论知识。 之前的文章参考下面的链接&#xf…...

万字详解ADC药物Payload

抗体药物偶联物&#xff08;ADC&#xff09;是一种有前景的癌症治疗方式&#xff0c;能够选择性地将有效载荷&#xff08;Payload&#xff09;细胞毒性分子递送至肿瘤&#xff0c;降低副作用的严重程度。通常ADC由3个关键成分组成&#xff1a;抗体&#xff0c;连接子和有效载荷…...

算法笔记.求约数

代码实现&#xff1a; #include<iostream> using namespace std; #include<vector> void check(int x) {vector<int> v;for(int i 1;i< x/i;i){if(x%i 0) {cout << i<<" ";v.push_back(i);}}for(int i v.size()-1;i>0;i--){…...

Assetto Corsa 神力科莎 [DLC 解锁] [Steam] [Windows]

Assetto Corsa 神力科莎 [DLC 解锁] [Steam] [Windows] 需要有游戏正版基础本体&#xff0c;安装路径不能带有中文&#xff0c;或其它非常规拉丁字符&#xff1b; DLC 版本 至最新全部 DLC 后续可能无法及时更新文章&#xff0c;具体最新版本见下载文件说明 DLC 解锁列表&…...

启发式算法-遗传算法

遗传算法是一种受达尔文生物进化论和孟德尔遗传学说启发的启发式优化算法&#xff0c;通过模拟生物进化过程&#xff0c;在复杂搜索空间中寻找最优解或近似最优解。遗传算法的核心是将问题的解编码为染色体&#xff0c;每个染色体代表一个候选解&#xff0c;通过模拟生物进化中…...

生成式AI将重塑的未来工作

在人类文明的长河中,技术革命始终是推动社会进步的核心动力。从蒸汽机的轰鸣到互联网的浪潮,每一次技术跃迁都在重塑着人类的工作方式与生存形态。而今,生成式人工智能(Generative AI)的崛起,正以超越以往任何时代的速度与深度,叩响未来工作范式变革的大门。这场变革并非…...

【操作系统】吸烟者问题

问题描述 吸烟者问题是一个经典的同步问题&#xff0c;涉及三个抽烟者进程和一个供应者进程。每个抽烟者需要三种材料&#xff08;烟草、纸和胶水&#xff09;来卷烟&#xff0c;但每个抽烟者只有一种材料。供应者每次提供两种材料&#xff0c;拥有剩下那种材料的抽烟者可以卷烟…...