首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C++ 哈希的应用【位图】

一个无符号整型大小是 4 字节,40 亿个无符号整型就是:40 * 4 = 160 亿字节,转换一下可知:大约需要 16 GB 的空间(10 亿字节约占 1 GB 空间) 还好,现在的笔记本普遍内存都有...显然这种方法不现实 可能有的人觉得加装内存条就行了,确实,解决现在这个问题可以,但如果把数据量提至 80亿 呢?...在 C语言 阶段,我们学习过一个知识点:大小端字节序,对于多字节的数据类型,诸如 int 存在大小端问题,比如 int a = 1 在大端机器中为:00 00 00 01 而在小端机器中为:01 00...::cout std::endl; } } } private: bitset _bs1; bitset _bs2; }; 通过下面这个 demo..._bs2.test(i))) { std::cout std::endl; } } } private: bitset _bs1; bitset

29630
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    【C++高阶】哈希—— 位图 | 布隆过滤器 | 哈希切分

    方法二:红黑树 或者 哈希表 红黑树查找的效率是logN,哈希表可以直接映射,查找的效率接近常数次,虽然他们查找的效率确实很快,但是40亿个整数,那就是160亿字节,10亿字节是1GB,16GB字节红黑树和哈希表怎么能存的下呢...但是在语言层面上并没有比特位的数组。 个比特位可以用 个int类型的数组来表示。 也可以用 个char类型的数组来表示。 随便例举一些数字,如下图所示,这里采用char类型为数组的基本单位。...而采用char类型数组就不用考虑大小端的问题,因为一个char类型就是一个字节,每个char都是从低地址到高地址排列。 上面是在内存中存储的真实样子,但是我们在使用的时候无需知道位图在内存中样子。...爬取到的URL可以通过布隆过滤器进行判断,已经存在的URL则可以直接忽略,避免重复的网络请求和数据处理。 垃圾邮件过滤 在垃圾邮件过滤系统中,布隆过滤器可以用来判断邮件是否是垃圾邮件。...对数据库查询提效 在数据库中,布隆过滤器可以用来加速查询操作。

    13810

    C++:哈希拓展-位图

    来计算一下; 答案肯定是不行的;1GB=1024MB=1024*1024KB=1024*1024*1024B(B是字节),10^9量级大约等于10亿多字节;一个整形4字节,40亿个整形就是16*10^9...字节,相当于是16亿G; 所以40亿个整数是无法直接放到内存中的,只能放到硬件文件中,而二分查找只能堆内存中的数组中的有序数据进行查找; 针对上述的空间问题,我们可以使用位图思想来实现; 二.什么是位图...}; 整体代码实现 #include #include #includeBitset> using namespace std; namespace bit...标准库中的bitset底层是使用静态数组实现的;那么这就意味着空间是在堆栈上开辟的;其实堆栈是很小的,所以当我们开出一块很大的空间的时候容易出现问题; 所以当数据量十分巨大的时候我们尽量使用自己构造的bitset...bs2;分别代表n出现次数的两个比特位; 代码实现: #include #include #includeBitset> using namespace std

    4000

    位图与布隆过滤器

    void test_bs1() { int a1[] = { 5,7,9,2,5,99,5,5,7,5,3,9,2,55,1,5,6 };//出现多个返回-1 //std::bitset<100...;它会崩掉;下面演示一下: 这里原因是什么;其实就是当无符号整型过大的时候;而库里面对应的类似栈上开的静态数组;因此栈的空间没有堆大;因此这里导致了进程崩了;我们自己实现的这个bitset就没有问题:...间接给它转移到堆上就可以了:我们在栈上创建个指针才几个字节空间;让资源都到堆上;以后操控位图直接就用这个指针不就好了。...爬取到的URL可 以通过布隆过滤器进⾏判断,已经存在的URL则可以直接忽略,避免重复的⽹络请求和数据处理。...系统可以将已知的垃圾邮件的特征信息存储在布隆过滤器中,当新的邮件到达时,可以通过布隆过滤器快速判断是否为垃圾邮 件,从⽽提⾼过滤的效率。

    7910

    DES算法C++程序设计和实现

    f -> f(Ri-1, Ki) (Feistel轮函数) 将长度为32位的串Ri-1 作E-扩展 E(Ri-1) E(Ri-1)⊕Ki 子密钥的生成 S-box 平均分成8个分组分别经过...(其他具体细节见源代码) 4 数据结构 涉及到位操作的许多部分可以利用c++中的bitset方便进行; 此外,置换表可以用一维数组表示; 每个S_BOX为一个二维数组,所以S_BOX可以用三维数组表示...本次实验没有进行填充处理,但实际上,原始明文消息按PKCS#5 (RFC 8018) 规范进行字节填充:原始明文消息最后的分组不够8个字节(64位) 时,在末尾以字节填满,填入的字节取值相同,取值都为需填充的字节数目...;原始明文消息刚好分组完全时,在末尾填充8个字节(即增加一个完整分组),字节取值都是08(因为填充了8个字节)。...6 源代码 DES.hpp // DES.hpp #include bitset> using std::bitset; class DES { public: DES(); bitset<64

    1K10

    抖音二面,内存只有 2G,如何对 100 亿数据进行排序?

    唠嗑,周末抽空把 CS-Wiki 更新了下,迁移到 vuepress 框架上来了,部署的时候 Gitee Pages 老是提示我有一篇文章包含违规内容,一通折腾最后发现是因为包含了 "ke xue 上网...数据库排序 将存储着 100 亿数据的文本文件一条一条导入到数据库中,然后根据某个字段建立索引,数据库进行索引排序操作后我们就可以依次提取出数据追加到结果集中。...全部处理完之后,我们从前往后遍历一遍 byte 数组就能获取到有序数据了,时间复杂度为 O(N) java.util 封装了 BitSet 这样一个类,是位图法的典型实现 底层用的 long 数组,一个...long 型数据占 8 个字节(64 位,也就是说 long 数组中的一个元素就可以表示 64 个数字否出现过),占比与只占 1 个字节的 byte(8 位) 来说,能存储的数据更多了 BitSet...bitSet = new BitSet(); bitSet.set(0, 2, true); 上面的代码的含义是,第 [0,2) 位会被设置成 1,也就是说这个类会自动地生成一个 long 型的元素,

    4.1K10

    【笔记】《C++Primer》—— 第17章:标准库特殊设施

    这里要注意string的下标编号习惯与bieset正好相反,string的内容会初始化在bitset的右侧,因为bitset的低位在右侧 ?...pos,v)将某个位置位为v,to_string(zero,one)将bitset转换回字符串string bitset也可以直接与IO流协作,cin时最多接受到bitset满载 17.3 正则表达式...平时常见的是格式化IO操作,而未格式化IO操作允许我们将一个流当作一个无解释的字节序列处理,最常用的就是读取一个字符的get函数和输出一个字符的put函数,然后对于istream,我们可以用get将下一个字节作为...int返回,putback(ch)可以将任意一个字符放回流中,peek可以将下一个字节作为int返回但不会从流中拿走它,unget会自动将最后一个取出的字符放回。...一个很常见的错误就是将get,peek之类的函数返回值赋值给char而不是int,当读取到EOF时赋值给char得到的值会与int型的EOF不同,这很容易产生一些错误的判断 一些操作可以进行多字节的未格式化

    1.1K20

    从七桥问题开始:全面介绍图论及其应用

    位集合(Bitset)允许储存 20 个不同数据而只用 20 个字节。...最可能的情况是将所有房源的完整对象保存在哈希表,并将房源 ID 映射到房源的完整对象中,以及保存另一个哈希表(或更好的,一个数组),该哈希表将价格与房源 ID 进行映射。...如果我们将返回标题中包含「Inter」的所有电影(不仅仅是以「Inter」开头的电影)那就太好了,并且该列表将根据电影的评分或与该特定用户相关的内容进行排序(喜欢惊悚片比戏剧更多)。...他们分析每个文档的内容,对其进行标记(将其分解为更小的实体和单词)并添加到表中,该表将每个标记(词)映射到标记已被「看到」的文档标识(网站)。...倒排索引 哈希表,再提一次。是的,我们将为此倒排索引(索引结构存储来自内容的映射)保留哈希表。哈希表会将关键字映射到物品的 BST。为什么选择 BST?

    2K80

    大量数据去重bitMap位图解决方案

    可创建一个整型数组(如byte数组,int数组,long数组)来表示 Bitmap原理 在Java中,数据类型int占4字节,4字节=32位(1 byte = 8 bit) 数据类型byte占1字节,1...字节=8位 用byte数组来表示 集合 {1,2,4,6},byte数组一个元素占一个字节,一个字节占8位 计算机内存分配的最小单位是字节,也就是8位,那如果要表示集合{1,2,4,6,12,13,15...void or(BitSet set) 对此目标位集执行逻辑或操作 void clear() 将此 BitSet 中的所有位设置为 false void clear(int bitIndex):将指定索引处的位设置为...false void set(int index) 将指定索引处的位设置为 true boolean get(int index) 返回指定索引处的位值 int size():返回此 BitSet...,通过hash值转换 原理 将元素添加到一个bitmap数组中,每个散列函数将元素映射到bitmap数组中的一个位置 如果该位置已经被占用,则将该位置置为1,否则置为0 当要查询一个元素是否存在时

    1.3K20

    不得不掌握的三种BitMap

    java.util包中提供了BitSet类型,其内部包含了一个long类型的数组,通过位运算实现bitmap功能,简单看下其使用方式: val bitSet:util.BitSet=new util.BitSet...()//2 bitSet.size() //64/8=8 字节 接下来存储一个10000的数字: bitSet.set(10000) bitSet.cardinality()//2 bitSet.size...RoaringBitmap RoaringBitmap 是一种压缩bitmap,其思想就是采用高低位存储方式,将一个Int类型的数据转换为高16位与低16位,也就是两个short类型的数据,高位存储在一个...通过(short) (x & 0xFFFF)操作得到value, 根据获取到的key对应下标从values里面查询具体的值 到目前为止还未介绍Container,也就是其低16位的处理方式,它是一个抽象类...Roaring64NavigableMap Roaring64NavigableMap也是使用拆分模式,将一个long类型数据,拆分为高32位与低32位,高32位代表索引,低32位存储到对应RoaringBitmap

    59410

    C++一分钟之-位操作与位集(bitset)

    本文将深入浅出地介绍C++中的位操作和bitset类,探讨常见的问题、易错点,并提供代码示例来展示如何避免这些错误。位操作基础位操作涉及对整型数据的二进制表示进行直接操作。...0 std::cout std::endl; return 0;}bitset类bitset是C++标准库中的一个容器...这意味着你不能用运行时确定的值来初始化bitset。bitset的索引从0开始,与数组类似,但初学者可能会忘记这一点。如何避免:在初始化bitset时,确保其大小是一个已知的常量。...示例代码:#include #include bitset>int main() { std::bitset bits("10101010"); // 初始化8位的bitset...:cout std::endl; } return 0;}通过上述介绍和示例,我们可以看到位操作和bitset在C++中的强大功能。

    30710

    手把手:四色猜想、七桥问题…程序员眼里的图论,了解下?(附大量代码和手绘)

    ; bool superhost; bitset amenities; bitset facilities; bitset property_types; bitset...最有可能的情况是,将所有房屋的完整对象保存在一个哈希表中,房屋ID映射房屋对象,同时建立另一个哈希表(或者一个数组),用房屋ID映射价格。...总的来说,当一个用户发送推文,我们应当获取该用户的关注者列表,并更新这些关注者的时间线(将内容相同的推文插入它们的时间线)。时间线可以用列表或是平衡树表示(以推文发送时间的数据作为节点)。...如果这个程序可以找出标题中包含“Inter”的所有电影(包括并没有以“Inter”开头,但是标题中包含这个关键字的电影),并且该列表将按电影的评分或与该特定用户相关的内容进行排序就更好了(例如,某用户更喜欢惊险片而不是戏剧...他们分析每个文档的内容,对其进行标记(将其分解为更小的词组和单词)并添加到列表中。 这个表将每个标记(单词)映射到已被标记成 ”包含这个标记” 的文档或网站的ID上。

    2.2K40

    海量数据处理之bitmap

    要快速的解决这个问题最好的方案就是将数据搁内存了,所以现在的问题就在如何在2G内存空间以内存储着40亿整数。...一个int整数在java中是占4个字节的即要32bit位,如果能够用一个bit位来标识一个int整数那么存储空间将大大减少,算一下40亿个int需要的内存空间为40亿/8/1024/1024大概为476.83...mb,这样的话我们完全可以将这40亿个int数放到内存中进行处理。...具体思路: 1个int占4字节即4*8=32位,那么我们只需要申请一个int数组长度为 int tmp[1+N/32]即可存储完这些数据,其中N代表要进行查找的总数,tmp中的每个元素在内存在占32位可以对应表示十进制数...(bitSet.size()); //64 //将数组内容组bitmap for(int i=0;i<array.length;i++) {

    1.3K20
    领券