【问题标题】:Time complexity of prefix to postfix conversion?前缀到后缀转换的时间复杂度?
【发布时间】:2020-02-09 08:20:42
【问题描述】:

我认为它应该是二次的,即 O(n^2)。我正在从这个来源阅读prefix to postfix。我假设追加两个字符串需要线性时间(O(我们要追加的两个字符串的大小之和)),我们需要追加的最大次数可以达到 O(n),因此总体复杂度是 O(n^ 2)。 有人可以判断我是否错了吗?有人可以提供更好的证据吗?

【问题讨论】:

  • 看起来你是对的,但当然你可以用不同的方式实现它,所以它是 O(n)。
  • @kaya3 你能提供在 O(n) 中的任何此类教程的链接吗?
  • 本质上是一样的算法,只是用二叉树来表示表达式,并将树节点存放在栈中,而不是字符串;然后在最后用 StringBuilder 构建整个输出字符串。

标签: data-structures stack time-complexity postfix-notation


【解决方案1】:

是的,你是对的,它是 O(n2),我认为你的证明是可以的,但这取决于你必须向谁证明。也许明确展示如何构造一个会导致 O(n) 附加 O(n) 大小的字符串。

这是一个在 O(n) 中完成工作的简单递归版本:

static String preToPost(String src)
{
    StringBuilder dest = new StringBuilder(src.length());
    for(int pos=0; pos < src.length(); pos = preToPost(dest, src, pos));
    return dest.toString();
}
// Convert one prefix expression to postfix.  Returns
// end position
static int preToPost(StringBuilder dest, String src, int pos)
{
    if (pos >= src.length())
    {
        //no expression
        return pos;
    }
    char c = src.charAt(pos++);
    if ("+-/*".indexOf(c)>=0)
    {
        //operator. Convert both operands first
        pos = preToPost(dest, src, pos);
        pos = preToPost(dest, src, pos);
    }
    dest.append(c);
    return pos;
}

迭代版本并没有复杂多少:

static String preToPost2(String src)
{
    StringBuilder dest = new StringBuilder(src.length());
    int pos=0;

    Stack<Character> stk = new Stack<>();
    while(pos < src.length())
    {
        char c = src.charAt(pos++);
        if ("+-/*".indexOf(c)>=0)
        {
            //operator.  After the next 2 expressions, put c
            stk.push(c);
            //after the next expression, just do another one
            stk.push('\0');
            continue;
        }
        dest.append(c);
        // done expression.  check the todo stack
        while(!stk.empty())
        {
            c = stk.pop();
            if (c=='\0')
            {
                break;
            }
            dest.append(c);
            // the append completed another expression, so loop
            // to check the todo stack again
        }
    }
    return dest.toString();
}

这是递归的直接转换。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-28
    • 1970-01-01
    • 2018-09-13
    • 1970-01-01
    • 2021-10-30
    • 1970-01-01
    • 1970-01-01
    • 2010-11-29
    相关资源
    最近更新 更多