【问题标题】:Java Stack array - Big O notationJava Stack 数组 - 大 O 表示法
【发布时间】:2015-06-14 16:59:05
【问题描述】:

下面这段代码的大符号是什么。我仍然无法完全掌握这个概念。 我应该从有经验的编码人员那里得到一个想法,以根据此代码对大 o 性能进行总结。

import java.util.*;
import java.util.InputMismatchException;
import javax.swing.*;
public class MyStack {

   private int maxSize;
   private long[] stackArray;
   private int top;
   public MyStack(int s) {
      maxSize = s;
      stackArray = new long[maxSize];
      top = -1;
   }
   public void push(long j) {
      stackArray[++top] = j;
      System.out.println("Push onto stack");
   }
   public long pop() {
      return stackArray[top--];
   }
   public long peek() {
      return stackArray[top];
   }
   public boolean isEmpty() {
      return (top == -1);
   }
   public boolean isFull() {
      return (top == maxSize - 1);
   }
   public static void main(String[] args) {
        Scanner num = new Scanner(System.in);
        int input =0;
        int x;
        MyStack theStack = new MyStack(5); 
    for(x=0; x<5; x++)
    {


        System.out.println("\nEnter a number(Push): ");
        input = num.nextInt();
        theStack.push(input);



      } 



     System.out.print("The first element on the top is the top of the stack");
     System.out.println("");
      while (!theStack.isEmpty()) {
         long value = theStack.pop();
         System.out.print(value);
         System.out.println(" Pop");

      }


      System.out.println("");

   }
}

【问题讨论】:

  • 一个类没有大 O 复杂度。你有什么问题?

标签: java arrays performance stack notation


【解决方案1】:

Big O 性能因您尝试的操作而异。看看你的“isEmpty()”方法。它总是只查看 top 的值,所以它是常数,或者 O(1)。我没有看到你的类中的其他方法(除了 main(),我们稍后会介绍)对数组中的元素数量有任何依赖关系,它们都只适用于 top。

main() 只要求 5 个值,然后将它们打印出来。如果它要求 50,则需要十倍的时间(假设用户输入保持相对恒定)。所以 main 是 O(n),其中 n 是数组中的元素数。

如果您要在数组中查找特定数字,则可能必须依次检查每个数字,因此 O(n)。

如果你正在做一些更复杂的事情,你查看每个元素,然后对其他元素进行一些操作或比较(例如,使用嵌套的 for 循环),你最终会得到 O(n^2)。

希望对您的思考过程有所帮助。

【讨论】:

    【解决方案2】:

    所有方法的性能都在 O(1) 内,因为它们只是索引数组或检查 top 的值。

    在 main 的主体中,for 循环执行 5 次,执行 5 次推送,因此 O(5 * 1) = O(n),因为堆栈的大小为 n = 5。

    之后,while 循环将弹出堆栈,直到它为空。因为堆栈只能包含 5 个元素(这也是它的大小),所以又是 O(5 * 1) = O(n)。

    所以你可以假设它在 O(2 * n) 中产生 O(n)。

    【讨论】:

      【解决方案3】:

      一个操作的数据结构复杂度总是根据它所拥有的元素数量来计算的,它显示了随着元素数量的增加它将花费的最大时间。

      例如:考虑到已经存在 n 个元素,在“B-Tree”中搜索一个元素需要多长时间。

      在 B-Tree 中搜索时间为 O(log n),意味着最大搜索时间将作为 log n 的函数增长(参见 Big-O 复杂度图)。

      在您实现堆栈的情况下,您使用了一个数组并且您有多个操作,但是您的操作不依赖于堆栈中携带的元素,因为在特定位置获取元素的复杂性是 O(1 )。所以你所有的操作都需要 O(1) 时间。

      推-O(1)

      流行 - O(1)

      满 - O(1)

      isEmpty - O(1)

      但是,如果您在堆栈中实现搜索,请检查给定的 long 是否在堆栈中,然后搜索取决于您必须迭代所有元素的元素,复杂度将为 O(n)。

      【讨论】: