对不起,我在之前的问题中犯了一个错误。因为那个原因,我没有得到我想要的答案。
老师告诉我们,每次除以2,运行时间可能是log n。例如,如果我们将一个数组分成两部分,每次遍历其中一个数组,运行时间可能是log n。然而,我们在使用LinkedList时可能会遇到这样的情况,我们很容易被误导。例如,我们可能有一个算法,通过从头或尾开始,将列表的第n个元素设置为其他元素,以使运行时间小于n。从逻辑上讲,我们可能认为运行时间将是log n,但事实并非如此。为什么呢?怎么确定呢?
我们是否一定需要拆分才能得到log n的运行时间?我认为当循环的最大运行时间是n/2时,说n的运行时间是没有任何逻辑意义的
我认为这里需要对一些概念进行一些细化,因为时间复杂度只与算法有关,而与你正在操作的数据结构的大小无关。
老师告诉我们,每次除以2,运行时间可能是log n。例如,如果我们把一个数组分成两部分,每次遍历其中一个数组,运行时间将是log n。
遍历数组,比如
for (int i = 0; i < array.size; i++) {
variable = array[i];
}
在O(n)
中运行:执行该操作所需的时间与数组的大小成线性关系。对于像对数组进行二进制搜索这样的操作,您将使用O(log n)
,但您不能将此概念推广到所有数组操作,特别是那些需要遍历数组的操作。
现在,这个句子
例如,我们可以有一个算法,通过从头或尾开始将列表的第n个元素设置为其他元素,以使运行时间小于n。
让我相信你认为大O中使用的n和你所说的"第n个元素"是直接相关的。他们不是。在链表中,你去到元素n的唯一选择是去到列表的开始,并沿着你正在寻找的元素的链接向下(或者在双链表的情况下,根据你正在寻找的元素的位置去到开始或结束),所以这个操作的时间复杂度为O(n),即与集合的长度线性相关。