分组循环算法

分组循环算法(Group Round Robin Algorithm)通常用于将一组元素(如任务、数据项等)均匀地分配到多个组中,并可能在这些组之间循环地选择以进行进一步处理。这种算法在负载均衡、任务调度、数据分区等场景中非常有用。

适用场景:按照题目要求,数组会被分割成若干组,且每一组的判断/处理逻辑是一样的。

核心思想:外层循环负责遍历组之前的准备工作(记录开始位置),和遍历组之后的统计工作(更新答案最大值)。内层循环负责遍历组,找出这一组最远在哪结束。

时间复杂度是 O(n)。

例1:Leetcode题目Leetcode 2760.最长奇偶子数组-CSDN博客

例2:

import java.util.ArrayList;  
import java.util.List;  
  
public class GroupRoundRobin {  
  
    // 分组数量  
    private int groupCount;  
  
    // 存储每个组的任务列表  
    private List<List<Integer>> groups;  
  
    public GroupRoundRobin(int groupCount) {  
        this.groupCount = groupCount;  
        this.groups = new ArrayList<>();  
        for (int i = 0; i < groupCount; i++) {  
            groups.add(new ArrayList<>());  
        }  
    }  
  
    // 添加任务到分组中,使用循环分配  
    public void addTask(int task) {  
        int index = groups.size() - 1 & task % groups.size(); // 使用位运算优化取模操作  
        groups.get(index).add(task);  
    }  
  
    // 获取所有分组  
    public List<List<Integer>> getGroups() {  
        return groups;  
    }  
  
    // 示例用法  
    public static void main(String[] args) {  
        GroupRoundRobin grr = new GroupRoundRobin(3); // 假设有3个组  
  
        // 添加一些任务  
        for (int i = 1; i <= 15; i++) {  
            grr.addTask(i);  
        }  
  
        // 打印分组结果  
        List<List<Integer>> groups = grr.getGroups();  
        for (int i = 0; i < groups.size(); i++) {  
            System.out.println("Group " + (i + 1) + ": " + groups.get(i));  
        }  
    }  
}

在这个例子中,GroupRoundRobin 类用于管理分组和任务的分配。addTask 方法负责将新任务添加到相应的组中,使用位运算来优化取模操作(index = groups.size() - 1 & task % groups.size();),这是一种常见的技巧,用于提高性能,尤其是在处理大量数据时。注意,这里假设任务ID(即整数)是均匀分布的,因此可以直接用作分配的依据。

main 方法中创建了一个有3个组的GroupRoundRobin实例,并添加了15个任务。然后,它打印出每个组中的任务列表,展示了分组循环算法的效果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值