通用堆栈构造函数的Big-O

时间:2013-10-26 15:54:10

标签: 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];
    }
 }

 public class ArrayStack<T> implements BoundedStackInterface<T> {
    protected T[] stack;
    public ArrayStack(int maxSize) {
       stack = (T[]) new Object[maxSize];
    }
 }

现在在我的书中,这两个构造函数中的Big(O)被称为 O(N),但是我们的教师试图告诉我们他们应该 O(1)

有人会介意向我解释为什么 O(N)而不是 O(1)

3 个答案:

答案 0 :(得分:3)

构造函数根据数组的长度分配一定量的内存,数组的长度定义为构造函数的参数。分配这个内存所花费的时间是所分配的数组大小(因此是内存量)的lineair,因此O(n)O(1)意味着内存可以在恒定的时间内分配,与数组的大小无关,这是不可能的。

答案 1 :(得分:2)

当您询问大O符号时,需要考虑两个问题:

  1. 什么是N? (对于n×n矩阵,是N n,还是n ** 2?)

  2. 您测量的费用是多少?合并N种项目需要进行O(N log N)比较;但如果要对字符串进行排序,则每次比较的成本取决于字符串的长度。

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

    但是分配O(N)内存,或者需要进行O(N)比较,与采用O(N)时间完全不同 - 虽然这显然是一个更加滑溜的概念,需要考虑整个系统(缓存效果,垃圾收集,CPU调度等)而不仅仅是算法。

    一般来说,分配N个字节的内存似乎花费O(N)时间,这对于使用显式自由的经典C风格内存分配和Java风格的垃圾收集系统来说似乎都是如此(在Java中分配内存是非常便宜,但你分配的所有内存必须是垃圾收集,你必须考虑到这个的摊销成本。这仍然是一个有趣的研究问题; Time complexity of memory allocation有一些很好的指示。 (HT对Patrick Kostjens的链接。)

    我很高兴你在想这个,而不是盲目地信任你的书或你的导师。

答案 2 :(得分:1)

如果要分配更多内存,分配内存的时间不会太长。 new Object[100];new Object[1000];new Object[100000];等之间存在无法察觉的差异。这表明您用于构建堆栈的算法是 O(1) ,而不是O(N)