首页 > 文章列表 > 在一个范围内评估给定方程的查询

在一个范围内评估给定方程的查询

评估 范围评估方程查询 关键词:范围 方程查询
446 2023-08-30

对区间 [L, R] 内的所有方程进行评估,为我们提供了这些变量的一系列值。如何使用它的示例包括建模、数据分析和解决问题的场景。

在这种情况下,我们为范围内的所有点定义方程变量值。因此,可以通过指定范围的步长并评估范围内每个变量值的方程来完成。

规格

这可以称为向数据库询问信息的请求。当满足某些要求时,使用特定命令提取数据。为了从数据库中获取、过滤、排序和汇总数据,查询经常用编程语言编写。查询可以很简单,具体取决于必须提取的数据和信息的复杂性。

接受方程范围 [L, R] 和步长作为输入并为范围内变量的每个值生成方程结果的计算机程序可用于自动执行此过程。

问题处理方法

在一定范围内查找给定方程的值是评估范围 [L, R] 内任何给定方程的查询的目标。这是用于类似查询的潜在方法 -

  • 解析提供的方程并从中创建表达式树。二叉树可用于可视化表达式树,每个节点代表方程中的运算符或操作数。

  • 对表达式树进行预排序并迭代每个子树,评估每个子树的方程。表达式树的每个节点都应包含结果。

  • 创建范围查询函数,接受表达式树的根、下界 L 和上限 R 作为输入。该函数的目标是迭代表达式树并返回所提供的 [L, R] 范围的方程解。

  • 可以额外预先计算并保存指定范围[L,R]的每个子范围的方程解,以改进范围查询功能。

  • 最后,我们可以使用范围查询函数计算不同范围的方程。

语法

在 C++ 中,可以使用循环来迭代每个范围中的值,然后将提供的方程应用于每个值以确定其在 [L, R] 范围内的评估。对于 [L, R] 范围内的每个 x 值,创建以下循环来评估方程 -

y = x2 + 2x + 1
// Define equation to evaluate
   int equation(int x) {
   return x*x + 2*x + 1;
}

// Evaluate equation for every value of x in range [L, R]
int L, R; // Define the range
for (int x = L; x <= R; x++) {
   int y = equation(x);

   // Do something with value of y like print it
   cout << "x = " << x << ", y = " << y << endl;
}

算法

这是评估区间 [L, R] 中的方程的 C++ 算法 -

  • 步骤 1 - 举例说明如何将方程定义为接收变量 x 并返回值 y 的函数 -

  • double equation(double x) {
       return x*x + 2*x + 1;
    }
    
  • 步骤 2 - 编写函数,接受两个整数 L 和 R 作为参数,并输出 L 和 R 之间每个整数值的方程解。可以使用循环遍历范围 [L, R],评估每个整数值的方程 -

  • vector<double> evaluate_equation(int L, int R) {
       vector<double> results;
       for (int x = L; x <= R; x++) {
          double y = equation(x);
          results.push_back(y);
       }
       return results;
    }
    
  • 步骤 3 - 在评估范围 [L, R] 上的方程后,可以使用此函数获得结果,该结果以双精度值向量形式传递 -

    < /里>
    vector<double> results = evaluate_equation(1, 10);
    

注意 - 通过简单地用所需的方程替换方程函数,就可以改变计算任何方程的过程。

遵循的方法

方法-1

在 C++ 中,可以使用循环循环遍历范围内的每个值并评估其中的方程,以便评估范围 [L, R] 中的方程。

示例中评估的范围是 [1, 10],评估的方程是 i*i + 2*i + 1。for 循环重复评估范围内每个值的方程,并将答案打印到控制台。方程和范围可以根据需要进行更改。

示例 1

#include <iostream>
using namespace std;
int main() {
   int L = 1, R = 10; // range of values to evaluate
   for (int i = L; i <= R; i++) {
      int result = i*i + 2*i + 1; // equation to evaluate
      cout << "Result at " << i << " = " << result << endl;
   }
   return 0;
}

输出

Result at 1 = 4
Result at 2 = 9
Result at 3 = 16
Result at 4 = 25
Result at 5 = 36
Result at 6 = 49
Result at 7 = 64
Result at 8 = 81
Result at 9 = 100
Result at 10 = 121

方法2

这里是 C++ 查询的说明,可用于分析给定方程的 L 和 R 之间的值范围 -

在此图中,需要计算的方程首先被定义为称为方程的函数。然后,我们创建一个评估函数,它接受两个参数 L 和 R,它们代表我们要评估方程的值范围。

我们在评估函数内迭代评估 L 和 R(含)之间的每个值的方程。然后,使用 cout,我们输出每个值的结果。

我们在主函数中指定要计算方程的范围(在本例中,L = 1 且 R = 10),并使用这些值调用评估函数。程序员的输出将是 1 到 10 之间每个数字的问题的解决方案。

示例 2

#include <bits/stdc++.h>
using namespace std;

// Define the equation you want to evaluate
int equation(int x) {
   return x * x + 2 * x + 1;
}

// Define a function to evaluate the equation for a given range [L, R]
void evaluate(int L, int R) {
   for (int i = L; i <= R; i++) {
      int result = equation(i);
      cout << "The result of equation for " << i << " is " << result << endl;
   }
}
int main() {
   int L = 1, R = 10;
   evaluate(L, R);
   return 0;
}

输出

The result of equation for 1 is 4
The result of equation for 2 is 9
The result of equation for 3 is 16
The result of equation for 4 is 25
The result of equation for 5 is 36
The result of equation for 6 is 49
The result of equation for 7 is 64
The result of equation for 8 is 81
The result of equation for 9 is 100
The result of equation for 10 is 121

结论

总之,我们可以应用前缀和或累积和方法来评估区间 [L,R] 内的给定方程。通过预先计算直到每个索引的方程值的前缀和,可以在恒定时间内回答每个查询。该策略的时间复杂度(其中 N 是输入数组的大小)对于预计算来说是 O(N),对于每个查询来说是 O(1)。

总的来说,输入数组的大小和要运行的查询的数量决定了应使用哪种方法。如果查询的数量远大于数组的大小,则前缀和技术会更有效。但是,如果查询数量较少,二分搜索策略可能是更好的选择。