隨筆-204  評論-90  文章-8  trackbacks-0

          需求:廣告按權重展現

          基本算法描述如下:
          1、每個廣告增加權重
          2、將所有匹配廣告的權重相加sum,
          3、以相加結果為隨機數的種子,生成1~sum之間的隨機數rd
          4、.接著遍歷所有廣告,訪問順序可以隨意.將當前節點的權重值加上前面訪問的各節點權重值得curWt,判斷curWt >=  rd,如果條件成立則返回當前節點,如果不是則繼續累加下一節點. 直到符合上面的條件,由于rd<=sum 因此一定存在curWt>=rd。
          特別說明:
                  此算法和廣告的順序無關

          測試代碼如下:

          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"測試1");
                  arrNodes.add(n);
                  n 
          = new Node(20"測試2");
                  arrNodes.add(n);
                  n 
          = new Node(30"測試3");
                  arrNodes.add(n);
                  n 
          = new Node(40"測試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;
              }

          }
          posted on 2010-08-31 17:08 一凡 閱讀(3400) 評論(0)  編輯  收藏 所屬分類: JAVA 基礎數據結構&算法
          主站蜘蛛池模板: 钟祥市| 金阳县| 庄河市| 桐城市| 湘潭县| 土默特左旗| 浑源县| 五河县| 舞钢市| 阆中市| 宁津县| 万宁市| 宁强县| 宜春市| 卢湾区| 堆龙德庆县| 乌海市| 祁东县| 运城市| 夏津县| 香港| 永顺县| 关岭| 洪洞县| 和平县| 韩城市| 顺义区| 五原县| 江都市| 湖南省| 申扎县| 云龙县| 曲靖市| 彭州市| 工布江达县| 织金县| 信阳市| 灵璧县| 绥化市| 承德县| 施秉县|