前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >algorithm--数组分批次算法

algorithm--数组分批次算法

作者头像
潇洒
发布2023-10-20 10:39:18
1390
发布2023-10-20 10:39:18
举报
文章被收录于专栏:石头岛石头岛

要求

对一个数组,按指写个数n,划为一组。 比如有一个数组,包含1200000 的数据,要求每1000为一组。放到一个新的Array里要怎么处理呢。 方法肯定有很多,可以一一来验证。

取模

可能是最简单的方式:取模。可以用少最数据验证一下。 思路很简单:

  1. 对 step 取模,每到1000就打印一下,这一步也机以创建新的数组都可以的
  2. else就是普通的处理
代码语言:javascript
复制
public class Test {

  public static void main(String[] args) {
    int total = 120;
    int step = 10;
    int[] array = new int[total];
    for (int i = 0; i < total; i++) {
      if (i % step == 0) {
        // 在这里相当于可以做一些特殊的开头处理,比如创建一个新的容器之类,这里我就直接用来打印
        array[i] = i;
        System.out.println(Arrays.toString(array));
      } else {
        array[i] = i;
      }
    }
    System.out.println(Arrays.toString(array));
  }
}

结果:

代码语言:javascript
复制
0
10
20
30
40
50
60
70
80
90
100
110
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119]

分段

这个思路是:把每一段的startend直接算出来。 这样有一个好处,就是可以提前知道每一段的位置,这样可以提前做一些处理。比如,在并发场景下,可以把每一段的startend直接拿到,提交给不是的线程去处理。

实现

代码语言:javascript
复制
public class ListTest {

  public static void test1() {
    int data = 1200000;
    int batch = 5;
    int segment = data / batch;
    for (int i = 0; i < batch; i++) {
      int start = i * segment;
      int end = start + segment - 1;
      System.out.println("start: " + start);
      System.out.println("end: " + end);
    }
  }
}

可以看一下结果,下面这样就很棒棒了:

代码语言:javascript
复制
start: 0
end: 239999
start: 240000
end: 479999
start: 480000
end: 719999
start: 720000
end: 959999
start: 960000
end: 1199999

假设现在有一个线程池,就可以直接用上,比如在定时任务计算一天的订单或者其它批量任务,就可以这样分。

双层for

虽然是双层for,但是很多刚开始学算法的人,未必能想到这种方式。 这种方式的关键点在于,i 的每一段都是 j 的起点,这种方式最大的好处是,煅练算法的小技巧,让自己多了解一种技巧。 结果是一样的,可以自行验证。

代码语言:javascript
复制
public class StepTest {

  public static void main(String[] args) {
    int[] arr = new int[100000];
    int step = 100;

    int count = 0;
    for (int i = 0; i < arr.length ; i = i + step) {
      System.out.println("current count: " + count++);
      for (int j = i; j < i + step && j < arr.length ; j++) {
        arr[j] = j;
        System.out.println(arr[j]);
      }
    }
  }
}

总结

分组算法,还有很多种,这里只是抛砖引玉,最主要还是熟练这种用法,当做一个基础的练习。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2016-05-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 要求
    • 取模
    • 分段
      • 双层for
      • 总结
      相关产品与服务
      容器服务
      腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档