Java 整数分割迭代代码优化

Java 整数分割迭代代码优化,java,optimization,numbers,number-theory,integer-partition,Java,Optimization,Numbers,Number Theory,Integer Partition,我一直在编写代码,以迭代方式对整数进行分区,并使用以前的结果对数字进行完全分区,其思想是使用以前的分区可以提高速度。到目前为止,我的性能比递归分区整数慢22倍,而且由于内存很快用完,无法测试更大的数字。如果有人能帮助优化代码,我将非常感激 import java.util.ArrayList; 导入java.util.array; 导入java.util.HashMap; 导入java.util.HashSet; 导入java.util.List; 导入java.util.stream.coll

我一直在编写代码,以迭代方式对整数进行分区,并使用以前的结果对数字进行完全分区,其思想是使用以前的分区可以提高速度。到目前为止,我的性能比递归分区整数慢22倍,而且由于内存很快用完,无法测试更大的数字。如果有人能帮助优化代码,我将非常感激

import java.util.ArrayList;
导入java.util.array;
导入java.util.HashMap;
导入java.util.HashSet;
导入java.util.List;
导入java.util.stream.collector;
公开课总结{
私有静态HashMap结果;
私有静态哈希映射递归结果;
私有静态无效排序(int[]a){
//整数数组的基数排序
int i,m=a[0],exp=1,n=a.长度;
int[]b=新的int[n];
对于(i=1;im){
m=a[i];
}
}
而(m/exp>0){
int[]bucket=新的int[n];
对于(i=0;i=0;i--)
b[--bucket[(a[i]/exp)%n]=a[i];
对于(i=0;i1){
如果(等式get(1)>1){
HashSet temp=results.get(eq.get(1));
对于(列表k:temp){
List tempEquList=new ArrayList(k);
tempeqlist.add(eq.get(0));
int[]tempeq=tempeqlist.stream().mapToInt(Integer::intValue.toArray();
排序(tempeq);
results.get(n).add(Arrays.stream(tempeq).boxed().collect(Collectors.toList());
}
}
}
}
}
}
私有静态void recursivePartition(int n){
//递归划分
recursiveResults.put(n,new HashSet());
分区(n,n,“,n);
}
私有静态无效分区(int n、int max、字符串前缀、int键){
//递归分区法
如果(n==0){
recursiveResults.get(key).add(前缀);
返回;
}
对于(int i=Math.min(max,n);i>=1;i--){
分区(n-i,i,前缀+“”+i,键);
}
}
公共静态void main(字符串[]args){
//获取要获取的分区数
int target=Integer.valueOf(args[0]);
//为迭代版本计时
长时间1=System.currentTimeMillis();
结果=新HashMap(目标);
//循环直到完成

对于(int i=1;i您可以使用
mapToObj
reduce
方法生成一组指定数量的求和数组合,即整数分区。首先准备求和数数组集,然后按顺序将这些集合对相乘,得到笛卡尔积

int n=7;
Set partition=IntStream.range(0,n)
//准备总和数组集
.mapToObj(i->IntStream.rangeClosed(1,n-i)
.mapToObj(j->newint[]{j})
//溪流
.collect(收集器(
//比较两个数组的内容
()->新树集(数组::比较)))
//中间输出,总和数组集
.peek(设置->System.out.println(
set.stream().map(Arrays::toString.collect(Collectors.joining()))
//设置到给定数量的成对集合的顺序求和
.reduce((set1,set2)->set1.stream()
//内部数组的组合
.flatMap(arr1->{
//第一个数组的元素之和
int sum=Arrays.stream(arr1.sum();
//如果达到指定的数字
if(sum==n)返回Arrays.stream(新的int[][{arr1});
//否则继续追加求和
return set2.stream()//删除更大的组合
.filter(arr2->Arrays.stream(arr2.sum()+sum stream.of(arr1,arr2)
.flatMapToInt(数组::流)
.sorted().toArray());//已排序的数组
})//组合数组集
.collect(收集器.toCollection(//两个不同的数组
//只有顺序被认为是相同的分区
()->新树集(数组::比较)))
//否则将创建一组空数组
.orElse(新树集(数组::比较));
//最终输出,指定数字的整数分区
partition.stream().map(Arrays::toString).forEach(System.out::println);
中间输出,总和数组集:

[1][2][3][4][5][6][7]
[1][2][3][4][5][6]
[1][2][3][4][5]
[1][2][3][4]
[1][2][3]
[1][2]
[1]
最终输出,指定数字的整数分区:

[1, 1, 1, 1, 1, 1, 1]
[1, 1, 1, 1, 1, 2]
[1, 1, 1, 1, 3]
[1, 1, 1, 2, 2]
[1, 1, 1, 4]
[1, 1, 2, 3]
[1, 1, 5]
[1, 2, 2, 2]
[1, 2, 4]
[1, 3, 3]
[1, 6]
[2, 2, 3]
[2, 5]
[3, 4]
[7]


另请参见:

我认为您必须提供一些上下文。您所说的“整数分区”是什么意思?请展示输入和输出的示例。您不使用wikipedia文章中给出的显式公式有什么特别的原因吗?看起来