【问题标题】:Declaring a shrink function in Dynamic Array in Stack在堆栈中的动态数组中声明收缩函数
【发布时间】:2022-01-04 12:09:18
【问题描述】:

这是我的代码:

private void shrink(){ 
int length = top+1; 
    if(length<=MINCAPACITY || top<<2 >= length)  
        return;
        length = length + (top<<1); 
        if(top < MINCAPACITY) length = MINCAPACITY;
        int[] newstack = new int[length];
        System.arraycopy(stackRep, 0 , newstack, 0 , top+1);
        stackRep = newstack;
    }

在我的书中据说如果超过 3/4 为空,则此操作会将数组缩小到一半。谁能向我解释一下这段代码是如何发生的?我怀疑这个操作发生在第一个 if 语句和 length 语句中?

【问题讨论】:

  • 那么你不明白代码的哪个确切部分?

标签: java arrays stack bit-shift


【解决方案1】:

Java 数组不能改变长度。它的作用是计算新长度,创建一个该长度的新数组,并将旧数组中的内容复制到其中,然后使旧数组引用新数组。

int length = ... // this will be the new arrays length
int[] newstack = new int[length]; // this is the new array
System.arraycopy(stackRep, 0 , newstack, 0 , top + 1); // stuff is copied to the new array
stackRep = newstack; // old array is now the new array

不确定这是否能回答您的问题

编辑:

通过我假设的“改变长度的部分”,您想知道它们的作用:&lt;&lt;&gt;&gt;。它们是位移运算符,您可以找到有关它们的更详细说明,例如 here

他们基本上是这样做的:

  • x &lt;&lt; n - 将 x 乘以 2n 的幂
  • x &gt;&gt; n - 将x 除以2 的幂n

所以10 &lt;&lt; 12010 &lt;&lt; 38010 &gt;&gt; 1510 &gt;&gt; 22 (此处丢失精度,因为这些运算符只是移位位)。

【讨论】:

  • 我需要它如何改变长度的部分。
  • 这能回答你的问题吗?
  • 嗯还是不行。我需要知道这段代码如何将数组大小减半。
【解决方案2】:

我跟踪了上面的逻辑,如果超过 3/4 为空,它不会将数组缩小到一半。

我认为您正在关注由 narasimha karumanchi 在 java 中简化的数据结构和算法。您在这里共享了相同的代码 sn-p。

我对代码做了一些改动。请找到以下代码。如果超过 3/4 为空,它会将数组缩小到一半。

private void shrink(){ 
    int length = top+1; 
        if(length<=MIN_CAPACITY || top<<2 >= stackRep.length){
             return;
        }
        length =  (length<<1); 
        if(top < MIN_CAPACITY) length = MIN_CAPACITY;
        int[] newstack = new int[length];
        System.arraycopy(stackRep, 0 , newstack, 0 , top+1);
        stackRep = newstack;
}

假设堆栈中有 16 个元素,数组的大小也是 16。再添加一个元素,因为数组是完整的新数组,大小为 32 的两倍,旧数组内容将被复制到新数组和第 17 个元素条目将进入新数组。 让我们通过弹出元素进行跟踪。假设 MIN_CAPACITY=2

堆栈 17 中的元素数量,数组大小 32,顶部 = 16

如果堆栈中只剩下1/4大小的数组元素,则弹出后

堆栈 8 中的元素个数,数组大小 32,顶部 = 7

top = stackRep.length) 将变为 (28 > 32),这是错误的。 现在我们应该创建一半大小的数组。

长度 = (长度

其余的事情是不言自明的。

【讨论】:

    猜你喜欢
    • 2010-11-22
    • 2021-12-22
    • 1970-01-01
    • 1970-01-01
    • 2013-07-11
    • 1970-01-01
    • 2019-05-09
    • 2014-12-24
    • 2010-09-08
    相关资源
    最近更新 更多