以下此代码的重要注意事项是什么?我仍然无法完全掌握这个概念。 我应该从经验丰富的程序员那里得到一个想法,根据这段代码给出一个大的性能总结。
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("");
}
}
答案 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)
操作的数据结构复杂性总是根据它所持有的元素数来计算,显示随着元素数量的增加所需的最长时间。
例如:在&#34; B-Tree&#34;中搜索元素需要多长时间?鉴于其中已存在n个元素。
在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)。