bitmap与2bitmap实现

Kubernetes CRD 系列(一):CRD 介绍 CR(Custom Resource)其实就是在 Kubernetes 中定义一个自己的资源类型,是一个具体的 “自定义 API 资源” 实例,为了能够让 Kubernetes 认识这个 CR,就需要让 Kubernetes 明白这个 CR 的宏观定义是什么,也就是需要创建所谓的 CRD(Custom Resource Definition)来表述。 可能这么说并不是太直观,换个方式表达一下,我们想要创建一个 Pod 的时候,那么会编写一个 YAML 配置,然后前两行一般会这么写: [root@l 阅读详情

Bitmap就是用一个bit位来标记某个元素是否存在,而2Bitmap就是用两个bit为来标记某个元素的个数,00,01,10,11(分别表示0,1,2,3,0表示不存在,1表示存在1次,后面依次)。

Bitmap能用来处理下面的两个问题:

(1)、在2.5亿个整数找出不重复的整数,内存不足以容纳着2.5亿个整数

(2)、腾讯面试题:给40亿个不重复的unsigned int的整数,没排过序的,然后再给一个数,如何快速判断这个数是否在那40亿个数当中?

对于问题1,整数可能是正数也可能是负数,首先只考虑正整数情况,采用2Bitmap方法,用00表示不存在,01表示出现1次,10表示出现2次及以上,此方法总共需要的内存2^31*2bit = 1Gb = 128MB(32位的正整数有2^31个,每个存储需要2bit,所以就是1Gb,换成字节就是128MB),这样内存就应该能够容纳了,最后在处理完所有的数后,只要输出对应位为01的数即可。如果这2.5亿个数里面既有正数又有负数那么就用两个2Bitmap分别存储正数和负数(取绝对值存储),零就随便放,这是所需要的内存是512MB。

对于问题2,直接用Bitmap即可,0表示存在,1表示不存在。


Bitmap实现:

参考:http://blog.youkuaiyun.com/QIBAOYUAN/article/details/5914662

#include <cstdio>
#include <iostream>
using namespace std;
#define WORD 32
#define SHIFT 5 ////移动5个位,左移则相当于乘以32,右移相当于除以32取整
#define MASK 0x1F //16进制下的31
#define N 1024*1024*1024
int bitmap[1 + N / WORD];
/*
 * 置位函数——用"|"操作符,i&MASK相当于mod操作
 * m mod n 运算,当n = 2的X次幂的时候,m mod n = m&(n-1)
 */
void set(int i) {
    bitmap[i >> SHIFT] |= (1 << (i & MASK));
}
/* 清除位操作,用&~操作符 */
void clear(int i) {
    bitmap[i >> SHIFT] &= ~(1 << (i & MASK));
}
/* 测试位操作用&操作符 */
int test(int i) {
    return bitmap[i >> SHIFT] & (1 << (i & MASK));
}
这里由于int型为32个bit,那么每个bitmap[i]就能保存32个相邻整数是否存在的信息,而为了区分就用余数来表示其位置,例如对于号码 89256,由于89256 mod 32=2789…8,这样我们应该置a[2789]中32位字符串的第8位(从低位数起)为1。

2Bitmap实现:

#include <cstdio>
#include <iostream>
using namespace std;

unsigned char bitmap[1005];

//x表示一个整数,num表示bitmap中已经拥有x的个数
//由于我们只能用2个bit来存储x的个数,所以num的个数最多为3
void set(int x,int num){
    int m = x >> 2;
    int n = x & 3;

    //将x对于为值上的个数值先清零,但是有要保证其他位置上的数不变
    bitmap[m] &= ~((0x3<<(2*n)) & 0xFF);
    //重新对x的个数赋值
    bitmap[m] |= ((num&3)<<(2*n) & 0xFF);
}

void clear(int x){
    int m = x >> 2;
    int n = x & 3;
    bitmap[m] &= ~((0x3<<(2*n)) & 0xFF);
}

unsigned char get(int x){
    int m = x >> 2;
    int n = x & 3;

    return (bitmap[m] & (0x3<<(2*n))) >> (2*n);
}

void add(int x){
    int num = get(x);
    set(x,num+1);
}
上面的&0xFF其实没用,作用就是为了“确保”,unsigned char为8个bit位。

总结:Bitmap是简单快速的数据结构,长用于空间的优化。

Claude Code 学习笔记之一:理解 Agentic Loop 与内置工具 本文介绍了Claude Code这一终端智能助手的工作原理与使用方式。作者从ABAP开发经验出发,指出学习Claude Code的高级用法具有长期价值。文章详细解析了Claude Code的Agentic Loop机制:通过大语言模型进行推理,借助各类工具执行任务,并循环收集上下文、执行操作、验证结果三个步骤。系统阐述了Claude Code支持的五大类工具及其扩展方式,说明了其访问本地资源的范围和自治处理能力,同时介绍了权限模式等安全机制。最后提供了从小任务开始、充分探索、及时引导、使用CLAUDE.md 阅读详情

相关推荐

解决com.kingbase8.util.KSQLException: This _connection has been closed.

一个消息管理系统,系统采用kingbase8数据库,数据库采用单体模式,后台应用也采用springboot单体模式。系统正式上线后,出现几个JDBC响应的异常信息: com.kingbase8.util.KSQLException: An I/O error occurred while sending to the backend. java.net.SocketTimeoutException: Read timed out.

qq_38127559的博客 2756

【大数据处理】bitmap思想和2-Bitmap 实现

1. Bit-map思想 给你一堆西安市的电话号码列表,数量大概在千万级,要求从中找出所有重复的电话号码,需要时间复杂度尽可能小。 目前西安市的电话号码大概都以8开头,为8位,也就是类似于82678578这样子 二重暴力搜索时间复杂度太高,这里我们不予考虑。 容易想到的办法就是建立一个标志数组,int boolean都行,用相应的位置值来代替这个号码是否出现, 根据数组的可直接存取特性,

比尔丁子 1452

【NLP】语言模型的发展历程 (1)

N-gram模型是一种基于统计语言模型的文本分析算法,它用于预测文本中下一个词出现的概率,基于前面出现的n-1个词的序列。这里的n代表序列中元素的数量,因此称为N-gram。Unigram:N=1,每个单词的出现概率独立计算,不考虑上下文。Bigram:N=2,基于前一个单词预测当前单词的联合概率模型。Trigram:N=3,考虑前两个单词来预测当前单词的联合概率模型,更复杂但可能更准确。

酒酿小圆子呀~ 1667

2-bitmap

在2.5亿个整数中找出不重复的整数,注,内存不足以容纳这2.5亿个整数。 思路: bitmap用一个bit来代表存在还是不存在,现在我们要判断重不重复,则需要三个状态:不存在,存在一个,存在多个。2bits可以表示四个状态,令00表示不存在,01表示存在1个,10表示存在多个,11无意义。 令2bits用一个序号,最后只要判断某序号的2bits是01,则该序号就是不重复的。 ...

weixin_30897233的博客 226

超声波传感器(CHx01) 学习笔记 Ⅲ - I2C读写操作

CH-x01 通过 2 线 I2C 协议与主机处理器通信

nicole088的专栏 1737

3.DJI-payload SDK自定义控件的设计:

自定义控件(Widget)是指负载运行时,在用户界面中显示的自定义 UI 控件,以帮助用户快速查看负载独特的设备状态,或者对负载设进行设置。这些 UI 控件可以显示在以下用户界面中。Pilot 2 应用程序;大疆智图;基于 MSDK 开发的应用程序。这种自定义控件并不是通过 MSDK 实现的,而是通过 PSDK 的配置实现的。。

哒宰的博客 770

bitmap与2-bitmap使用总结

bitmap是一种简单的数据结构,但在存储空间压缩方面却使用广泛。 bitmap就是用一个bit位来标记某个元素是否存在:1表示存在,0表示不存在;而2-bitmap就是用两个bit为来标记某个元素出现的次数:00出现0次,01出现1次,10出现2次及其以上,11无意义。 2-bitmap在内存中的表示如下: [0] [1] [2] …… |00 00 00 00|00 00 00 00|00 00

u013071074的专栏 2559

得物(毒)App潮鞋价格波动监控系统实战:从爬虫开发到数据可视化完整指南

本文将带领您从零开始构建一套完整的得物潮鞋价格监控系统,涵盖爬虫开发、数据存储、价格波动分析和可视化展示等全流程技术。我们将使用最新的Python技术栈,包括异步爬虫框架、智能代理池、反爬虫绕过技巧,以及基于机器学习的时间序列预测模型。无论您是想要追踪特定鞋款价格的潮流爱好者,还是希望构建商业级监控系统的开发者,这篇文章都将为您提供切实可行的解决方案。

2201_76125261的博客 2504

java bitmap 排序_Java实现2-BitMap排序

2-BitMap算法是BitMap算法的一种扩展,核心是:每个数分配2个bit,00表示不存在,01表示出现一次,10表示出现2次,11表示多次或无意义。一个int类型,占4个字节,在2-BitMap中可以表示16个数,表示全部int类型数据需要内存2^32*2bit=1G。时间复杂度O(n)。经常用来解决的问题如下:2.5亿个整数中找出不重复的整数的个数,内存空间不足以容纳这2.5亿个整数。将b...

weixin_39801613的博客 517

Pulseaudio之同步/异步(十一)

PulseAudio是一个声音服务器,一个后台进程从一个或多个音源(进程或输入设备)接受声音输入 然后重定向声音到一个或多个槽(声卡,远程网络PulseAudio服务,或其他进程)。 PulseAudio的主要特点包括: 可对每一个应用程序进行音量控制Per-application volume controls 可扩展的插件与支持可装载模块架构 兼容性许多流行的音频应用程序 支持多重音源和多重输出 低延时操作和支持延迟测量 一个对处理器资源效率零拷贝内存架构 能够发现本地网络上使用PulseAu

Android系统攻城狮 996

深度拆解 ‘High-Frequency Trading’ (HFT) 系统:解析如何在 100 纳秒内完成从网卡到 C++ 策略的响应

在100纳秒内完成从网卡到C++策略的响应,这是一项对技术栈每一个层面都进行极限优化的系统工程。它要求我们深入理解计算机体系结构、操作系统、网络协议和C++语言的底层机制。从物理距离的极致缩短,到高性能网卡和内核旁路技术,再到C++代码中每一个字节、每一个CPU周期的精打细算,HFT系统展现了人类对计算速度的永恒追求。这项技术不仅仅应用于金融交易,其背后的低延迟理念和实现方法,如DPDK、无锁编程、硬件加速等,正在逐渐渗透到其他对延迟敏感的领域,例如电信网络、边缘计算和工业自动化。

weixin_41455464的博客 1039

bitmap思想和2-Bitmap 实现

摘自:http://hi.baidu.com/passerryan/item/5fd2fd571e9ead9208be1757 bitmap思想和2-Bitmap 实现 1. Bit-map思想 给你一堆西安市的电话号码列表,数量大概在千万级,要求从中找出所有重复的电话号码,需要时间复杂度尽可能小。 目前西安市的电话号码大概都以8开头,为

向往大海专栏 710

q-learning精讲

Q-learning Q-learning是一种用于机器学习的强化学习技术。 Q-learning的目标是学习一种策略,告诉Agent在什么情况下要采取什么行动。 它不需要环境模型,可以处理随机转换和奖励的问题,而无需进行调整。 对于任何有限马尔可夫决策过程(FMDP),Q学习找到一种最优的策略,即从当前状态开始,它在任何和所有后续步骤中最大化总奖励的预期值。在给定无限探索时间和部分随机策略的情况...

weixin_41697507的博客 1万+

php实现2-bitmap

1.前言先说一下什么是2-bitmap,为每个数分配2bit,00表示没有出现过,01表示出现过1次,10表示出现过2次及以上,11表示无意义。下面有个需求,求出一个数组中出现过一次的数字,显然用bitmap是无法实现的,位图法只能判断出是否出现过,但是只出现过一次是无法确定的,用2-bitmap正好能解决这种情况。2.数据结构既然连个bit表示一个数字,则能容纳的数字个数就是bitmap的一半插...

Mr.yang 1250

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

bitmap与2bitmap c++实现

#include &lt;iostream&gt; #include &lt;vector&gt; using namespace std; /*************************************************** *  函数功能: 2bitmap  在2.5亿个整数找出不重复的整数,内存不足以容纳着2.5亿个整数 //采用2-Bitmap(每个数分配2bit,00...

因每天学习而伟大 646

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

bitmap2drawable-两者的转化实现

先来看今天遇到的一个问题,是关于mms报错的。后来发现报的地方如下 Bitmap deleteBitMap = ((BitmapDrawable)mChipDelete).getBitmap(); Drawable mChipDelete = r.getDrawable(R.drawable.chip_delete); 我发先,chip_delete,我用的是.9图片。报错信...

weixin_30279751的博客 161

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Android跨进程传输大图思考及实现_aidl bitmap(2)

文件中的,我们看上面测试的两个例子,其中有一个传了。

2401_84519998的博客 710

海量数据解决思路之BitMap

原文地址:http://blog.51cto.com/zengzhaozheng/1404108 一、概述   本文将讲述Bit-Map算法的相关原理,Bit-Map算法的一些利用场景,例如BitMap解决海量数据寻找重复、判断个别元素是否在海量数据当中等问题.最后说说BitMap的特点已经在各个场景的使用性。 二、Bit-Map算法 先看看这样的一个场

lizhou828的专栏 215

Android Bitmap(一), 资源重用

一、为什么Bitmap需要资源重用 Android 中图片显示的实体其实是一个 Bitmap 对象, 每次图片显示时, 都会构建一个 Bitmap 对象, 不用时再销毁, 假设, 在一个长列表且列表的每项都有一个图片显示, 持续滑动这个列表, 内存中的行为就是, 持续的创建 Bitmap 对象和产生不用的 Bitmap 对象, 当量级到达一定程度, 会触发 GC, 这样持续滑动界面, 势必会频繁触发 GC, 导致界面卡顿 二、Bitmap 内存管理的演变 以下内容参考官文: 管理位图内存 Androi

πππ 512

用Bundle传Bitmap图片

方法一: 在做项目中要实现将图片传到另外一个Activity中,利用利用bunble传值 1、Bitmap bitmap = null;Intent intent = new Intent();Bundle bundle = new Bundle();bundle.putParcelable("bitmap", bitmap);intent.putExtras( bundle); ...

weixin_30493321的博客 1194

Android两种 旋转Bitmap方法

原文地址:https://www.cnblogs.com/exmyth/p/4632700.html 旋转有两种方案,一种是旋转控件,还有一种是在旋转bitmap 旋转bitmap有两种方式 Android两种 旋转Bitmap方法 方法1. 利用Bitmap.createBitmap    Bitmap adjustPhotoRotation(Bitmap bm, final int ...

chenhuakang的博客 4883

java实现的BitMap

java bitmap

然然然的博客 697

Bitmap算法

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34032779的博客 84

BitMap的原理和实现

相关概念 基础类型 在java中: byte -> 8 bits -->1字节 char -> 16 bit -->2字节 short -> 16 bits -->2字节 int -> 32 bits -->4字节 float -> 32 bits -->4字节 long -> 64 bits -->8字节 位运算符 在java中,int数据底层以补码形式存储。int型变量使用32bi

sushuiyuzhou的专栏 668
上一篇: Trie的java实现
下一篇: MySQL索引背后的数据结构及算法(吐血推荐)
大树叶
博客等级 码龄12年 1171粉丝 664原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值