0

入力として、次の 1 行があります。

2 6 7 5 1 2 3 4 5    
A a b B c d e f g

どこでA - 整数、 の数Array1、次にa b- の数Array1、次にB - 整数、 の数Array2c d e f g- の数Array2

私はこのコードを書きます:

scanf("%d", &Alen); // read Array1 len
int posA[Alen];
for (i = 0; i < Alen; i++){
        scanf("%d", &posA[i]);//read Array1 numbers
    }

scanf("%d", &Blen);//read Array2 len
int posB[Blen];
for (i = 0; i < Blen; i++){//read Array2 numbers
        scanf("%d", &posB[i]);
    }

しかし、それは非常に遅いです (私のプログラムよりも遅く、この配列で何かをしています)、この配列をスキャンしてこれをすばやく行う別の方法があるのでしょうか?

4

1 に答える 1

0

この一定の要因は、ほとんどの状況で大したことにはならないと思います。しかし、それでもあなたがそれを改善することを主張するならば...あなたはこれを試すかもしれません:

#define BIGBIG_SIZE (10000000)
char* buffer=(char*)malloc(BIGBIG_SIZE); // make it big enough for your file.
                              // makes your life easier by making sure 
                              //the whole file could be read in once
fread( buffer , 1 , BIGBIG_SIZE , stdin );
sscanf( buffer , "%d", &a ); // from now on use sscanf to get from buffer instead of scanf()

これは時々私のために働きます。(たまたま、パスカルよりも2倍遅いことscanf("%d")わかりました)必要に応じて、トークン(整数)を取得するための独自のルーチンを作成します。read(x)

freadそれでも遅すぎる場合は、バッファではなくメモリマップトファイルを使用してみてください。

fd = open(FILEPATH, O_RDWR | O_CREAT | O_TRUNC, (mode_t)0600);
if (fd == -1) {
    perror("Error opening file for writing");
    exit(EXIT_FAILURE);
}
map = mmap(0, FILESIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
if (map == MAP_FAILED) {
      close(fd);
      perror("Error mmapping the file");
      exit(EXIT_FAILURE);
}
// then you use sscanf() here

または、プラットフォーム上の他のメモリマッピングソリューション。


それでも、これらの汚いトリックは必要ないと思います。

于 2013-02-19T11:40:37.670 に答える