1

私の問題は、私が持っているデータファイルからユークリッド距離を計算する必要があるという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配列を介してFORループを作成し、ユークリッド距離がN配列の少なくとも1つの要素よりも小さいかどうかを確認してみませんか?これに問題がある場合は、アレイが初期化されていないことが原因である可能性があります。これは、最初に、大きなファイルの最初の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 に答える