获得数组中所有可能元素组合的最小差异

时间:2016-11-29 18:00:26

标签: 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 (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;
        }

    }
}
[...]

这需要太多时间。我们怎样才能优化表现?

1 个答案:

答案 0 :(得分:1)

首先对数组进行排序。然后你只需要比较连续的值。而你甚至不需要使用#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; } ,因为你知道哪两个元素更大。

如果不能更改阵列,请先将其复制(下面未显示)。

qsort

<强>更新

qsort使用 Quicksort 算法对数组进行排序。如果你有两个嵌套的 for 循环,那么排序的成本是O(n ln n),而不是O(n ^ 2)。对于更大的阵列(n> 100),这可以产生巨大的差异。算一算:约。 500比10,000。

传递给qsort的比较函数总是很棘手,因为void*被编写为可以使用任何类型的数组。该函数传递给数组中两个元素的(指向)地址。对于小型类型(如整数),如果直接传递整数,则会很方便。但相反,你必须处理地址。所以你做的是两件事:

  1. 将指针转换为更具体的类型,即从任何类型的指针(int*)转换为指向整数(*)的指针。

  2. 取消引用指针,即使用*ia运算符获取有效值,在本例中为*ibvar documents = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments); var cache = System.IO.Path.Combine(documents, ".config", ".isolated-storage", "ImageLoaderCache"); foreach (var file in System.IO.Directory.GetFiles(cache)) { System.IO.File.Delete(file); }

  3. 如果第一个整数小于第二个整数,则函数需要返回小于0的数字,如果它们相等则返回0,如果第二个数字更大,则返回大于0的数字。所以一个老技巧就派上用场了:只需返回第一个和第二个数字之间的差异。