抱歉,我在之前的问题中犯了一个错误。因此,我没有得到我想要的答案。
老师告诉我们,每当你将某事物除以2时,运行时间很可能是log n。例如,如果我们将一个数组分成两个,每次遍历其中一个数组时,运行时间就是log n。但是,我们可能会遇到LinkedList的情况,我们可能很容易被误导。例如,我们可能有一个算法,通过从头部或尾部开始将列表的第n个元素设置为其他元素,以便具有小于n的运行时间。从逻辑上讲,我们可能认为运行时间是log n,但事实并非如此。这是为什么?你如何确定?
我们是否需要完全分裂才能获得log n的运行时间?当循环的最大运行时间为n / 2时,我认为说n的运行时没有任何逻辑意义。
答案 0 :(得分:0)
我认为一些概念需要在这里进行一些改进,因为时间复杂度仅与算法有关,而与您正在操作的数据结构的大小无关。
老师告诉我们,每当你将某事物除以2时,运行时间很可能是log n。例如,如果我们将一个数组分成两个,每次遍历一个数组时,运行时就是log n。
现在,遍历一个数组,如
for (int i = 0; i < array.size; i++) {
variable = array[i];
}
在O(n)
中运行:执行此类操作所需的时间与数组的大小呈线性关系。对于数组上的binary search之类的操作,您将有O(log n)
,但是您无法将此概念概括为所有数组操作,尤其是那些需要迭代数组的人。
现在,这句话
例如,我们可能有一个算法,通过从头部或尾部开始,将列表的第n个元素设置为其他元素,以使运行时间小于n。
让我相信你认为大O中使用的n和你称之为“第n个元素”的n是直接相关的。他们不是。在链接列表中,您转到元素n的唯一选择是转到列表的开头并按照您要查找的元素的链接(或者在双链表的情况下,转到开头或结尾)取决于您正在寻找的元素的位置,因此该操作具有O(n)的时间复杂度,即与集合的长度线性相关。