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 2023年5月12日
    00
  • 详解SpringBoot静态方法获取bean的三种方式

    下面是详解Spring Boot静态方法获取bean的三种方式的完整攻略。 1. 使用ApplicationContextAware接口 通过实现ApplicationContextAware接口,可以获取ApplicationContext上下文,并在静态方法中获取bean。 示例代码: @Component public class BeanUtils …

    Java 2023年5月31日
    00
  • 自定义@RequestBody注解如何获取JSON数据

    自定义@RequestBody注解可以方便我们在处理请求数据时进行更细致的控制和处理。其实,要自定义@RequestBody注解获取JSON数据很简单,只需要通过反射机制获取请求体中的数据并进行处理即可。 以下是具体的步骤: 定义自定义注解 定义一个自定义注解并使用@Target(ElementType.PARAMETER)来标识该注解只能用在参数上,例如:…

    Java 2023年5月26日
    00
  • Java反应式框架Reactor中的Mono和Flux

    Java反应式框架Reactor中的Mono和Flux是两种非常重要的响应式数据类型。Mono是一种表示单个结果和可能的错误信息的数据类型,而Flux则是一种可以包含多个结果且可能有多个错误信息的数据类型。在Reactor框架中,这两种数据类型是非常常用的,下面我们将详细讲解它们的使用方法。 Mono和Flux的创建 要创建Mono和Flux对象,最常见的方…

    Java 2023年5月19日
    00
  • Maven 修改tomcat运行版本和端口的实现方法

    以下是“Maven 修改 Tomcat 运行版本和端口的实现方法”的攻略。 介绍 Maven是一个Java项目管理工具,可以自动化构建,依赖管理,以及项目信息管理。它的一个重要作用就是可以将项目打包成一个可以部署的War包。而Tomcat是一个Java Web应用程序服务器,可以运行打包好的War包。 在Maven的项目中,我们可以使用插件来管理Tomcat…

    Java 2023年5月20日
    00
  • java实现操作系统中的最佳置换Optimal算法

    Java实现操作系统中的最佳置换Optimal算法攻略 算法介绍 最佳置换算法(Optimal)也称为理论最优算法。其思想是根据还未完成的进程未来的使用情况,计算出每一个进程在什么时候会访问页面,然后选择最长时间以后才用到的页面进行置换。 实现步骤 首先根据需要分配的内存大小,将所有的物理块置为空闲状态,并初始化所有页面的最近使用时间为正无穷大。 当一个新页…

    Java 2023年5月19日
    00
  • Java的Struts框架报错“NullActionForwardException”的原因与解决办法

    当使用Java的Struts框架时,可能会遇到“NullActionForwardException”错误。这个错误通常由以下原因之一起: 配置错误:如果配置文件中没有正确配置,则可能会出现此。在这种情况下,需要检查文件以解决此问题。 转发名称:如果转发名称不正确,则可能出现此。在这种情况下,需要检查转发名称以解决此问题。 以下是两个实例: 例 1 如果配置…

    Java 2023年5月5日
    00
  • shiro 与 SpringMVC的整合完美示例

    以下是关于“shiro 与 SpringMVC的整合完美示例”的完整攻略,其中包含两个示例。 shiro 与 SpringMVC的整合完美示例 shiro是一个强大的Java安全框架,可以用于身份验证、授权、加密等。在本文中,我们将讲解如何将shiro与SpringMVC整合,以实现安全的Web应用程序。 整合步骤 将shiro与SpringMVC整合的步骤…

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