Java实现的权重算法(按权重展现广告)
基本算法描述如下:
1、每个广告增加权重
2、将所有匹配广告的权重相加sum,
3、以相加结果为随机数的种子,生成1~sum之间的随机数rd
4、.接着遍历所有广告,访问顺序可以随意.将当前节点的权重值加上前面访问的各节点权重值得curWt,判断curWt>= rd,如果条件成立则返回当前节点,如果不是则继续累加下一节点.直到符合上面的条件,由于rd<=sum因此一定存在curWt>=rd。
特别说明:
此算法和广告的顺序无关
importjava.util.ArrayList;
importjava.util.Collections;
importjava.util.Comparator;
importjava.util.LinkedHashMap;
importjava.util.List;
importjava.util.Map;
publicclassTest{
/**
*@paramargs
*/
@SuppressWarnings("unchecked")
publicstaticvoidmain(String[]args){
List<Node>arrNodes=newArrayList<Node>();
Noden=newNode(10,"测试1");
arrNodes.add(n);
n=newNode(20,"测试2");
arrNodes.add(n);
n=newNode(30,"测试3");
arrNodes.add(n);
n=newNode(40,"测试4");
arrNodes.add(n);
//Collections.sort(arrNodes,newNode());
Map<String,Integer>showMap=null;
intsum=getSum(arrNodes);
intrandom=0;
Nodekw=null;
for(intk=0;k<20;k++){
showMap=newLinkedHashMap<String,Integer>();
for(inti=0;i<100;i++){
random=getRandom(sum);
kw=getKW(arrNodes,random);
if(showMap.containsKey(kw.kw)){
showMap.put(kw.kw,showMap.get(kw.kw)+1);
}else{
showMap.put(kw.kw,1);
}
//System.out.println(i+""+random+""+getKW(arrNodes,random));
}
System.out.print(k+"");
System.out.println(showMap);
}
}
publicstaticNodegetKW(List<Node>nodes,intrd){
Noderet=null;
intcurWt=0;
for(Noden:nodes){
curWt+=n.weight;
if(curWt>=rd){
ret=n;
break;
}
}
returnret;
}
publicstaticintgetSum(List<Node>nodes){
intsum=0;
for(Noden:nodes)
sum+=n.weight;
returnsum;
}
publicstaticintgetRandom(intseed){
return(int)Math.round(Math.random()*seed);
}
}
classNodeimplementsComparator{
intweight=0;
Stringkw="";
publicNode(){}
publicNode(intwt,Stringkw){
this.weight=wt;
this.kw=kw;
}
publicStringtoString(){
StringBuildersbBuilder=newStringBuilder();
sbBuilder.append("weight=").append(weight);
sbBuilder.append("kw").append(kw);
returnsbBuilder.toString();
}
publicintcompare(Objecto1,Objecto2){
Noden1=(Node)o1;
Noden2=(Node)o2;
if(n1.weight>n2.weight)
return1;
else
return0;
}
}