从数组中获取大小为 n 的所有组合的算法(Java)? [关闭]

2024-01-11

现在我正在尝试编写一个函数,它接受一个数组和一个整数 n,并给出每个大小 n 组合的列表(因此是 int 数组的列表)。我可以使用 n 个嵌套循环来编写它,但这仅适用于特定大小的子集。我不知道如何将其推广到适用于任何大小的组合。我想我需要使用递归?

这是 3 个元素的所有组合的代码,我需要一个用于任意数量元素的算法。

import java.util.List;
import java.util.ArrayList;

public class combinatorics{
    public static void main(String[] args) {

        List<int[]> list = new ArrayList<int[]>();
        int[] arr = {1,2,3,4,5};
        combinations3(arr,list);
        listToString(list);
    }

    static void combinations3(int[] arr, List<int[]> list){
        for(int i = 0; i<arr.length-2; i++)
            for(int j = i+1; j<arr.length-1; j++)
                for(int k = j+1; k<arr.length; k++)
                    list.add(new int[]{arr[i],arr[j],arr[k]});
    }

    private static void listToString(List<int[]> list){
        for(int i = 0; i<list.size(); i++){ //iterate through list
            for(int j : list.get(i)){ //iterate through array
                System.out.printf("%d ",j);
            }
        System.out.print("\n");
        }
    }
}

这是一个经过充分研究的生成所有 k 子集的问题,或者k-组合 https://en.wikipedia.org/wiki/Combination,无需递归即可轻松完成。

这个想法是有大小的数组k保持顺序indices输入数组中的元素(这些数字来自0 to n - 1)按递增顺序。 (Subset然后可以通过从初始数组中获取这些索引的项目来创建。)因此我们需要生成所有此类索引序列。

第一个索引序列将是[0, 1, 2, ... , k - 1],在第二步它切换到[0, 1, 2,..., k],然后到[0, 1, 2, ... k + 1]等等。最后可能的序列将是[n - k, n - k + 1, ..., n - 1].

在每一步中,算法都会查找最接近可以递增的最终项目,递增它并填充该项目的右侧项目。

为了说明这一点,请考虑n = 7 and k = 3。第一个索引序列是[0, 1, 2], then [0, 1, 3]等等......在某些时候我们有[0, 5, 6]:

[0, 5, 6] <-- scan from the end: "6" cannot be incremented, "5" also, but "0" can be
[1, ?, ?] <-- "0" -> "1"
[1, 2, 3] <-- fill up remaining elements

next iteration:

[1, 2, 3] <-- "3" can be incremented
[1, 2, 4] <-- "3" -> "4"

Thus, [0, 5, 6]接下来是[1, 2, 3],然后去[1, 2, 4] etc.

Code:

int[] input = {10, 20, 30, 40, 50};    // input array
int k = 3;                             // sequence length   

List<int[]> subsets = new ArrayList<>();

int[] s = new int[k];                  // here we'll keep indices 
                                       // pointing to elements in input array

if (k <= input.length) {
    // first index sequence: 0, 1, 2, ...
    for (int i = 0; (s[i] = i) < k - 1; i++);  
    subsets.add(getSubset(input, s));
    for(;;) {
        int i;
        // find position of item that can be incremented
        for (i = k - 1; i >= 0 && s[i] == input.length - k + i; i--); 
        if (i < 0) {
            break;
        }
        s[i]++;                    // increment this item
        for (++i; i < k; i++) {    // fill up remaining items
            s[i] = s[i - 1] + 1; 
        }
        subsets.add(getSubset(input, s));
    }
}

// generate actual subset by index sequence
int[] getSubset(int[] input, int[] subset) {
    int[] result = new int[subset.length]; 
    for (int i = 0; i < subset.length; i++) 
        result[i] = input[subset[i]];
    return result;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从数组中获取大小为 n 的所有组合的算法(Java)? [关闭] 的相关文章

  • 在文本文件中写入多行(java)

    下面的代码是运行命令cmd并使用命令行的输出生成一个文本文件 下面的代码在 Eclipse 的输出窗口中显示了正确的信息 但在文本文件中只打印了最后一行 谁能帮我这个 import java io public class TextFile
  • 这个函数(for循环)空间复杂度是O(1)还是O(n)?

    public void check 10 for string i list Integer a hashtable get i if a gt 10 hashtable remove i 这是 O 1 还是 O n 我猜测 O n 但不是
  • org.apache.sling.api.resource,version=[2.3,3) -- 无法解析

    您好 我无法访问我的项目内容 我已经上传了从 CQ 访问内容所需的所有包 我唯一能看到的是 org apache sling api resource version 2 3 3 无法解析 这是否是异常的原因 如果是 请告诉我如何解决 中Q
  • 比较两个文本文件的最快方法是什么,不将移动的行视为不同

    我有两个文件非常大 每个文件有 50000 行 我需要比较这两个文件并识别更改 然而 问题是如果一条线出现在不同的位置 它不应该显示为不同的 例如 考虑这个文件A txt xxxxx yyyyy zzzzz 文件B txt zzzzz xx
  • 如何获得n个具有不同元素数量的数组的所有可能组合?

    我有一些在编程时未知的数组数量 也许是 3 或 4 或 7 每个数组都有一些元素 即 a 1 2 3 4 b 6 7 5 2 1 c 22 4 6 8 4 8 5 4 d e f g 我想通过从每个数组中采样一个数字来获得所有可能的组合 例
  • 按第一列排序二维数组,然后按第二列排序

    int arrs 1 100 11 22 1 11 2 12 Arrays sort arrs a b gt a 0 b 0 上面的数组已排序为 1 100 1 11 2 12 11 22 我希望它们按以下方式排序a 0 b 0 首先 如果
  • 如何在不超过最大值的情况下增加变量?

    我正在为学校开发一个简单的视频游戏程序 我创建了一个方法 如果调用该方法 玩家将获得 15 点生命值 我必须将生命值保持在最大值 100 并且由于我目前的编程能力有限 我正在做这样的事情 public void getHealed if h
  • 当从服务类中调用时,Spring @Transactional 不适用于带注释的方法

    在下面的代码中 当方法内部 是从内部调用的方法外部 应该在交易范围内 但事实并非如此 但当方法内部 直接从调用我的控制器class 它受到事务的约束 有什么解释吗 这是控制器类 Controller public class MyContr
  • 使用 AES SecretKey 的 Java KeyStore setEntry()

    我目前正在 Java 中开发一个密钥处理类 特别是使用 KeyStore 我正在尝试使用 AES 实例生成 SecretKey 然后使用 setEntry 方法将其放入 KeyStore 中 我已经包含了代码的相关部分 The KS Obj
  • 匿名类上的 NotSerializedException

    我有一个用于过滤项目的界面 public interface KeyValFilter extends Serializable public static final long serialVersionUID 7069537470113
  • Java 中的“Lambdifying”scala 函数

    使用Java和Apache Spark 已用Scala重写 面对旧的API方法 org apache spark rdd JdbcRDD构造函数 其参数为 AbstractFunction1 abstract class AbstractF
  • 普罗米修斯指标 - 未找到

    我有 Spring Boot 应用程序 并且正在使用 vertx 我想监控服务和 jvm 为此我选择了 Prometheus 这是我的监控配置类 Configuration public class MonitoringConfig Bea
  • Javafx过滤表视图

    我正在尝试使用文本字段来过滤表视图 我想要一个文本字段 txtSearch 来搜索 nhs 号码 名字 姓氏 和 分类类别 我尝试过在线实施各种解决方案 但没有运气 我对这一切仍然很陌生 所以如果问得不好 我深表歉意 任何帮助将不胜感激 我
  • java.lang.NumberFormatException: Invalid int: "3546504756",这个错误是什么意思?

    我正在创建一个 Android 应用程序 并且正在从文本文件中读取一些坐标 我在用着Integer parseInt xCoordinateStringFromFile 将 X 坐标转换为整数 Y 坐标的转换方法相同 当我运行该应用程序时
  • 替换后增量

    我自己已经有一个问题了 但我想扩展它后增量示例 https stackoverflow com questions 51308967 post increment with example char a D int b 5 System o
  • HQL Hibernate 内连接

    我怎样才能在 Hibernate 中编写这个 SQL 查询 我想使用 Hibernate 来创建查询 而不是创建数据库 SELECT FROM Employee e INNER JOIN Team t ON e Id team t Id t
  • Eclipse 中 Spring MVC 模型对象的 (jsp /jstl) 视图中的代码辅助

    在 Spring MVC 中 当将对象放置在视图模型中时 如下所示 public String getUser Model model fetch user model addAttribute user user return viewN
  • 为什么这个作业不起作用?

    我有课Results which extends ArrayList
  • 调整添加的绘制组件的大小和奇怪的摆动行为

    这个问题困扰了我好几天 我正在制作一个特殊的绘画程序 我制作了一个 JPanel 并添加了使用 Paint 方法绘制的自定义 jComponent 问题是 每当我调整窗口大小时 所有添加的组件都会 消失 或者只是不绘制 因此我最终会得到一个
  • 在 RESTful Web 服务中实现注销

    我正在开发一个需要注销服务的移动应用程序 登录服务是通过数据库验证来完成的 现在我陷入了注销状态 退一步 您没有提供有关如何在应用程序中执行身份验证的详细信息 并且很难猜测您在做什么 但是 需要注意的是 在 REST 应用程序中 不能有会话

随机推荐

  • TestCafe - 将选择器的结果存储在变量中

    因此 为了测试 我的搜索结果根据我输入的关键字而有所不同 我想在输入关键字之前存储 searchResults 的节点列表 然后将它们与添加关键字后获得的 searchResults 的节点列表进行比较 但是我无法让它工作 我试过了 let
  • Google Chrome 开发者工具包速度很慢

    我已经使用 Google Chrome 的开发工具包 元素检查 堆栈跟踪 JavaScript 调试等 一段时间了 并取得了巨大的成功 然而 大约两周前 它突然变得非常迟缓 例如 当我右键单击 UI 中的某个元素 然后单击 检查元素 时 或
  • Onedrive cors 在 JavaScript 中下载

    我正在尝试在客户端 JavaScript 中处理 onedrive 文件 但首先我需要一种使用 XMLHttpRequest 下载文件的方法 Onedrive支持cors进行很多操作 但是将文件下载到javascript中存在以下问题 正如
  • 在mysql中创建表约束

    我有一个表 其中有一些列a b c每列都有另一列 例如 x y z 这取决于a b c分别 x y z将会有价值1 if a b c具有任何值并且将包含 null 如果a b c has null 举个例子吧 存储的值a is 2 and
  • 静态档案中的 C 符号可见性

    我有文件 foo c bar c 和 baz c 以及定义函数 myfn 的包装器代码 myfn c 该函数使用其他文件中的代码和数据 我想创建诸如目标文件或存档 myfn o 或 libmyfn a 之类的内容 以便 myfn 可以供其他
  • string.Format() 参数

    可以向 string Format 方法传递多少个参数 必须有某种理论上的或强制的限制 它是否基于 params 类型的限制或使用它的应用程序的内存使用情况或完全基于其他原因 好的 我从隐藏中出现 我使用以下程序来验证发生了什么 而 Mar
  • 不带对话框窗口保存

    我正在尝试编写一个脚本来自动执行 Photoshop CS5 的许多操作 其中一部分涉及保存一堆文件 有没有一种方法可以在不打开对话框窗口的情况下保存文件 我一直在寻找JavaScript 工具指南 http wwwimages adobe
  • 如何在 BigQuery 中取消嵌套两列中的两个列表而不使用叉积作为单独的行

    我在 BigQuery 中有一个表 它有两列 每列包含一个数组 对于给定的行 两列将包含相同长度的数组 但该长度可能因行而异 WITH tbl AS select a b c AS one 1 2 3 as two union all se
  • 如何异步渲染局部视图

    可以异步渲染部分视图吗 我有一个需要渲染博客文章的部分视图 博客文章异步返回 In my Layout文件我渲染我的部分页脚 Footer In Footer我有以下标记 Html Action FooterLatestBlogPosts
  • 在 Dex 阶段构建大型 Codename One 应用程序时出错

    在 dex 阶段发送 Android 构建时 我在构建服务器中遇到错误 谷歌搜索了一下我了解到64K函数有一个硬限制 包括所有库 最重的是google play服务 或者你可以使用多个dex机制 如何为代号一激活此功能 我明白代号一 htt
  • SocketIO 发送给特定用户(无需为每个客户端使用单独的空间)

    我正在尝试开发一个支持后端长任务的网络应用程序 我在用flask socketio与芹菜一起打包在我的服务器上 我的工作流程如下 当客户端打开 Html 页面时 我启动到服务器的套接字连接 该连接为用户创建一个 uid 并将其发回 现在 一
  • 请求/响应日志记录的响应正文

    我正在尝试编写一个 Owin 中间件组件 它将记录每个传入的请求和对数据库的响应 这是我所取得的进展 我被困在阅读response body 上 说 Stream不支持读取 如何读取 Response Body public class L
  • 在自动增量列中插入问题

    如何使用标识插入将数据插入到已定义为自动增量列的列中 请举例说明 如果您有一个 自动增量 列 您确实不应该自己将特定值插入到该列中 毕竟 这就是为什么它是自动增量列 If you must毕竟这样做 那么你需要这样做 SET IDENTIT
  • redirect_uri 的参数值无效:缺少方案:/auth/google_auth_code/callback

    edit 这是一个最小可行的项目 https github com rednebmas google auth code test 似乎是护照谷歌错误 你可能会在这里看到它 https github com jaredhanson pass
  • 重新定义 Python 内置数据类型

    是否可以重新定义括号 使用哪个对象 我可以子类化list对象 但如何使解释器使用我的子类代替内置列表对象 是否可以 我很确定我在这个问题上使用了错误的术语 请随意编辑 gt gt gt class mlist list def init s
  • QueryDSL / JPQL:如何构建连接查询?

    我尝试通读 QueryDSL 文档 但仍然很困惑 我习惯于编写大量 SQL 但这是我第一次真正尝试使用 QueryDSL 和 JPQL JPA2 我有以下实体 Entity public class Provider implements
  • Android - VideoView 需要按 BACK 两次才能退出

    我有一个显示不同视频文件的活动 当我单击视频文件时 我会进入另一个 Activity 其中 VideoView 会播放视频 我的问题是 当我想退出此活动并返回到上一个活动时 我应该单击两次后退按钮才能返回 如果我只单击一次 视频会再次开始播
  • 如何在 CodeIgniter 模型中使用 ON DUPLICATE KEY UPDATE?

    我有一个 CodeIgniter PHP 模型 我想将一些数据插入数据库 然而 我在 原始 SQL 查询中设置了这个 ON DUPLICATE KEY UPDATE duplicate duplicate 1 我正在使用 CodeIgnit
  • daemonset 不创建任何 pod

    我正在尝试使用 Kubernetes DaemonSets 但一点运气都没有 我已经寻找解决方案但无济于事 我希望这里有人可以提供帮助 首先 我见过这张票 https stackoverflow com questions 34818198
  • 从数组中获取大小为 n 的所有组合的算法(Java)? [关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 现在我正在尝试编写一个函数 它接受一个数组和一个整数 n 并给出每个大小 n 组合的列表 因此是 int 数组的列表 我