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ù)呐渲谩1疚闹饕榻B了如何使用線程池來(lái)優(yōu)化我們的應(yīng)用程序,需要的可以參考一下2023-04-04Spring?Boot?Reactor?整合?Resilience4j詳析
這篇文章主要介紹了Spring?Boot?Reactor整合Resilience4j詳析,文章通過(guò)引入pom包展開(kāi)詳細(xì)介紹,具有一定的參考價(jià)值,感興趣的小伙伴可以參考一下2022-09-09java基礎(chǔ)實(shí)現(xiàn)猜數(shù)字小游戲
這篇文章主要為大家詳細(xì)介紹了java基礎(chǔ)實(shí)現(xiàn)猜數(shù)字小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11ScheduledThreadPoolExecutor巨坑解決
這篇文章主要為大家介紹了使用ScheduledThreadPoolExecutor遇到的巨坑解決示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02SpringBoot優(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