粗糙集的属性约简规则如下,数据如下所示:
a1 b1 c1 d1
a1 b2 c1 d2
a2 b3 c2 d3
a1 b2 c3 d3
a1 b1 c3 d3
a1 b3 c1 d3
a1 b4 c1 d1
最基本的:即,第一列属性去掉后,随后余下的属性进行查询时,相同的条件属性的决策属性没有冲突,则说明去掉第一列并没有不一致的数据产生,则说明第一列可去掉,如此循环,直到所有的决策属性都被判断完毕
说是很简单,但是实现起来细节问题很多,思路如下:
从第一个属性开始循环,直至最后一个条件属性,用余下的条件属性进行查询,分如下情况:
if(在DB中无相同的条件属性) 则说明根本不可能产生不一致数据的机会,此属性可去掉
if(有相同的条件属性)则找出相应的决策属性,判断是否相等{
if(决策属性相等) 则说明相同的条件属性并没有产生不同的决策属性,可去掉
if(决策属性不相等) 则说明相同的条件属性产生了不同的决策,不可去掉(此属性起关键作用)
}
问题:
判断一个Vector中的重复元素,并计算重复次数,并判断重复次数是否过半数以上,如下方法:
public boolean getSymbol(Vector<String> decisionProperty) {
boolean isFlag = false;
int length = decisionProperty.size();
Vector<String> distinctDecProperty = new Vector<String>();
Vector<Boolean> flag = new Vector<Boolean>();
int i = 0;
while (i < length) {
flag.add(true);
i++;
}
for (int j = 0; j < length; j++) {
i = j + 1;
int n = 1;
while (i < length) {
if (flag.get(i) == true) {
if (decisionProperty.get(j).equals(decisionProperty.get(i))) {
flag.set(i, false);
n++;
} else {
i++;
}
} else {
i++;
}
}
if (flag.get(j) == true) {
distinctDecProperty.add(decisionProperty.get(j));
}
if (n >= length / 2) {
isFlag = true;
}
}
if (distinctDecProperty.size() == decisionProperty.size()){
isFlag = false;
}
System.out.println(distinctDecProperty + " " + decisionProperty);
return isFlag;
}
以上代码为实现此功能的原程序,并不单单仅实现了此功能
需要注意的是,多设置了一个VECTOR型flag,用来标志重复的元素,若为flase,则说明已经和之前比较过的数据重复了,可不用比较。这样,用空间来换取了一定的时间复杂度。
还有distinctDecProperty是最后的没有重复的元素的VECTOR,注意语句的位置
今天的时间,一些花在resultset的结果如何判断为空上,还有是VECTOR的去重,属性约简思路的整理,和程序细节上,感觉仅仅写算法比用程序真正实现容易多了,:(
有的时候做多了,自己的脑子就浆糊了,抱怨下,:(
可能还有没有想到的,想起了再补充