分组循环算法
分组循环算法(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个任务。然后,它打印出每个组中的任务列表,展示了分组循环算法的效果。