Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 一元线性方程的求解_C++_Python_Algorithm_Linear Algebra - Fatal编程技术网

C++ 一元线性方程的求解

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

求解一个变量中的线性方程的最有效算法是什么?例如,对于输入字符串:

“x+9-2-4+x=–x+5-1+3-x”

输出应该是1

我正在考虑使用一个堆栈,当我遇到字符串中的空格时,将每个字符串标记推到堆栈上。如果输入是波兰语符号,那么从堆栈中弹出数字以获得结果会更容易,但我不确定在这里采取什么方法


这是一个面试问题。

确定一些简单的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
,那么解线性方程(我希望)对你来说非常容易

因此,问题的难点在于解析表达式并“计算”它以找到系数。您的示例表达式非常简单,它只使用一元运算符
-
、二进制运算符
-
、二进制运算符
+
。和
=
,您可以专门处理

这个问题不清楚解决方案是否也应该处理包含二进制
*
/
的表达式,或者括号。我想知道面试问题是否是为了:

  • 让你写一些简单的代码,或者
  • 在你写任何东西之前,让你问问题的真正范围是什么
两者都是重要的技能:-)

这个问题甚至可能是为了:

  • 将那些有大量编写解析器经验的人(他们将以最快的速度编写/键入解析器)与那些没有解析器经验的人(他们可能在几分钟内很难解决问题,至少在没有提示的情况下)
无论如何,考虑到未来更复杂的需求,解析算术表达式有两种常用方法:递归下降法或Dijkstra的调车场算法。您可以查找这些,如果您只需要1.0版中的简单表达式,那么您可以使用简化形式的Dijkstra算法。然后,解析表达式后,需要对其求值:在
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
,求解线性方程(我希望)对你来说非常容易

因此,问题的难点在于解析表达式并“计算”它以找到系数。您的示例表达式非常简单,它只使用一元运算符
-
、二进制运算符
-
、二进制运算符
+
。和
=
,您可以专门处理

这个问题不清楚解决方案是否也应该处理包含二进制
*
/
的表达式,或者括号。我想知道面试问题是否是为了:

  • 让你写一些简单的代码,或者
  • 在你写任何东西之前,让你问问题的真正范围是什么
两者都是重要的技能:-)

这个问题甚至可能是为了:

  • 将那些有大量编写解析器经验的人(他们将以最快的速度编写/键入解析器)与那些没有解析器经验的人(他们可能在几分钟内很难解决问题,至少在没有提示的情况下)
无论如何,考虑到未来更复杂的需求,有两种常见的方法t
le, ri = equation.split('=')    
a1, b1 = ab(le)
a2, b2 = ab(ri)    
x = (b2 - b1) / (a1 - a2)