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; } }