您的位置:首页 > 编程语言 > Java开发

每日一省之———— 递归 + 回溯 求集合的幂集

2017-02-22 00:44 211 查看


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

/**
* 所谓幂集(Power Set), 就是一个集合中所有的子集(包括全集和空集)作为元素构成的集合。
*
* 该类通过遍历一棵满二叉树,求解集合的幂集。程序的原理是:把求幂集元素的过程看作是在先序遍历一棵深度为n+1的满二叉树,
* 从根节点开始,访问左孩子表示幂集元素(集合的子集)中包含集合的第一个元素,访问右孩子表示幂集元素中不包含集合的
* 第一个元素,这样,在二叉树的第二层完成了对集合第一个元素的取舍,依次类推,当遍历到达第n+1层,也就是二叉树的叶
* 子节点时,完成了集合所有元素的取舍,这时输出一个取舍后的幂集元素。满二叉树的第n+1层共有2n个叶子节点,代表了集
* 合的2n个幂集元素,待遍历输出完整棵满二叉树的叶子节点,也就得到了我们要求的幂集。
*/
public class PowerSetFinder<V>
{

public static void main(String[] args)
{
// 初始化一个集合,放在list里面
List<String> list = new ArrayList<String>();
list.add("A");
list.add("B");
list.add("C");
list.add("D");
List<String> li = new ArrayList<String>();
printPowerSet(0, list, li);

System.out.println();
System.out.println("-------------------------------------------------");
System.out.println();

List<Integer> list1 = new ArrayList<Integer>();
list1.add(1);
list1.add(2);
list1.add(3);
list1.add(4);
List<Integer> li1 = new ArrayList<Integer>();
printPowerSet(0, list1, li1);
}

/**
* 递归 + 回溯 求幂集
* @param i
* @param list
* @param li
* @author lhever 2017年2月21日 下午11:50:21
* @since v1.0
*/
public static <V> void  printPowerSet(int i, List<V> list, List<V> li)
{

if (i > (list.size() - 1))
{
System.out.println(li);
} else
{
li.add(list.get(i));// 左加
printPowerSet(i + 1, list, li); // 递归方法
li.remove(list.get(i)); // 右去
printPowerSet(i + 1, list, li);
}
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  幂集 java