将数字流分成更接近的整数组

时间:2018-10-22 08:58:35

标签: algorithm split numbers

我有一堆数字,例如

[2872, 2997, 3121, 13055, 14178, 14302, 23134, 23382, 23507, 32832, 33677, 34017, 43415, 44246, 44374, 52866, 54035, 54158, 62835, 64243, 64936, 73110, 73890, 74014, 82809, 83771, 83899, 93436, 94765, 94891].

我想按如下方式分割它:

[[2872, 2997, 3121], [13055, 14178, 14302], [23134, 23382, 23507], [32832, 33677, 34017], [43415, 44246, 44374], [52866, 54035, 54158], [62835, 64243, 64936], [73110, 73890, 74014], [82809, 83771, 83899], [93436, 94765, 94891]].

要注意的是,组之间的距离可以彼此更近,组内的数字也可以更远。

3 个答案:

答案 0 :(得分:0)

这不是答案,而是一种查看数据的方法,应该很有见地。

原始值:

enter image description here

增量:

enter image description here

答案 1 :(得分:0)

您不能只创建大小为N / 3(N是总数的总数)的整数列表(或数组数组)的列表,然后仅在此长度上循环并将最小数放入其中?

这样的事情(我不知道您使用什么语言,所以我以c#为例):

        int len = numbersStream.count();
        List<List<int>> BigList = new List<List<int>>();
        List<int> smallList = new List<int>();
        for (int i = 0; i < len; ++i)
        {
            smallList = new List<int>();
            for (int j = 0; j < 3; ++i)
            {
                int value = Math.Min(numbersStream);
                smallList.Add(value);
                numbersStream.remove(value);
            }
            BigList.Add(smallList);
        }

BigList将是(2872、2997、3121),(13055、14178、14302)等...

*假设您始终总是有%3个数字,否则您只需对算法进行调整即可避免出现异常

答案 2 :(得分:0)

解决方案是在Java中进行的,但是基本上这样做是找到平均增量,并且如果两个元素之间的差小于该平均值,则将所有内容归为一个子集。您可以通过更改averageDelta的运行方式来调整此过程

ps。该解决方案假定您的输入至少为1,并且称为temp

int[] diffrence = new int[temp.length-1];

for (int i=1; i < temp.length; i++) {
    diffrence[i-1] = temp[i]-temp[i-1];
}
int averageDelta = (int) Math.round(Arrays.stream(diffrence).average().orElse(1.0));

List<List<Integer>> resultList = new ArrayList<>();
List<Integer> currentList = new ArrayList<>();
currentList.add(temp[0]);

for (int i=1; i < temp.length; i++) {
    if (temp[i]-temp[i-1] > averageDelta) {
        resultList.add(currentList);
        currentList = new ArrayList<>();
    }
    currentList.add(temp[i]);
}
resultList.add(currentList);
System.out.println(resultList.toString());