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

 更新时间:2015年04月28日 10:02:54   投稿:junjie  
这篇文章主要介绍了Java实现的权重算法(按权重展现广告),本文讲解了算法实现原理和实现代码,需要的朋友可以参考下

基本算法描述如下:

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

相关文章

  • MyBatis下SQL注入攻击的3种方式

    MyBatis下SQL注入攻击的3种方式

    SQL注入漏洞作为WEB安全的最常见的漏洞之一,本文希望通过Mybatis框架使用不当导致的SQL注入问题为例,能够抛砖引玉给新手一些思路。感兴趣的可以了解一下
    2021-07-07
  • C++内存管理看这一篇就够了

    C++内存管理看这一篇就够了

    这篇文章主要介绍了C/C++中的内存管理小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-08-08
  • SpringBoot 集成 activiti的示例代码

    SpringBoot 集成 activiti的示例代码

    这篇文章主要介绍了SpringBoot 集成 activiti的示例代码,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-10-10
  • java猜数字小游戏案例

    java猜数字小游戏案例

    这篇文章主要为大家详细介绍了java猜数字小游戏案例,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-10-10
  • java使用DOM4J对XML文件进行增删改查操作

    java使用DOM4J对XML文件进行增删改查操作

    这篇文章主要为大家详细介绍了java使用DOM4J对XML文件进行增删改查操作,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-12-12
  • 基于java中的PO VO DAO BO POJO(详解)

    基于java中的PO VO DAO BO POJO(详解)

    下面小编就为大家带来一篇基于java中的PO VO DAO BO POJO(详解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06
  • 浅析在Java中如何优雅的停止一个线程

    浅析在Java中如何优雅的停止一个线程

    我们知道在Java中可以通过new Thread().start()创建一个线程,那今天我们就来思考另外一个问题:线程的终止,快跟随小编一起学习起来吧
    2024-03-03
  • SpringBoot使用@PathVariable进行数据校验的流程步骤

    SpringBoot使用@PathVariable进行数据校验的流程步骤

    在SpringBoot项目中,我们经常需要从 URL 中获取参数并进行相关的数据校验,而@PathVariable注解就是一种非常方便的方式,可以让我们在方法参数中直接获取URL中的参数,并进行数据校验,本文将介绍如何使用@PathVariable注解进行数据校验
    2023-06-06
  • mybatis源码解读之executor包语句处理功能

    mybatis源码解读之executor包语句处理功能

    这篇文章主要介绍了executor包语句处理功能,mybatis中支持三种语句类型,不同语句类型支持的变量符号不同,下文详细内容,需要的小伙伴可以参考一下
    2022-02-02
  • java获取每月的最后一天实现方法

    java获取每月的最后一天实现方法

    下面小编就为大家带来一篇java获取每月的最后一天实现方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-09-09

最新评论