什么是 BigMap 算法

  • 什么是 BigMap 算法
  • 算法思想
    • 优点:
    • 缺点:
    • 示例:
  • map映射表
  • 位移转换
  • 代码示例(c语言)

C/C++Linux服务器开发/后台架构师知识体系整理

什么是 BigMap 算法

所谓 BitMap 就是用一个 bit 位来标记某个元素对应的 value,而 key 即是这个元素。由于采用bit为单位来存储数据,因此在可以大大的节省存储空间。

算法思想

32位机器上,一个整形,比如 int a; 在内存中占32bit,可以用对应的32个bit位来表示十进制的0-31个数,bitmap算法利用这种思想处理大量数据的排序与查询。

优点:

  • 效率高,不许进行比较和移位
  • 占用内存少,比如N=10000000;只需占用内存为N/8 = 1250000Bytes = 1.2M,如果采用int数组存储,则需要38M多

缺点:

  • 无法对存在重复的数据进行排序和查找

示例:

  • 申请一个int型的内存空间,则有4Byte,32bit。输入 4, 2, 1, 3时:

    输入4:

    输入2:

    输入1:

    输入3:

    思想比较简单,关键是十进制和二进制bit位需要一个 map 映射表,把10进制映射到bit位上。

map映射表

假设需要排序或者查找的总数N=10000000,那么我们需要申请的内存空间为 int a[N/32 + 1].其中a[0]在内存中占32位,依此类推:

bitmap表为:

a[0] ------> 0 - 31

a[1] ------> 32 - 63

a[2] ------> 64 - 95

a[3] ------> 96 - 127

下面介绍用位移将十进制数转换为对应的bit位

位移转换

(1) 求十进制数 0-N 对应的在数组 a 中的下标

index_loc = N / 32即可,index_loc即为n对应的数组下标。例如n = 76, 则loc = 76 / 32 = 2,因此76在a[2]中。

(2)求十进制数0-N对应的bit位

bit_loc = N % 32即可,例如 n = 76, bit_loc = 76 % 32 = 12

(3)利用移位0-31使得对应的32bit位为1

代码示例(c语言)

#include <stdio.h>
#include <stdlib.h>#define SHIFT 5
#define MASK 0x1F/*** 设置所在的bit位为1** T = O(1)**/
void set(int n, int *arr)
{int index_loc, bit_loc;index_loc = n >> SHIFT; // 等价于n / 32bit_loc = n & MASK;    // 等价于n % 32 。 h%2^n = h & (2^n -1)arr[index_loc] |= 1 << bit_loc;
}/*** 初始化arr[index_loc]所有bit位为0** T = O(1)**/
void clr(int n, int *arr)
{int index_loc;index_loc = n >> SHIFT;arr[index_loc] &= 0;
}/*** 测试n所在的bit位是否为1** T = O(1)**/
int test(int n, int *arr)
{int i, flag;i = 1 << (n & MASK);flag = arr[n >> SHIFT] & i;return flag;
}int main(void)
{int i, num, space, *arr;while (scanf("%d", &num) != EOF) {// 确定大小&&动态申请数组space = num / 32 + 1;arr = (int *)malloc(sizeof(int) * space);// 初始化bit位为0for (i = 0; i <= num; i ++)clr(i, arr);// 设置num的比特位为1set(num, arr);// 测试if (test(num, arr)) {printf("成功!\n");} else {printf("失败!\n");}}return 0;
}

C/C++Linux服务器开发/后台架构师面试题、学习资料、教学视频和学习路线图如有需要的可以自行添加学习交流群960994558

什么是 BigMap 算法相关推荐

  1. 海量用户标签系统之存储架构设计(Bigmap算法)

    背景 我们在日常的工作中经常遇到这种场景 对一个用户添加许多的标签信息方便对用户身份进行搜索和精细化运营 ps:本文我们不考虑用户身上的标签是怎么来的,只讨论用户已经拥有标签的情况下怎么进行存储 需求 ...

  2. golang通过RSA算法生成token,go从配置文件中注入密钥文件,go从文件中读取密钥文件,go RSA算法下token生成与解析;go java token共用

    RSA算法 token生成与解析 本文演示两种方式,一种是把密钥文件放在配置文件中,一种是把密钥文件本身放入项目或者容器中. 下面两种的区别在于私钥公钥的初始化, init方法,需要哪种取哪种. 通过 ...

  3. 通用解题法——回溯算法(理解+练习)

    积累算法经验,积累解题方法--回溯算法,你必须要掌握的解题方法! 什么是回溯算法呢? 回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就&quo ...

  4. 伍六七带你学算法 进阶篇-生命游戏

    有趣的算法题–生命游戏 难度-中等 根据 百度百科 ,生命游戏,简称为生命,是英国数学家约翰·何顿·康威在 1970 年发明的细胞自动机. 想要体验生命游戏的小伙伴可以到这里-->生命游戏 进入 ...

  5. 伍六七带你学算法 进阶篇-排序算法

    给定一个整数数组 nums,将该数组升序排列. 示例 1: 输入:[5,2,3,1] 输出:[1,2,3,5] 示例 2: 输入:[5,1,1,2,0,0] 输出:[0,0,1,1,2,5] 各排序算 ...

  6. 伍六七带你学算法 入门篇-卡牌分组

    力扣-914. 卡牌分组 难度-简单 这是一道非常有趣的题,提交通过率令人深思 ,思考它是不是一道简单的题- 开始正题: 给定一副牌,每张牌上都写着一个整数. 此时,你需要选定一个数字 X,使我们可以 ...

  7. 伍六七带你学算法 入门篇-最小的k个数

    java面试题-最小的k个数 难度-简单 输入整数数组 arr ,找出其中最小的 k 个数.例如,输入4.5.1.6.2.7.3.8这8个数字,则最小的4个数字是1.2.3.4. 示例 1: 输入:a ...

  8. 十大算法,描述+代码+演示+分析+改进(赶紧收藏!)

    十大算法 1.冒泡排序 ​ (1)算法描述 ​ 冒泡排序是一种简单的排序算法.它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来.走访数列的工作是重复地进行直到没有再需要 ...

  9. 人工智能3d建模算法_打破国外垄断,全国产3D芯片为机器人“点睛”

    ◎ 科技日报记者 崔爽 传统机器人只有"手",只能在固定好的点位上完成既定操作,而新一轮人工智能技术大大推动了机器和人的协作,这也对机器人的灵活性有了更高要求. 要想像人一样测量. ...

最新文章

  1. Kubernetes 笔记 01 初识 Kubernetes 新时代的领航者
  2. 深入理解Java中的final关键字
  3. python随机森林特征重要性_Python中随机森林回归的特征重要性
  4. mysql select命令加速_数据库教程
  5. fortran_Fortran 60岁生日快乐
  6. POJ1212 HDU1650 UVA180 LA5240 Eeny Meeny【约瑟夫环】
  7. android socket 失败,安卓Socket发起失败 急
  8. Shuffle a Array
  9. STM32: HAL库开发概览
  10. 商城后台管理系统Vue+Vue-Router+Element-UI+Axios+Echarts 黑马程序员视频笔记
  11. gan的几种变体_推荐系统系列第6部分,用于协作过滤的自动编码器的6种变体
  12. 简单的SWF视频播放器代码
  13. 设置mysql回收空闲链接_mysql 8小时空闲后连接失效的解决
  14. vCode组件的使用
  15. Jekins构建触发器Build Triggers:定时构建配置
  16. 七日杀怎么建立虚拟服务器,《七日杀》怎么创建服务器
  17. 自动驾驶神经网络是什么,自动驾驶神经网络算法
  18. EESM和MI-ESM
  19. Windows编译FreeRDP
  20. vue 加载动态图片出错的三种解决方法

热门文章

  1. 有保证的复制消除(Guaranteed Copy Elision)
  2. 十一、Spring Boot整合Redis(一)
  3. 高并发系统的限流算法与实现
  4. SQL 语句:不得使用外键与级联,一切外键概念必须在应用层解决
  5. 企业微信会议室管理,对接企业微信官方应用会议室,会议管理系统功能清单
  6. b站百万Up主分享如何做内容
  7. JAVA多线程基础篇 4、可见性、有序性与Volatile
  8. 第05章 图形基础
  9. 监控易携手三大运营商,助推安徽省农行三级网扁平化管理
  10. Github连接不上问题