带变量的Java空间复杂性

带变量的Java空间复杂性,java,space-complexity,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 =

这里的空间复杂度是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
}
public ListNode reverseKGroup(ListNode头,int k){
int p=1;
而(p< /代码> 取决于您是否考虑了预先存在的结构的空间复杂性的一部分,空间复杂度是O(1)或O(n),其中n是正在操作的列表的长度,因为不添加任何新节点,只引用现有节点。p>

k只与时间复杂度有关

>P>根据您是否考虑到预先存在的结构的空间复杂性的一部分,空间复杂度是O(1)或O(n),其中n是正在操作的列表的长度,因为不添加任何新节点,只引用现有节点。p>
k只与时间复杂度有关

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

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

p
是一个数字(在本例中为基本类型int,因此需要4个字节-常量大小)。如果
p
增加,并不意味着占用更多空间,而是意味着存储的数字更大。例如,p=5表示设置以下字节:“0,0,0,5”,对于p=257,字节设置为:“0,0,1,2”。 我假设,JVM以大端字节顺序存储日期,因此前零代表较大的字节。使用小endian时,字节顺序将颠倒

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


但在现实中,当处理“常规”数据时,您不会期望有这么大的数据量。由于只需超过32位寄存器(一个
int
number),您就需要有2^32个数据条目(1个条目=下一个引用的4字节,值
Object
引用的至少4字节,对象大小本身=至少8字节),即2^35字节=32千兆字节。因此,当使用数字时,通常认为它是一个恒定的空间复杂度。它取决于任务和环境。

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

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

p
是一个数字(在本例中为基本类型int,因此需要4个字节-常量大小)。如果
p
增加,并不意味着占用更多空间,而是意味着存储的数字更大。例如,p=5表示设置以下字节:“0,0,0,5”,对于p=257,字节设置为:“0,0,1,2”。 我假设,JVM以大端字节顺序存储日期,因此前零代表较大的字节。使用小endian时,字节顺序将颠倒

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


但在现实中,当处理“常规”数据时,您不会期望有这么大的数据量。由于只需超过32位寄存器(一个
int
number),您就需要有2^32个数据条目(1个条目=下一个引用的4字节,值
Object
引用的至少4字节,对象大小本身=至少8字节),即2^35字节=32千兆字节。因此,当使用数字时,通常认为它是一个恒定的空间复杂度。这取决于任务和环境。

此算法使用的唯一空间是
int p
的空间,该空间是恒定的,与输入无关,因此空间复杂度为O(1)。时间复杂度实际上是O(N)。

该算法使用的唯一空间是
int p
的空间,该空间是恒定的,与输入无关,因此空间复杂度是O(1)。时间复杂度确实是O(N)。

我理解时间复杂度部分。对于空间复杂性,我知道使用head不会占用任何空间。但是你能解释一下为什么使用数字p不占空间吗?因为如果我增加k,p不会增加相同的量,因此我的算法会占用输入k的空间,即O(n)空间complex@Theo-我的答案有点长,请参阅编辑后的文章。我理解时间复杂性部分。对于空间复杂性,我知道使用head不会占用任何空间。但是你能解释一下为什么使用数字p不占空间吗?因为如果我增加k,p不会增加相同的量,因此我的算法会占用输入k的空间,即O(n)空间complex@Theo-我的答案有点长,请参阅编辑后的帖子。