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)文章
springboot啟動(dòng)后和停止前執(zhí)行方法示例詳解
這篇文章主要介紹了springboot啟動(dòng)后和停止前執(zhí)行方法,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-08-08
一文詳解如何使用線程池來(lái)優(yōu)化我們的應(yīng)用程序
線程池是一種工具,但并不是適用于所有場(chǎng)景。在使用線程池時(shí),我們需要根據(jù)應(yīng)用程序的性質(zhì)、計(jì)算資源的可用性和應(yīng)用程序的需求進(jìn)行適當(dāng)?shù)呐渲?。本文主要介紹了如何使用線程池來(lái)優(yōu)化我們的應(yīng)用程序,需要的可以參考一下2023-04-04
Spring?Boot?Reactor?整合?Resilience4j詳析
這篇文章主要介紹了Spring?Boot?Reactor整合Resilience4j詳析,文章通過(guò)引入pom包展開(kāi)詳細(xì)介紹,具有一定的參考價(jià)值,感興趣的小伙伴可以參考一下2022-09-09
java基礎(chǔ)實(shí)現(xiàn)猜數(shù)字小游戲
這篇文章主要為大家詳細(xì)介紹了java基礎(chǔ)實(shí)現(xiàn)猜數(shù)字小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11
ScheduledThreadPoolExecutor巨坑解決
這篇文章主要為大家介紹了使用ScheduledThreadPoolExecutor遇到的巨坑解決示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02
SpringBoot優(yōu)化連接數(shù)的方法詳解
SpringBoot開(kāi)發(fā)最大的好處是簡(jiǎn)化配置,內(nèi)置了Tomcat,下面這篇文章主要給大家介紹了關(guān)于SpringBoot優(yōu)化連接數(shù)的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-06-06

