O(1) 和 O(n) 之间的线性搜索差异

Posted

技术标签:

【中文标题】O(1) 和 O(n) 之间的线性搜索差异【英文标题】:Linear Search difference between O(1) and O(n) 【发布时间】:2017-10-21 20:40:25 【问题描述】:

我对线性搜索中的以下两种情况感到困惑。我这里先写线性搜索算法吧。

线性搜索的伪代码

输入:未排序的数组 A & 键

输出:索引 i 使得 A[i] = key

LinearSearch(A,low,high,key) 
if high < low    
   return NOT_Found
if A[low] = key
   return low
return LinearSearch(A,low+1,high,key)

本书大部分内容的复杂度为 O(n)。有什么区别

    如果数组中存在键,则线性搜索的最佳运行时间 [Ans: O(1)] 如果数组中不存在键,则线性搜索的最佳运行时间 [Ans: O(n)]

是什么原因当key出现在数组中时,复杂度会降低到O(1)?非常感谢!

【问题讨论】:

【参考方案1】:

您的问题基于最佳情况。最好的情况是您的密钥位于第一个位置 (O(1))。更实用的是平均情况,这两种情况都是 O(n)

【讨论】:

感谢您的解释。如果数组中不存在键,那么最好情况、平均情况和最坏情况之间有什么区别吗?另外,我了解到最坏的情况是 theta(n) 而不是 O(n)。如何解释差异?谢谢。 如果键不存在,那么函数将在每种情况下(最佳、平均和最差)遍历整个数组 (O(n)) 如果键存在则最好的情况是O(1) 因为它可能在第一个索引(或前几个)上。平均和最坏情况仍然是 O(n),因为在最坏情况下,键位于最后一个索引上,平均值约为 O(n/2),即 O(n)【参考方案2】:

当key出现在数组中时,是什么原因 复杂度会降低到 O(1)?

考虑到这两种情况,数组中键的存在会有所不同:

键存在于数组中:那么你的运行时间最好的情况O(1),这意味着您必须移动常数次才能找到它(例如,它将是第 2 个元素,第 10 个元素,第 1 个元素通常是 sth 常数)。如果密钥存在,那么最坏的情况是它在数组中的 O(n) 位置,因此您至少需要 Ω(n) 步,当然最大步骤是搜索数组中的所有 n 个位置,所以 O(n) 这证明了最坏的情况 Θ(n)

键不存在:在这种情况下,给定一个数组和一个数组中不存在的键,您的线性搜索算法试图找到它他必须检查所有元素才能找到它,因为该算法有两个终止条件:找到键或数组已结束。当然,在这种情况下将找不到密钥,并且在检查所有元素后算法将终止。这里的一个观察是,如果密钥不存在,算法将在最佳或最坏情况下精确执行 O(n) 步骤,如果密钥不存在,最好和最坏情况是相同的,因为在你们都搜索整个数组!!

在上述两种情况下,最坏的情况是 θ(n)

【讨论】:

以上是关于O(1) 和 O(n) 之间的线性搜索差异的主要内容,如果未能解决你的问题,请参考以下文章

线性和二进制搜索

Java搜索算法[关闭]

二分搜索 O(log n) 算法在顺序列表中查找重复项?

有序数组中线性搜索的复杂度分析

如何在 O(n) 时间内对双向链表进行二进制搜索?

常见搜索算法:二分查找