私の質問はCS50、pset5のタスクと関連しています。それについて知らない人のために、私は説明しようとします。非常に特別なものはありません。私はちょうど20キロ以上の単語を含んでいる辞書ファイル(前に書かれた、そのファイルのすべての単語が大文字である)を摂取する関数を作成する必要があり、何とかそれらを並べ替えます。私はハッシュテーブルを構築するシンプルで素朴なアルゴリズムを作りました。ハッシュテーブルは、最初の文字に応じて単語を並べ替えます。 CS50ですべての小切手を渡したので、私のプログラムはうまくいきます。しかしコースのものと比較すると、それは遅すぎる。人事の実行時間は0.1秒ですが、私の場合は5.0秒〜7.0秒です。このコードを改善してより速くするにはどうすればよいですか?あるいは、私はすべてを完全に変えるべきですか?私は最適化の経験がないので、ちょうど学習を始めたからです。皆さんのおかげで勉強するのはすばらしいことです。=)事前に感謝します!私のハッシュアルゴリズムをより速く作る方法
// Some constant values, which are declared before the function
#define LENGTH 46
#define ALPHALENGTH 26
/* Definition of node struct. Nothing special, in fact =) */
typedef struct node {
char word[LENGTH +1];
struct node *next;
} node;
node *hashTable[ALPHALENGTH];
bool load(const char *dictionary) {
FILE *f = fopen(dictionary, "r");
if (f == NULL) {
return false;
}
char word[LENGTH + 1];
int hash = 0;
for (int i = 0; i < ALPHALENGTH; i++) {
hashTable[i] = NULL;
}
// 46 - is LENGTH, but for some reason it is impossible
// to put variable`s name between quotation marks
while (fscanf(f, "%46s", word) == 1) {
// make every letter lowercase to get result from 0 - 25
hash = tolower(word[0]) - 'a';
node *new_node = malloc(sizeof(node));
strcpy(new_node->word, word);
// check if element is first in the list
if (hashTable[hash] == NULL) {
new_node->next = NULL;
hashTable[hash] = new_node;
} else {
node *ptr = hashTable[hash];
do {
if (ptr->next == NULL) {
break;
}
ptr = ptr->next;
} while (true);
ptr->next = new_node;
new_node->next = NULL;
}
}
fclose(f);
return true;
}
リンクされたリストを使用する理由はありますか?他のデータ構造を使ってみましたか?異なるデータ構造のルックアップの複雑さを知っていますか? – nobism
@ Martinnええ、私は複雑さがO(n)であることを理解しています。さて、それはデータ構造型で、私たちは講義を渡していたので、私はそれを選択することに決めました。また、私たちは試してみましたが、私は全く何も理解していません:)あなたは、構造がリンクリストのために問題だと思いますか? –