子集生成算法


title: 子集生成算法
date: 2016-10-09 21:58:28
categories: 算法
tags: 穷举


问题描述

  子集生成是暴力求解算法中比较经典的问题,给出集合A,求得相应的子集,进行打印。首先明确子集的定义,举个例子,如果一个集合是
CodeCogsEqn (1).gif

那么生成的子集应当是空集,
CodeCogsEqn (2).gif

一般来说有三种方法,增量构造法,位向量法,二进制法。

算法思路

二进制法思路

  在这里集合中的元素一定是存储在数组中,所以可以看成数组中的元素和下标对应。那么此时集合中的元素就
CodeCogsEqn (3).gif

,转化成的二进制数,取值范围也就是
CodeCogsEqn (4).gif

这2^n个数也就是整个集合的全排列,只需要判断相应位置二进制表示,哪几位是1,然后输出相应位置的元素即可,便得到了整个集合的子集结果。

二进制法程序

下面给出子集生成算法的java代码:

public class CreateSubset {
    public static void get_subset(int n,int s,String str){
        for(int i=0;i<n;i++)
        {
            int res = s&(1<<i);//看这2的n次方个数上哪些的位数是1。
            if(res != 0)
                System.out.print(str.charAt(i));//然后打印子集即可。
        }
        System.out.println();
    }
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        String str = sc.nextLine();//从控制台得到字符串
        int n = str.length();
        for(int i=0;i<(1<<n);i++)//一共有2的n次方个子集
            get_subset(n,i,str);
    }
}

子集生成算法的Python代码如下:

class Solution(object):
    def  get_subset(self,n,s,str):
        for i in range(n):
            res = s & (1 << i)
            if res != 0:
                print str[i],
        print '\n'

    def test(self):
        str = raw_input('please input str:')
        n = len(str)
        lenth = 1 << n
        for i in range(lenth):
            self.get_subset(n,i,str)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 归去来兮。 1.1 说明 本篇为《挑战程序设计竞赛(第2版)》[http://www.ituring.com.cn...
    尤汐Yogy阅读 14,538评论 0 160
  • 前言 其实读完斯坦福的这本《互联网大规模数据挖掘》,让我感觉到,什么是人工智能?人工智能就是更高层次的数据挖掘。机...
    我偏笑_NSNirvana阅读 12,823评论 1 23
  • 9.3.3 快速排序   快速排序将原数组划分为两个子数组,第一个子数组中元素小于等于某个边界值,第二个子数组中的...
    RichardJieChen阅读 1,881评论 0 3
  • 今天是周三,西安的天空仍然弥漫着漫天雾气,阴霾让人心里很不利索。体育课的时候,我特意注意到了那个男生,我发现他总是...
    李晏然阅读 370评论 0 1
  • 找到吴新梅,说分享书!她很高兴,应约而来。我选择读两段给她听: 或许你一直认为掌控着自己的生活,但说不...
    徐丽红阅读 183评论 0 0