线性搜索的最差时间复杂度O(n)



我正试图写一份报告,评估我设计的算法的时间复杂性,我确信它的复杂性是O(n(。根据我从维基百科上得到的信息,最好的情况是O(1(,如果我理解正确的话,这意味着最好的情况就是当我使用的ArrayList只包含一个元素,但我没有完全得到最坏的情况,"0(1(迭代"是什么意思,它是如何发生的?

在一条注释中,您写道:

在我的情况下,我不是在寻找列表中的某个元素,但我需要检查每个元素的属性是true还是false。

这不是线性搜索。搜索(线性或其他(是在回答"是否至少有一个匹配元素"的问题。你的问题是"所有元素都匹配吗"。

我总是需要从第一个元素到最后一个元素来思考整个列表,那么最坏和最好的情况是什么。

最佳情况仍然是O(1(。如果发现元素的属性之一是false,则可以立即终止扫描。最好的情况是第一个元素发生这种情况。。。。

想想这个。检查"所有元素都为true"等同于检查"NOT(某些元素为false("。

它是O(1(最佳情况的原因并不是只针对具有1个元素的列表(尽管在该场景中也是如此(。想象一下,你有一个由10个数字组成的列表。

[44,6,1,2,6,10,93,187,33,55]

假设我们运行线性搜索,正在搜索整数44。由于它是列表中的第一个元素,所以我们的时间复杂性是O(1(,这是最好的情况,因为我们只需要在整个列表中搜索一个元素,就可以找到我们要找的东西。

让我们来看看这份清单的一个变体。

[55,6,1,2,6,10,93,187,33,44]

在这种情况下,我们交换了第一个和最后一个数字。因此,当我们对整数44运行线性搜索时,它将是O(n(的时间复杂度,这是最坏的情况,因为我们必须遍历n个元素的整个列表,然后才能找到我们想要的元素(如果它甚至存在于列表中,在我们的情况下就是这样(。

关于维基百科上的"O(1(迭代",我不会让它混淆你。还要注意,它指的是维基百科页面上的空间复杂性,而不是时间复杂性性能。在线性搜索过程中,我们不需要任何额外的空间来存储任何东西,我们只需要将我们想要的值(例如示例中的44(与数组中的元素逐一进行比较,因此我们的空间复杂度为O(1(。

编辑:根据您的评论:

在我的情况下,我不是在寻找特定中的列表元素

请记住,"线性搜索"是一种特定的算法,具有在列表中查找特定元素的特定目的,您提到的不是您想要做的。线性搜索似乎不是您想要的。线性搜索提供了一个数组/列表和所需的元素。它将返回所需元素在列表中出现的位置的索引,假设它确实存在于列表中。

我总是需要从第一个到第二个考虑整个列表最后一个元素

根据您的评论描述,我相信您只是试图从头到尾遍历列表。这将永远是O(N(,因为您总是遍历整个列表。考虑这个简单的Python示例:

L1 = [1,2,3,4,5,6,7,8,9,10]  #Size n, where n = 10
for item in L1:
print(item)

这将只打印列表中的每一项。我们的列表的大小是n。所以列表遍历的时间复杂度是O(n(。这仅适用于每次都要遍历整个列表的情况。

最新更新