C 获取数组中所有可能元素组合的最小差异
我有一个非常非常长的数组,我必须得到2个元素的所有可能组合的最小差 这是我的代码:C 获取数组中所有可能元素组合的最小差异,c,arrays,sorting,optimization,difference,C,Arrays,Sorting,Optimization,Difference,我有一个非常非常长的数组,我必须得到2个元素的所有可能组合的最小差 这是我的代码: [...] int diff = 1000000; // a very big difference that i'm sure is too big int tmpDiff; // swap //Compare for (size_t i = 0; i < N; i++) { // I try every combination of 2 elements of array for (siz
[...]
int diff = 1000000; // a very big difference that i'm sure is too big
int tmpDiff; // swap
//Compare
for (size_t i = 0; i < N; i++) { // I try every combination of 2 elements of array
for (size_t j = i + 1; j < N; j++) { // don't repeat same elements
tmpDiff = abs(array[i] - array[j]); // get the difference
if (diff > tmpDiff) { // if it is smaller is the difference i need
diff = tmpDiff;
}
}
}
[...]
[…]
int diff=1000000;//一个非常大的差异,我敢肯定是太大了
int tmpDiff;//交换
//比较
对于(size_t i=0;itmpDiff){//如果它较小,则是我需要的差异
diff=tmpDiff;
}
}
}
[...]
这需要太多的时间。如何优化性能?首先对阵列进行排序。然后只需要比较连续的值。您甚至不需要使用
abs()
,因为您知道这两个元素中哪一个更大
如果不能更改阵列,请先复制它(下面未显示)
#包括
#包括
//整数的比较函数,与qsort兼容
整型整型cmp(常数无效*a,常数无效*b)
{
常量int*ia=(常量int*)a;//强制转换指针类型
常数int*ib=(常数int*)b;
返回*ia-*ib;
}
...
int diff=int_MAX;
int d;
//分类
qsort(数组,N,sizeof(数组[0]),int_-cmp);
//比较连续的元素
对于(大小i=1;i
更新
qsort
使用快速排序算法对数组进行排序。如果有两个嵌套的for循环,排序的代价是O(n ln n)的顺序,而不是O(n^2)。对于较大的阵列(n>100),这会产生巨大的差异。算算一下:大约500对10000
传递给qsort
的比较函数总是很棘手的,因为qsort
的编写方式使得它可以处理任何类型的数组。函数被传递数组中两个元素的地址(指针)。对于像integer这样的小类型,如果它直接传递整数就很方便了。但是,你必须处理地址。所以你要做的是两件事:
void*
)转换为指向整数(int*
)的指针*
运算符获取有效值,在本例中为*ia
和*ib
如果第一个整数小于第二个整数,则函数需要返回小于0的数字;如果它们相等,则返回0;如果第二个整数较大,则返回大于0的数字。因此,一个古老的技巧派上了用场:只需返回第一个和第二个数字之间的差值。使用有效的排序,然后按顺序浏览列表,比较相邻元素。很好,它可以工作;)你能给我一个关于qsort和比较函数必须如何编写的简单解释吗?因为在大学里我们还没有学习指针和函数指针(但没关系,我想知道:P)。我发现从O(N^2)到平均O(N logn)应该是一个巨大的改进。除非你遇到了快速排序的最坏情况。我已经添加了比较函数的描述。
#include <limits.h>
#include <stdlib.h>
// compare function for integer, compatible with qsort
int int_cmp(const void *a, const void *b)
{
const int *ia = (const int *)a; // casting pointer types
const int *ib = (const int *)b;
return *ia - *ib;
}
...
int diff = INT_MAX;
int d;
// sort
qsort(array, N, sizeof(array[0]), int_cmp);
// compare consecutive elements
for (size_t i = 1; i < N; i++) {
d = array[i] - array[i - 1];
if (d < diff)
diff = d;
}