一个简单的子集产生算法

原创 2006年05月22日 01:08:00

  在做关联规则挖掘模块的时候,由频繁项集产生关联规则,需要使用到子集产生的算法。比如:
char[] A={'a','b','c','d',...},集合A中,产生所有A的子集{'a'},{'b'},{'a','b'},{'a','b','c'}...这些。

1. 我最初的实现方法

  在OpenMiner的关联模块实现之处,我考虑的方法和人们思考产生子集的方法类型,既是先产生所有的单个元素的子集,然后产生2个元素的子集,然后3个的,一直到n个元素的子集。这种方法符合人们思考的方向,不容易找漏掉,但是实现起来就比较困难了。

  /**
  * 开始产生所有子集(非空)
  *
  */
 public void beginGenerateSubItemSets() {
  m_SubItemSetIndexes = new int[m_ItemIndexes.length];
  m_SubItemSetIndexes[0] = 0;
  m_SubItemSetIndexCount = 1;
 }
 
 /**
  * 产生下一个子集(非空)
  * @return
  */
 public ItemIndexSet nextSubItemSet() {
  int i,k,j;
  int length = m_ItemIndexes.length;
  
  if(m_SubItemSetIndexCount > length)
   return null;
  
  ItemIndexSet subItemSet = new ItemIndexSet();
  subItemSet.m_ItemIndexes = new int[m_SubItemSetIndexCount];
  for(i=0;i<m_SubItemSetIndexCount; i++) {
   k = m_SubItemSetIndexes[i];
   subItemSet.m_ItemIndexes[i] = m_ItemIndexes[k];
  }
  
  j=0;
  m_SubItemSetIndexes[i-1]++;
  while(m_SubItemSetIndexes[i-j-1] >= length-j) {
   if(i-j-2 < 0) {
    m_SubItemSetIndexCount++;
    if(m_SubItemSetIndexCount <= length) {
     for(i=0;i<m_SubItemSetIndexCount; i++)
      m_SubItemSetIndexes[i] = i;
    }
    return subItemSet;
   }
   m_SubItemSetIndexes[i-j-2]++;
   j++;
  }
  if (j > 0) {
   k = m_SubItemSetIndexes[i - j - 1];
   i = i - j;
   while (i < length)
    m_SubItemSetIndexes[i++] = ++k;
  }
  
  return subItemSet;
 }
 
 /**
  * 结束产生子集(非空)的过程
  *
  */
 public void endGenerateSubItemSets() {
  m_SubItemSetIndexes = null;
 }

我整整用了一个整数和一个数组来保存当前产生所有集合的索引,甚至还实现了一个任意进制的加法算法。

2. 高手的实现方法

  最近从CSDN上看到了一个人的做法,很简单:

class Test
{
 static void Main(string[] args)
 {
  char[] chs = {'a','b','c','d'};
  SubSet s = new SubSet(chs);
  s.Print();
 }

}
class SubSet
{
 char[] chs;
 int bits = 0;
 public SubSet(char[] chs)
 {
  this.chs = chs;
 }

 public void Print()
 {
  for(int i = 0;i < (1<<chs.Length);i++)
  {
   for(int j = 0; j< chs.Length; j++)
    if( ((1 << j) & i) !=0 )
     Console.Write( chs[j] );
   Console.WriteLine();
  }
 }
}

 里面二进制位1,0,来产生对应的集合元素。比如一个整数的所有n个bits对应集合内的n个元素,1表示该子集内包含该元素,0表示不包含。则通过一个整数的累加,肯定会把n个bits的所有1,0排列组合情况产生完成。

  真是高明的做法!

 

 

求集合的所有子集的算法

求集合的所有子集的算法对于任意集合A,元素个数为n(空集n=0),其所有子集的个数为2^n个如集合A={a,b,c},其子集个数为8;对于任意一个元素,在每个子集中,要么存在,要么不存在,对应关系是:...
  • yzl20092856
  • yzl20092856
  • 2014年10月11日 15:30
  • 2283

子集生成算法

      问题:  给定一个正整数,列出{1, 2, ···,n}的所有子集    朋友问我这个问题,一时无法作答,才发现,没有受过系统的计算机专业教育,对于我来讲,是个短板,于是,查看书籍,才在离...
  • zhwang_1999
  • zhwang_1999
  • 2008年03月02日 17:02
  • 3380

子集生成算法

本文地址: 子集的生成: 参考自:子集生成算法 生成n个元素的子集,我认为可以这样理解:有n个不同的桶,编号1~n,每个桶最多放置一个球。遍历一遍桶,可以将球放入也可以不放入,这样, 在遍历结束后,...
  • spch2008
  • spch2008
  • 2013年07月30日 22:17
  • 3223

任意N个数的子集生成算法

第一种方法: #include #include #include #include using namespace std; int q[100]; int w[100]; int cmp(int...
  • AXuan_K
  • AXuan_K
  • 2014年11月30日 15:41
  • 917

输出一个集合的所有子集(算法)

转自输出一个集合的所有子集(算法) 时间复杂度很显然,最少也是2^n,空间复杂度,是n,代码比较简单(每个元素要么在子集中,要么不在,用 j 的二进制形式的每一位代表数组a中对应的位...
  • wdjhzw
  • wdjhzw
  • 2014年10月02日 20:53
  • 2696

一个简单的子集产生算法

  char[] A={a,b,c,d,...},集合A中,产生所有A的子集{a},{b},{a,b},{a,b,c}...这些。方法一: 根据二进制产生import java.text.*;publ...
  • rabbitbug
  • rabbitbug
  • 2007年10月26日 17:20
  • 878

一个简单的子集产生算法

 在做关联规则挖掘模块的时候,由频繁项集产生关联规则,需要使用到子集产生的算法。比如:char[] A={a,b,c,d,...},集合A中,产生所有A的子集{a},{b},{a,b},{a,b,c}...
  • ecitnet
  • ecitnet
  • 2007年10月17日 15:18
  • 505

一个字符串子集判断的算法

#include typedef struct node{ char value; struct node *next; }; int mapping(char *p) { sw...
  • codingkid
  • codingkid
  • 2011年04月12日 22:52
  • 673

求子集的算法

#include#include #includeusing namespace std;int prim=0;int pr (int sum){    int i;    int p=1;    i...
  • iwillsucceed555
  • iwillsucceed555
  • 2010年08月10日 19:22
  • 616

输出一个集合的所有子集合-Java代码实现(二)

接上篇,提供另外一种解题s
  • foreverbu
  • foreverbu
  • 2014年07月08日 16:39
  • 5739
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:一个简单的子集产生算法
举报原因:
原因补充:

(最多只允许输入30个字)