iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > JAVA >java实现排列组合算法
  • 794
分享到

java实现排列组合算法

排列组合数据结构java 2023-09-01 08:09:54 794人浏览 安东尼
摘要

我这里只写了组合的算法。         假设现有 M=4 个数据 a,b,c,d。从中随机抽取n个数,n为1—4个数据进行组合。那么数学中的计算组合方式为C(4,1) + C(4,2) + C(4,3) + C(4,4)  = 4 + 6

我这里只写了组合的算法

        假设现有 M=4 个数据 a,b,c,d。从中随机抽取n个数,n为1—4个数据进行组合。那么数学中的计算组合方式为C(4,1) + C(4,2) + C(4,3) + C(4,4)  = 4 + 6 + 4 + 1 = 15。那么共有15种组合方式。

方案一:此方法容易理解但是效率慢

        我的做法是,按顺序循环组合,数据分为已组合的数据和未组合(未组合数据指的是已组合数据往后剩余的数据),然后把未参与组合的进行循环与已组合再次组合,循环进行,直到最后。
        如下示例,规律

      已组合数据    剩余未参与组合的数据

1       a                            b,c,d               //a 后面还有b,c,d未参与
2       b                             c,d                 //b 后面还有c,d未参与
3       c                             d                   //c 后面还有d未参与
4       d                                                 //d后面没有了其他数据
//开始把上述第1行a —  b,c,d 进行二次循环组合
5       a,b                          c,d               //a,b 后面还有c,d未参与         
6       a,c                           d                 //a,c 后面还有d未参与          
7       a,d                                                                                                                                          
//开始把上面第5行a,b —  c,d 行进行循环组合      
8       a,b,c                        d                //a,b,c 后面还有d未参与
9       a,b,c,d
//开始把上面第2行b  —  c,d 行进行循环组合
10     b,c                          d                //b,c 后面还有c,d未参与
11     b,d                          
//开始把上面第3行c  —  d 行进行循环组合
12      c,d                                             
//开始把上面第6行a,c  —  d 行进行循环组合
13      a,c,d                                         
//开始把上面第8行a,b,c  —  d 行进行循环组合
14      a,b,c,d                                      
//开始把上面第10行b,c  —  d 行进行循环组合
15      b,c,d                                         
..............................依据上述规则,循环把每一行未组合的与当前已组合的再次进行组合,然后计算剩余未组合数据。至到未参与组合的数据个数为0

上述思路基本明了,按顺序依次组合,只是根据每行上的未参与组合数据,进行再次组合直到全部组合完成。代码实现如下:

public static void main(String[] args) {        //结果集        List resList = new ArrayList<>();        //初始化需要组合的数据        String[] arr = new String[]{"a","b","c","d"};        List initList = new LinkedList(Arrays.asList(arr));        //map中 key:组合数据的前缀,value:未参与组合的数据        Map> map = new HashMap<>();        for (int i = 0; i < initList.size(); i++) {            String pj = initList.get(i);            resList.add(pj);            System.out.println(pj);            //当剩余未组合的数据个数为0时 不再继续添加            if(i+1 < initList.size()){                //按顺序排列 下标为i后面未参与组合的数据                List syList = initList.subList(i+1,initList.size());                map.put(pj,syList);            }        }        combinLoop(map,resList);        System.out.println(resList.size());    }    public static void combinLoop(Map> map,List resList){        for (Map.Entry> entry : map.entrySet()) {            String prefix = entry.geTKEy();            List list = entry.getValue();            Map> map2 = new HashMap<>();            //循环未参与组合的数据,与之前的prefix进行组合            for (int i = 0; i < list.size(); i++) {                String newPre = prefix+list.get(i);                System.out.println(newPre);                resList.add(newPre);                if(i+1 < list.size()){                    //按顺序排列,下标为i后面未参与组合的数据集合                    List syList = list.subList(i+1,list.size());                    map2.put(newPre,syList);                }            }            combinLoop(map2,resList);        }    }

方案2:效率更快

此方法,对初始化数据initList进行循环,把前一次的结果resultList与当前参与循环的数据进行一一组合,得到新的结果加入到已有的组合结果resultList中,initList依次循环,resultList不断加入新的数据,重复进行直到最后。如下示例:

对initList = {"a","b","c","d"} 进行循环,初始化resultList为空。

              当前参与循环数据   前一次resultList集    结束resultList集

第一次循环      a                        null                                    a
第二次循环      b                         a                                    a,b,ab
第三次循环      c                      a,b,ab                             a,b,ab,c,ac,bc,abc
第四次循环      d                a,b,ab,c,ac,bc,abc    a,b,ab,c,ac,bc,abc,d,ad,bd,abd,cd,acd,bcd,abcd   

通过上述规律可看出,当前参与循环的数据与已有的resultList集进行新的组合,可得到黄色部分组合后的结果,再加上resultList中原来已有的数据,组成新的resultList与下一次参与循环的数据组合,依次进行直到所有数据循环完成。

代码如下:

    public static void combine2(){        String[] arr = new String[]{"a","b","c","d"};        //初始化数据        List initList = Arrays.asList(arr);        //结果集        List resultList = new ArrayList<>();        for (String init : initList) {            //重新赋值上次循环组合后得到的resultList结果集            List list = new ArrayList<>(resultList);            //resultList添加初始数据            resultList.add(init);            for (String pr : list) {                //把前一次得到的resultList 与当前数据重新进行组合                resultList.add(pr + init);            }        }    }

来源地址:https://blog.csdn.net/yusewuhen/article/details/130603555

--结束END--

本文标题: java实现排列组合算法

本文链接: https://www.lsjlt.com/news/387952.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • java实现排列组合算法
    我这里只写了组合的算法。         假设现有 M=4 个数据 a,b,c,d。从中随机抽取n个数,n为1—4个数据进行组合。那么数学中的计算组合方式为C(4,1) + C(4,2) + C(4,3) + C(4,4)  = 4 + 6...
    99+
    2023-09-01
    排列组合 数据结构 java
  • java如何实现排列组合算法
    这篇文章主要介绍java如何实现排列组合算法,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!java排列组合算法[@more@]import java.util.ArrayList;import j...
    99+
    2023-06-03
  • 如何用Java实现排列组合算法
    目录需求从排列到组合-穷举从排列到组合-分治分治思想代码实现直击本质-位运算思想代码实现小结需求 我们的数据表有多个维度,任意多个维度组合后进行 group by 可能会产生一些”奇...
    99+
    2024-04-02
  • python 排列组合算法
    def c(n,m,out): if(m==0):    return 1 x=n while x>=m:    out.append(x)    if(c(x-1,m-1,...
    99+
    2023-01-31
    算法 排列组合 python
  • 基于python快速实现排列组合算法
    1.python语言简单、方便,其内部可以快速实现排列组合算法,下面做简单介绍、 2.一个列表数据任意组合 2.1主要是利用自带的库 #_*_ coding:utf-8 _*_ #__author__='dragon' impor...
    99+
    2023-01-31
    算法 排列组合 快速
  • c语言排列组合算法怎么实现
    C语言排列组合算法可以通过递归实现。下面是一个示例代码: #include <stdio.h> void combin...
    99+
    2024-02-29
    c语言
  • 用python实现排列组合
    比如我们要实现1,2,3的排列组合,我们可以很容易写出来,如下表:     1个元素 2个元素 3个元素 不考虑顺序 123 1,2,3 12,13,23 123 考虑顺序 123 1,2,3, 12,21,13,31,23,32 12...
    99+
    2023-01-31
    排列组合 python
  • Java算法如何实现全排列
    本篇内容主要讲解“Java算法如何实现全排列”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java算法如何实现全排列”吧!算法一基于递归与回溯实现。在排列1,2,3的时候,先由3向上回溯到2发现...
    99+
    2023-07-02
  • java全排列算法怎么实现
    以下是一种实现Java全排列算法的方法:```javaimport java.util.ArrayList;import java....
    99+
    2023-09-26
    java
  • Python通过内置函数和自写算法DFS实现排列组合
    目录调用内置函数自写算法DFS实现排列组合是数学中的一种常见的计算方法,用于求出从给定的元素中选取若干个元素的所有可能的排列或组合。在Python中,有多种方式可以实现排列组合的计算...
    99+
    2023-05-18
    Python 算法 Python 排列组合
  • python如何实现列表元素排列组合
    这篇文章主要为大家展示了“python如何实现列表元素排列组合”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“python如何实现列表元素排列组合”这篇文章吧。列...
    99+
    2024-04-02
  • Java算法之重新排列数组例题
    目录题目题目分析解题思路思路一思路二总结前言: 今天和大家分享一道简单,但是细节满满的算法题,其中一个思路反正我没有想到,但是很有用,分享出来希望对大家有帮助。 题目 给你一个数组 ...
    99+
    2024-04-02
  • Java实现全排列的三种算法详解
    目录算法一算法二算法三算法一 基于递归与回溯实现。在排列1,2,3的时候,先由3向上回溯到2发现没有其他可能的情况,再回溯到1,排列为1,3,2再向上回溯到存在其他情况时,即根节点然...
    99+
    2024-04-02
  • python排列组合
    1.Python的排列函数permutations() itertools.permutations(iterable,r=None) 功能:连续返回由iterable序列中的元素生成的长度为r...
    99+
    2023-09-01
    python 开发语言 算法
  • C++实例分析组合数的计算与排列组合的产生
    目录组合数的计算使用加法递推—O(n^2)使用乘法递推—O(n)排列和组合的产生(无重集元素)全排列一般组合全组合由上一排列产生下一排列由上一组合产生下一组合...
    99+
    2024-04-02
  • Java实现全排列的三种算法是什么
    Java实现全排列的三种算法分别是:1. 回溯法:回溯法是通过递归实现的,它通过不断交换数组中的元素位置来生成全排列。具体步骤是,从...
    99+
    2023-08-11
    Java
  • 利用Java如何实现全排列算法和递归
    利用Java如何实现全排列算法和递归?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。全排列:从n个不同元素中任取m(m≤n)个元素,按照一定的顺序排列起来,叫做从...
    99+
    2023-05-31
    全排列 递归 ava
  • python list的排列组合
    排列 例如: 输入为 [‘1’,’2’,’3’]和3 输出为 [‘111’,’112’,’113’,’121’,’122’,’123’,’131’,’132’,’133’,’211’,’212’,’213’,’221’,’...
    99+
    2023-01-31
    排列组合 python list
  • 如何php数组排列组合
    在进行编程开发中,数组是一种非常常见和重要的数据类型。而排列组合则是数组处理中比较常见的操作,通过排列组合可以将数组中的元素按照不同的方式进行排列、组合,以达到不同的处理目的。在本文中,我们将重点讨论如何使用PHP编程语言实现数组的排列组合...
    99+
    2023-05-19
  • Java中怎么实现一个通用组合算法
    Java中怎么实现一个通用组合算法,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Java实现通用组合算法,存在一个类似{31311133,33113330}这样的集合,经过...
    99+
    2023-06-17
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作