以下は、ハッシュテーブルを使ってファイル(辞書)をメモリにロードする私のプログラムの一部です。辞書には、1行に1語しか含まれていません。しかし、プロセスは時間がかかり過ぎています。どのように最適化するのですか?実世界の実行時間を短縮するためにハッシュテーブルを最適化するにはどうすればよいですか?
bool load(const char* dictionary)
{
// TODO
int k;
FILE* fp = fopen(dictionary,"r");
if(fp == NULL)
return false;
for(int i=0; i<26; i++)
{
hashtable[i] = NULL;
}
while(true)
{
if(feof(fp))
return true;
node* n = malloc(sizeof(node));
n->pointer = NULL;
fscanf(fp,"%s",n->word);
if(isalpha(n->word[0]))
{
k = hashfunction(n->word);
}
else return true;
if(hashtable[k] == NULL)
{
hashtable[k] = n;
total_words++;
}
else
{
node* traverse = hashtable[k];
while(true)
{
if(traverse->pointer == NULL)
{
traverse->pointer = n;
total_words++;
break;
}
traverse = traverse->pointer;
}
}
}
return false;
}
ファイル内にいくつの単語(行)がありますか? 'hashfunction'は何をしますか?バケットの数を増やしてみましたので、あまり多くのリストトラバーサルは必要ありませんか?しかし、最も重要なのは、*プロファイラ*を使ってボトルネックがどこにあるのかを調べてみましたか? –
あなたの問題とは無関係ですが、あなたの読書ループは 'while(!feof(fp))'とはあまり変わりません、[間違っています](http://stackoverflow.com/questions/5431941/why-is-while -feof-file-always-wrong)です。 –
これは「作業中の」コードです。それを "より良い"ものにするためのアイディアが必要な場合は、[codereview.stackexchange.com](http://codereview.stackexchange.com)に投稿してください。そうする際には、ハッシュ関数とドライバーコードを、これを正式にテストしている手段のメモと測定値とともに含める必要があります。 – WhozCraig