我们正在使用堆算法来生成数组 a 的排列。 .生成的排列被传递给 printArr 函数, 它根据当前排列计算两个数组 X 和 Y 之间的相关系数。这按预期工作,但是对于更大的数字,例如超过20。 堆的排列呈指数级缓慢。知道我们如何才能显着改进基于堆的排列。
void printArr(int a[], int n, double X[], double Y[], int *diff, double corrcoeffO)
{
for (int i = 0; i < n; i++)
{
// cout << a[i] << " ";
}
// printf("\n");
double corrcoeffHP = correlationCoefficient(X, Y, a, n);
if (abs(corrcoeffHP) >= abs(corrcoeffO))
{
++(*diffCount);
}
}
void heapPermutation(int a[], int size, int n, double X[], double Y[], int *diffCount, double corrcoeff)
{
if (size == 1)
{
printArr(a, n, X, Y, diffCount, corrcoeff);
return;
}
for (int i = 0; i < size; i++)
{
heapPermutation(a, size - 1, n, X, Y, diffCount, corrcoeff);
if (size % 2 == 1)
{
swap(a[0], a[size - 1]);
}
else
{
swap(a[i], a[size - 1]);
}
}
}