0

对不起标题,这个问题很难用一行来解释。我从 .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;

如果我注释掉调用插入列表函数的第二行,那么我会得到 tabletime 和 tableclock 的以下值:0s 和 0.03s

如果我用 inserttable 注释掉该行,我会得到以下值:6.34s 和 0.02s

如果我让它们都运行,我会得到以下值:12.39s 和 0.04s

当哈希表函数也在运行时,执行表函数的时间是否会加倍?

Insertlist 函数:(Inserttable 函数调用此函数):

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

Jon Bentley给出了一个非常好的基准测试框架,以获取“此操作所花费的时间”的可用数据并非易事。

于 2013-01-20T02:52:27.410 回答
0

来自时钟的值可能会有很大差异。另请注意,因为您在函数顶部初始化 tabletime,所以它同时为插入和 tableinsert 计时。如果您要编写自己的基准测试,您确实应该有一些设置和拆卸代码。在这种情况下,您应该对每个函数进行 100 次采样并取平均值。在每个样本之间,您应该清除所有数据(而不是计入您的时间)。

但实际上,您需要备份并询问您为什么要这样做?您是否抱怨插入时间太长,因此您试图在链表和哈希表之间做出决定?该决定不仅应基于您添加数据的方式,还应取决于您如何删除或访问数据。如果您很少插入并且经常通过键访问,那么您可能需要一个哈希表。如果您需要元素是唯一的,您应该使用哈希表。如果您经常插入并且总是删除第一个或最后一个元素,那么列表是有意义的。您花在计时这一操作上的所有时间可能对您的应用程序总体而言并不重要。处理代码时,最好从大而不是小考虑。

于 2013-01-16T18:59:02.430 回答