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

Java 线性搜索的最坏时间复杂度O(n),java,algorithm,big-o,evaluation,Java,Algorithm,Big O,Evaluation,我试图写一份报告,评估我设计的算法的时间复杂度,我确信它的复杂度是O(n)。根据我从维基百科得到的信息,最好的情况是O(1),如果我理解正确,这意味着最好的情况是我使用的ArrayList只包含一个元素,但我没有完全了解最坏的情况,“O(1)迭代”是什么意思?它是如何发生的?为什么是O(1)最好的情况不仅仅是一个包含1个元素的列表(尽管在这种情况下也是如此)。假设你有一个10个数字的列表 [44,6,1,2,6,10,93,187,33,55] 假设我们运行线性搜索,正在搜索整数44。因为它是

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

为什么是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个元素的整个列表才能找到所需的元素(如果它甚至存在于列表中,在我们的情况下是does)

关于维基百科上的“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)。这仅适用于每次要遍历整个列表的情况。

在您编写的注释中:

在我的例子中,我并没有特别寻找列表中的某个元素,但我需要检查每个元素的属性是否为true或false

这不是线性搜索。搜索(线性或其他)就是回答“是否至少有一个匹配元素”的问题。你的问题是“所有元素匹配吗?”

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

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


想想这个。检查“所有元素均为true”等同于检查“NOT(某些元素为false)”。

线性搜索的最佳案例复杂性为O(1):这意味着您要查找的值位于第一个索引处。最坏情况下的时间复杂度是O(n),这意味着在数组中找不到该值(或在最后一个索引中找到),这意味着我们必须迭代n次才能得出该结论。平均复杂度是您(平均)必须在列表中搜索该项的一半,因此O(n/2),但由于消除了常数,因此它是O(n),也就是说,与最坏情况相同。使用基于哈希的算法可以实现O(1)时间复杂度,这显然需要更多的空间来存储哈希值…:)。。。如果有时间,请阅读此内容。感谢您的快速回复,在我的情况下,我没有特别查找列表中的元素,但我需要检查每个元素的属性是否为真(这是一个对象列表),我始终需要考虑从第一个元素到最后一个元素的整个列表,那么,最坏和最好的情况是什么?@jaymartines-在这种情况下,您将问题描述为“线性搜索”是不正确的。@jaymartines似乎线性搜索可能不是您要完成任务的目标。线性搜索应该给定一个元素(我们称之为X)和一个列表/数组(我们称之为L1)。它从L1的开头开始,逐个遍历列表。如果它在列表L1中找到元素X,它将返回元素X的结果,通常是索引。您试图做的基本上只是一个“for each”循环。您希望每次遍历列表中的每个元素。因此,不管怎样,都要遍历n个元素列表中的n个元素。所以你最好和最坏的情况是O(n)。@jaymartines我想我知道你想要实现什么。你在文章中提到你正在分析你设计的算法。显然你没有设计线性搜索。我认为你有一个更大的算法,你只是想确定它的一部分的时间复杂度,对吗?这部分就是你想要遍历列表中每个元素的地方,对吗?(你一直认为是“线性搜索”,而实际上线性搜索是一个具有特定目的的完整独立算法)“因为它是列表中的第一个元素,我们的时间复杂度是O(1)。。。不,我认为这不准确。算法的时间复杂度是算法整体性能的一个特征。这个术语是canno