我有一個遞歸算法,它可以生成給定數量的所有組合作爲參數。它也可以基於'k'做分區,這也可以作爲參數給出。只要我們輸入較小的數字,它就可以正常工作。但是隨着'n'的增加,計算結果需要更多的時間和空間。生成x個整數分區
是否有可能給出'x'作爲輸入,使算法只返回x分區的數量,而不是全部。下面是什麼我尋找一個例子:
輸入: N = 10, K = 4,分段N成「k'parts x = 2時,隔板的數目需要 M = 4,最大數在分區
輸出:
1)4,2,2,2
2)4,3,2,1
這裏是我使用的算法:
int h=0; //iterator
public ArrayList<int[]> generate_partitions(int n,int k,int max,boolean norep)
{
int korig;
korig = k;
int[] A = new int[korig+1];
ArrayList<int[]> partitions = new ArrayList<int[]>();
GenP(A, n, k, korig, 1,partitions,max);
if(norep)
{
for(int i=0; i<partitions.size(); i++)
{
if(check_repetition(partitions.get(i),max))
partitions.remove(i);
}
}
return partitions;
}
boolean check_repetition(int[] a,int max)
{
boolean[] hash = new boolean[max+1];
for(int i=0; i<max+1; i++)
hash[i]= false;
for(int i=0; i<a.length; i++)
{
if(hash[a[i]]==false)
hash[a[i]]=true;
else
return true;
}
return false;
}
void GenP(int[] A, int n, int k, int korig, int l, ArrayList<int[]> partitions,int max)
{
//n = number to partition
//korig = original k
//l = least number integer required in partition
if (k==1) // k = number of partitions
{
A[k]=n;
int [] temp = new int[korig];
// System.out.println("size = "+korig);
boolean max_check = false;
for (int j=1; j<=korig; j++)
{
// System.out.print(A[j]+" ");
temp[j-1]=A[j];
if(A[j]>max)
max_check = true;
}
if(!max_check) {
partitions.add(temp);
}
//System.out.println();
}
else
{
if (k==0)
{
h=0;
}
else
{
h=n/k;
for (int i=l; i<=h; i++)
{
A[k]=i;
GenP(A, n-A[k], k-1, korig, A[k], partitions,max);
}
}
}
}
如果您的代碼正常工作,請將其發佈在Code Review Stack Exchange上,因爲這不適用於SO社區 – ThreeFx