集合论与位运算之间的转换

news2024/9/20 18:42:52

集合可以用二进制表示,二进制从低到高第 i 位为 1 表示 i 在集合中,为 0 表示 i 不在集合中。例如集合 {0,2,3} 可以用二进制数 1101(2)​ 表示;反过来,二进制数 1101(2)​ 就对应着集合 {0,2,3}。

例如集合 {0,2,3} 可以压缩成 20+22+23=13,也就是二进制数 1101(2)​。

一、集合与集合

其中 & 表示按位与,| 表示按位或, 表示按位异或,~ 表示按位取反。

两个集合的「对称差」是只属于其中一个集合,而不属于另一个集合的元素组成的集合,也就是不在交集中的元素组成的集合。

注 1:按位取反的例子中,仅列出最低 4个比特位取反后的结果,即 0110 取反后是 1001。

注 2:包含于的两种位运算写法是等价的,在编程时只需判断其中任意一种。

注 3:编程时,请注意运算符的优先级。例如 == 在某些语言中优先级比位运算更高。

二、集合与元素

在处理集合与元素的关系时,通常会用到移位运算。

其中 << 表示左移,>> 表示右移。

注:左移 i 位相当于乘以 2i,右移 i 位相当于除以 2i(注意,这里的除法指的是整数除法,即结果向下取整)。

      s = 101100
    s-1 = 101011 // 最低位的 1 变成 0,同时 1 右边的 0 都取反,变成 1
s&(s-1) = 101000

特别地,如果 s 是 2 的幂,那么 s&(s−1)=0。

此外,编程语言提供了一些和二进制有关的库函数,例如:

  • 计算二进制中 1 的个数,也就是集合大小;
  • 计算二进制长度(位数),减一后得到集合中最大元素的索引(注意,这里通常指的是从0开始计数的索引,如果要得到实际的元素值,则需要根据位数计算,即 2位数−1);
  • 计算二进制尾零个数,这个操作通常用于获取最低位的 1 之前的 0 的个数,但直接将其解释为集合最小元素可能不太准确,因为集合中的元素通常是从 0 或 1 开始的连续整数。不过,在某些特定场景下,这个信息可能有助于推断集合的某些性质。

调用这些函数的时间复杂度通常是 O(1),意味着它们可以在常数时间内完成计算,不随输入规模的增长而增长。

特别地,只包含最小元素的子集,即二进制最低 11及其后面的 0,也叫 lowbit,可以用 s & -s 算出。举例说明:

     s = 101100
    ~s = 010011
(~s)+1 = 010100 // 根据补码的定义,这就是 -s  =>  s 的最低 1 左侧取反,右侧不变
s & -s = 000100 // lowbit

三、遍历集合

设元素范围从 0 到 n−1,枚举范围中的元素 i,判断 i 是否在集合 s 中。

for (int i = 0; i < n; i++) {
    if (((s >> i) & 1) == 1) { // i 在 s 中
        // 处理 i 的逻辑
    }
}

也可以直接遍历集合 s 中的元素:不断地计算集合最小元素、去掉最小元素,直到集合为空。

for (int t = s; t > 0; t &= t - 1) {
    int i = Integer.numberOfTrailingZeros(t);
    // 处理 i 的逻辑
}

四、枚举集合

枚举所有集合

设元素范围从 0 到 n−1,从空集 ∅ 枚举到全集 U:

for (int s = 0; s < (1 << n); s++) {
    // 处理 s 的逻辑
}

枚举非空子集

设集合为 s,从大到小枚举 s 的所有非空子集 sub:

for (int sub = s; sub > 0; sub = (sub - 1) & s) {
    // 处理 sub 的逻辑
}

枚举子集(包含空集)

如果要从大到小枚举 ss的所有子集 sub(从 ss枚举到空集 ∅),可以这样写:

int sub = s;
do {
    // 处理 sub 的逻辑
    sub = (sub - 1) & s;
} while (sub != s);

原理是:当 sub=0(空集)时,再减一就得到 -1,对应的二进制为 111⋯1。然后再与 s 进行按位与操作(&),就得到了 s。所以当循环到 sub=s 时,说明最后一次循环的 sub=0(空集),s 的所有子集都枚举到了,此时可以退出循环。

Gosper's Hack(枚举全集 U 的所有大小恰好为 k 的子集)

public class GospersHack {  
      
    // 打印一个整数表示的子集,其中集合是 0 到 n-1 的整数  
    private static void printSubset(int subset, int n) {  
        for (int i = 0; i < n; i++) {  
            if ((subset & (1 << i)) != 0) {  
                System.out.print(i + " ");  
            }  
        }  
        System.out.println();  
    }  
      
    // 使用 Gosper's Hack 枚举所有大小为 k 的子集  
    public static void enumerateSubsets(int n, int k) {  
        // 初始子集是所有最低位的 k 个 1  
        int subset = (1 << k) - 1;  
          
        // 循环直到达到上限(所有 n 个位中的 k 个 1 的最大子集)  
        while (true) {  
            // 打印当前子集  
            printSubset(subset, n);  
              
            // 查找需要翻转的最低位的 1(即需要向右移动的最低位的 1)  
            int x = subset & -subset; // 找到最低位的 1  
            int y = subset + x; // 将该位及其左边的所有位设为 1  
              
            // 清除 y 中从最低位的 1 到最右边的 1 之间的所有位  
            y = (y / x) >> 1;  
              
            // 翻转 y 中最右边的 1 及其右边的所有位  
            subset = subset ^ y;  
              
            // 检查是否已经生成了所有子集  
            if ((subset & (1 << (k - 1))) == 0) {  
                break;  
            }  
        }  
    }  
      
    public static void main(String[] args) {  
        int n = 4; // 集合大小  
        int k = 2; // 子集大小  
        enumerateSubsets(n, k);  
    }  
}

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

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

相关文章

干货|软件测试简历的编写以及注意事项

一、个人信息 1.年龄超过30岁的&#xff0c;就不体现年龄&#xff1b; 2.学历是本科的&#xff0c;以及专业是计算机的可以加上学历、专业2个标签&#xff0c;大专的则可以不体现&#xff1b; 3.英语过了四六级的可以加1个英语的标签&#xff1b; 4.如果你的户籍和面试城市…

Python入门级 序列全集 [ 继上篇 进阶版 持续更新中哞哞哞!!! ]例题较多

本文主要结合例题介绍了序列【常用函数、可迭代对象】&#xff0c;字典【函数、写法、定义、视图对象】&#xff0c;集合【常用函数】&#xff0c;运算符优先级。这几种数据集合在Python中也是蛮重要的&#xff0c;对于新手比较友好。 本文例题大多来自哔站up主鱼C-小甲鱼【Pyt…

系统编程 网络 http协议

http协议------应用层的协议 万维网&#xff1a;http解决万维网之间互联互通 计算机web端网络只能看到文字 1.如何在万维网中表示一个资源&#xff1f; url <协议>&#xff1a;//<主机>&#xff1a;<端口>/<路径> ------------------------------…

Adobe After Effects的插件--------CC Ball Action

CC Ball Action是粒子效果器,其将2D图层变为一个个由3D小球构成的图层。它是AE内置的3D插件。 使用条件 使用该插件的图层需是2D图层。 我们以一张图片素材为例: 给图片图层添加CC Ball Action效果控件,然后新建一个摄像机(利用摄像机旋转、平移、推拉工具,方便在各个角…

【LeetCode面试150】——36有效的数独

博客昵称&#xff1a;沈小农学编程 作者简介&#xff1a;一名在读硕士&#xff0c;定期更新相关算法面试题&#xff0c;欢迎关注小弟&#xff01; PS&#xff1a;哈喽&#xff01;各位CSDN的uu们&#xff0c;我是你的小弟沈小农&#xff0c;希望我的文章能帮助到你。欢迎大家在…

微服务基础与Spring Cloud框架

一、系统架构的演变 1.1单体应⽤架构 Web应⽤程序发展的早期&#xff0c;⼤部分web⼯程(包含前端⻚⾯,web层代码,service层代码,dao层代码)是将 所 有的功能模块,打包到⼀起并放在⼀个web容器中运⾏。 1.2 垂直应⽤架构 当访问量逐渐增⼤&#xff0c;单⼀应⽤增加机器带来的…

【Unity3D小技巧】Unity3D中实现FPS数值显示功能实现

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址QQ群&#xff1a;398291828 大家好&#xff0c;我是佛系工程师☆恬静的小魔龙☆&#xff0c;不定时更新Unity开发技巧&#xff0c;觉得有用记得一键三连哦。 一、前言 很简单也很使用的小技巧&#xff0c;就是在Unity…

PHP酒店宾馆民宿预订系统小程序源码

酒店宾馆民宿预订系统&#xff1a;一键解锁完美旅行住宿新体验 &#x1f31f; 开篇&#xff1a;告别繁琐&#xff0c;拥抱便捷预订新时代 在这个快节奏的时代&#xff0c;每一次旅行的规划都希望能尽可能高效与省心。想象一下&#xff0c;在规划一场说走就走的旅行时&#xf…

Nature | 小麦D基因组的起源和演化,野生近缘种对作物抗病改良具有重要潜力

image-20240815151428804 2024年8月14日沙特阿卜杜拉国王科技大学Brande B. H. Wulff 和 Simon G. Krattinger团队在Natue发表Origin and evolution of the bread wheat D genome研究论文&#xff0c;通过研究粗山羊草&#xff08;Aegilops tauschii&#xff0c;也被称为节节麦…

Ant-Design-Vue快速上手指南+排坑,操作详细步骤

Ant-Design-Vue是一款基于Vue.js的UI组件库&#xff0c;它不仅提供了丰富的高质量组件&#xff0c;还支持灵活的配置选项&#xff0c;使得开发者能够快速构建出既美观又功能强大的前端应用。下面将详细介绍Ant-Design-Vue的快速上手指南和排坑操作&#xff0c;帮助开发者顺利使…

Springboot整合mongodb和mysql两个数据库,mysql无法连接

一、问题 在日常开发中&#xff0c;难免需要用到mongodb和mysql数据库 当我在mongodb正常连接使用的时候&#xff0c;切换回mysql&#xff0c;发现无法连接 二、原因分析 1、端口查看被占用 winr打开命令提示符&#xff08;cmd&#xff09;&#xff0c;可以使用以下命令&…

html标签大合集一文入门

一、文档结构标签 <html>&#xff1a;网页的根标签 &#xff0c;嵌套包含所有标签。 <head>&#xff1a;头标签&#xff0c;包含文档的元数据用于编写网页的修饰内容&#xff0c;附加信息。 <body>&#xff1a;身体标签&#xff0c;用于编写展示内容&…

HTML5休闲小游戏《城市争夺战》源码,引流、刷广告利器

HTML5休闲小游戏《城市争夺战》源码&#xff0c;直接把源码上传到服务器就能使用了&#xff01; 下载链接&#xff1a;https://www.huzhan.com/code/goods468820.html

TCP Analysis Flags 之 TCP ACKed unseen segment

前言 默认情况下&#xff0c;Wireshark 的 TCP 解析器会跟踪每个 TCP 会话的状态&#xff0c;并在检测到问题或潜在问题时提供额外的信息。在第一次打开捕获文件时&#xff0c;会对每个 TCP 数据包进行一次分析&#xff0c;数据包按照它们在数据包列表中出现的顺序进行处理。可…

Java---面向对象

一.面向对象 1.概念 1.1面向过程 C 吃饭&#xff1a;动作为核心 起身--》开门--》大量的逻辑判断 1.2面向对象 C/Java/Python/Go 目标&#xff1a;吃饭 人&#xff08;忽略&#xff09;吃饭 站在人类的角度思考问题 2.什么是对象&#xff1f; Object-->东西(万事万物皆…

【数据结构2】哈希表、哈希表的应用(集合与字典、md5算法和文件的哈希值)

1 哈希表 哈希表一个通过哈希函数来计算数据存 储位置的数据结构&#xff0c;通常支持如下操作: 插入(键&#xff0c;值):插入键值对(键&#xff0c;值) Get(key):如果存在键为键的键值对则返回其值&#xff0c;否则返回空值 删除(键):删除键为键的键值对哈希表(Hash Table&am…

开发者学习类网站

目录 **1、CodeProject****2、simplilearn****3、VisuAlgo****4、Google AI****5、CodeWars****6、SourceForge****7、GeeksforGeeks****8、StackOverflow** 1、CodeProject 网址&#xff1a;https://www.codeproject.com/ CodeProject是一个免费公开自己写的代码与程序的优秀…

稀土阻燃协效剂在木质地板中的应用

木质地板作为一种天然材料&#xff0c;非常容易燃烧&#xff0c;因此需要采取措施来增强其阻燃性能。稀土阻燃协效剂基于稀土4f电子层结构带来的特有属性&#xff0c;在聚合物材料燃烧时可催化酯化成炭,迅速在高分子表面形成致密连续的碳层,隔绝聚合物材料内部的可燃性气体与氧…

vue项目png图片加载不出来的问题

前提&#xff1a;因为命名的时候 配合后端&#xff0c;所以把图片的名称设置成中文的例如&#xff1a;新增圆、新增方块等命名&#xff1b;提交到线上环境后&#xff0c;发现有些图片不能完全显示&#xff1b;鼠标移入查看地址&#xff0c;发现其他展示的图片已经转为base64的形…

SALib | 灵敏度分析Python工具箱

灵敏度分析Python工具箱 Sensitivity Analysis LibrarySupported MethodsInstallationRequirementsHow to cite SALibReference Sensitivity Analysis Library SALib是常用灵敏度分析方法的Python实现&#xff0c;包括 Sobol、Morris 和 FAST 方法。在系统建模中很有用&#x…