前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >一种均摊法实现

一种均摊法实现

作者头像
路行的亚洲
发布2022-11-16 14:46:28
2930
发布2022-11-16 14:46:28
举报
文章被收录于专栏:后端技术学习后端技术学习

内容来源于alibaba的开源项目ageiport,场景:如果需要基于集群节点进行均摊,对数据进行处理分而治之的话,就可以采用。

代码语言:javascript
复制
   //均摊分配
    public static <T> List<List<T>> averageAssign(List<T> source, int n) {
        List<List<T>> result = new ArrayList<>();
        //对当前的大小进行取模
        int remaider = source.size() % n;
        //对当前大小取整
        int number = source.size() / n;
        //偏移量
        int offset = 0;
        //对集群节点进行遍历
        for (int i = 0; i < n; i++) {
            List<T> value;
            //如果模大于0,则对任务列表进行部分获取 List<E> subList(int fromIndex, int toIndex);
            if (remaider > 0) {
                value = source.subList(i * number + offset, (i + 1) * number + offset + 1);
                remaider--;
                offset++;
            } else {
                value = source.subList(i * number + offset, (i + 1) * number + offset);
            }
            result.add(value);
        }
        return result;
    }

测试:

代码语言:javascript
复制
 //测试均摊算法
    public static void main(String[] args) {
        //子任务列表
        List<Integer> subTaskNos = new ArrayList<>();
        subTaskNos.add(1);
        subTaskNos.add(2);
        subTaskNos.add(3);
        subTaskNos.add(4);
        subTaskNos.add(5);
        subTaskNos.add(6);
        subTaskNos.add(7);
        subTaskNos.add(8);
        subTaskNos.add(9);
        subTaskNos.add(10);
        subTaskNos.add(11);
        subTaskNos.add(12);
        //当前的集群节点
        Integer nodeCount = 5;
        //执行均摊
        List<List<Integer>> subTaskAvgByNodeCount = Lists.averageAssign(subTaskNos, nodeCount);
        System.out.println(subTaskAvgByNodeCount);
    }

测试结果:

[1, 2, 3], [4, 5, 6], [7, 8], [9, 10], [11, 12]]

这个代码设计很巧妙,使用了取模和取余来实现对任务分发到不同的机器上,这样一来处理任务的时候,就可以快速完成任务的处理了。通常适应于大批量数据的处理。类似的思想:jdk中的fork-join也是分而治之的思想。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-10-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 后端技术学习 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档