哈希表搜索比linkedlist慢

时间:2015-09-16 09:30:22

标签: c algorithm

我有一个树结构,其中每个节点都包含其名称以及使用哈希表的引用。

我正在尝试使用链表一次搜索结构中的节点,并且一次使用哈希表。 链表搜索比哈希表更快。哈希表搜索比链表慢的情况可能是什么?

这里是搜索的代码

 /* if there is a hasthable defined in the dpal object search using it */
 if(!htbl){
    for (i= 0, j = 0; dpal_path[i] != 0; i++)
    {
      if (dpal_path[i] == sep)
      {
        khash_str_t key;
        khiter_t entry;
        const char *token = &dpal_path[j];
        size_t length = i-j;
        j=i+1;
        htbl = &start_obj->obj_string_htbl;
        key.str = token;
        key.len = length;
        /* look for the dpal object in the hashtable */
        entry = kh_get_str2int32(htbl, key);
        if (entry != kh_end(htbl)) {
          start_obj=(dpal_obj_t*)kh_value(htbl, entry); 
          result = start_obj;
        }
        else{
          result=DPAL_OBJ_HANDLE_INVALID;
          break;
        }
      }
    }
  }
  /* otherwise search for it using linked list structure */
  else{
    for (i= 0, j = 0; dpal_path[i] != 0; i++)
    {
      if (dpal_path[i] == sep)
      {
        const char *token = &dpal_path[j];
        size_t length = i-j;
        j=i+1;
        if(start_obj != NULL){
          start_obj = start_obj->child;
        }
        while ((start_obj != NULL)){
          if(strncmp(token, start_obj->static_props.name, length) == 0){
            result = start_obj;
            break; 
          }
          /* get next handle in flat hierarchy */
          start_obj=start_obj->next;
          if(start_obj == NULL){
            result = DPAL_OBJ_HANDLE_INVALID;
          }
        }
      }
    }
  }

1 个答案:

答案 0 :(得分:2)

它主要取决于你的for循环的每次迭代有多少元素要搜索(即start_obj-> next所形成的链表长度是多少)以及kh_get_str2int32,kh_end和kh_value的计算成本如何。如果不知道链表的平均长度和哈希表函数的实现,就无法给出更明确的答案。