子集生成算法


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,444評論 0 160
  • 前言 其實讀完斯坦福的這本《互聯網大規模數據挖掘》,讓我感覺到,什么是人工智能?人工智能就是更高層次的數據挖掘。機...
    我偏笑_NSNirvana閱讀 12,713評論 1 23
  • 9.3.3 快速排序 ??快速排序將原數組劃分為兩個子數組,第一個子數組中元素小于等于某個邊界值,第二個子數組中的...
    RichardJieChen閱讀 1,863評論 0 3
  • 今天是周三,西安的天空仍然彌漫著漫天霧氣,陰霾讓人心里很不利索。體育課的時候,我特意注意到了那個男生,我發現他總是...
    李晏然閱讀 364評論 0 1
  • 找到吳新梅,說分享書!她很高興,應約而來。我選擇讀兩段給她聽: 或許你一直認為掌控著自己的生活,但說不...
    徐麗紅閱讀 180評論 0 0