Java堆栈数组 - 大O表示法

时间:2015-06-14 16:59:05

标签: java arrays performance stack notation

以下此代码的重要注意事项是什么?我仍然无法完全掌握这个概念。 我应该从经验丰富的程序员那里得到一个想法,根据这段代码给出一个大的性能总结。

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("");

   }
}

3 个答案:

答案 0 :(得分:0)

大O性能因您尝试的操作而异。看看你的&#34; isEmpty()&#34;方法。它总是只看顶部的值,所以它是常数,或者是O(1)。我没有在你的类中看到其他方法(除了main(),我们将在一分钟内看到),这些方法对数组中元素的数量有任何依赖性,它们都只能与top一起使用。

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

如果你在数组中寻找一个特定的数字,你可能需要轮流检查每个数字,所以O(n)。

如果您在查看每个元素然后进行某些操作或与其他元素进行比较(例如使用嵌套for循环)时执行更复杂的操作,则最终会得到O(n ^ 2)

希望这有助于您的思考过程。

答案 1 :(得分:0)

所有方法的性能都在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)。

答案 2 :(得分:0)

操作的数据结构复杂性总是根据它所持有的元素数来计算,显示随着元素数量的增加所需的最长时间。

enter image description here

例如:在&#34; B-Tree&#34;中搜索元素需要多长时间?鉴于其中已存在n个元素。

enter image description here

在B-Tree中,搜索时间为O(log n),表示最大搜索时间将随log n的变化而增长(参见Big-O Complexity图)。

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

推 - O(1)

pop - O(1)

isFull - O(1)

isEmpty - O(1)

但是如果你在堆栈中实现搜索,检查给定long是否在你的堆栈中,那么搜索取决于你必须迭代所有元素的元素,复杂性将是O(n)。