高斯Hack算法

背景

leetcode时,碰到一题需要求解nbit中选择mbit的所有组合集,我只想到了递归求解,没啥问题,但是在官方题解中看到了牛逼的方法(Gosper's Hack),故记录一下。

4bit中2个1的情况

  • 0011b
  • 0101b
  • 0110b
  • 1001b
  • 1010b
  • 1100b

解法

递归求解

/**** @param retain 剩余可选1的个数* @param start 下一个可选坐标,范围[0,max)* @param max 最大边界值* @param val 路径val* @param result 结果集*/
private void getSelectOptions(int retain, int start, int max, int val, List<Integer> result){if (retain == 0){result.add(val);return;}if (start >= max){return;}// 这个位置不填1this.getSelectOptions(retain,  start+1, max, val, result);// 这个位置填1this.getSelectOptions(retain-1,  start+1, max, val | (1 << (max - 1 - start)),result);
}// 获取结果
List<Integer> selectOptions = new LinkedList<>();
this.getSelectOptions(numSelect, 0, 12, 0, selectOptions);

这个有个缺点,就是遍历了所有的case。个人感觉不是很优雅

Gosper’s Hack

思路

人工写出4个bit2个1的所有场景,可以这么写0011b,0101b,0110b,1001b,1010b,1100b
它的处理步骤如下:

  • 找到最右边的1,假设位置为i
    从[i,31]中找到最右端的1,假设替换位置为j(j>i)
    [0,j)中所有的1全部移到最右边
    循环处理

干,语文不好,描述的不太清楚,可以看看参考文章

代码

/**
* 获取所有bit组合数
* @param limit 总共bit数
* @param select 选取的bit数
* @return
*/
public static List<Integer> getAllBitCombination(int limit, int select){// 边界值处理if (limit >= 31 || limit <= 0 || select <= 0 || limit < select){return new LinkedList<>();}List<Integer> result = new LinkedList<>();int val = (1 << select) - 1, r, t;  //1int max = 1 << limit; //2while (val < max){ //3// 将符合条件的数加入结果集result.add(val);//4// 获取val中最右边的1r = val & -val;//5// 最右边的1进位左移,替换左边的第一个0槽位t = val + r;//6val = (((val ^ t) / r)  >> 2)| t;//7}return result;
}

解读

测试case

4bit中里面存在2个1的解集
limit=4select=2

步骤1

获取最小符合条件的解

  • 1 << 2 => 0100b => 4
  • (1<<2)-1 => 0011b => 3
步骤2

获取最大边界值
1<<4 => 10000 => 16

步骤3

循环获取值,知道超过边界值

步骤4

加有效的结果集加入,或者可以直接进行结果处理

步骤5

获取val中最右边的1,例如011010对应的结果为000010

步骤6

最右边的一向左扫描,替换首个碰到的零。例如011010变成011100

步骤7
(val^t)

获取步骤6中变更的路径

val                                           0 1 1 0 1 1 0 b
r                                             0 0 0 0 0 1 0 b
t                                             0 1 1 1 0 0 0 b
val^t                                         0 0 0 1 1 1 0 b
(val^t)/r

处理相对偏移量。移除右边的零,因为要将所有的1放到右边

val                                           0 1 1 0 1 1 0 b
r                                             0 0 0 0 0 1 0 b
t                                             0 1 1 1 0 0 0 b
val^t                                         0 0 0 1 1 1 0 b
(val^t)/r                                     0 0 0 0 1 1 1 b
((val^t)/r)>>2

移除两个变更点,原来是1的变成0,原来是0的变成1

val                                           0 1 1 0 1 1 0 b
r                                             0 0 0 0 0 1 0 b
t                                             0 1 1 1 0 0 0 b
val^t                                         0 0 0 1 1 1 0 b
(val^t)/r                                     0 0 0 0 1 1 1 b
((val^t)/r)>>2                                0 0 0 0 0 0 1 b
(((val^t)>>2/r)|t

拼凑结果

在这里插入图片描述

参考文章

貌似需要翻墙

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

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

相关文章

基于协同过滤的零食推荐系统

介绍 协同过滤算法&#xff1a;协同过滤是推荐系统中比较常用的算法之一&#xff0c;其核心思想是寻找用户之间的相似性&#xff0c;通过发现用户之间的共性&#xff0c;向用户推荐可能喜欢的商品或服务。Python Django Vue&#xff1a;Django 是一个基于 Python 的 Web 开发框…

模型的权值平均的原理和Pytorch的实现

一、前言 模型权值平均是一种用于改善深度神经网络泛化性能的技术。通过对训练过程中不同时间步的模型权值进行平均&#xff0c;可以得到更宽的极值点&#xff08;optima&#xff09;并提高模型的泛化能力。 在PyTorch中&#xff0c;官方提供了实现模型权值平均的方法。 这里…

遥感类SCI期刊_一区二区汇总

IEEE Geoscience And Remote Sensing Magazine(Ieee地球科学与遥感杂志) h-index:19 CiteScore:17.80 1区 IEEE Geoscience and Remote Sensing Magazine | IEEE Xplore Remote Sensing Of Environment(环境遥感) h-index:238 CiteScore:24.80 1区 https://www.scienced…

深度学习15—(迁移学习)冻结和解冻神经网络模型的参数

冻结与解冻代码&#xff1a; def freeze_net(net):if not net:returnfor p in net.parameters():p.requires_grad Falsedef unfreeze_net(net):if not net:returnfor p in net.parameters():p.requires_grad True 这段代码定义了两个函数&#xff1a;freeze_net 和 unfree…

webview全屏处理,即插即用

去年双十一有个直播的需求&#xff0c;听起来很简单&#xff0c;技术也都很成熟&#xff0c;但是真的开始实现后&#xff0c;还是有不少坑的&#xff0c;首先第一个uc内核不支持webRTC协议&#xff0c;需要重新开发chrome内核的webview&#xff0c;其次webview全屏处理、悬浮窗…

PYTHON通过跳板机巡检CENTOS的简单实现

实现的细节和引用的文件和以前博客记录的基本一致 https://shaka.blog.csdn.net/article/details/106927633 差别在于,这次是通过跳板机登陆获取的主机信息,只记录差异的部份 1.需要在跳板机相应的路径放置PYTHON的脚本resc.py resc.py这个脚本中有引用的文件(pm.sh,diskpn…

查询速度提升15倍!银联商务基于 Apache Doris 的数据平台升级实践

本文导读&#xff1a; 在长期服务广大规模商户的过程中&#xff0c;银联商务已沉淀了庞大、真实、优质的数据资产数据&#xff0c;这些数据不仅是银联商务开启新增长曲线的基础&#xff0c;更是进一步服务好商户的关键支撑。为更好提供数据服务&#xff0c;银联商务实现了从 H…

EI级 | Matlab实现VMD-TCN-LSTM变分模态分解结合时间卷积长短期记忆神经网络多变量光伏功率时间序列预测

EI级 | Matlab实现VMD-TCN-LSTM变分模态分解结合时间卷积长短期记忆神经网络多变量光伏功率时间序列预测 目录 EI级 | Matlab实现VMD-TCN-LSTM变分模态分解结合时间卷积长短期记忆神经网络多变量光伏功率时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.【E…

Springboot3新特性:开发第一个 GraalVM 本机应用程序(完整教程)

在讲述之前&#xff0c;各位先自行在网上下载并安装Visual Studio 2022&#xff0c;安装的时候别忘了勾选msvc 概述&#xff1a;GraalVM 本机应用程序&#xff08;Native Image&#xff09;是使用 GraalVM 的一个特性&#xff0c;允许将 Java 应用程序编译成本机二进制文件&am…

AI-数学-高中-5.求函数解析式(4种方法)

原作者视频&#xff1a;函数】3函数解析式求法&#xff08;易&#xff09;_哔哩哔哩_bilibili 1.已知函数类型-待定系数法&#xff1a;先用待定系数法把一次或二次函数一般表达式写出来&#xff1b;再用“要变一起变”左右两边同时替换&#xff0c;计算出一般表达式的常数&…

18、golang时间管理

时间 时间是非常重要的&#xff0c;离开了时间&#xff0c;几乎没有哪个生产环境数据能够有意义。 在Go语言中&#xff0c;时间定义为Time结构体。 package mainimport ("fmt""time" )func main() {var t time.Now()fmt.Println(t) fmt.Printf("%…

【嵌入式-裸机开发】kermit工具安装使用

安装ckermit sudo apt-get install ckermit配置kermit vim ~/.mykermrc set line /dev/ttyS0 set speed 115200 set carrier-watch off set handshake none set flow-control none robust set file type bi…

ZZULIOJ 1121: 电梯

题目描述 在某一高层建筑内只有一部电梯&#xff0c;当你按下一个数时&#xff0c;电梯会运行到那一层。已知电梯每上升一层需6秒&#xff0c;下降一层需4秒&#xff0c;在需要停留的那层停留5秒。现有N个整数组成的一个需求列表&#xff0c;电梯将依次响应&#xff0c;电梯从…

树的高度C++(dfs)

树是一种特殊的图结构&#xff0c;有根树是一个有固定根的树。 现在给定一棵有根树&#xff0c;编程求出树中所有节点到指定的根节点最远距离。 输入格式 第一行是两个整数 N,M&#xff0c;表示数的顶点数和根节点的编号。接下来 N−1 行&#xff0c;每行两个整数 u,v&#xf…

SpringIOC之support模块GenericGroovyApplicationContext

博主介绍&#xff1a;✌全网粉丝5W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战&#xff0c;博主也曾写过优秀论文&#xff0c;查重率极低&#xff0c;在这方面有丰富的经验…

商务外语MR混合现实仿真情景实训教学

MR混合现实技术是一种将虚拟世界与真实世界相结合的技术。通过MR设备&#xff0c;我们可以将虚拟的场景、人物、物品等元素实时地呈现在真实的环境中&#xff0c;实现真实与虚拟的完美融合。在商务外语的实训教学中&#xff0c;MR技术可以为我们提供丰富的场景资源&#xff0c;…

【c++】利用嵌套map创建多层树结构

通常树的深度都大于1&#xff0c;即树有多层&#xff0c;而树结构又可以用c的map容器来实现&#xff0c;所以&#xff0c;本文给出了一种多层树结构的实现思路&#xff0c;同时也给出了相应的c代码。 整体思路概述 首先定义一个节点类Node类&#xff0c;要包括children&#x…

FineBI实战项目一(17):热门商品Top10分析开发

点击新建组件&#xff0c;创建热门商品Top10组件。 选择柱状图&#xff0c;拖拽cnt&#xff08;总数&#xff09;到横轴&#xff0c;拖拽goodName到纵轴。 选择排序规则。 修改横轴和纵轴的标签名称 切换到仪表板&#xff0c;拖拽组件到仪表板 效果如下&#xff1a;

运维信创:驱动数字化转型,塑造企业未来之篇章

随着信息技术的迅猛发展&#xff0c;数字化转型已成为企业生存和发展的必由之路。在数字化转型的过程中&#xff0c;运维作为企业IT的重要组成部分&#xff0c;其信创成熟度直接关系到数字化转型的进程。本文将深入探讨运维的信创&#xff0c;分析其与信创的区别、技术成熟度、…

代码随想录算法训练营第四天|24. 两两交换链表中的节点,19.删除链表的倒数第N个节点,面试题 02.07. 链表相交,142.环形链表II,总结

系列文章目录 代码随想录算法训练营第一天|数组理论基础&#xff0c;704. 二分查找&#xff0c;27. 移除元素 代码随想录算法训练营第二天|977.有序数组的平方 &#xff0c;209.长度最小的子数组 &#xff0c;59.螺旋矩阵II 代码随想录算法训练营第三天|链表理论基础&#xff…