首页 > 编程知识 正文

位图数据量,数据库物理结构设计

时间:2023-05-04 10:18:41 阅读:116793 作者:2999

今天在位图中介绍的数据结构被称为位图。 在谈论什么是位图之前,先看看“非常简单的问题”。 有40亿个无符号整数数据。 现在给定目标数字,判断该数字是否在这40亿数据中。 主题确实看起来很简单。 一些同学说,直接遍历就ok了。 其他同学通过对这些数字进行排序和二分钟搜索,展示了更高效的搜索方法。 但是,这有问题。 问题不是你搜索这个数字的效率问题,而是你可以扫描或排序。 这些数字在内存里吗?

一个整数int是4字节,10亿个int已经需要4G内存,40亿个int是16G。 所以,这里方法行不通的根本原因实际上是内存不足,而今天的位图可以很好地处理这个问题。

既然位图模型的根本原因是这些数据int无法容纳,还有什么比标记这些数字更小的呢? 没错,一些同学认为char可能只要占一个字节就能代表一个数字。 但是,随着数字位数的增加,仍然不能用一个字符表示一个数字。 这意味着低于4G的内存仍然无法解决此问题。

其实到目前为止,我们的问题已经转化为使用更小的存储单元标记数字的方法,但在程序中是我们最小的访问单位的bit位,所以这里我们如何使用位标记(映射)这些数据

当前,4个字节本来只能存储一个int,但使用位图存储(映射)了32个数字。 这意味着16G/32大约可以在500米左右映射这些数据。 那么,这些数据是如何映射到位图的呢? 接下来请看。

为了便于设计位图,我们将位图表示为一个数组,以便矢量为我们提供连续的空间。 只负责数据的设定或删除。

class bitmap { public : bitmap (size _ trange ) /向右移动5位相当于除以32,加上1等于小于32的数字除以32等于0_bittable.resize )。 (; 设置位图元素

voidsetbit(size_tx ) {size_t index=x 5; size_t num=x % 32; _bitTable[index] |=(1 num ); }看看为什么需要size_t index = x 5size_t num = x % 32两级操作。 让我们来看看映射5和32两个个数

5表示防止第一个整数空间中的第五个,32表示放置在第二个整数空间中的第一个。 另一方面,**bittable[index]|=(1num ) *将num位的数字设置为1,并确保其余数字保持不变。

删除位图元素

比较简单,需要知道的是,**~(1num ) *表示num位为0,其余位均为1。

voidremovebit(size_tx ) {size_t index=x 5; size_t num=x % 32; _bittable[index]=~(1num ); }查找位图元素

这个什么都别说,很简单。 说到这里,你的位图也就完成了。 很简单

OOLtestbit(size_tx ) {size_t index=x 5; size_t num=x % 32; return_bittable[index](1num; }完整代码:

class bitmap { public : bitmap (size _ trange ) ) _ bittable.resize (range5)1); //表示位图中数字位置的voidsetbit(size_tx ) {size_t index=x 5; size_t num=x % 32; _bitTable[index] |=(1 num ); //去除位图中的数字标记. voidremovebit(size_tx ) {size_t index=x 5; size_t num=x % 32; _bittable[index]=~(1num ); }booltestbit(size_tx ) {size_t index=x 5; size_t num=x % 32; return_bittable[index](1num; } private : vector int _ bittable; (; 展开现在修正问题,让你在40亿个数据中寻找出现两次的数据。 这个时候,我们需要用两个人来标记同样的数据。

n位图的实现如下:

classnbitmap { public : n bitmap (size _ trange ) ) _bittable.resize ) (range4)1); }voidsetbit(size_tx ) {size_t index=x 4; size_t num=x % 16; num *=2; OOLfirst=_bittable[index](1num ); OOLsecond=_bittable[index](1) num1); if (! (第一次连接) ) _bittable[index]=)1num; }booltestbit(size_tx ) {size_t index=x 4; size_t num=x % 16; num *=2; 返回(bittable [ index ] num )0x03; } private : vector int _ bittable; (; 关于位图的说明到此为止。 现在,让我们在10亿个字符串中寻找一次出现的字符串。 一些同学毫不犹豫地使用我们使用的位图。 但是仔细想想,我们的位图只是可以映射数字类型的数据,到了字符串和其他文件,似乎就没那么自信了。 请不要着急。 聪明的悲伤招牌有一个叫布隆过滤器的骚动。 请看下面的博客哦。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。