0

タイトルについて申し訳ありませんが、この問題を1行で説明するのは非常に困難です。.txtファイルから単語を読み取り、リンクリストとハッシュテーブルの両方に配置しています。また、時計を使用して、各機能の実行に費やされた時間を記録しています。

listclock = clock();
list = insertlist(list, word);
listclock = clock() - listclock;
listtime = listtime + listclock;

tableclock = clock();
table = inserttable(table, word);
tableclock = clock() - tableclock;
tabletime = tabletime + tableclock;

リスト挿入関数が呼び出されている2行目をコメントアウトすると、tabletimeとtableclockの値は0と0.03になります。

挿入可能な行をコメントアウトすると、次の値が得られます:6.34sおよび0.02s

両方を実行させると、次の値が得られます:12.39sと0.04s

ハッシュテーブル関数も実行しているときに、テーブル関数の実行時間が2倍になる理由はありますか?

Insertlist関数:(挿入可能な関数はこれを呼び出します):

List *insertlist(List *list, char word[30]) {
  List *templist = list;
  while(templist != NULL) {
    if(strcmp(templist->word, word) == 0) {
      templist->count++;
      list = addnode(list, word);
      list->count = templist->count;
      break;
    }
    templist = templist->next;
  }
  if(templist == NULL) {
    list = addnode(list, word);
  }
  return list;
}
4

2 に答える 2

0

クロックからの値は大きく異なる場合があります。また、関数の先頭で tabletime を初期化するため、挿入と tableinsert の両方のタイミングであることに注意してください。独自のベンチマークを作成する場合は、実際にいくつかのセットアップ コードとティアダウン コードが必要です。この場合、たとえば、各関数を 100 回サンプリングして平均を取る必要があります。各サンプル間で、すべてのデータをクリアする必要があります (タイミングでカウントしないでください)。

しかし、実際には、バックアップして、なぜこれを行うのかを尋ねる必要があります。挿入に時間がかかりすぎて、リンク リストとハッシュテーブルのどちらを使用するかを決めようとしているという不満がありますか? その決定は、データを追加する方法だけでなく、データを削除またはアクセスする方法にも基づいて行う必要があります。めったに挿入せず、キーによって頻繁にアクセスする場合は、おそらくハッシュテーブルが必要です。要素を一意にする必要がある場合は、ハッシュテーブルを使用する必要があります。最初または最後の要素を頻繁に挿入し、常に削除する場合、リストは理にかなっています。この 1 つの操作のタイミングを計るのに費やしたすべての時間は、おそらくアプリケーション全体にとって重要ではありません。コードにアプローチするときは、小さいことではなく、大きいことを考えたほうがよいでしょう。

于 2013-01-16T18:59:02.430 に答える
0

非常に優れたベンチマーク フレームワークがJon Bentleyによって提供されており、「この操作にかかる時間」について使用可能なデータを取得することは簡単ではありません。

于 2013-01-20T02:52:27.410 に答える