【数据结构】位图

位图

位图(Bitmap)是一种紧凑型数据结构,用于表示一个固定大小的集合或序列中的元素状态(存在或不存在)。它通常用于处理一组整数值或布尔值,例如集合操作、数据筛选和计数等应用场景。位图通过使用位数组来表示集合中的元素状态,每个元素对应一个位(bit),从而实现高效的空间和时间性能。

位图的基本原理

  • 位图通过一系列位数组(通常使用 unsigned charunsigned int 类型的数组)来表示一组元素的状态。数组中的每一位(bit)表示集合中的一个元素的存在与否。
  • 位图的大小通常与要表示的集合中的元素范围成正比。它可以快速执行集合操作(如并集、交集和差集)以及检查元素是否存在于集合中。
  • 位图使用位运算(如与、或、异或)来高效地执行集合操作。

位图的优点

  • 高效的空间利用率:位图在表示大范围的数据时非常紧凑,每个元素只需要一个位。
  • 快速的集合操作:位图支持高效的并集、交集和差集操作,这些操作可以通过位运算来实现。
  • 快速的存在检查:位图可以快速检查某个元素是否存在于集合中,通过索引直接访问位数组。

位图的缺点

  • 固定大小:位图通常适用于固定大小的集合。如果要表示的集合范围不固定,可能需要额外的空间。
  • 不适合稀疏数据:位图在表示稀疏数据时可能浪费大量空间,因为空闲的元素仍然会占用位数组的空间。

C语言中的位图示例

下面是一个使用C语言实现的位图示例,展示了基本的插入、删除和存在检查操作。

首先,定义位图的数据结构和相关操作:

#include <stdio.h>
#include <stdlib.h>#define MAX_SIZE 100  // 位图的最大大小typedef struct {unsigned char *bitmap;int size;
} Bitmap;// 初始化位图
Bitmap *initBitmap(int size) {if (size > MAX_SIZE) {fprintf(stderr, "位图大小超出最大限制\n");return NULL;}Bitmap *bitmap = (Bitmap *)malloc(sizeof(Bitmap));bitmap->bitmap = (unsigned char *)calloc((size + 7) / 8, sizeof(unsigned char));bitmap->size = size;return bitmap;
}// 释放位图
void freeBitmap(Bitmap *bitmap) {free(bitmap->bitmap);free(bitmap);
}// 在位图中插入元素
void insert(Bitmap *bitmap, int element) {if (element >= bitmap->size || element < 0) {fprintf(stderr, "元素超出位图范围\n");return;}int index = element / 8;  // 计算字节索引int offset = element % 8;  // 计算位偏移bitmap->bitmap[index] |= (1 << offset);  // 设置对应的位
}// 在位图中删除元素
void delete(Bitmap *bitmap, int element) {if (element >= bitmap->size || element < 0) {fprintf(stderr, "元素超出位图范围\n");return;}int index = element / 8;  // 计算字节索引int offset = element % 8;  // 计算位偏移bitmap->bitmap[index] &= ~(1 << offset);  // 清除对应的位
}// 检查元素是否在位图中
int contains(Bitmap *bitmap, int element) {if (element >= bitmap->size || element < 0) {fprintf(stderr, "元素超出位图范围\n");return 0;}int index = element / 8;  // 计算字节索引int offset = element % 8;  // 计算位偏移return (bitmap->bitmap[index] & (1 << offset)) != 0;  // 检查对应的位
}

在上面的代码中,定义了位图的数据结构 Bitmap,包含一个 unsigned char 类型的位数组 bitmap 和位图的大小 size。同时,定义了插入、删除和存在检查操作。

  • 插入操作:通过计算元素对应的字节索引和位偏移,将位数组中的相应位设置为1。
  • 删除操作:通过计算元素对应的字节索引和位偏移,将位数组中的相应位清零。
  • 存在检查:通过计算元素对应的字节索引和位偏移,检查位数组中的相应位是否为1。

接下来,示例代码展示了如何使用位图:

int main() {// 初始化位图,大小为32Bitmap *bitmap = initBitmap(32);// 在位图中插入元素insert(bitmap, 3);insert(bitmap, 7);insert(bitmap, 15);// 检查元素是否在位图中printf("元素3是否存在:%s\n", contains(bitmap, 3) ? "是" : "否");printf("元素7是否存在:%s\n", contains(bitmap, 7) ? "是" : "否");printf("元素15是否存在:%s\n", contains(bitmap, 15) ? "是" : "否");printf("元素10是否存在:%s\n", contains(bitmap, 10) ? "是" : "否");// 删除元素delete(bitmap, 7);printf("删除元素7后,元素7是否存在:%s\n", contains(bitmap, 7) ? "是" : "否");// 释放位图freeBitmap(bitmap);return 0;
}

在上面的代码中,我们首先初始化一个大小为32的位图,然后插入元素 3715。接下来,我们检查这些元素是否存在于位图中,并删除元素 7 后再次检查其存在与否。

总结

位图是一种高效的数据结构,适用于表示固定大小的集合或序列中的元素状态。通过使用位数组和位运算,位图可以快速执行集合操作、存在检查和删除等操作。位图在处理大范围数据和集合操作时表现出色,尤其在低基数、高密度数据的应用中。

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

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

相关文章

C#到底属于编译型语言还是解释型语言?

C#是一种编译型语言&#xff0c;也称为静态类型语言&#xff0c;这意味着C#代码在运行之前需要经过编译器的编译处理&#xff0c;并生成一个可执行的本地代码文件&#xff08;通常是.exe或.dll文件&#xff09;。相反&#xff0c;解释型语言将代码转换为低级代码后直接执行&…

计算机视觉——手机目标检测数据集

这是一个手机目标检测的数据集&#xff0c;数据集的标注工具是labelimg,数据格式是voc格式&#xff0c;要训练yolo模型的话&#xff0c;可以使用脚本改成txt格式&#xff0c;数据集标注了手机&#xff0c;标签名&#xff1a;telephone,数据集总共有1960张&#xff0c;有一部分是…

软件无线电安全之GNU Radio基础 -上

GNU Radio介绍 GNU Radio是一款开源的软件工具集&#xff0c;专注于软件定义无线电&#xff08;SDR&#xff09;系统的设计和实现。该工具集支持多种SDR硬件平台&#xff0c;包括USRP、HackRF One和RTL-SDR等。用户可以通过GNU Radio Companion构建流程图&#xff0c;使用不同…

BackTrader 中文文档(二十七)

原文&#xff1a;www.backtrader.com/ 数据 - 多个时间框架 原文&#xff1a;www.backtrader.com/blog/posts/2015-08-24-data-multitimeframe/data-multitimeframe/ 有时&#xff0c;使用不同的时间框架进行投资决策&#xff1a; 周线用于评估趋势 每日执行进入 或者 5 分钟…

软考132-上午题-【软件工程】-沟通路径

一、定义 1-1、沟通路径1 沟通路径 1-2、沟通路径2 沟通路径 n-1 二、真题 真题1&#xff1a; 真题2&#xff1a; 真题3&#xff1a;

发布 Chrome/Edge浏览器extension扩展到应用商店

Chrom Extension发布流程 创建和发布自定义 Chrome 应用和扩展程序&#xff1a;https://support.google.com/chrome/a/answer/2714278?hlzh-Hans 在 Chrome 应用商店中发布&#xff1a;https://developer.chrome.com/docs/webstore/publish?hlzh-cn 注册开发者帐号&#…

图解CPU的实模式与保护模式

哈喽&#xff0c;大家好&#xff0c;我是呼噜噜&#xff0c;好久没有更新old linux了&#xff0c;在上一篇文章Linux0.12内核源码解读(7)-陷阱门初始化中&#xff0c;我们简要地提及了中断&#xff0c;但是中断机制在计算机世界里非常重要&#xff0c;处处都离不开中断&#xf…

Element——组件

element官网 https://element.eleme.cn/#/zh-CN/component/layout vscode格式化快捷键&#xff1a;shiftaltf table表格 <template><el-table:data"tableData"style"width: 100%"><el-table-columnprop"date"label"日期…

Git使用总结(不断更新中)

branch 本地分支操作 删除本地分支 git branch -d <local-branch-name>远端分支操作 从远端分支创建本地分支 git checkout -b <local-branch-name> origin/<remote-branch-name>git ignore 如果工程的代码文件中有不希望上传到远端的文件&#xff0c;…

排列特征重要性(Permutation Feature Importance)

5个条件判断一件事情是否发生&#xff0c;每个条件可能性只有2种&#xff08;发生或者不发生&#xff09;&#xff0c;计算每个条件对这件事情发生的影响力。排列特征重要性模型的程序。 例一 在机器学习领域&#xff0c;排列特征重要性&#xff08;Permutation Feature Impor…

【honggfuzz学习笔记】honggfuzz的基本特性

本文架构 1.动机2.honggfuzz的基本概念官网描述解读 3. honggfuzz的反馈驱动(Feedback-Driven)软件驱动反馈&#xff08;software-based coverage-guided fuzzing&#xff09;代码覆盖率代码覆盖率的计量单位 代码覆盖率的统计方式 硬件驱动反馈&#xff08; hardware-based co…

CTFHUB RCE作业

题目地址&#xff1a;CTFHub 完成情况如图&#xff1a; 知识点&#xff1a; preg_match_all 函数 正则匹配函数 int preg_match_all ( string $pattern , string $subject [, array &$matches [, int $flags PREG_PATTERN_ORDER [, int $offset 0 ]]] )搜索 subject 中…

【Python小游戏】植物大战僵尸的实现与源码分享

文章目录 Python版植物大战僵尸环境要求方法源码分享初始化页面&#xff08;部分&#xff09;地图搭建&#xff08;部分&#xff09;定义植物类 &#xff08;部分&#xff09;定义僵尸类&#xff08;部分&#xff09;游戏运行入口 游戏源码获取 Python版植物大战僵尸 已有的植…

【Proteus】51单片机对直流电机的控制

直流电机&#xff1a;输出或输入为直流电能的旋转电机。能实现直流电能和机械能互相转换的电机。把它作电动机运行时是直流电动机&#xff0c;电能转换为机械能&#xff1b;作发电机运行时是直流发电机&#xff0c;机 械能转换为电能。 直流电机的控制&#xff1a; 1、方向控制…

动态多目标测试函数DF1-DF14,FDA1-FDA5,SDP1-SDP12的TurePOF(MATLAB代码)

动态多目标测试函数FDA1、FDA2、FDA3、FDA4、FDA5的turePOF&#xff08;MATLAB代码&#xff09; 动态多目标测试函数DF1-DF14的turePOF变化&#xff08;提供MATLAB代码&#xff09; 动态多目标测试函数SDP1-SDP12的TurePOF变化视频&#xff08;含MATLAB代码及参考文献&#xff…

Java Swing制作大鱼吃小鱼魔改版本

《大鱼吃小鱼》这款游戏的历史渊源可以追溯到休闲游戏的兴起和发展。在游戏的早期发展阶段&#xff0c;开发者们开始探索各种简单而有趣的游戏玩法&#xff0c;以吸引玩家的注意力。在这样的背景下&#xff0c;《大鱼吃小鱼》应运而生&#xff0c;它结合了自然界的食物链原理与…

AI大模型之idea通义灵码智能AI插件安装方式

问题描述 主要讲述如何进行开发工具 idea中如何进行通义灵码的插件的安装解决方案 直接在idea的plugin市场中安装 下载插件之后进行安装 见资源

lua 光速入门

文章目录 安装注释字符串变量逻辑运算条件判断循环函数Table (表)常用全局函数模块化 首先明确 lua 和 js Python一样是动态解释性语言&#xff0c;需要解释器执行。并且不同于 Python 的强类型与 js 的弱类型&#xff0c;它有点居中&#xff0c;倾向于强类型。 安装 下载解释…

【OpenHarmony】TDD-FUZZ环境配置

零、参考 1、AttributeError: ‘ElementTree‘ object has no attribute ‘getiterator‘&#xff1a;https://blog.csdn.net/suhao0911/article/details/110950742 一、创建工作目录 1、新建工作目录如&#xff1a;D:\0000_TDD_FUZZ\0000_ohos_tdd_fuzz。 2、gitee上下载 t…

陇剑杯 ios 流量分析 CTF writeup

陇剑杯 ios 流量分析 链接&#xff1a;https://pan.baidu.com/s/1KSSXOVNPC5hu_Mf60uKM2A?pwdhaek 提取码&#xff1a;haek目录结构 LearnCTF ├───LogAnalize │ ├───linux简单日志分析 │ │ linux-log_2.zip │ │ │ ├───misc日志分析 │ │…