高级数据结构及应用 —— 使用 bitmap 进行字符串去重
bitmap 即为由单个元素为 boolean(0/1, 0 表示未出现,1 表示已经出现过)的数组。
如果C/C++ 没有原生的 boolean 类型,可以用 int 或 char 来作为 bitmap 使用,如果我们要判断某字符(char)是否出现过,
- 使用 int 作为 bitmap 的底层数据结构,bitmap 即为 int 数组,一个 int 长度为 32 个 bit 位,
- c / 32 ⇒ bitmap 中的第几个 int
- c % 32 ⇒ bitmap 中的某 int 中的第几个 bit 位;
- 使用 char 作为 bitmap 的底层数据结构,bitmap 即为 char 数组,一个 char 长度为 8 个 bit 位;
- c / 8 ⇒ bitmap 中的第几个 char
- c % 8 ⇒ bitmap 中某 char 中的第几个 bit 位;
ASCII
- A-Z:65-90
- a-z:97-122
如果使用 char 作为 bitmap 的替代底层数据结构,为了实现字符串的去重需要 char 的长度为多少呢?122/8+1 ⇒ 16。如果使用 int 作为 bitmap 的底层实现,则需要 int 数组的长度为 122/32 + 1 ⇒ 4
1. int 作为底层数据结构
void dedup(const char* src, char* dst)
{unsigned int exists[4] = { 0 };int i = 0, j = 0;unsigned int mask;char c;while (src[i]){c = src[i];mask = 1 << (c % 32);if ((exists[c / 32] & mask) == 0){dst[j++] = c;exists[c / 32] |= mask;}i++;}dst[j] = '\0';
}
2. 使用 char 作为底层数据结构
void dedup(const char* src, char* dst)
{unsigned char exists[16] = { 0 };int i = 0, j = 0;unsigned int mask;char c;while (src[i]){c = src[i];mask = 1 << (c % 8);if ((exists[c / 8] & mask) == 0){dst[j++] = c;exists[c / 8] |= mask;}i++;}dst[j] = '\0';
}
高级数据结构及应用 —— 使用 bitmap 进行字符串去重相关推荐
- Redis高级数据结构原理解析-bitmap,hyperloglog
Redis 位图 开发过程中,我们可能遇到这种场景记录用户的打卡情况,签到情况,这些场景只有两种结果,有或者没有,加入记录的数据量比较大,比如用一年的数据,如果用Redis中普通key/value,每 ...
- 浅谈python高级数据结构—— 字符串(str)
浅谈python高级数据结构-- 字符串(str) 在python中字符串可以说的运用的特别多了.在当我们input 输入的时候,也是一个str字符串类型,我们今天就来简单的说一下(字符串)类型的一些 ...
- Redis的3个高级数据结构
转载自 Redis的3个高级数据结构 平常接触最多的是5个入门级数据结构:String,Hash,List,Set,Sorted Set,本文介绍3个高级数据结构:Bitmaps,Hyperlog ...
- 【2. Redis 高级数据结构】
Redis 高级数据结构 Bitmaps 现代计算机用二进制(位)作为信息的基础单位,1 个字节等于 8 位,例如"big" 字符串是由 3 个字节组成,但实际在计算机存储时将 ...
- Golang高级数据结构
文章目录 Golang高级数据结构 一.channel 1.channel操作 2.channel应用 a.停止信号 b.任务定时 c.解耦生产方和消费方 d.控制并发数 3.channel 数据结构 ...
- 高级数据结构讲解与案例分析
然而,仅仅掌握好它们不足以应付大厂的算法面试的.为了达到对时间和空间复杂度的理想要求,本节课探究高级数据结构,它们的实现要比那些常用的数据结构要复杂得多.其中重点介绍: 优先队列 图 前缀树 线段树 ...
- Python中的高级数据结构详解
这篇文章主要介绍了Python中的高级数据结构详解,本文讲解了Collection.Array.Heapq.Bisect.Weakref.Copy以及Pprint这些数据结构的用法,需要的朋友可以参考 ...
- Python中的高级数据结构
http://blog.jobbole.com/65218/ 本文由 伯乐在线 - 熊崽Kevin 翻译自 pypix.com.欢迎加入技术翻译小组.转载请参见文章末尾处的要求. 数据结构 数据结构的 ...
- 省选+NOI 第五部分 高级数据结构
左偏树 [AgOHの数据结构]左偏树 [AgOHの数据结构]左偏树_哔哩哔哩_bilibili CSU-ICPC集训课程 启发式合并和左偏树 CSU-ICPC集训课程 启发式合并和左偏树_哔哩哔哩_b ...
最新文章
- 如何搭建高可用redis架构?
- 关于js浅拷贝与深拷贝的理解
- boost::fusion::push_back用法的测试程序
- react学习(10)----react数组定义 从0开始 直接加个0下标空
- C++学习之路 | PTA乙级—— 1012 数字分类 (20分)(精简)
- 10个必会的 PyCharm 技巧,附高清大图
- android PopupWindow 显示问题
- UE4中Component和Subobject的区别
- mrst 实施编辑器 data流程
- javascript基础之拖拽(2)(详细篇)---FileReader对象,blod对象
- 母版页Master中Html控件img,a,javascript相对路径问题
- iOS中TableView小技巧
- 通用印刷体文字识别_印刷体文字识别(汉字)中文符的分割
- To prevent a memory leak, the JDBC Driver has been forcibly unregistered. 解决方法
- 【操作系统】进程间通信 — 消息队列
- 13.包装类和字符串
- mysql只有frm_MySQL只有.frm和.ibd文件如何批量恢复InnoDB表-爱可生
- Elasticsearch学习笔记(三)安装hanlp中文分词插件及同义词配置
- Python中程序的基本结构
- Python爬虫实战(3):安居客房产经纪人信息采集
热门文章
- android.os.NetworkOnMainThreadException 异常处理
- 让C#语言充当自身脚本!——.NET中的动态编译
- elementUI中radio的相关使用
- equals()重写之后为什么要重写hashCode()方法
- qt截图怎样实现橡皮擦_利用QT实现截屏的四种方法
- 为什么派生的子类报错不能实例化抽象类_C# 接口与抽象类实例分析
- Pytorch——可视化不同的优化器效果
- LeetCode 70.爬楼梯(动态规划)
- 39种语言编写的Hello World程序
- 原 matplotlib命令与格式:系统字体与显示中文