Java 泛型堆栈构造函数的Big-O

Java 泛型堆栈构造函数的Big-O,java,stack,big-o,Java,Stack,Big O,下面的代码包含用户创建的堆栈数据结构的两个构造函数 public class ArrayStack<T> implements BoundedStackInterface<T> { protected T[] stack; public final int defCap = 100; public ArrayStack() { stack = (T[]) new Object[defCap]; } } 公共类ArrayS

下面的代码包含用户创建的堆栈数据结构的两个构造函数

 public class ArrayStack<T> implements BoundedStackInterface<T> {
    protected T[] stack;
    public final int defCap = 100;
    public ArrayStack() {
       stack = (T[]) new Object[defCap];
    }
 }
公共类ArrayStack实现BoundedStackInterface{
受保护的T[]堆栈;
公共最终int defCap=100;
公共阵列堆栈(){
堆栈=(T[])新对象[defCap];
}
}

公共类ArrayStack实现BoundedStackInterface{
受保护的T[]堆栈;
公共阵列堆栈(int maxSize){
堆栈=(T[])新对象[maxSize];
}
}
现在在我的书中,这两个构造器中的大(O)表示为O(N),但我们的讲师试图告诉我们它们应该是O(1)


有人能给我解释一下为什么它是O(N)而不是O(1)

构造函数根据数组的长度分配内存量,数组的长度被定义为构造函数的参数。分配此内存所需的时间与所分配的数组大小(以及内存量)成线性关系,因此
O(n)
O(1)
意味着可以在恒定的时间内分配内存,与数组大小无关,这是不可能的

如果要分配更多内存,则分配内存所需的时间不会明显延长。
新对象[100]之间存在无法检测到的差异
新对象[1000]
新对象[100000]等。这表明用于构造堆栈的算法是
O(1)
,而不是
O(N)
当您询问大O符号时,有两个问题需要考虑:

  • 什么是N?(对于nxn矩阵,是n n,还是n**2?)

  • 你测量的成本是多少?N项的合并排序需要O(N logn)比较;但是,如果要对字符串进行排序,则每次比较的成本取决于字符串的长度

  • 对于两个构造函数,第一个分配O(1)内存,第二个分配O(N)内存,其中N是
    maxSize

    但是,分配O(N)内存,或者需要O(N)比较,与占用O(N)时间完全不同——这显然是一个更为复杂的概念,需要考虑整个系统(缓存效果、垃圾收集、CPU调度等),而不仅仅是算法

    一般来说,分配N字节的内存大约需要O(N)个时间,这对于使用显式free的经典C风格内存分配和Java风格的垃圾收集系统来说都是正确的(在Java中分配内存非常便宜,但您分配的所有内存都必须进行垃圾收集,并且您必须考虑摊销成本)。这仍然是一个有趣的研究问题,有一些很好的指导意义。(HT向Patrick Kostjens提供链接。)


    我很高兴你能想到这一点,而不是盲目地相信你的书或你的导师。

    第一个构造函数显然是O(1)-它的执行时间基本上是恒定的。@AlanStokes您的评论与PatrickKostjens的回答冲突。为什么?@Tdorno,请参阅我在回答中对AlanStokes的评论。@Tdorno对于第一个构造函数,没有N表示它是O(N)。第二个更有趣。注意,为什么分配N个字节需要与N成比例的时间?分配通常只是指针减法。@AlanStokes,我想我假设内存分配是线性分配时有点快,但另一个问题是()已经被问及这个话题。从那里的答案来看,我怀疑我们是否能找到这个问题的明确答案。感谢链接!是的,我怀疑没有简单的答案。垃圾收集内存的成本如何?需要引用;-)在Big OH中,您单独讨论算法-没有考虑其他内容。您声称“如果要分配更多内存,则分配内存的时间不会明显延长。“为什么?@AlanStokes-Claim??这是事实!只有当您的可用内存少于1 TB时,分配1 TB内存所需的时间才会比分配1 TB内存所需的时间更长。在这种情况下,你分析的是环境,而不是算法。在《大奥》中,你只讨论算法——没有考虑任何其他因素。。。不需要花多长时间-永远!!!大OH是算法的复杂性——仅此而已。等待1000年然后完成的算法的最大优点是什么?
     public class ArrayStack<T> implements BoundedStackInterface<T> {
        protected T[] stack;
        public ArrayStack(int maxSize) {
           stack = (T[]) new Object[maxSize];
        }
     }