次の問題があります。
次のようなN個の数値の2つのファイルが与えられた場合
file1.dat: 1,2,3,4,5,6,7,8,9,0
file2.dat: 2,5,4,7,6,9,8,1,0,3
最初のファイルの 2 つの連続する数字の順序が 2 番目のファイル (同じ数字を含む) で何回変更されたかを知りたいです。たとえば、ファイル 1 では 1 と 2 の検索を開始し、2 番目のファイルでは 2 が 1 の前に来るため、順序が変更されました。最初のファイルには 9 と 0 があり、2 番目のファイルではこの順序が維持されます。
次のプログラムを書きました。
#include <stdio.h>
#include <stdlib.h>
#define N 32421
int main () {
int A[N], B[N];
int i,j,k=0,count=0;
FILE *fp;
if ((fp = fopen ("file1.dat", "r")) == NULL) {
printf ("Error opening file 1\n");
exit (EXIT_FAILURE);
}
for (i = 0; i < N; i++)
fscanf (fp, "%d", &A[i]);
fclose (fp);
if ((fp = fopen ("file2.dat", "r")) == NULL) {
printf ("Error opening file 2\n");
exit (EXIT_FAILURE);
}
for (i = 0; i < N; i++)
fscanf (fp, "%d", &B[i]);
fclose (fp);
for(i=0; i<N-1; i++)
for(j=0; j<N; j++)
for(k=0 ; k<N; k++)
if(B[j]==A[i] && B[k]==A[i+1] && k < j )
count++;
printf("The number of inversion is: %d\n",count);
return 0;
}
私が扱っているファイルは、プログラムの 3 行目からわかるように非常に大きく (各ファイルの番号は 32421)、時間がかかりすぎます。計算速度を改善するための提案はありますか?
次の方法でループにブレークを追加してみました:
int a;
for(i=0;i<N-1;i++){
a=0;
for(j=0;j<N;j++){
for(k=0;k<N;k++){
if(A[i]==B[j] && A[i+1]==B[k] && k<j) {
count++;
break;
a=1;
} if(A[i]==B[j] && A[i+1]==B[k] && j<k){
break;
a=1;
}
}
if(a==1){
break;
}
}
}
それでも5時間以上かかります。どうすればこれをスピードアップできますか?