Python 3程序用于范围LCM查询

Python 3程序用于范围LCM查询

在数据结构中,对查询进行范围是一种常见的数据库当前兴趣操作,用于恢复所有输出值位于上下边界之间的记录。该过程使用一些输入数据,以便将它们以高效的方式结构化在特定输入的任何子集上。范围函数,表示为range(),用于在系列上迭代for循环。在进程开始时,我们需要将开始声明为0。如果我们不小心错过了这一步,进程将一直运行并迭代循环直到结束(-1)。

范围是可以存储在变量中的最小和最大值。它们通过运算符生成,并用于调用变量的数组。它们返回一个输出列表,该列表在x至y-1之间。

示例

假设我们有一个整数数组集,并且我们需要以LCM(a,r)的形式评估查询。因此,我们必须以高效的方式评估查询。

LCM(a,r)表示在索引a和r之间存在的数组的最小公倍数。这里的两个指标都是包含在内的。

根据数学上我们都知道;L.C.M. = L.C.M Of Numerator / H.C.F of Denominator。

因此,通过使用这个逻辑,我们可以按照下面写的范围LCM查询规则进行操作:

LCM(a, r) = LCM(arr[a],  arr[a+1] , ......... ,arr[r-1], arr[r])

应用该逻辑:

输入 –

arr[0] = 5;
arr[1] = 7;
arr[2] = 5;
arr[3] = 2;
arr[4] = 10;
arr[5] = 12;
arr[6] = 11;
arr[7] = 17;
arr[8] = 14;
arr[9] = 1;
arr[10] = 44;
build(1, 0, 10);
cout << query(1, 0, 10, 2, 5) << endl;
cout << query(1, 0, 10, 5, 10) << endl;
cout << query(1, 0, 10, 0, 10) << endl;

输出 –

60
15708
78540

该特定过程的时间复杂度表示为O(Log N * Log n)。这里N是数组中存在的元素总数。我们需要将Log n声明为特定编码环境中LCM操作的时间要求查找器,而O(N)的时间则需要构建树以从编写的程序中获得输出。它还指示了该过程的空间要求。

范围LCM查询的算法

  • 步骤1 – 开始

  • 步骤2 – 为两个数字初始化变量

  • 步骤3 – 找到每个数字的存储值

  • 步骤4 – 用’max’函数分离变量

  • 步骤5 – 如果最大值被第一个数字和第二个数字整除

  • 步骤6 – 打印最大值作为LCM

  • 步骤7 – 否则,如果不可被整除,则将其增加1

  • 步骤8 – 然后再次执行第五步,直到打印出一个数字

  • 步骤9 – 重复该过程,直到找到满足条件的最大值

  • 步骤10 – 终止

范围LCM查询的语法

int find_therangelcm(int a, int tl, int ts, int r) {
    if (r > t[a])
        return -1;
    if (tl == ts)
        return tl;
    int tm = (tl + ts) / 2;
    if (t[a*2] >= r)
        return find_therangelcm(a*2, tl, tm, r);
    else 
       return find_therangelcm(a*2+1, tm+1, ts, r - t[a*2]);
}

在这个语法中,我们解释了如何在特定的编码环境中对LCM查询进行范围划分。

遵循的方法:

  • 方法1 – 使用线段树的朴素方法。
  • 方法2 – 以一般方式找到两个数的LCM。

使用线段树的原生方法

对于这个问题,没有更新操作,但仅仅使用朴素方法是不够的。我们需要实现一个线段树来获得可能的结果。这里我们将使用以下逻辑 –

LCM(a, b) = (a*b) / GCD(a,b)

下面是实现步骤 –

  • 为数组建立线段树。
  • 遍历线段树的特定范围。
  • 计算该范围内的LCM。
  • 打印该范围的答案。

示例1

MAX = 1000
tree = [0] * (4 * MAX)
arr = [0] * MAX
def gcd(a: int, b: int):
    if a == 0:
        return b
    return gcd(b % a, a)
def lcm(a: int, b: int):
    return (a * b) // gcd(a, b)
def build(node: int, start: int, end: int):
    if start == end:
        tree[node] = arr[start]
        return

    mid = (start + end) // 2
    build(2 * node, start, mid)
    build(2 * node + 1, mid + 1, end)
    left_lcm = tree[2 * node]
    right_lcm = tree[2 * node + 1]

    tree[node] = lcm(left_lcm, right_lcm)
def query(node: int, start: int,
        end: int, l: int, r: int):
    if end < l or start > r:
        return 1
    if l <= start and r >= end:
        return tree[node]
    mid = (start + end) // 2
    left_lcm = query(2 * node, start, mid, l, r)
    right_lcm = query(2 * node + 1,
                    mid + 1, end, l, r)
    return lcm(left_lcm, right_lcm)
if __name__ == "__main__":

    # initialize the array
    arr[0] = 16
    arr[1] = 7
    arr[2] = 10
    arr[3] = 2
    arr[4] = 22
    arr[5] = 31
    arr[6] = 11
    arr[7] = 17
    arr[8] = 14
    arr[9] = 1
    arr[10] = 44
    build(1, 0, 10)
    print(query(1, 0, 10, 7, 5))
    print(query(1, 0, 10, 5, 10))
    print(query(1, 0, 10, 0, 10))

输出

1
162316
3246320

一般情况下求两个数的最小公倍数

在这个程序中,我们有两个整数n1和n2。较大的那个数被存储在max中。

示例2

def compute_lcm(x, y):
   if x > y:
       greater = x
   else:
       greater = y

   while(True):
       if((greater % x == 0) and (greater % y == 0)):
           lcm = greater
           break
       greater += 1

   return lcm

num1 = 16
num2 = 7

print("The L.C.M. is of the given number", compute_lcm(num1, num2))

输出

The L.C.M. is of the given number 112

结论

在本文中,我们发现了如何使用特定的编码环境编写程序,以找出给定LCM查询的范围。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程