最大化前缀表达式的值

时间:2020-01-09 06:10:32

标签: algorithm logic

给出一个前缀表达式,其中包含潜在变量,并且每个变量都可以取值范围,在为变量分配适当的值后找到表达式的最大值

例如

+ 1 x 
{ x: [3 7) }

这里x可以取值3到7(不包括)(范围始终为[x, y))和0 < x,y <= max_int

起初,我认为这很简单,并且对于每个受支持的(+ - * /)运算符,我使用以下逻辑决定了在替换时需要选择的范围内的值

例如 当运算符为+并且其操作数为范围时,则从该范围中选择最大值 当运算符为-并且其操作数为范围时,则选择最小值 当运算符为*并且其操作数为范围时,则选择最大值 当operator为/且其numerand为范围时,则选择最大值;如果分母为范围,则选择最小值(这是/最大化的方式)

我使用了基于常规堆栈的方法来评估前缀表达式

我通过反转前缀转换了前缀=>后缀,对吗? [+, 1, 2] becomes [2, 1, +],是否在所有情况下都是prefix == reverse(postfix)

这是我的实现方式

def add(a, b):
    x = max(a) if isinstance(a, tuple) else a
    y = max(b) if isinstance(b, tuple) else b
    return x + y

def sub(a, b):
    x = min(a) if isinstance(a, tuple) else a
    y = min(b) if isinstance(b, tuple) else b
    return x - y

def mul(a, b):
    x = max(a) if isinstance(a, tuple) else a
    y = max(b) if isinstance(b, tuple) else b
    return x * y

def divide(a, b):
    x = max(a) if isinstance(a, tuple) else a
    y = min(b) if isinstance(b, tuple) else b
    return int(x / y)


ops = {
  "+": add,
  "-": sub,
  "*": mul,
  "/": divide
}

def max_result_expression(expression, variables):
    stack = []
    tokens = expression.split()[::-1] ;; is this correct logically?

    for token in tokens:
        print(stack)
        if token in ops:
            i = stack.pop()
            j = stack.pop()
            res = ops[token](i, j)
            stack.append(res)
        else:
            if token in variables:
                r = variables[token]
                stack.append((r[0], r[1] - 1))
            else:
                stack.append(int(token))

    return stack.pop()

print(max_result_expression("/ 10 + 1 x", {"x": (1, 5)})) 

对于上面给出的表达式,如果x被选为1,但根据我的上述逻辑选择为5,则最大值可能为5,这是失败的。我知道我的最小,最大方法的问题在于,它会考虑使用当前的运算符来进行本地决策。在这种情况下,由于除法是顶级运算符,因此+必须将其结果减到最小

我现在不知道如何进行此操作。我猜想为此需要使用一些递归解决方案

编辑:

让我们假设变量没有被重用,即它们只出现一次 变量的范围是0 < i <= max_int 表达式中的变量数为10^3

0 个答案:

没有答案