私は(入力ファイルと出力ファイルの両方)を開始するために、すべての3つのファイルを開くと思います。それらのすべてを開くことができない場合は、何か有用なことはできません(エラーメッセージなどを表示する以外)。 CPU時間を浪費することなく、後で出力ファイルを開くことができます。これは、競合状態(たとえば、最初のファイルを処理している間の2番目のファイルの変更)を減らすのにも役立ちます。
次に、最初のファイルの処理を開始します。それを読んで単語/トークンに分解し、各単語/トークンに対してハッシュ値を計算します。次に、ハッシュ値と単語/トークン自体を使用して、新しい単語/トークンが以前の(既知の)単語/トークンの複製であるかどうかを確認します。重複していない場合は、メモリを割り当てて、単語/トークンの新しいエントリを作成し、ハッシュに対応するリンクリストにエントリを挿入します。
最後に、2番目のファイルを処理します。これは、単語/トークンが分からない場合を除いて、最初のファイルを処理した方法(単語/トークンに分解し、ハッシュを計算し、ハッシュを使用して単語/トークンが分かっているかどうかを調べる方法)と似ています出力ファイルに "language"を書き出します。
ハッシュテーブルに精通していない場合は、かなり簡単です。あなたのような何かができるASCII /テキストのハッシュ値を計算する簡単な方法(必要はない最良の方法)の場合:
その後
hash = 0;
while(*src != 0) {
hash = hash^(hash << 5)^*src;
src++;
}
hash = hash % HASH_SIZE;
あなたはINDEX_ENTRY」のようなリンクリストの配列を、持っている*インデックス[HASH_SIZE]各リンクされたリストの最初のエントリへのポインタ(ハッシュのリンクリストが空の場合はNULL)を含みます。
検索するには、正しいリンクリストの最初のエントリを検索するためにハッシュを使い、次にリンクリストの各エントリに対して "strcmp()"を実行します。例は次のようになります。
INDEX_ENTRY *find_entry(uint32_t hash, char *new_word) {
INDEX_ENTRY *entry;
entry = index[hash];
while(entry != NULL) {
if(strcmp(new_word, entry->word) == 0) return entry;
entry = entry->next;
}
return NULL;
}
このすべてのアイデアは、パフォーマンスを向上させることです。たとえば、両方のファイルが1024ワードの場合(ハッシュテーブルなし)、 "strcmp()"を1024 * 1024回実行する必要があります。 "#define HASH_SIZE 1024"というハッシュテーブルを使用すると、おそらくそれを約2000倍に減らすことができます(そして、はるかに高速なコードで終わります)。HASH_SIZEの値を大きくすると、使用するメモリ量が少し増えます(同じハッシュを持つ異なる単語の可能性が減ります)。
ファイルの終了時にファイルを閉じることを忘れないでください。あなたがこの後に何か他のことをするなら、あなたが使ったメモリを解放することは良いアイデアです(しかし、この後に何もしなければ、 "exit()"してOSをクリーンアップする方が速くて簡単です)。
私たちにいくつかのコードを見せてください。あなたは何か? – Muggen
どのようなアイデアがありましたか?どのように失敗しましたか? –
ファイルはどのように見えますか?それらには区切り記号が含まれていますか?できるだけ多くの追加情報を追加してください。 –