位图bitset及其应用——【C++实现】

news2024/11/20 14:39:51

bitse

本章代码gitee仓库:位图实现及其应用

文章目录

    • 1.位图的概念
    • 2. 位图的实现
    • 3. 位图应用

1.位图的概念

当面对海量数据时,我们一般的数据结构无法存储那么多的值,要对这些数据进行分析,我们就可以采用位图来对这些数据进行标记(不是存储)。位图适用于海量数据,数据无重复的场景,通常用来判断这个数据是否存在

给40亿个不重复的无符号整数,没排过序。给一个无符号整数,如何快速判断一个数是否在这40亿个数中。【腾讯】

  • 方法1:

    直接遍历,时间复杂度为O(N)

  • 方法2:

    先排序(O(N*logN)),再用二分(O(logN))

以上这两种方法,都忽略了,这是40亿无符号整数,差不多需要16G的空间,这对于我们普通的电脑,是行不通的。

那在这种情况下,就可以使用位图解决

如图示例(小端平台):

image-20230922154622090

2. 位图的实现

template<size_t N>
class bitset
{
public:

    bitset()
    {
        _a.resize(N / 32 + 1, 0);	//至多多开一个int 空间
    }


    void set(size_t x)
    {
        size_t i = x / 32;
        size_t j = x % 32;
        //置1
        _a[i] |= (1 << j);
    }

    void reset(size_t x)
    {
        size_t i = x / 32;
        size_t j = x % 32;

        //置0
        _a[i] &= ~(1 << j);
    }

    bool test(size_t x)
    {
        size_t i = x / 32;
        size_t j = x % 32;
        return _a[i] & (1 << j);
    }

private:
    vector<int> _a;
};
  • 这里采用vector来管理位集合的数据,int4byte,占32个比特位
  • 采用非类型模板参数,来表示要开多少个空间,N/32 + 1,这里防止开的空间不够,所有每次直接+1,至多多开一个整型空间

3. 位图应用

  1. 快速查找某个数据是否在一个集合中
  2. 排序 + 去重
  3. 求两个集合的交集、并集等
  4. 操作系统中磁盘块标记

相关题目:

  1. 给定100亿个整数,设计算法找到只出现一次的整数?

这题我们可以采用2个位图解决,01表示出现一次,10表示2次及以上的数据

template<size_t N>
class twobitset
{
public:
    void set(size_t x)
    {
        if (!bt1.test(x) && !bt2.test(x))
        {
            //出现一次的数据
            //00 ->01
            bt2.set(x);
        }
        else if (!bt1.test(x) && bt2.test(x))
        {
            //2次及以上
            //01->10
            bt2.reset(x);
            bt1.set(x);
        }
    }

    bool is_once(size_t x)
    {
        return !bt1.test(x) && bt2.test(x);
    }

private:
    bitset<N> bt1;
    bitset<N> bt2;
};

//模拟
void isOnce()
{
	bitSet::twobitset<100> tbt;
	int arr[] = { 1,2,3,3,44,6,6,4,4,6,3,1,9,6,8 ,3,22 };
	for (auto e : arr)
	{
		tbt.set(e);
	}

	for (auto e : arr)
	{
		if (tbt.is_once(e))
			cout << e << " ";
	}cout << endl;
}
  1. 给两个文件,分别有100亿个整数,我们只有1G内存,如何找到两个文件交集?

这题也是采用位图,先将数据映射到位图中,然后再比较这两个位图各位

void IN()
{
	bitSet::bitset<32> bt1;
	bitSet::bitset<32> bt2;

	int arr1[] = { 10,52,20,23,9,22 ,22 ,22 };
	for (auto e : arr1)
	{
		bt1.set(e);
	}
	int arr2[] = { 11,21,23,14,22,52 };
	for (auto e : arr2)
	{
		bt2.set(e);
	}

	for (int i = 10; i < 55; i++)
	{
		if (bt1.test(i) && bt2.test(i))
		{
			cout << i << " ";
		}
	}cout << endl;
}
  1. 1个文件有100亿个int,1G内存,设计算法找到出现次数不超过2次的所有整数

这题与第一个类似,我们也是采用两个位图,01只出现一次,10出现两次,11出现2次以上

template<size_t N>
class twobitset
{
public:
    void set(size_t x)
    {
        if (!bt1.test(x) && !bt2.test(x))
        {
            //00 ->01
            bt2.set(x);
        }
        else if (!bt1.test(x) && bt2.test(x))
        {
            //01->10
            bt2.reset(x);
            bt1.set(x);
        }
        else if (bt1.test(x) && !bt2.test(x))
        {
            //10->11
            bt1.set(x);
            bt2.set(x);
        }
    }

    bool is_once(size_t x)
    {
        return !bt1.test(x) && bt2.test(x);
    }

    //00
    //01
    //11
    bool lessTwo(size_t x)
    {
        if ((!bt1.test(x) && bt2.test(x)) || (bt1.test(x) && !bt2.test(x)))
        {
            bt1.reset(x);
            bt2.reset(x);
            return true;
        }
        return false;
    }

private:
    bitset<N> bt1;
    bitset<N> bt2;
};

//模拟
void LessTwo()
{
	bitSet::twobitset<10> bt;
	int arr[] = { 1,1,2,2,3,3,5,5,5,9,7,7,7,8,8,8,8,1 };
	for (auto e : arr)
	{
		bt.set(e);
	}

	for (auto e : arr)
	{
		if (bt.lessTwo(e))
		{
			cout << e << " ";
		}
	}cout << endl;
}

C++STL库里面bitset支持的接口:
在这里插入图片描述
有兴趣的可以查阅文档:bitset


那么本次的分享就到这里,我们下期再见,如果还有下期的话。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1031777.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

02强化学习基本概念

强化学习基本概念 前言1、State、Action、Policy等① State② Action③ State transition④ State transition probability⑤ Polity 2、Reward、Return、MDP等① Reward② Trajectory and return③ Discounted return④ Episode⑤ MDP 总结&#xff1a; 前言 本文来自西湖大学…

PMP考试300条知识点汇总,20天上岸!

PMP考试300条知识点完整内容可在文末获取。 3、项目管理 vs 运营管理 项目与日常运营的共同特征&#xff1a; 由人来做、 受制于有限的资源、需要规划、执行和控制、为了实现组织的目标或战略计划 项目与日常运营的根本区别&#xff1a; 项目是临时的&#xff1b;运营是持…

企业进行品牌推广时怎么才能达到预期广告效应?不如试试软文营销

企业进行品牌推广的目的就在于提升品牌的曝光率&#xff0c;树立该品牌在市场中的形象&#xff0c;加强品牌的影响力与公信力&#xff0c;提高产品的竞争力&#xff0c;那么企业进行品牌推广时怎么才能达到预期效果呢&#xff0c;我们可以试试软文营销&#xff0c;接下来媒介盒…

竞赛选题 基于深度学习的目标检测算法

文章目录 1 简介2 目标检测概念3 目标分类、定位、检测示例4 传统目标检测5 两类目标检测算法5.1 相关研究5.1.1 选择性搜索5.1.2 OverFeat 5.2 基于区域提名的方法5.2.1 R-CNN5.2.2 SPP-net5.2.3 Fast R-CNN 5.3 端到端的方法YOLOSSD 6 人体检测结果7 最后 1 简介 &#x1f5…

从丢失msvcp140_codecvt_ids.dll到修复,解决方法详解

在日常计算机使用过程中&#xff0c;我们有时会遇到一些烦人的错误提示。其中之一就是丢失了msvcp140_codecvt_ids.dll文件。当我们打开某些应用程序或游戏时&#xff0c;可能会收到类似于“找不到msvcp140_codecvt_ids.dll”或“该应用程序无法正常启动”的错误信息。这可能会…

Guava Cache介绍-面试用

一、Guava Cache简介 1、简介 Guava Cache是本地缓存&#xff0c;数据读写都在一个进程内&#xff0c;相对于分布式缓存redis&#xff0c;不需要网络传输的过程&#xff0c;访问速度很快&#xff0c;同时也受到 JVM 内存的制约&#xff0c;无法在数据量较多的场景下使用。 基…

按文件大小批量分类保存,高效管理你的文件!

作为一名文件管理者&#xff0c;你是否经常为如何高效地管理大量文件而烦恼&#xff1f;现在&#xff0c;我们为你提供了一种简单、快速、准确的方法&#xff0c;帮助你轻松解决这个问题&#xff01; 首先。进入文件批量改名高手主页面&#xff0c;并在板块栏里选择“文件智能…

Android 启动优化案例:WebView非预期初始化排查

去年年底做启动优化时&#xff0c;有个比较好玩的 case 给大家分享下&#xff0c;希望大家能从我的分享里 get 到我在做一些问题排查修复时是怎么看上去又low又土又高效的。 1. 现象 在我们使用 Perfetto 进行app 启动过程性能观测时&#xff0c;在 UI 线程发现了一段 几十毫…

当语文课本上的古诗词遇上拓世AI,文生图绘就东方美学画卷

东方美学自古以来一直以其深刻的内涵和精致的表现形式&#xff0c;吸引着世界各地的文化爱好者。在中国的文学传统中&#xff0c;古诗词扮演着不可或缺的角色。诗词是我国文学宝库中的瑰宝&#xff0c;也是我们民族的文化精髓。如今随着人工智能技术的崛起&#xff0c;古诗词与…

基于微信小程序付费自习室系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言运行环境说明用户微信端的主要功能有&#xff1a;管理员的主要功能有&#xff1a;具体实现截图详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考论文参考源码获取 前言 &#x1f497;博主介绍&#x…

文心一言 VS 讯飞星火 VS chatgpt (98)-- 算法导论9.3 4题

四、用go语言&#xff0c;对一个包含n个元素的集合&#xff0c;假设一个算法只使用比较来确定第i小的元素&#xff0c;证明:无需额外的比较操作&#xff0c;它也能找到第 i-1 小的元素和第 n-i大的元素。 文心一言&#xff1a; 在这个问题中&#xff0c;我们要使用一个称为&q…

做影视特效本地电脑配置不够怎么办?

影视特效对电脑要求高&#xff0c;往往本地电脑配置不足的情况下&#xff0c;会导致电脑卡顿等造成工作效率低下等问题&#xff0c;再加上现在异地协同的云电脑需求越来越高&#xff0c;更多的企业和个人开始选择做影视特效的云电脑&#xff0c;那么今天就来看看租一台云电脑如…

Swift SwiftUI 修改 List 背景颜色

Preview: Code: .listRowBackground(Color(.yellow)).scrollContentBackground(.hidden) .background(.linearGradient(colors: [.white, .accentColor], startPoint: .top, endPoint: .bottom))喜欢或对你有帮助&#xff0c;点个赞吧&#xff0c;自己先点个嘿嘿。 有错误或者…

【面试题】面试官问你前端性能优化时,他想问什么?

一直以来&#xff0c;前端性能优化都是面试过程中考察的热点题目。 相关的技术博客也层不出穷&#xff0c;我们总是能找到很多这样的文章&#xff0c; 从一个应用的各个层面开始分析&#xff0c;优化的种种手段&#xff0c;取得的种种效果。 往往篇幅越长&#xff0c;讲得越…

MySQL 远程连接1130问题

通过后台进入mysql 1,切换到mysql库 2.查询user表信息 3.更新你想远程登录的用户的host信息,我这里想用root进行远程登录,所以修改如下 4.刷新权限 5.大功告成 快来和博主打成一片吧^_^

使用人工智能聊天机器人时要注意这些!(配提问技巧)

这两年ChatGPT可谓是火遍了互联网&#xff0c;在微博等社交平台上能看到很多网友晒出了与ChatGPT对话的截图&#xff0c;精准、恰当的回答让网友们都倍感新鲜。但是有很多人把人工智能聊天机器人当成玩具&#xff0c;有很多经典犯错回答&#xff0c;不少网友戏称是“人工智障”…

如何优雅的退出线程(condition_variable )

C多线程并发编程入门&#xff08;目录&#xff09; 使用条件变量来实现在析构函数中再次向线程发出一次notify&#xff0c;之后join 线程&#xff0c;等等线程安全退出。 #pragma once #include <iostream> #include <fstream> #include <string> #include …

PerformanceOne一站式性能测试平台

PerformanceOne&#xff08;简称&#xff1a;P-One&#xff09;是泽众软件自主研发的一套一站式性能测试平台软件产品。 该产品采用 B/S 架构开发&#xff0c;实现了集管理、设计、压测、监控以及分析于一体的全方位性能测试解决方案。可有效提升性能测试技术能力&#xff0c;…

拥抱数字化时代SOP电子作业指导书系统助力企业差异化竞争

在如今的竞争激烈的市场环境中&#xff0c;企业要想在同等条件下脱颖而出&#xff0c;差异化竞争成为了关键。然而&#xff0c;与硬件相比&#xff0c;软件的差异化更具有决定性的作用。而软件的差异化往往体现在细节上&#xff0c;而不是大的战略方面。而如何将这些细节进行量…

深入理解C#中委托的使用及不同类型委托的应用示例

在C#中&#xff0c;委托是一种强大而灵活的机制&#xff0c;可以引用一个或多个方法&#xff0c;并允许以类似函数指针的方式进行调用。委托在事件处理、回调函数和多线程编程等场景中非常有用。本文将深入探讨C#中委托的使用&#xff0c;并介绍不同类型委托的应用示例。 目录…