Backtracking-how to solve subset problem and full permutation

本文介绍了两种常见的算法——全排列问题与子集问题,并提供了详细的实现案例。针对全排列问题,采用邻位交换法与标签法两种解决方案;对于子集问题,则运用选择拼接法实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在算法基础中,有两种关于排列的算法经常使用到,一种是<1>全排列问题(有序),一种是<2>子集问题(无序)。接下来我们使用数据集进行案例演示:

in the algorithm foundation.there are tow kinds of algorithm are often used.one named full permutation problem,and another one named subSet problem.let us show it through a demostrate.

<1>数据:

elemnt:[1,2,3]

result:
1 2 3 
1 3 2 
2 1 3 
2 3 1 
3 2 1 
3 1 2 

<2>数据:

elemnt:[1,2,3]

result:
1 2 3 
1 2 
1 3 
1 
2 3 
2 
3 

如何实现需求<1> <2>的需求?

<1>.1-----邻位交换法

<1>.1-----Ortho transposition algorithm
//程序大意:
//通过递归交换内部元素进行全排列的生成

package Algorithm;


//这是配列问题的第一种解法
//也成为邻位对换算法
public class ArrangementProblemsA1 {
    public static void main(String[] args) {
        int[] list = {1,2,3};
        Perm(list,0,list.length);
    }

    public static void Perm(int[] list, int k, int m) {
        //只剩下最后一个元素不需要置换
        if (k == m) {
            for(int index = 0;index<list.length;index++){
                System.out.print(list[index]+" ");
            }
            System.out.println();
        }
        else{
            for(int index = k;index<m;index++){
                //将list[k]作为首部
                Swap(list,index,k);
                //将list[k+1:m]作为递归条件
                Perm(list,k+1,m);
                //复位
                Swap(list,index,k);
            }
        }
    }

    public static void Swap(int[] list,int i,int j){
        int temp = list[i];
        list[i] = list[j];
        list[j] = temp;
    }
}

<1>.2-----label algorithm

<1>.2-----标签法

//程序大意:
//通过判断是否fang'wen

package Algorithm;


//这是配列问题的第二种解法
public class ArrangementProblemsA2 {

    static int n = 10;
    //设置结果数组
    static int[] result = new int[n];
    //设置标志位
    //默认为false
    static boolean[] hashTable = new boolean[n];
    static int[] list = {1, 2, 3, 4, 5};


    public static void main(String[] args) {

        //从index = 0开始全排列
        Perm(0);
    }

    public static void Perm(int index) {
        //如果排到最后一位的时候则可以直接打印数据
        if (index == 2) {

            for (int i = 0; i < list.length; i++) {
                System.out.print(result[i] + " ");
            }
            System.out.println();
        } else {
            for (int x = 0; x < list.length; x++) {
                //System.out.println(">>>>>>>>>>>>>>>>>"+index+"   "+list.length);
                //若当前标志位还在则进行置换
                if (hashTable[x] == false) {
                    result[index] = list[x];
                    hashTable[x] = true;
                    Perm(index+1);
                    //还原标志位
                    hashTable[x] = false;
                }
            }
        }
    }
}

<2>-----selective splicing algorithm

<2>-----选择拼接法

package Algorithm.Recursion;

import java.util.ArrayList;

/**
 * @author 韦海涛
 * @version 1.0
 * @date 4/17/2021 2:08 AM
 */
public class ArrangementProblemsC {
    //用于存放求取子集中的元素
    public static ArrayList<Integer> list = new ArrayList<Integer>();
    public static void getSubSet(int[] A, int step,int len) {
        while (step != A.length) {
            //递归执行语句,向数组链表中添加一个元素
            list.add(A[step]);
            step++;
            getSubSet(A, step,len);
            //回溯执行语句,删除数组链表最后一个元素
            list.remove(list.size() - 1);
        }
        for(int i = 0;i < list.size();i++) {
            System.out.print(list.get(i)+" ");
        }
        System.out.println();

    }

    public static void main(String[] args) {
        int [] arr = {1,2,3};
        getSubSet(arr,0,3);
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值