【问题标题】:Stack Recursive Implementation Complexity堆栈递归实现复杂度
【发布时间】:2014-03-14 13:54:51
【问题描述】:

我在大学的老师教过我们这种堆栈的实现。但是这个是完全递归的,我在网络上的任何地方都没有看到过这样的东西。所以我想知道这有多好或多有效。正如我所看到的,使用链表(是最有效的一种)和使用数组的堆栈实现很多。

public class Stack<T>
{
    private T top;
    private Stack<T> base;

    public Stack(){
        top = null;
        base = null;
    }

    public Stack(T data, Stack<T> base){
        top = data;
        this.base = base;
    }

    public boolean isEmpty(){
        return top == null;
    }

    public T top(){
        return top;
    }

    public T push(T data){
        if (isEmpty()){
            top = data;
            base = new Stack<T>();
        } else {
            base = new Stack<T>(top, base);
            top = data;
        }
        return data;
    }

    public T pop(){
        T res = null;
        if (!isEmpty()){
            res = top;
            top = base.top;
            base = base.base;
        }
        return res;
    }
}

我想听听您的意见,因为我真的在其他任何地方都没有见过这种实现方式。请随意解释复杂性!

【问题讨论】:

  • 递归在哪里?
  • 所以它是一个基于链表而不是数组的堆栈。这意味着推送和弹出的 O(1) - 您不必担心数组的增长。随机访问将是 O(n),但这通常不是使用堆栈的方式。
  • 所有操作都是 O(1)。看不出这个实现有什么问题。
  • @rendon:这是一种递归数据结构,与递归函数调用相反。它是一个堆栈(节点),带有指向另一个堆栈的指针。
  • @FraK:这一个链表实现。看:最上面的节点有对下一个的引用,它有对下一个的引用,等等。这就是链表。

标签: java recursion stack


【解决方案1】:

正如其他人评论的那样,此实现使用单链表,而典型实现使用数组来保存堆栈。

所以我想知道这有多好或多有效。

复杂性优先:

  • 最佳/平均/最坏情况时间复杂度为O(1)

  • 最佳/平均/最差情况空间复杂度为O(N)

比较复杂性:

  • 最佳情况下的时间复杂度与数组实现中的相同:O(1)

  • 最佳情况下的空间复杂度在数组实现中是相同的:O(N)

  • 平均复杂度和最坏情况复杂度的比较有点棘手,因为基于数组的度量取决于堆栈的数组是否/如何随着堆栈的增长和收缩而重新分配。这是特定于实现的。

比较性能(最佳情况):

  • 使用链表版本推送更昂贵,因为每个push 调用都会创建一个新对象。 (在基于数组的版本的最佳情况下,数组中有一个空闲槽......所以不需要重新分配。)

  • 弹出间接地更昂贵,因为它会导致对象变得不可访问。

  • 对于基于列表的实现,最佳情况下的空间使用率肯定更高。堆栈条目由具有 2 个引用的对象表示。那是 2 个“单词”加上对象标题加上填充。在 64 位 JVM 中……可能是 24 字节。相比之下,基于数组的解决方案使用数组中的 1 个引用 ... 8 个字节 ... 每个条目。

由于上述原因,很难比较平均情况和最差情况的性能和空间使用情况。

从 API 设计的角度来看:API 提供了无泄漏的抽象。我唯一的疑问是弹出一个空堆栈应该是一个错误。如果调用者不测试意外(或预期的)null 结果,则返回nullpop() 方法可能会导致问题(NPE)。此外,您不能将null 放入堆栈。

(实际上,那里有一个错误!如果您尝试推送null,它“有效”,但随后Stack.isEmpty() 将报告堆栈为空。push 方法应该抛出异常,如果你尝试推送null ...或至少保护数据结构。)


请随意解释复杂性!

如果你自己解决,你会学到更多。

但是这个是完全递归的……

值得商榷。数据结构在某种意义上是递归的,但算法不需要递归。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-27
    • 2015-12-17
    • 2021-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-26
    • 1970-01-01
    相关资源
    最近更新 更多