美文网首页
排列组合算法

排列组合算法

作者: ironman_ | 来源:发表于2019-03-03 23:21 被阅读0次

给出一个字串,列出所有可能的排列组合

如果用for循环的话根本不知道需要多少层,所以这里的算法都是通过递归来完成。

排列

排列的思想就是从所有的可能选择数组里拿一个出来,放到目标数组,目标数组放满了则输出。

一个实现

    private static void arrangementSelect(String[] dataList, String[] resultList, int resultIndex) {
        int resultLen = resultList.length;
        if (resultIndex >= resultLen) { // 全部选择完时,输出排列结果
            System.out.println(Arrays.asList(resultList));
            return;
        }

        // 递归选择下一个
        for (int i = 0; i < dataList.length; i++) {
            // 判断待选项是否存在于排列结果中
            boolean exists = false;
            for (int j = 0; j < resultIndex; j++) {
                if (dataList[i].equals(resultList[j])) {
                    exists = true;
                    break;
                }
            }
            if (!exists) { // 排列结果不存在该项,才可选择
                resultList[resultIndex] = dataList[i];
                arrangementSelect(dataList, resultList, resultIndex + 1);
            }
        }
    }

这里的几个点:

  • 每次递归都去所有的选择里拿,然后看目标数组里是不是已经存在了,不存在则放入。
  • 每一次递归代往表目标数组放入一个数字。比如遍历A、B、C、D第一个递归放入A,第二个递归放入B,第三个递归放入C,第四个递归放入D,然后目标数组满了,然后第四个递归返回,返回到第三个递归,第三个递归上次放入的是C,这次放入D,然后又到第四个递归,第四个递归只剩下C可以放了,所以输出的顺序是ABCD,ABDC等等。

组合

    private static void combinationSelect(String[] dataList, int dataIndex, String[] resultList, int resultIndex) {
        int resultLen = resultList.length;
        int resultCount = resultIndex + 1;
        if (resultCount > resultLen) { // 全部选择完时,输出组合结果
            System.out.println(Arrays.asList(resultList));
            return;
        }

        // 递归选择下一个
        for (int i = dataIndex; i < dataList.length; i++) {
            resultList[resultIndex] = dataList[i];
            combinationSelect(dataList, i + 1, resultList, resultIndex + 1);
        }
    }

//useage
combinationSelect(new String[]{"A", "B", "C", "D"}, 0, new String[3], 0);

这里的不同点在于同一个位置选择过的数据不再选择。

参考文章:

相关文章

  • 排列组合-js

    排列组合 数学相关知识:5分钟彻底了解排列组合 参考:程序员必备算法——排列组合 排列有序,组合无序 3选2 :排...

  • 排列组合算法

    排列 排列概念 从m个不同元素中,任取n(n<=m)个元素按照一定的顺序排成一列,叫做从m个不同元素中取出n个元素...

  • 排列组合算法

    组合算法 非递归算法 组合算法的思路是开一个数组,其下标表示1到m个数,数组元素的值为1表示其下标代表的数被选中,...

  • 排列组合算法

    给出一个字串,列出所有可能的排列组合 如果用for循环的话根本不知道需要多少层,所以这里的算法都是通过递归来完成。...

  • iOS swift 排列组合 算法

    排列组合的算法有很多,例如递归、穷举,下面我们用位运算的方式来实现全组合的算法 - 原理: 我们以[1, 2, 3...

  • 算法导论第5.3章 - 随机算法

    随机算法 简而言之,随机算法就是随机设定输入的排列组合。与概率分析类似,这种方法可以用这种方法来估算算法的平均情况...

  • 排列组合公式及排列组合算法

    排列组合公式 排列组合公式/排列组合计算公式 公式P是指排列,从N个元素取M个进行排列。 公式C是指组合,从N个元...

  • 回溯算法

    【回溯算法】在 最优解、排列组合、解空间搜素 中存在典型应用 【动态规划】和【贪心算法】都要求 无后效性,即 子问...

  • 全组合

    第一种方法:/* 全组合 排列组合算法用途广泛, 需要掌握, 为降低门槛, 本文主要关注算法的逻辑和简易性, 未重...

  • 迷人的算法-排列组合

    需求 最近工作中碰到一个需求:我们的数据表有多个维度,任意多个维度组合后进行 group by 可能会产生一些”奇...

网友评论

      本文标题:排列组合算法

      本文链接:https://www.haomeiwen.com/subject/lidvuqtx.html