当前位置: 移动技术网 > IT编程>开发语言>Java > Java实现的权重算法(按权重展现广告)

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

2019年07月22日  | 移动技术网IT编程  | 我要评论

基本算法描述如下:

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

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网