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';
}

最新文章

  1. JS实现页面打印
  2. 使用Fluent API 配置/映射属性和类型
  3. mybatis 使用动态SQL
  4. Java关于队列的自我实现
  5. 全文检索引擎Solr系列—–全文检索基本原理
  6. Struts Convention Plugin 流程 (2.1.6+)
  7. sql waitfor 延时执行
  8. SDUT2087离散事件模拟-银行管理
  9. asp.net MVC日志插件Log4Net学习笔记一:保存日志到本地
  10. 九度OJ 1373 整数中1出现的次数(从1到n整数中1出现的次数)
  11. MySQL源码 information_schema新增表
  12. R语言 多元线性回归分析
  13. 1‘b0 什么意思
  14. 怎样在iis中发布asp.net网站
  15. (转)Spark JAVA RDD API
  16. BZOj 4540: [Hnoi2016]序列 [莫队 st表 预处理]
  17. Maven将中央仓库修改为阿里云的仓库地址
  18. 高效获得Linux函数调用栈/backtrace的方法【转】
  19. PC端的鼠标拖拽滑动
  20. nginx Access-Control-Allow-Origin css跨域

热门文章

  1. Beta阶段——第3篇 Scrum 冲刺博客
  2. 2017-4-12/session
  3. 牛客网第一场 A Monotonic Matrix
  4. python 多进程练习 调用 os.system命令
  5. Redis的JAVA连接
  6. ie edge 自动给数字加下划线
  7. Java IO流01-总叙
  8. 使用 NumPy 和 Matplotlib 绘制函数图
  9. 图的深度优先遍历(DFS)和广度优先遍历(BFS)
  10. oracle数据导入导出数据与编码格式不正确