一个简单的子集产生算法

王朝other·作者佚名  2006-05-22
窄屏简体版  字體: |||超大  

在做关联规则挖掘模块的时候,由频繁项集产生关联规则,需要使用到子集产生的算法。比如:

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排列组合情况产生完成。

真是高明的做法!

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有 導航