我有一个树结构,其中每个节点都包含其名称以及使用哈希表的引用。
我正在尝试使用链表一次搜索结构中的节点,并且一次使用哈希表。 链表搜索比哈希表更快。哈希表搜索比链表慢的情况可能是什么?
这里是搜索的代码
/* 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;
}
}
}
}
}
答案 0 :(得分:2)
它主要取决于你的for循环的每次迭代有多少元素要搜索(即start_obj-> next所形成的链表长度是多少)以及kh_get_str2int32,kh_end和kh_value的计算成本如何。如果不知道链表的平均长度和哈希表函数的实现,就无法给出更明确的答案。