基于时间复杂度的这些片段真的很困惑

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 &lt; 0。如果你的意思是初始化i = 1,那么它是对数的。 单独重新分配,现在我的困惑被清除了谢谢:-) 【参考方案1】:
    所以上面的 sn-p 中的家伙真的是 O(1),因为它创建了一个新的实例对象并指向它,还是我错了?

第 1 行 List&lt;Integer&gt; temp = List.of(1,2,3,4,5)O(n)。实际上,Java 在将元素设置到 List 所持有的底层数组之前,实际上会遍历元素以执行 null 检查。

第 2 行 temp = new ArrayList&lt;&gt;()O(1)。初始化新列表所需的时间是恒定的;这里没有变量。

将整个 sn-p 视为一个整体(第 1 + 2 行一起)时,它是 O(n),因为我们总是取算法中的最高复杂度。


    在上面的 sn-p 中,我猜它的 O(n) 因为计数器是可变的,并且可以有任何不固定的随机值或者它是 log(n) 吗?

假设您将循环初始化为 i = 1,并且 ncounter 都是变量而不是常量,时间复杂度将是 O(log counter n).

在循环中,每次迭代后剩余的迭代次数会减少(除以)counter。因此时间复杂度是对数的。你可以把“log c n”想象成“从n开始,你需要递归除以c的次数才能达到1”。


但是,如果您真的打算将循环初始化为i = 0,它只会无限执行。

【讨论】:

感谢哥们的详细解释,非常感谢:-) 没问题,不客气 :)

以上是关于基于时间复杂度的这些片段真的很困惑的主要内容,如果未能解决你的问题,请参考以下文章

哈希表的时间复杂度

为 for 循环确定不同的大 O 复杂度

子选择使复杂的查询真的很慢

关于代码片段的时间复杂度

以下代码片段的时间复杂度是多少?

哈斯克尔。我很困惑这个代码片段是如何工作的