C ++ - 比较多个int数组和返回最小span的数组

时间:2014-06-02 07:24:44

标签: c++ arrays

我正在研究一个问题,即我有多个数组要与单个数组进行比较。将返回索引之间跨度最短的数组。

以下是我将使用的一组数组的示例:

(如果它们具有任何重要性,则这些值代表RGB值)

int[] workingset = {55, 34,102};
int[] test1 = {54,36,99};`   
int[] test2 = {21,65,231};    
int[] test3 = {76,35,1};    
int[] test4 = {133,22,3};

由于test1[]值最接近workingset[]test1[]将是要返回的数组。

*我为没有提供示例代码而道歉,但我根本想不出将这个难题拼凑在一起的方法。

3 个答案:

答案 0 :(得分:1)

您可以轻松总结所有组件(r,g,b)并检查哪个组件具有最小差异。

#include <iostream>

int main(int argc, char* args[])
{
    int workingset [] = {55, 34,102};
    int test1 [] = {54,36,99};  
    int test2 []= {21,65,231};    
    int test3 [] = {76,35,1};    
    int test4 [] = {133,22,3};


    int sums [4] = {};
    for(int i=0; i<3;++i){
        sums[0] += abs(test1[i]-workingset[i]);
    }
    std::cout << "diff test1 " << sums[0] << std::endl;

    for(int i=0; i<3;++i){
        sums[1] += abs(test2[i]-workingset[i]);
    }
    std::cout << "diff test2 " << sums[1] << std::endl;

    for(int i=0; i<3;++i){
        sums[2] += abs(test3[i]-workingset[i]);
    }
    std::cout << "diff test3 " << sums[2] << std::endl;

    for(int i=0; i<3;++i){
        sums[3] += abs(test4[i]-workingset[i]);
    }   
    std::cout << "diff test4 " << sums[3] << std::endl;

    int smallestIndex = 0;
    int smallestDiff = INT_MAX;
    for(int i=0; i< 4; i++){
        if(sums[i] < smallestDiff){
            smallestIndex = i;
            smallestDiff = sums[i];
        }
    }

    std::cout << "array with smallest index: " << smallestIndex << std::endl;
    return 0;
}

我编辑了microsoft特定的包含和数据类型。

答案 1 :(得分:0)

“指数之间的最短跨度”的指标是什么?我猜你在试图最小化两个数组之间差异的绝对值之和?

一旦定义了指标,请尝试使用此伪代码:

min_metric = MAX_INT
min_array = null
for array in arrays:
    if array.length() == workingset.length():
        metric = calculateMetric(workingset, array)
        if metric < min_metric:
            min_metric = metric
            min_array = array

答案 2 :(得分:0)

我也猜。假设您正在尝试编写颜色匹配器。考虑这些数组向量。然后,workingsettestX之间的向量差的绝对长度将是要使用的度量。

或在代码中:

int [] delta = { 0, 0, 0 };
for (int i = 0; i < delta.length; ++i) delta[i] = workingset[i] - testX[i];
double metric = 0;
for (int x: delta) metric += x * x;
metric = sqrt(metric); // and use this to assess how far away the testX color is from the workingset color (sqrt operation is optional)