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 进行字符串去重相关推荐

  1. Redis高级数据结构原理解析-bitmap,hyperloglog

    Redis 位图 开发过程中,我们可能遇到这种场景记录用户的打卡情况,签到情况,这些场景只有两种结果,有或者没有,加入记录的数据量比较大,比如用一年的数据,如果用Redis中普通key/value,每 ...

  2. 浅谈python高级数据结构—— 字符串(str)

    浅谈python高级数据结构-- 字符串(str) 在python中字符串可以说的运用的特别多了.在当我们input 输入的时候,也是一个str字符串类型,我们今天就来简单的说一下(字符串)类型的一些 ...

  3. Redis的3个高级数据结构

    转载自   Redis的3个高级数据结构 平常接触最多的是5个入门级数据结构:String,Hash,List,Set,Sorted Set,本文介绍3个高级数据结构:Bitmaps,Hyperlog ...

  4. 【2. Redis 高级数据结构】

    Redis 高级数据结构 Bitmaps ​ 现代计算机用二进制(位)作为信息的基础单位,1 个字节等于 8 位,例如"big" 字符串是由 3 个字节组成,但实际在计算机存储时将 ...

  5. Golang高级数据结构

    文章目录 Golang高级数据结构 一.channel 1.channel操作 2.channel应用 a.停止信号 b.任务定时 c.解耦生产方和消费方 d.控制并发数 3.channel 数据结构 ...

  6. 高级数据结构讲解与案例分析

    然而,仅仅掌握好它们不足以应付大厂的算法面试的.为了达到对时间和空间复杂度的理想要求,本节课探究高级数据结构,它们的实现要比那些常用的数据结构要复杂得多.其中重点介绍: 优先队列 图 前缀树 线段树 ...

  7. Python中的高级数据结构详解

    这篇文章主要介绍了Python中的高级数据结构详解,本文讲解了Collection.Array.Heapq.Bisect.Weakref.Copy以及Pprint这些数据结构的用法,需要的朋友可以参考 ...

  8. Python中的高级数据结构

    http://blog.jobbole.com/65218/ 本文由 伯乐在线 - 熊崽Kevin 翻译自 pypix.com.欢迎加入技术翻译小组.转载请参见文章末尾处的要求. 数据结构 数据结构的 ...

  9. 省选+NOI 第五部分 高级数据结构

    左偏树 [AgOHの数据结构]左偏树 [AgOHの数据结构]左偏树_哔哩哔哩_bilibili CSU-ICPC集训课程 启发式合并和左偏树 CSU-ICPC集训课程 启发式合并和左偏树_哔哩哔哩_b ...

最新文章

  1. 如何搭建高可用redis架构?
  2. 关于js浅拷贝与深拷贝的理解
  3. boost::fusion::push_back用法的测试程序
  4. react学习(10)----react数组定义 从0开始 直接加个0下标空
  5. C++学习之路 | PTA乙级—— 1012 数字分类 (20分)(精简)
  6. 10个必会的 PyCharm 技巧,附高清大图
  7. android PopupWindow 显示问题
  8. UE4中Component和Subobject的区别
  9. mrst 实施编辑器 data流程
  10. javascript基础之拖拽(2)(详细篇)---FileReader对象,blod对象
  11. 母版页Master中Html控件img,a,javascript相对路径问题
  12. iOS中TableView小技巧
  13. 通用印刷体文字识别_印刷体文字识别(汉字)中文符的分割
  14. To prevent a memory leak, the JDBC Driver has been forcibly unregistered. 解决方法
  15. 【操作系统】进程间通信 — 消息队列
  16. 13.包装类和字符串
  17. mysql只有frm_MySQL只有.frm和.ibd文件如何批量恢复InnoDB表-爱可生
  18. Elasticsearch学习笔记(三)安装hanlp中文分词插件及同义词配置
  19. Python中程序的基本结构
  20. Python爬虫实战(3):安居客房产经纪人信息采集

热门文章

  1. android.os.NetworkOnMainThreadException 异常处理
  2. 让C#语言充当自身脚本!——.NET中的动态编译
  3. elementUI中radio的相关使用
  4. equals()重写之后为什么要重写hashCode()方法
  5. qt截图怎样实现橡皮擦_利用QT实现截屏的四种方法
  6. 为什么派生的子类报错不能实例化抽象类_C# 接口与抽象类实例分析
  7. Pytorch——可视化不同的优化器效果
  8. LeetCode 70.爬楼梯(动态规划)
  9. 39种语言编写的Hello World程序
  10. 原 matplotlib命令与格式:系统字体与显示中文