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

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

什么是按权重展现广告算法?

按权重展现广告算法是一种广告广泛应用的算法,主要用来按照指定的权重展现广告,以达到给高权重的广告更多展示的目的。简而言之,权重越高的广告展示的概率就越大。

如何实现按权重展现广告算法?

在Java中,我们可以使用以下三种方式实现按权重展现广告算法:

1. 使用Random类的nextInt()方法实现

我们可以使用Random类的nextInt()方法来生成指定范围内的随机数,然后根据广告的权重来确定广告的展示概率。具体实现步骤如下:

import java.util.*;

public class AdDisplay {

    private List<Advertisement> adList;
    private Random random;

    public AdDisplay(List<Advertisement> adList) {
        this.adList = adList;
        this.random = new Random();
    }

    public Advertisement displayAd() {
        int totalWeight = 0;
        for (Advertisement ad : adList) {
            totalWeight += ad.getWeight();
        }

        int rand = random.nextInt(totalWeight);
        int cumulativeWeight = 0;
        for (Advertisement ad : adList) {
            cumulativeWeight += ad.getWeight();
            if (rand < cumulativeWeight) {
                return ad;
            }
        }

        return null;
    }
}

在上述代码中,我们使用Random类的nextInt()方法生成一个指定范围内的随机数,然后根据广告的权重依次累加生成的随机数,最后比较累加值与广告的权重,即可确定该广告是否被展示。需要注意的是,我们在展示广告前要先计算出所有广告的权重总和,以便使用生成的随机数按比例确定展示哪个广告。

下面是使用该算法展示广告的示例代码:

import java.util.*;

public class Main {

    public static void main(String[] args) {
        Advertisement ad1 = new Advertisement("ad1", 4);
        Advertisement ad2 = new Advertisement("ad2", 3);
        Advertisement ad3 = new Advertisement("ad3", 2);
        Advertisement ad4 = new Advertisement("ad4", 1);

        List<Advertisement> adList = new ArrayList<>();
        adList.add(ad1);
        adList.add(ad2);
        adList.add(ad3);
        adList.add(ad4);

        AdDisplay adDisplay = new AdDisplay(adList);

        for (int i = 0; i < 10; i++) {
            Advertisement ad = adDisplay.displayAd();
            System.out.println("Display " + ad.getName());
        }
    }
}

class Advertisement {

    private String name;
    private int weight;

    public Advertisement(String name, int weight) {
        this.name = name;
        this.weight = weight;
    }

    public String getName() {
        return name;
    }

    public int getWeight() {
        return weight;
    }
}

输出结果如下:

Display ad1
Display ad1
Display ad3
Display ad2
Display ad1
Display ad1
Display ad2
Display ad1
Display ad1
Display ad1

2. 使用Apache Commons Math库的DiscreteDistribution类实现

除了使用Java本身的Random类外,我们还可以使用第三方库中的算法类来实现按权重展现广告算法。例如,我们可以使用Apache Commons Math库中的DiscreteDistribution类,它可以在O(n)的时间复杂度内展现具有不同权重的广告,具体实现步骤如下:

import org.apache.commons.math3.distribution.EnumeratedIntegerDistribution;

import java.util.*;

public class AdDisplay {

    private List<Advertisement> adList;
    private List<Integer> adIds;

    public AdDisplay(List<Advertisement> adList) {
        this.adList = adList;

        adIds = new ArrayList<>();
        for (int i = 0; i < adList.size(); i++) {
            adIds.add(i);
        }
    }

    public Advertisement displayAd() {
        int[] weights = new int[adList.size()];
        for (int i = 0; i < adList.size(); i++) {
            weights[i] = adList.get(i).getWeight();
        }

        EnumeratedIntegerDistribution dist = new EnumeratedIntegerDistribution(adIds, weights);
        int index = dist.sample();

        return adList.get(index);
    }
}

在上述代码中,我们先将所有广告的权重值存入一个数组中,并使用该数组和广告的ID列表来初始化一个EnumeratedIntegerDistribution对象,然后调用其sample()方法生成随机数,即可实现按权重展现广告。需要注意的是,该算法的时间复杂度为O(n),与广告数目成正比,因此在处理大规模数据时可能效率较低。

下面是使用该算法展示广告的示例代码:

import java.util.*;

public class Main {

    public static void main(String[] args) {
        Advertisement ad1 = new Advertisement("ad1", 4);
        Advertisement ad2 = new Advertisement("ad2", 3);
        Advertisement ad3 = new Advertisement("ad3", 2);
        Advertisement ad4 = new Advertisement("ad4", 1);

        List<Advertisement> adList = new ArrayList<>();
        adList.add(ad1);
        adList.add(ad2);
        adList.add(ad3);
        adList.add(ad4);

        AdDisplay adDisplay = new AdDisplay(adList);

        for (int i = 0; i < 10; i++) {
            Advertisement ad = adDisplay.displayAd();
            System.out.println("Display " + ad.getName());
        }
    }
}

class Advertisement {

    private String name;
    private int weight;

    public Advertisement(String name, int weight) {
        this.name = name;
        this.weight = weight;
    }

    public String getName() {
        return name;
    }

    public int getWeight() {
        return weight;
    }
}

输出结果如下:

Display ad1
Display ad2
Display ad1
Display ad1
Display ad3
Display ad3
Display ad2
Display ad1
Display ad1
Display ad2

3. 使用Apache Commons Math库的EnumeratedDistribution类实现

同样,我们还可以使用Apache Commons Math库中的EnumeratedDistribution类来实现按权重展现广告算法。EnumeratedDistribution类可以非常方便地定义离散概率分布,具体实现步骤如下:

import org.apache.commons.math3.distribution.EnumeratedDistribution;
import org.apache.commons.math3.util.Pair;

import java.util.*;

public class AdDisplay {

    private List<Advertisement> adList;
    private List<Pair<Advertisement, Double>> adPairs;

    public AdDisplay(List<Advertisement> adList) {
        this.adList = adList;

        adPairs = new ArrayList<>();
        for (Advertisement ad : adList) {
            adPairs.add(new Pair<>(ad, (double) ad.getWeight()));
        }
    }

    public Advertisement displayAd() {
        EnumeratedDistribution<Advertisement> dist = new EnumeratedDistribution<>(adPairs);

        return dist.sample();
    }
}

在上述代码中,我们使用Apache Commons Math库中的Pair类来存储广告和其对应的权重,然后使用广告列表和其对应的权重列表来初始化一个EnumeratedDistribution对象,最后调用其sample()方法即可生成随机数,即可实现按权重展现广告。需要注意的是,该算法的效率与广告数目无关,因此在处理大规模数据时表现更佳。

下面是使用该算法展示广告的示例代码:

import java.util.*;

public class Main {

    public static void main(String[] args) {
        Advertisement ad1 = new Advertisement("ad1", 4);
        Advertisement ad2 = new Advertisement("ad2", 3);
        Advertisement ad3 = new Advertisement("ad3", 2);
        Advertisement ad4 = new Advertisement("ad4", 1);

        List<Advertisement> adList = new ArrayList<>();
        adList.add(ad1);
        adList.add(ad2);
        adList.add(ad3);
        adList.add(ad4);

        AdDisplay adDisplay = new AdDisplay(adList);

        for (int i = 0; i < 10; i++) {
            Advertisement ad = adDisplay.displayAd();
            System.out.println("Display " + ad.getName());
        }
    }
}

class Advertisement {

    private String name;
    private int weight;

    public Advertisement(String name, int weight) {
        this.name = name;
        this.weight = weight;
    }

    public String getName() {
        return name;
    }

    public int getWeight() {
        return weight;
    }
}

输出结果如下:

Display ad1
Display ad3
Display ad1
Display ad2
Display ad2
Display ad1
Display ad1
Display ad3
Display ad1
Display ad1

至此,三种实现按权重展现广告算法的方法均已完成。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java实现的权重算法(按权重展现广告) - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • java实现简单学生成绩管理系统

    下面是“Java实现简单学生成绩管理系统”的完整攻略: 1. 系统简介 本学生成绩管理系统是用Java语言编写的一个简单的命令行应用程序,用于管理学生的考试成绩。系统可以实现以下功能: 添加学生信息 添加学生成绩 查询学生成绩 修改学生成绩 删除学生成绩 统计学生成绩 2. 思路分析 在实现该系统之前,需要对系统的流程进行分析和设计。系统主要分为两类数据,学…

    Java 2023年5月19日
    00
  • java与JSON数据的转换实例详解

    下面是Java与JSON数据的转换实例详解的完整攻略。 什么是JSON JSON是JavaScript Object Notation的缩写,它是一种轻量级、易于读写的数据格式,可以被多种编程语言解析和生成。JSON的主要优势在于它的可读性、可解析性和可靠性,由于其原始格式为文本,因此可以通过网络传输,而且多种编程语言都提供了JSON的解析和生成支持。 JS…

    Java 2023年5月26日
    00
  • JSP的response对象的实例详解

    JSP的response对象的实例详解 在JSP中,response对象代表服务器向客户端发送响应。它是JSP内置对象之一,可以用来设置HTTP响应的相关信息,如响应头、响应状态码、输出内容等。在本篇攻略中,我们将详细讲解如何使用response对象,包括以下内容: 设置响应头 设置响应状态码 输出HTML内容 文件下载 设置响应头 使用response对象…

    Java 2023年6月15日
    00
  • 详解SpringMVC的类型转换及验证方法

    详解SpringMVC的类型转换及验证方法 SpringMVC是一个非常流行的Java Web框架,它提供了许多有用的功能,包括类型转换和验证。在本文中,我们将详细介绍SpringMVC的类型转换和验证方法,并提供一些示例来说明这些方法的使用。 类型转换 在SpringMVC中,我们可以使用类型转换器将请求参数转换为Java对象。SpringMVC提供了许多…

    Java 2023年5月17日
    00
  • 在idea中创建SpringBoot项目

    下面我会给出详细的教程步骤。 一、安装Java和IntelliJ IDEA 在创建SpringBoot项目之前,您需要先安装Java和IntelliJ IDEA开发工具。 如果您还没有Java环境,请先从官方网站中下载并安装JAVA环境。请注意,SpringBoot 2.x版本至少需要Java 8。 然后,在官方网站上下载适合您操作系统的IntelliJ I…

    Java 2023年5月15日
    00
  • Java面试题冲刺第二十一天–JVM

    Java面试题冲刺第二十一天–JVM 一、了解JVM 1. JVM的概念 JVM(Java Virtual Machine)即Java虚拟机,是Java语言的运行环境,负责将Java字节码文件转换为机器指令执行。 2. JVM的内部结构 JVM的内部结构分为三个部分:类加载器,运行时数据区,执行引擎。 2.1 类加载器 用来加载类文件,包括如下几种类型: …

    Java 2023年5月26日
    00
  • 关于Ubuntu Server 18.04 LTS 安装Tomcat并配置systemctl管理Tomcat服务的问题

    下面是详细讲解如何在Ubuntu Server 18.04 LTS系统上安装Tomcat并配置systemctl管理Tomcat服务的完整攻略。 1. 安装Tomcat 在Ubuntu Server 18.04 LTS系统上安装Tomcat的方法如下: 软件包更新:需要更新软件包列表和已安装软件包,以防止出现软件包依赖错误等问题,在终端中执行以下命令: su…

    Java 2023年5月19日
    00
  • Spring Security表单配置过程分步讲解

    下面是关于Spring Security表单配置过程分步讲解的攻略,包含以下几个步骤: 引入Spring Security依赖 要使用Spring Security,需要在项目中引入相应的依赖。在Maven项目中,可以在pom.xml文件中添加以下依赖: <dependency> <groupId>org.springframewor…

    Java 2023年5月20日
    00
合作推广
合作推广
分享本页
返回顶部