在最坏的情况下,在排序链表中搜索元素所需的比较数是多少?

时间:2016-02-25 05:26:57

标签: c algorithm sorting search linked-list

这是我大学数据结构和算法课程测验的一个问题

  

在最坏的情况下,搜索排序链表中的元素所需的比较数是多少?

以下是选项:

  

一个。 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;
            }
        }

    }
}

2 个答案:

答案 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