c - 在最坏的情况下,在排序的链表中搜索一个元素需要进行多少次比较?

标签 c algorithm sorting search linked-list

这是我大学数据结构和算法类(class)测验中的一道题

What is the number of comparisons required to search an element in a sorted linked list in the worst case?

这些是选项:

a. ceil (n/2)

b. ceil (log n)

c. n2

d. ceil ((log n) + 1)

e. n

根据答案正确答案是n。

但我是这样想的,在一个排序的链表中,搜索不需要遍历所有元素。它可以从当前节点跳转到第二个节点(如 curr->next->next 并保留前一个指针,如 prev = curr->next)并查看是否节点的key小于要搜索的key,

如果要搜索的键大于当前节点的键,我们重复这个。

否则,我们将搜索键与 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 次比较。

while( curr = head; curr != NULL && curr->skey != skey; curr = curr->next);

最坏的情况是 skey 不在链表中

关于c - 在最坏的情况下,在排序的链表中搜索一个元素需要进行多少次比较?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35619075/

相关文章:

c - GDB 无法识别某些 C 函数

c - 为第 4 个字母停止的循环

当缓冲区为 1MB 时调用系统 ("printf buffer > output.txt") 写入文件失败

algorithm - 从 Delaunay 三角剖分计算 alpha 形状的边界多边形

java - 有些测试用例没有运行,但有些是概率测试

algorithm - 如何在 Ada 中进行快速排序

java - 如何在 Java 中将已排序数组重置为未排序数组?

c - 为什么我的程序不对结构进行排序?

c - 命名管道权限位

java - 在 Java 中对数组的 ArrayList 进行排序