C++ 一元线性方程的求解
求解一个变量中的线性方程的最有效算法是什么?例如,对于输入字符串: “x+9-2-4+x=–x+5-1+3-x” 输出应该是1 我正在考虑使用一个堆栈,当我遇到字符串中的空格时,将每个字符串标记推到堆栈上。如果输入是波兰语符号,那么从堆栈中弹出数字以获得结果会更容易,但我不确定在这里采取什么方法C++ 一元线性方程的求解,c++,python,algorithm,linear-algebra,C++,Python,Algorithm,Linear Algebra,求解一个变量中的线性方程的最有效算法是什么?例如,对于输入字符串: “x+9-2-4+x=–x+5-1+3-x” 输出应该是1 我正在考虑使用一个堆栈,当我遇到字符串中的空格时,将每个字符串标记推到堆栈上。如果输入是波兰语符号,那么从堆栈中弹出数字以获得结果会更容易,但我不确定在这里采取什么方法 这是一个面试问题。确定一些简单的psuedo代码,您可以使用它们来解决这个问题 function(stinrgToParse){ arrayoftokens = stringToParse
这是一个面试问题。确定一些简单的psuedo代码,您可以使用它们来解决这个问题
function(stinrgToParse){
arrayoftokens = stringToParse.match(RegexMatching);
foreach(arrayoftokens as token)
{
//now step through the tokens and determine what they are
//and store the neccesary information.
}
//Use the above information to do the arithmetic.
//count the number of times a variable appears positive and negative
//do the arithmetic.
//add up the numbers both positive and negative.
//return the result.
}
好的,一些简单的psuedo代码,可以用来解决这个问题
function(stinrgToParse){
arrayoftokens = stringToParse.match(RegexMatching);
foreach(arrayoftokens as token)
{
//now step through the tokens and determine what they are
//and store the neccesary information.
}
//Use the above information to do the arithmetic.
//count the number of times a variable appears positive and negative
//do the arithmetic.
//add up the numbers both positive and negative.
//return the result.
}
第一件事是解析字符串,识别各种标记(数字、变量和运算符),这样就可以通过赋予运算符适当的优先级来形成表达式树 正则表达式可以提供帮助,但这不是唯一的方法(boost::spirit之类的语法分析器也很好,您甚至可以运行自己的语法分析器:这都是一种“查找和追索”) 然后可以对树进行操作,减少执行这些处理常量的操作的节点,并将变量相关的操作分组,相应地执行这些操作 这将以递归方式进行,直到保留变量相关节点和常量节点 在这一点上,解的计算非常简单
它们基本上与产生解释器或编译器的原理相同。第一件事是解析字符串,识别各种标记(数字、变量和运算符),以便通过赋予运算符适当的优先级来形成表达式树 正则表达式可以提供帮助,但这不是唯一的方法(boost::spirit之类的语法分析器也很好,您甚至可以运行自己的语法分析器:这都是一种“查找和追索”) 然后可以对树进行操作,减少执行这些处理常量的操作的节点,并将变量相关的操作分组,相应地执行这些操作 这将以递归方式进行,直到保留变量相关节点和常量节点 在这一点上,解的计算非常简单
它们基本上是导致产生解释器或编译器的相同原理。一旦你计算出方程
a*x+b=0
中的系数a
和b
,那么解线性方程(我希望)对你来说非常容易
因此,问题的难点在于解析表达式并“计算”它以找到系数。您的示例表达式非常简单,它只使用一元运算符-
、二进制运算符-
、二进制运算符+
。和=
,您可以专门处理
这个问题不清楚解决方案是否也应该处理包含二进制*
和/
的表达式,或者括号。我想知道面试问题是否是为了:
- 让你写一些简单的代码,或者
- 在你写任何东西之前,让你问问题的真正范围是什么
- 将那些有大量编写解析器经验的人(他们将以最快的速度编写/键入解析器)与那些没有解析器经验的人(他们可能在几分钟内很难解决问题,至少在没有提示的情况下)
x
中使用线性表达式的值,并将=
解释为具有最低优先级的运算符,即“减法”。结果是x
中的线性表达式等于0
如果您不需要复杂的表达式,那么您可以在标记该简单示例之后,直接从左到右对其求值[*]:
x
x + 9
// set the "we've found minus sign" bit to negate the first thing that follows
x + 7 // and clear the negative bit
x + 3
2 * x + 3
// set the "we've found the equals sign" bit to negate everything that follows
3 * x + 3
3 * x - 2
3 * x - 1
3 * x - 4
4 * x - 4
最后,将a*x+b=0
解为x=-b/a
[*]Python中的标记化代码示例:
acc = None
for idx, ch in enumerate(input):
if ch in '1234567890':
if acc is None: acc = 0
acc = 10 * acc + int(ch)
continue
if acc != None:
yield acc
acc = None
if ch in '+-=x':
yield ch
elif ch == ' ':
pass
else:
raise ValueError('illegal character "%s" at %d' % (ch, idx))
另一个示例标记化代码,也是Python代码,假设标记之间总是有空格,如示例中所示。这将令牌验证留给解析器:
return input.split()
一旦你计算出方程
a*x+b=0
中的系数a
和b
,求解线性方程(我希望)对你来说非常容易
因此,问题的难点在于解析表达式并“计算”它以找到系数。您的示例表达式非常简单,它只使用一元运算符-
、二进制运算符-
、二进制运算符+
。和=
,您可以专门处理
这个问题不清楚解决方案是否也应该处理包含二进制*
和/
的表达式,或者括号。我想知道面试问题是否是为了:
- 让你写一些简单的代码,或者
- 在你写任何东西之前,让你问问题的真正范围是什么
- 将那些有大量编写解析器经验的人(他们将以最快的速度编写/键入解析器)与那些没有解析器经验的人(他们可能在几分钟内很难解决问题,至少在没有提示的情况下)
le, ri = equation.split('=')
a1, b1 = ab(le)
a2, b2 = ab(ri)
x = (b2 - b1) / (a1 - a2)