分组循环算法(Group Round Robin Algorithm)通常用于将一组元素(如任务、数据项等)均匀地分配到多个组中,并可能在这些组之间循环地选择以进行进一步处理。这种算法在负载均衡、任务调度、数据分区等场景中非常有用。
适用场景:按照题目要求,数组会被分割成若干组,且每一组的判断/处理逻辑是一样的。
核心思想:外层循环负责遍历组之前的准备工作(记录开始位置),和遍历组之后的统计工作(更新答案最大值)。内层循环负责遍历组,找出这一组最远在哪结束。
时间复杂度是 O(n)。
例1:Leetcode题目Leetcode 2760.最长奇偶子数组-优快云博客
例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个任务。然后,它打印出每个组中的任务列表,展示了分组循环算法的效果。