欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java实现的权重算法(按权重展现广告)

程序员文章站 2024-03-31 17:11:16
基本算法描述如下: 1、每个广告增加权重 2、将所有匹配广告的权重相加sum, 3、以相加结果为随机数的种子,生成1~sum之间的随机数rd 4、.接着遍历所...

基本算法描述如下:

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