这是我大学数据结构和算法课程测验的一个问题
在最坏的情况下,搜索排序链表中的元素所需的比较数是多少?
以下是选项:
一个。 ceil(n / 2)
湾ceil(log n)
℃。 N2
d。 ceil((log n)+ 1)
即Ñ
根据答案,正确的答案是n。
但我想这样,在排序的链表中,搜索不需要遍历所有元素。它可以从当前跳转到第二个节点(如curr->next->next
并保留前一个指针,如prev = curr->next
),并查看该节点的密钥是否小于要搜索的密钥,
如果要搜索的密钥大于当前节点的密钥,我们重复此操作。
否则,我们将搜索关键字与prev->key
进行比较,如果它们相等,则找到该元素或链接列表中不存在
这种方法需要花费大约(n / 2)次比较(在与之前的比较的情况下为+1)...所以答案应该是ceil(n / 2)对吗?我是对的吗?
编辑:这是我上面提到的算法的c版本(链表的头部和要搜索的密钥是参数.skey是要搜索的密钥)
void search (struct node * head, int skey)
{
struct node * curr = head,*prev = NULL;
while(1)
{
if(curr==NULL)
{
if(prev!=NULL)
{
if(prev->key== skey)
{
printf("FOUND");
break;
}
else
{
printf("NOT FOUND");
break;
}
}
else
{
printf("NOT FOUND");
break;
}
}
if(curr->key==skey)
{
printf("FOUND");
break;
}
else if (curr->key < skey)
{
if(curr->next!=NULL)
{
prev=curr->next;
curr=curr->next->next;
}
else
{
printf("NOT FOUND");
break;
}
}
else
{
if(prev!=NULL)
{
if(prev->key== skey)
{
printf("FOUND");
break;
}
else
{
printf("NOT FOUND");
break;
}
}
else
{
printf("NOT FOUND");
break;
}
}
}
}
答案 0 :(得分:0)
这是一种逐步浏览链表的方法,每个节点只有2次比较。
while( curr = head; curr != NULL && curr->skey != skey; curr = curr->next);
最糟糕的情况是skey
不在链表
答案 1 :(得分:0)
这在很大程度上取决于搜索的实施方式。
示例:
执行非常糟糕的搜索可能会在移动到下一个条目之前检查/比较同一条目20次。
您可以实施二进制搜索并减少最差情况下的比较次数(同时增加执行次数current = current->next;
或current = current->previous;
并使性能更差)。
您可以跟踪&#34;中间条目&#34 ;;并且几乎减半了#34;最坏情况下的比较数。
您可以有一个额外的数组来跟踪开始搜索的最佳位置(例如,您正在搜索的内容的第一个字符用作此附加数组的索引),并减少那种比较的数量。这包括在搜索之前立即构建数组(因为您可以在不进行比较的情况下构建数组)。
如果你比较&#34;&#34;足够小(例如,您正在搜索1到10之间的数字的条目),您可以将链接列表转换为数组,然后使用数组查找;没有比较。
对于最明显的方法(线性搜索),并且仅针对最明显的方法,最糟糕的情况是您检查所有条目并且找不到您正在寻找的内容;这是&#34;每个条目一次比较&#34;或N comparisons
。