我有以下问题:提高C程序的计算速度
鉴于2个N号的文件,如
file1.dat:1,2,3,4,5,6,7 ,8,9,0
File2.DAT的:2,5,4,7,6,9,8,1,0,3
我想知道有多少时间连续的两个数字的顺序第一个文件在第二个文件中发生了变化(包含相同的数字)。例如,在文件1中,我们开始寻找1和2,在第二个文件2中找到1,因此订单发生了变化;在第一个文件中有9个,然后是0,在第二个文件中保持这个顺序。
我写了下面的程序:
#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;
}
与我处理的文件是非常大的,你可以从程序(32421号每个文件)的3号线看到,所以时间采取的太大了。任何人有任何建议来提高计算速度?
我也试图与破环中的下列方式增加:
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个多小时。我如何加快速度?
是否所有的号码不同的第一阵列的第一个元素的位置? – pmg
你可以在你的循环中做一些'break'ing – pmg
@pmg,这个中断可能是一个解决方案,但我不知道如何在程序中编写它们。这些数字都是截然不同的 –