Java實(shí)現(xiàn)的權(quán)重算法(按權(quán)重展現(xiàn)廣告)
基本算法描述如下:
1、每個(gè)廣告增加權(quán)重
2、將所有匹配廣告的權(quán)重相加sum,
3、以相加結(jié)果為隨機(jī)數(shù)的種子,生成1~sum之間的隨機(jī)數(shù)rd
4、.接著遍歷所有廣告,訪問(wèn)順序可以隨意.將當(dāng)前節(jié)點(diǎn)的權(quán)重值加上前面訪問(wèn)的各節(jié)點(diǎn)權(quán)重值得curWt,判斷curWt >= rd,如果條件成立則返回當(dāng)前節(jié)點(diǎn),如果不是則繼續(xù)累加下一節(jié)點(diǎn). 直到符合上面的條件,由于rd<=sum 因此一定存在curWt>=rd。
特別說(shuō)明:
此算法和廣告的順序無(wú)關(guān)
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
public class Test {
/**
* @param args
*/
@SuppressWarnings("unchecked")
public static void main(String[] args) {
List<Node> arrNodes = new ArrayList<Node>();
Node n = new Node(10, "測(cè)試1");
arrNodes.add(n);
n = new Node(20, "測(cè)試2");
arrNodes.add(n);
n = new Node(30, "測(cè)試3");
arrNodes.add(n);
n = new Node(40, "測(cè)試4");
arrNodes.add(n);
//Collections.sort(arrNodes, new Node());
Map<String, Integer> showMap = null;
int sum = getSum(arrNodes);
int random = 0;
Node kw = null;
for(int k = 0; k < 20; k++) {
showMap = new LinkedHashMap<String, Integer>();
for(int i = 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);
}
}
public static Node getKW(List<Node> nodes, int rd) {
Node ret = null;
int curWt = 0;
for(Node n : nodes){
curWt += n.weight;
if(curWt >= rd) {
ret = n;
break;
}
}
return ret;
}
public static int getSum(List<Node> nodes) {
int sum = 0;
for(Node n : nodes)
sum += n.weight;
return sum;
}
public static int getRandom(int seed) {
return (int)Math.round(Math.random() * seed);
}
}
class Node implements Comparator{
int weight = 0;
String kw = "";
public Node() {}
public Node(int wt, String kw) {
this.weight = wt;
this.kw = kw;
}
public String toString(){
StringBuilder sbBuilder = new StringBuilder();
sbBuilder.append(" weight=").append(weight);
sbBuilder.append(" kw").append(kw);
return sbBuilder.toString();
}
public int compare(Object o1, Object o2) {
Node n1 = (Node)o1;
Node n2 = (Node)o2;
if(n1.weight > n2.weight)
return 1;
else
return 0;
}
}
相關(guān)文章
java使用DOM4J對(duì)XML文件進(jìn)行增刪改查操作
這篇文章主要為大家詳細(xì)介紹了java使用DOM4J對(duì)XML文件進(jìn)行增刪改查操作,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-12-12
SpringBoot使用@PathVariable進(jìn)行數(shù)據(jù)校驗(yàn)的流程步驟
在SpringBoot項(xiàng)目中,我們經(jīng)常需要從 URL 中獲取參數(shù)并進(jìn)行相關(guān)的數(shù)據(jù)校驗(yàn),而@PathVariable注解就是一種非常方便的方式,可以讓我們?cè)诜椒▍?shù)中直接獲取URL中的參數(shù),并進(jìn)行數(shù)據(jù)校驗(yàn),本文將介紹如何使用@PathVariable注解進(jìn)行數(shù)據(jù)校驗(yàn)2023-06-06
mybatis源碼解讀之executor包語(yǔ)句處理功能
這篇文章主要介紹了executor包語(yǔ)句處理功能,mybatis中支持三種語(yǔ)句類(lèi)型,不同語(yǔ)句類(lèi)型支持的變量符號(hào)不同,下文詳細(xì)內(nèi)容,需要的小伙伴可以參考一下2022-02-02

