数据结构——bitmap

本文介绍了如何利用位图数据结构解决《编程珠玑》中关于电话号码排序的问题。通过位图,可以在有限内存下高效处理大量数据,避免了传统方法的多次读取操作。详细阐述了位图的原理,包括非负整数在位图中的表示、插入、查询和删除方法,并提供了C语言实现的简单测试代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        最近在看《编程珠玑》这本书。 第1章中引入了bitmap(位图)的数据结构。以前没有接触过, 抽空研究了一下,记录下来。

        书中描述的情景:  

         1. 最多1000万个7位数电话号码(号码不重复,实际大概800万个),保存在文本中 

         2. 每隔一段时间要对号码进行排序

         3.程序模块最多可用1M Bytes的内存, 磁盘空间充足


          分析:

           通常方案:7位电话号码可以用uint32_t (4个字节)来存储,  4 * 8 * 10^6 Bytes约为32M Bytes,一次性排序显然内存不满足。

                               1M Bytes 内存可以存放 10^6/4 = 250万个号码, 1000万个约要分40趟进行读取排序写入文件,在归并到一起

                               此方案,需要40次读原始文本的代价,效率低下。

           位图方案: 1个字节(8Bit)可以存放8个整数,  实际800万个号码,刚好1M Bytes的内存空间可以使用,符合要求。


        一、原理

        通常存储方案, 每个整数(假如4个字节), 占用内存多, 在内存不足或海量数据时, 导致处理方法复杂。

        位图, 可以理解用位(Bit)来表示数据, 1个字节是8位, 可以存储8个连续的整数, 内存空间充分利用。 每一位 1表示有数据, 0 表示没有数据。

        举例说明:   

        整数集合 {1 , 11,  9 , 7 , 10 }

        5个整数,用通常存储方案,需要 5  * 4 = 20 字节 

        位图只需要  12位,

### 关于武汉理工大学数据结构课程中的二叉树与赫夫曼编码用于图片压缩的实验 #### 实验概述 该实验旨在帮助学生掌握树形结构及其应用,特别是通过构建和使用霍夫曼(Huffman)树来实现图像压缩技术。具体目标包括理解并实践二叉树的不同遍历方式以及深入学习霍夫曼编码原理。 #### 储结构设计 为了有效地表示一棵二叉树,在内中通常采用两种主要的方法:顺序储和链式储。对于本项目而言,更推荐使用节点链接的方式创建动态的数据结构,因为这种方式能够灵活处理不同大小输入的同时也便于后续算法的操作[^1]。 #### 霍夫曼树构造过程 霍夫曼树是一种特殊的带权路径长度最短的二叉树,广泛应用于数据压缩领域。其建立基于给定字符集频率统计的基础上,按照以下原则逐步形最终形态: - 将所有单个符号视为独立子树; - 每次从未加入到新树中的集合里挑选两个具有最小权重(即出现次数最少)的对象作为左右孩子组新的父结点; - 更新剩余未参与组合对象列表,并重复上述步骤直到只剩下一个根节点为止; 此过程中形的二叉树就是所谓的霍夫曼树。 #### 文件读取与写入功能 考虑到实际应用场景下的需求,程序还需要具备基本的文件I/O能力。这涉及到如何高效地加载原始位图(bitmap),解析其中像素信息,并将其转换适合进一步加工的形式;同样重要的是经过编码后的输出也需要保下来供解压验证用途。C++标准库提供了丰富的API支持这些操作,比如`<fstream>`头文件下定义的各种类可以满足大部分情况的需求。 ```cpp #include <iostream> #include <fstream> using namespace std; // 打开文件流实例 ifstream inputFile("input.bmp", ios::binary); ofstream outputFile("output.huff", ios::binary); if (!inputFile.is_open() || !outputFile.is_open()) { cerr << "无法打开指定文件!" << endl; } ``` #### 编码流程展示 一旦获得了完整的霍夫曼表之后就可以着手进行具体的编码工作了。这里给出一段简化版伪代码用来说明整个逻辑框架: ```cpp void encodeImage(const string& inputFilePath, const string& outputFilePath){ // 初始化变量... while (there are still bytes to read from the image file){ byte currentByte = getNextByte(inputFile); encodedBits += huffmanTable[currentByte]; // 查找对应bit串并拼接起来 } writeEncodedDataToFile(outputFile, encodedBits); } int main(){ encodeImage("source_image.bmp","compressed_data.bin"); return 0; } ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值