packageBaseStructure.Tree;importjava.util.BitSet;importjava.util.HashSet;importjava.util.Set;publicclassProperSubsetCombination {privatestaticInteger[] array;privatestaticBitSet startBitSet;//比特集合起始状态privatestaticBitSet endBitSet;//比特集合终止状态,用来控制循环privatestaticSet>properSubset;//真子集集合/*** 计算得到一个集合的非空真子集集合
*
*@paramn
* 真子集的大小
*@paramitemSet
* 一个频繁项集元素
*@return非空真子集集合*/publicstaticSet>getProperSubset(intn, SetitemSet) {
Integer[] array=newInteger[itemSet.size()];
ProperSubsetCombination.array=itemSet.toArray(array);
properSubset=newHashSet>();
startBitSet=newBitSet();
endBitSet=newBitSet();//初始化startBitSet,左侧占满1for(inti=0; i
startBitSet.set(i,true);
}//初始化endBit,右侧占满1for(inti=array.length-1; i>=array.length-n; i--) {
endBitSet.set(i,true);
}//根据起始startBitSet,将一个组合加入到真子集集合中get(startBitSet);while(!startBitSet.equals(endBitSet)) {intzeroCount=0;//统计遇到10后,左边0的个数intoneCount=0;//统计遇到10后,左边1的个数intpos=0;//记录当前遇到10的索引位置//遍历startBitSet来确定10出现的位置for(inti=0; i
zeroCount++;
}if(startBitSet.get(i)&&!startBitSet.get(i+1)) {
pos=i;
oneCount=i-zeroCount;//将10变为01startBitSet.set(i,false);
startBitSet.set(i+1,true);break;
}
}//将遇到10后,左侧的1全部移动到最左侧intcounter=Math.min(zeroCount, oneCount);intstartIndex=0;intendIndex=0;if(pos>1&&counter>0) {
pos--;
endIndex=pos;for(inti=0; i
startBitSet.set(startIndex,true);
startBitSet.set(endIndex,false);
startIndex=i+1;
pos--;if(pos>0) {
endIndex=pos;
}
}
}
get(startBitSet);
}returnproperSubset;
}/*** 根据一次移位操作得到的startBitSet,得到一个真子集
*
*@parambitSet*/privatestaticvoidget(BitSet bitSet) {
Setset=newHashSet();for(inti=0; i
set.add(array[i]);
}
}
properSubset.add(set);
}
}