树节点加权得分

一棵树,层次不限,深度可以不一,只要设定好叶子节点的权重,得分,就可以一次求得每一个节点的得分,当然,每一个节点的权重也是要提前设定的:

 

/**

* 递归计算当前节点的得分=子节点的加权得分

* @param curr_folder_id

* @return

*/

public double calNodeScore(String curr_folder_id){

Dao dao = new DaoImp();

double gs = 0;//当前节点的加权结果,若当前节点包括叶子和非叶子节点

try{

String pfkSQL = "select folder_id,isleaf,weight,score from estimate_card where status=1 and par_folder_id="+curr_folder_id;

List ll = dao.getResultList(pfkSQL);

for(int ii = 0;ii<ll.size();ii++){//当前节点的子节点,包括可能的叶子节点和非叶子节点

String child_folder_id = (String)((Map)ll.get(ii)).get("FOLDER_ID");

String isleaf = (String)((Map)ll.get(ii)).get("ISLEAF");

String weight = (String)((Map)ll.get(ii)).get("WEIGHT");

if("0".equals(isleaf)){

//当前节点的非叶子子节点的计算结果

double ret = calNodeScore(child_folder_id);

//还要和兄弟节点的结果进行加权

gs += (ret*Double.valueOf(weight));

}else{

//当前节点的叶子子节点

double s = Double.valueOf((String)((Map)ll.get(ii)).get("SCORE"));

double w = Double.valueOf((String)((Map)ll.get(ii)).get("WEIGHT"));

gs += s*w;

}

}

//更新当前节点的加权得分

String update = "update estimate_card set score="+gs+" where folder_id="+curr_folder_id;

dao.update(update);

}catch(Exception e){

e.printStackTrace();

}finally{

dao.closeconn();

}

return gs;

}

 

另外,算法很需要实际业务模型的理解,还有参考,还需要实际的大概逻辑

猜你喜欢

转载自zengshaotao.iteye.com/blog/2300333