algorithm--数组分批次算法

2023-10-20 10:39:18 浏览数 (2)

要求

对一个数组,按指写个数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]);
      }
    }
  }
}

总结

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

0 人点赞