我正在尝试对类“ SlowMaxStack”的方法IsEmpty(),Push(),Pop()和getMaxSoFar()进行运行时分析。
这是我的猜测,但是我不确定答案是否正确,我也怀疑我的推理。
IsEmpty():o(1),只需检查顶部节点。常量
Push():o(1),只需将数据放入顶部节点即可。常量
Pop():o(1),猜测这可能是o(3),但仍为常数,因此我认为它是o(1)
getMaxSoFar():o(n),因为for循环遍历元素直到节点元素的长度。从顶部开始,1 + n + 1-> n + 2-> o(n)
class ListNode<T>{
public T value;
public ListNode<T> next;
public ListNode(T value, ListNode<T> next)
{
this.value = value;
this.next = next;
}
public ListNode<T> setValue(T value)
{
return new ListNode<T>(value, this);
}
}
interface Maximizer<T> {
T getMax(T t1, T t2);
T getGlobalMin();
}
interface MaxStack<T>
{
boolean isEmpty();
void push(T value);
T pop();
T getMaxSoFar();
//returns the maximum value in the stack
}
class SlowMaxStack<T> implements MaxStack<T>
{
private final Maximizer<T> maximizer; //data
private ListNode<T> top; // node
public SlowMaxStack(Maximizer<T> maximizer)
{
this.maximizer = maximizer;
}
@Override
public boolean isEmpty()
{
return top == null;
}
@Override
public void push(T value)
{
if (top == null)
{
top = new ListNode<T>(value, null);
}
else
{
top = top.setValue(value);
}
}
@Override
public T pop()
{
T value = top.value;
top = top.next;
return value;
}
@Override
public T getMaxSoFar()
{
T currentMax = maximizer.getGlobalMin();
for(ListNode<T> node = top; node != null; node = node.next)
{
currentMax = maximizer.getMax(currentMax, node.value);
}
return currentMax;
}
}