`
zengshaotao
  • 浏览: 757694 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

树节点加权得分

 
阅读更多

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

 

/**

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

* @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;

}

 

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

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics