1. 定义
2划分,是指多个事物作为一个集合S,把集合S的事物分成两部分。而这样的不同划分有多少个,即为2划分数。
例如,S={A,B,C}。则2划分有[A] | [B,C] , [B] | [A,C] , [C] | [A, B] .2划分数为3.
2. 算法实现
假设S的大小为n,即有n个元素。那么相对于S的不同划分有 2的(n-1)次方 减 1 个。
所以,用一个n位的二进制字符串表示一个划分,其中二进制字符串中每一位对应代表S集合中的元素,位为1的对应元素在划分的一部分,位为0的对应元素在划分的另一部分。这个二进制字符串首位为0,其他n-1位表示 的数从1开始,一直到2的(n-1)次方 减 1 为止。
2.1 生成对应2进制的字符串代码
int int_size = (int)Math.pow(2, int_attr_val_num-1)- 1; // 求2的n次幂,再减1
String[] strarr_binary = new String[int_size];
for (int i = 1; i <= int_size; i++) {
StringBuffer sb = new StringBuffer(Integer.toBinaryString(i)); //整型数据转化为二进制字符串
int length = sb.length();
if (length < int_attr_val_num) {
//填补位,使位数与n一样
for (int j = 0; j < int_attr_val_num - length; j++) {
sb.insert(0, "0");
}
}
strarr_binary[i-1] = sb.toString();
}
2.2 根据匹配2进制字符串,获得一个划分
for(int int_i=0; int_i<str_bi.length(); int_i++) {
if(str_bi.charAt(int_i) == '0') {
//在str_bi中字符为0的,分为一组
set_part_0.add(strarr_attr_val[int_i]);
} else {
set_part_1.add(strarr_attr_val[int_i]);
}
}