减治法在生成子集问题中的应用(JAVA)--递归、二进制反射格雷码

减治法在生成组合对象问题中的应用

生成子集问题:经典的背包问题就是求解一个最优子集的问题,这里我们来讨论一个更简单的问题。对于任意一个集合来说,它都存在2^n个子集(一个集合所有的子集集合称为幂集)。

1)简单递归实现:

import java.util.ArrayList;
import java.util.List;public class Main {public static void main(String[] args) {List<Integer> list = new ArrayList<>();list.add(1);list.add(2);list.add(3);List<Integer> li = new ArrayList<>();f(0, list, li);}public static void  f(int i, List list, List li) {if (i > (list.size() - 1)) {System.out.println(li);} else {li.add(list.get(i));// 左加f(i + 1, list, li);li.remove(list.get(i)); // 右去f(i + 1, list, li);}}}


上面这个算法简单实用,但是习惯上来说,我们更喜欢严格的升序排列,而不是这种混乱的情况。这里引入挤压序的概念,集合内按字典序顺序排列,集合与集合之间,按照元素个数严格增加一种序列。

二进制反射格雷码:这种算法得到的序列不仅是挤压序,而且还是一种最小变化法。下面的算法是使用了数学公式实现的,所以代码量很少,既然有数学公式,何乐而不为呢?难道要像NP问题一样没有公式才好吗?算法的“投机取巧”也在能直接利用数学公式上。

import java.util.Scanner;public class Main {public void getGrayCode(int bitNum){for(int i = 0; i < (int)Math.pow(2, bitNum); i++){int grayCode = (i >> 1) ^ i;System.out.println(numBinary(grayCode, bitNum));}}public String numBinary(int num, int bitNum){String ret = "";for(int i = bitNum-1; i >= 0; i--){ret += (num >> i) & 1;}return ret;}public static void main(String[] args) {Main test = new Main();Scanner in = new Scanner(System.in);int n = in.nextInt();test.getGrayCode(n);}
}

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

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

相关文章

【第九课】MriaDB密码重置和慢查询日志

目录 1、如何进行修改MariaDB的密码2、Mariadb的慢查询日志1、如何进行修改MariaDB的密码 记得root密码的修改方式&#xff1a; [rootlocalhost ~]# mysqladmin -uroot -p123456 password "123123" [rootlocalhost ~]# mysql -uroot -p Enter password: ERROR 1045 …

减治法解决俄式乘法问题(JAVA)

以上是在《算法设计与分析基础》一书中给出的定义。 这种算法只包括折半、加倍、相加这几个操作&#xff0c;在计算时&#xff0c;不需要用九九乘法表 。 同时&#xff0c;这个方法每次都会将计算的规模减少&#xff0c;运用了减治的思想 public class Main {public static…

1.需要对txt存放的测试数据做去重处理,代码如下

采用集合去重&#xff0c;在新文件里逐行写入&#xff0c;达成目的 old_file "D:/testdata/memberId.txt" #old result_file "D:/testdata/memberId_new.txt" #new lines_seen set() out_file open(result_file, "w") f open(old_file, &q…

减治法解决尼姆(Nim)游戏/拈游戏问题(JAVA)

尼姆游戏是一种两个人玩的回合制数学策略游戏。游戏者轮流从一堆棋子&#xff08;一共有好几堆&#xff0c;一次只能从其中一堆拿。&#xff09;&#xff08;或者任何道具&#xff09;中取走一个或者多个&#xff0c;最后不能再取的就是输家。当指定相应数量时&#xff0c;一堆…

jquery中$(document).ready()和window.onload的区别

在Jquery里面&#xff0c;我们可以看到两种写法:$(function(){}) 和$(document).ready(function(){}) 这两个方法的效果都是一样的&#xff0c;都是在dom文档树加载完之后执行一个函数&#xff08;注意&#xff0c;这里面的文档树加载完不代表全部文件加载完&#xff09;。 $(d…

蛮力法在排序算法中的应用(JAVA)--选择排序、冒泡排序

蛮力法在排序算法中的应用 对于一个排序问题&#xff0c;我们能想到的最简单的排序方法就是选择和冒泡 1、选择排序&#xff1a;时间复杂度O(n^2) public class Main {public static void main(String[] args) {int[] a {89, 45, 68, 90, 29, 34, 17};int min;for (int i 0…

PyCherm的常用快捷键总结

、Ctrl Enter&#xff1a;在下方新建行但不移动光标&#xff1b; 2、Shift Enter&#xff1a;在下方新建行并移到新行行首&#xff1b; 3、Ctrl /&#xff1a;注释(取消注释)选择的行&#xff1b; 4、Ctrl Alt L&#xff1a;格式化代码(与QQ锁定热键冲突&#xff0c;关闭Q…

蛮力法在查找算法中的应用(JAVA)--顺序查找

蛮力法在查找算法中的应用 对于查找算法来说&#xff0c;最简单的一个思路就是逐个匹配&#xff0c;直到找到目标元素 顺序查找&#xff1a; public class Main {public static void main(String[] args) {int[] a {89, 45, 68, 90, 29, 34, 17, 0};int k 45;int i 0;a[a.…

Xshell报错“The remote SSH server rejected X11 forwarding request.”

xshell连接centos7&#xff0c;报错&#xff1a;“The remote SSH server rejected X11 forwarding request.” 打开文件/etc/ssh/sshd_config,修改下面的参数 X11Forwarding yes 如果有&#xff0c;那就不用修改 修改xshell连接属性 把勾选去掉即可&#xff01; 参考&#xff…

蛮力法在字符串匹配问题中的应用(JAVA)--朴素模式匹配算法

蛮力法在字符串匹配问题中的应用字符串匹配问题通常是给定一个n个字符组成的串&#xff08;称为文本&#xff09;&#xff0c;一个m&#xff08;m<n&#xff09;个字符的串&#xff08;称为模式&#xff09;&#xff0c;从文本中寻找匹配模式的子串。显然我们需要逐个匹配&a…

蛮力法在求解“最近对”问题中的应用(JAVA)

最近对问题是在计算几何问题中最简单的&#xff0c;是指在一个包含n个点的集合中&#xff0c;找到距离最近的两个点&#xff0c;我们这里只研究二维空间中的版本&#xff0c;高维计算基本类似&#xff0c;区别只在于计算两点之间距离的公式略有不同&#xff0c;下面是标准的欧几…

测试框架有哪些

自动化测试最近几年都是大热&#xff0c;这里结合网上以及自己的经验整理了一些&#xff0c;自动化测试必问的一些题目&#xff0c;为想进入软件测试行业的同学一点帮助。一、如何理解自动化测试&#xff1f; 每个面试自动化测试的&#xff0c;80%会被问到这个。不用太宽泛&…

蛮力法在求解凸包问题中的应用(JAVA)

凸包问题向来是计算几何中最重要的问题之一&#xff0c;许多各式各样的应用大多要么本身就是图凸包问题要么其中一部分需要按照凸包问题解决。 凸集合定义&#xff1a;对于平面上一个点集合&#xff0c;如果集合中的任意两点p和q为端点的线段都属于该集合&#xff0c;那么称这…

人生路上对我影响最大的三位老师

在我的人生路上对我影响最大的三位老师第一位那便可能是我小学一年级到五年级的数学老师&#xff0c;他对我的影响确实是挺大但都是负面的那个老师不怎么负责人经常进来上课都是一身酒味在他四年的教导下以至于我到了五年级了两位数的乘除法都忘的差不多了&#xff0c;其实这也…

蛮力法在求解最优解问题中的应用(JAVA)--旅行家问题、背包问题、分配问题

蛮力法在求解最优解问题中的应用 1、TSP&#xff08;旅行商问题&#xff09;要求我们找出一条n个给定城市之间的最短路径&#xff0c;使我们再回到出发的城市之前&#xff0c;对欧每个城市都只访问一次。我们可以用赋权图来描述这个问题&#xff0c;那么算法的目的就是求解一个…

分治法在排序算法中的应用(JAVA)--归并排序

分治法最常用的就是将规模为n的实例划分成两个n规模为n/2的实例 。推广到一般的情况&#xff0c;我们可以将规模为n的实例划分为b个规模为n/b的实例。这样对于算法的运行时间存在递推式&#xff1a;T(n) aT&#xff08;n/b&#xff09;f&#xff08;n&#xff09;&#xff0c;…

ant design Modal关闭时清除数据的解决方案

背景&#xff1a;modal组件关闭时不清除数据&#xff0c;原来输入的数据还存在 解决方案&#xff1a; 1、modal的api&#xff1a;destroyOnClose 2、手动控制modal的销毁 this.state {destroy:true //设一开始为不显示状态 }{this.state.isDestroy? : <Modal classNam…

分治法在排序算法中的应用(JAVA)--快速排序(Lomuto划分、Hoare划分、随机化快排)

分治法在排序算法中的应用--快速排序 时间复杂度&#xff1a;平均O(nlogn)&#xff0c;最坏O(n^2) 如果说归并排序是按照元素在数组中的位置划分的话&#xff0c;那么快速排序就是按照元素的值进行划分。划分方法由两种&#xff0c;本节将主要介绍Huare划分&#xff0c;这也是…

分治法在二叉树遍历中的应用(JAVA)--二叉查找树高度、前序遍历、中序遍历、后序遍

分治法在二叉树遍历中的应用 二叉树本身就是由两个更小的部分组成--左子树和右子树&#xff0c;所以二叉树的问题非常适合用分治法来解决。 二叉树的高度&#xff1a;从叶子到根之间的最长路径。我们可以理解为根的左子树高度和右子树高度加1&#xff08;加1代表根所在的层&a…

Excel中用REPT函数制作图表

本文从以下七个方面&#xff0c;阐述在Excel中用REPT函数制作图表&#xff1a; 一. 图形效果展示 二. REPT语法解释 三. REPT制作条形图 四. REPT制作漏斗图 五. REPT制作蝴蝶图 六. REPT制作柱状图 七. REPT制作甘特图 一. 图形效果展示 这些图表都是用REPT函数制作成的&#…