粗糙集的属性约简规则如下,数据如下所示: a1 b1 c1 d1a1 b2 c1 d2a2 b3 c2 d3a1 b2 c3 d3a1 b1 c3 d3a1 b3 c1 d3a1 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的去重,属性约简思路的整理,和程序细节上,感觉仅仅写算法比用程序真正实现容易多了,:( 有的时候做多了,自己的脑子就浆糊了,抱怨下,:( 可能还有没有想到的,想起了再补充

评论