1

我的问题是一个函数,我需要从我拥有的数据文件中计算欧几里得距离,之后我需要得到欧几里得距离给出的 N 个最低数字。

我所做的是一个包含所有文件长度的数组,1.000.000但它给了我分段错误,顺便说一句,这很明显。所以我想的是获得 N 值,创建一个长度为 N 的数组,然后只存储它们中最低的 N,然后按新月顺序对它们进行排序,然后打印,但是我很难在欧几里得的值之间进行比较距离和存储在数组中的距离。

void calcDist(Nodo *L,int vpesq[],int n)
{
    int dist[n],ed;
    while(L!=NULL){
    x=0;
    for(i=0;i<12;i++)
            x=x+pow((vpesq[i]-L->caracter[i]),2);
            ed=sqrt(x);
 }

但现在我需要将 ed 的 N 个最低值保存到 dist[n] 并且 N 是由用户给出的

4

3 回答 3

1

您可以像这样存储 N 个最低值

void store_lowest_N(int* array, int N, int new_value) {
    for (int i=0; i<N; i++) {
        if (new_value < array[i]) {
            for (j=N-1; j>i; j--) {
                array[j] = array[j-1]; // shift the larger values down to make space
            }
            array[i] = new_value;
            break;
        }
    }
}

void initialize_array(int* array, int N) {
    for (int i=0; i<N; i++) {
        array[i] = INT_MAX;
    }
}
于 2012-11-08T22:37:01.893 回答
0

如果 N 不是那么大,为什么不通过这个 N-Array 进行 FOR 循环来检查您的欧几里德距离是否小于 N-Array 的至少一个元素?如果您对此有疑问,那么这可能是由于您的数组未初始化造成的。这意味着您首先必须用大文件的前 N ​​个数字填充数组。如果您只制作这样的数组,就会发生这种情况:

int my_array[100];

如果您没有分配数组的所有 100 个值,则未分配的值将具有值 0(可能取决于编译器),并且可能会导致您的比较出现问题。这就是全部,如果我到目前为止理解你的问题。

于 2012-11-08T21:34:15.637 回答
0

如果要保存第 N 个最低的数字,则必须执行以下伪代码:

void calcDist(..)
{    ...
     int array_size = //;
     int number_add = -1;

     for(int i = 0; i < number_of_numbers_to_read; i++) 
     {
         x = //  calculate euclidean distance

         if(number_add < array_size) // Theres still space in the array
         {
             number_add++;                  // a new number in the array
         }
         // rearrange the array so it will be order again
         for(j = 0; j <= number_add; j++)
         { 
             if(array_lower[j] > x)    // This is the position to put the value
             { 
                aux = array_lower[j];  // if have to swap than
                array_lower[j] = x;
                x = aux;
             }
         }
     }
 }
于 2012-11-08T22:22:20.607 回答