Java - 具有变量的空间复杂性

时间:2017-07-19 23:09:06

标签: java space-complexity

这里的空间复杂度是否为O(n)?因为如果k增加5,我的变量p也会增加5。

现在所有这个方法都是将节点置于k。例如:1-> 5-> 3,当k = 2时,节点为5.

public ListNode reverseKGroup(ListNode head, int k) {
    int p = 1;

    while (p < k) {
        if (head.next == null) {
            return head;
        }
        head = head.next;
        p++;
    }

    return head
}

3 个答案:

答案 0 :(得分:4)

严格考虑您的算法,它具有空间复杂度O(1)。您的输入是列表的标题和数字k,但您的算法不会消耗任何空间,而不仅仅是参考head和数字p。在我看来,现有列表并不属于您方法的复杂性。但是,您的时间复杂度为O(N)。

---在评论中回答Theo的问题:

p是一个数字(在这种情况下是基本类型int,所以需要4个字节 - 常量大小)。如果p增加,这并不意味着,它需要更多空间,但存储的数字更高。例如。 p = 5意味着设置了以下字节:&#34; 0,0,0,5&#34; ,对于p = 257,设置字节:&#34; 0,0,1,2&#34;。 我假设,JVM以大端字节顺序存储日期,因此第一个零表示更大的字节。使用小端,字节顺序将颠倒。

当然,你是对的,对于非常大的N,不需要32位长的整数。因此,严格考虑这一事实,O(log(N))位是存储最多N的数字所必需的。 例如。数字2 ^ 186需要存储187位(一个1和186个零)。

但实际上,与#34;通常&#34;数据,你不要指望这么大的数额。由于只有超过32位寄存器(一个int个数字),您需要有2 ^ 32个数据条目(1个条目= 4个字节用于下一个引用,至少4个字节用于值Object引用,对象大小本身=至少8个字节),即2 ^ 35字节= 32千兆字节。因此,当使用数字时,它通常被认为是恒定的空间复杂度。这取决于任务和环境。

答案 1 :(得分:1)

根据您是否认为预先存在的结构是空间复杂性的一部分,空间复杂度为O(1)或O(N),其中N是要操作的列表的长度,因为您不添加任何新的节点,仅引用现有节点。

k仅对时间复杂性有影响。

答案 2 :(得分:0)

此算法使用的唯一空间是int p的空间,无论输入如何,它都是常量,因此空间复杂度为O(1)。时间复杂度确实是O(N)。