基于时间复杂度的这些片段真的很困惑
Posted
技术标签:
【中文标题】基于时间复杂度的这些片段真的很困惑【英文标题】:Really confused for these snippets based on Time Complexity 【发布时间】:2022-01-14 11:56:15 【问题描述】:大家好,我很长时间以来对两个代码 sn-ps 的时间复杂度感到困惑
例如,让我们获取一个列表,该列表有 n 个项目,但在下一行中,我将其初始化为 ArrayList 的一个新实例。
List<Integer> temp = List.of(1,2,3,4,5);
temp = new ArrayList<>(); // I believe the time complexity is O(1)
所以上面的 sn-p 中的家伙真的是 O(1) 因为它创建了一个新的实例对象并指向它还是我在这里错了?
另一个sn-p是
int counter = any value;
for(int i = 0;i<n;i*=counter)// I guess its O(n)
在上面的 sn-p 中,我猜它的 O(n) 因为计数器是可变的,并且可以有任何不固定的随机值或者它是 log(n) 吗?
请大家多多指教,谢谢。
【问题讨论】:
“我相信时间复杂度是 O(1)”你是问两条线的时间复杂度,还是只是重新分配? "我猜它的 O(n)" 这会无限执行,除非n < 0
。如果你的意思是初始化i = 1
,那么它是对数的。
单独重新分配,现在我的困惑被清除了谢谢:-)
【参考方案1】:
所以上面的 sn-p 中的家伙真的是 O(1),因为它创建了一个新的实例对象并指向它,还是我错了?
第 1 行 List<Integer> temp = List.of(1,2,3,4,5)
是 O(n)。实际上,Java 在将元素设置到 List 所持有的底层数组之前,实际上会遍历元素以执行 null 检查。
第 2 行 temp = new ArrayList<>()
是 O(1)。初始化新列表所需的时间是恒定的;这里没有变量。
将整个 sn-p 视为一个整体(第 1 + 2 行一起)时,它是 O(n),因为我们总是取算法中的最高复杂度。
在上面的 sn-p 中,我猜它的 O(n) 因为计数器是可变的,并且可以有任何不固定的随机值或者它是 log(n) 吗?
假设您将循环初始化为 i = 1
,并且 n
和 counter
都是变量而不是常量,时间复杂度将是 O(log counter n).
在循环中,每次迭代后剩余的迭代次数会减少(除以)counter
。因此时间复杂度是对数的。你可以把“log c n”想象成“从n
开始,你需要递归除以c
的次数才能达到1”。
但是,如果您真的打算将循环初始化为i = 0
,它只会无限执行。
【讨论】:
感谢哥们的详细解释,非常感谢:-) 没问题,不客气 :)以上是关于基于时间复杂度的这些片段真的很困惑的主要内容,如果未能解决你的问题,请参考以下文章