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

生成子集问题:经典的背包问题就是求解一个最优子集的问题,这里我们来讨论一个更简单的问题。对于任意一个集合来说,它都存在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);}
}

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

  1. 生成二进制反射格雷码

    递归生成二进制反射格雷码: 需求: ​ 我们使用递归的方式来生成二进制的反射格雷码. 什么是格雷码? ​ 典型的二进制格雷码(Binary Gray Code)简称格雷码,因1953年公开的弗兰克·格 ...

  2. 减治法在求解拓扑排序问题中的应用(JAVA)--有向无环图

    减治法在求解拓扑排序问题中的应用 拓扑排序:对于一个有向无环图来说,如果我们能够按照次序列出顶点,使得对于每条边来说,边的起始顶点总是排在边的结束顶点之前,那么这个过程就称为拓扑排序,拓扑排序有解是一 ...

  3. java为什么复制数组会减一_如果从数组中复制了Java,为什么Java需要对最终变量进行显式强制转换?...

    从以下代码开始- byte foo = 1; byte fooFoo = foo + foo; 当我尝试编译此代码时,会得到以下错误- Error:(5, 27) java: incompatible ...

  4. java中补码与位运算,Java:二进制(原码、反码、补码)与位运算

    一.二进制(原码.反码.补码) 二进制的最高位是符号位("0"代表正数,"1"代表负数): Java中没有无符号数: 计算机以整数的补码进行运算: 1.  原码 ...

  5. 减治法(Decrease and Conquer)

    减治法 减治法是一种一般性的算法设计技术,它利用了一个问题给定实例的解和同样问题较小实例的解之间的关系.一旦建立了这样一种关系,我们既可以自顶至下(递归)也可以自底至上地运用它(非递归). 减治法有3 ...

  6. 减治法在生成全排列中的应用(JAVA)--回溯、Johnson-Trotter算法、自字典序

    减治法在生成组合对象问题中的应用 在深入浅出讲算法思想--蛮力法思想分析及应用这篇文章的最优解问题中中已经初步讲解了这类应用,下面我们将使用减治法再次思考这类问题. 1.全排列问题,在数学中求解一个n ...

  7. 格雷码基础和生成的几种方法

    1 格雷码: 1.1 格雷码引言: 在数字系统中,常要求代码按一定顺序变化. 在机器视觉里面,编码结构光也是按照一定的顺序进行变化,最常用的就是Binary,但是,二进制的纯粹的编码,由于二进制的进制 ...

  8. 3D 机器视觉 02 - FPGA生成N位元格雷码

    前言,FPGA是机器视觉里面经常用的的控制逻辑单元,并行处理速度快. 格雷码的生成方法中,通过异或的逻辑变化生成格雷码是最适合的方式. 举例一个位元为3的格雷码: 下面为一个位元为4的格雷码对比图 1 ...

  9. 3D 机器视觉 01 - 格雷码在3D视觉中的运用和码位选择原则

    1投影图像的编码方法: 常用的一种编码方法就是基于时间的编码方法. 该方法是将一系列投影图案在不同的时刻投射到被测物体的表面,像素的编码由物体表面反射的一系列值构成,因此这种方法被称为时间多路编码方法 ...

最新文章

  1. Yann LeCun 怒喷 Sophia:这就是彻头彻尾的骗局
  2. [SDUT](3329)顺序表应用5:有序顺序表归并 ---有序表归并(线性表)
  3. linux sudo 必须属于用户ID0,sudo:/usr/bin/sudo 务必属于用户 ID 0(的用户)并且设置 setuid 位...
  4. 从「蒸汽时代」到「高铁时代」,SUNMI DevOps 转型之路 | 原力计划
  5. Windows Server 2016-抢占FSMO角色
  6. EEGLAB在MATLAB中的下载、安装教程
  7. 昂达v819i安卓bios
  8. 手机安装W ndows7镜像,Windows7专业版
  9. 快速入门Sass:Sass中的体系结构
  10. 基于Python+深度学习+神经网络实现高度可用的生活垃圾分类机器人程序
  11. matlab判断星期几的语句,计算某一天是星期几的matlab程序
  12. [转]真核生物预测软件
  13. ​ 数据库约束【mysql】
  14. 少儿机器人教育现状与未来
  15. 练习时长两年半,二本学历,没背景,会唱跳篮球,美团四面成功拿下offer
  16. 如何看懂电路图--电源电路单元
  17. 微博拿下NBA,互联网巨头布局体育产业如何“绕开”版权费?
  18. 使用帕累托最优解和熵权双基点法实现电力成本双目标优化——附matlab实现代码
  19. 机器人操作系统ROS(6)动作编程
  20. php制作万年历的步骤_PHP制作万年历_php实例

热门文章

  1. python 打印皮卡丘_用python打印你的宠物小精灵吧
  2. mtk android 5.1 logo,Android ROM DIY之MTK平台手机通用移植
  3. html内容封装为一个对象_技术赋能还是内容为王,哪一个才是短视频创作的关键?...
  4. abb限位开关已打开drv1_Telemecanique传感器限位开关产品系列
  5. android jackson 解析json字符串,android:json解析的两个工具:Gson和Jackson的使用小样例...
  6. oracle数据如何获取游标中动态字段_原来Python自带了数据库,用起来真方便!
  7. 计算机管理也无法运行,【两种解决方法】任务管理器打不开怎么办?
  8. rtrim php,php rtrim() 格式化中文问题
  9. mysql hugepage_因未配置Hugepage会话数添增悲剧案例
  10. 长沙计算机中级职称分数公布,大家所期待的2020年湖南省长沙中级职称评审公示...