用于范围 LCM 查询的 JavaScript 程序

用于范围 lcm 查询的 javascript 程序

LCM 代表最小公倍数,一组数字的 LCM 是可被给定集合中存在的所有数字整除的所有数字中的最小数字。我们将看到完整的代码以及给定问题的解释。在本文中,我们将为一系列 LCM 查询实现 JavaScript 程序。

问题简介

在这个问题中,我们得到一个包含整数的数组和另一个包含表示给定数组范围的成对数字的数组查询,我们必须计算该给定范围内所有元素的 LCM。例如 –

如果给定数组为:[1, 2, 3, 4, 5, 6] 并且查询数组为:[ [1,3], [2,5]] 则第一个查询元素为 [2 , 3, 4]和12是LCM。

对于第二个查询元素为 [3, 4, 5, 6] LCM 为 60。

立即学习“Java免费学习笔记(深入)”;

LCM和GCD之间的数学关系

为了找到 GCD,我们有一个欧几里得公式,借助该公式,我们可以找到对数复杂度的两个数字的 GCD,并且 LCM 和 GCD 之间存在这样的关系 –

LCM and GCD of a given set A {a1, a2, a3 …. , an} is:LCM(A) * GCD(A) = (a1 * a2 * a3* … * an)ORLCM(A) = (a1 * a2 * a3 … * an) / GCD(A)

登录后复制

因此,我们将找到所有数字的 GCD 和乘积,然后从那里,我们可以在 O(1) 运算中找到该数字的 LCM。

天真的方法

最简单的方法是遍历查询数组,并为每个查询找到给定范围内的元素与 GCD 的乘积。从这两个值中找到 LCM 并返回它。让我们在代码中实现它 –

示例

// function to find the gcd of the given number function gcd(a,b){   if (a == 0) {      return b;   }   else {      return gcd(b%a,a);   }}// function to find the lcm function lcmRange(arr, l, r){   // taking gcd as zero because gcd of 0 with any number is that same number    var cur_gcd = 0   var product = 1   var cur_lcm = arr[l]   for(var i = l+1 ;i 

时间和空间复杂度

上述代码的时间复杂度为O(Q*N*log(D)),其中Q是查询次数,N是数组中元素的数量,D是数组中存在的最大数量数组。

上述代码的空间复杂度为 O(1),因为我们没有使用任何额外的空间。

在上面的程序中,如果查询数量等于 N,那么其时间复杂度将大于 N2,这使得该方法使用效率低下。让我们看看这是另一种方法 &miinus;

线段树方法

线段树是一种高级数据结构,用于将问题划分为多个线段,然后以 2 的幂的形式将它们连接起来。这需要一些空间用于范围查询,并在对数时间内产生结果。让我们看看它的代码 -

示例

// defining maximum sizevar MAX = 1000// makking tree var tree = new Array(4*MAX);// declaring new array var arr = new Array(MAX);// function for lcmfunction lcm(a, b){   return a*b/gcd(a,b);}// function for gcdfunction gcd(a, b){   if (a == 0){      return b   }   else{      return gcd(b%a,a);   }}// Function to creata a segment tree function build(first, last, cur_node){   // base condition    if (first == last){      tree[cur_node] = arr[first];      return;   }   var mid = (first + last)/2   mid = Math.floor(mid);      // creating left and right segments   build(first, mid, 2*cur_node);   build(mid+1, last, 2*cur_node + 1);      // build the parent for current    var lcm_l = tree[2*cur_node];   var lcm_r = tree[2*cur_node+1];   tree[cur_node] = lcm(lcm_l, lcm_r);}// Function to make queries for array range function query(first, last, l, r, cur_node){   // section out of current range      // 1 is safe to return    if (last  r){      return 1;   }      // complete inside the current segment   if (l = last)   return tree[cur_node];      // partially inside the current segment    var mid = (first+last)/2;   mid = Math.floor(mid)   var lcm_l = query(first, mid, l, r, 2*cur_node);   var lcm_r = query(mid+1, last, l, r, 2*cur_node+1);   return lcm(lcm_l, lcm_r);}// defining the array arr[0] = 1;arr[1] = 2;arr[2] = 3;arr[3] = 4;arr[4] = 5;arr[5] = 6;// build the segment treebuild(0, 5, 1);// defining query array var queries = [[1,3], [2,5]]// traversing over the array for(var i = 0; i

结论

在本教程中,我们实现了一篇 JavaScript 文章来查找范围 lcm 查询。我们已经看到了两种方法,一种是时间复杂度为 O(Q*N*log(D)) 的朴素方法,另一种是时间复杂度为 O(Q*log(N)) 的线段树实现。 p>

登录后复制

以上就是用于范围 LCM 查询的 JavaScript 程序的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2692143.html

(0)
上一篇 2025年3月7日 17:37:43
下一篇 2025年3月7日 17:37:48

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • 如何动态读取div的所有span?

    创建网页时,一个 HTML 元素可以包含多个嵌套的 HTML 元素。在某些情况下,开发人员可能需要读取一个 HTML 元素的特定 HTML 元素。在我们的例子中,我们需要读取 div 元素的所有 span 元素并提取它们的内容。 在本教程中…

    2025年3月7日
    000
  • 顶级免费 JavaScript Canvas 库

    canvas 元素是在 html5 中引入的,作为使用 javascript 绘制图形的地方。你可以用它来做很多事情。这包括编辑图像、绘制简单或复杂的形状以及动画。 在本文中,我们将介绍一些 JavaScript 中最好的免费画布库。这些可…

    2025年3月7日
    200
  • 如何在 JavaScript 中调用一个返回另一个函数的函数?

    我们将通过引用函数名称并在其后添加括号来调用函数。如果我们调用的函数返回另一个函数(在我们的例子中确实如此),我们需要分配它到一个变量或立即调用它。未来,我们需要确保我们了解返回函数的行为以及如何在我们的代码中使用它。这就是所谓的函数柯里化…

    2025年3月7日
    200
  • 如何使用 FabricJS 向 IText 添加 linethrough?

    在本教程中,我们将学习如何使用 FabricJS 将 linethrough 添加到 IText 对象。 IText 类是在 FabricJS 版本 1.4 中引入的,它扩展了 Fabric.Text 并用于创建 IText 实例。 ITe…

    2025年3月7日
    200
  • JavaScript 程序求方阵中的最大值和最小值

    要找到最大或最小元素,我们必须关注要进行的比较次数以及选择哪种方法进行比较最有效:使用 if-else 语句比较元素的方法还是使用 if-else 语句比较元素的方法作为内置的。我们将看到完整的代码实现和解释。在本文中,我们将实现一个 Ja…

    2025年3月7日
    200
  • JavaScript 程序检查是否可以通过旋转数组来增加或减少数组

    数组的旋转是指将数组假设为圆形数组,每次旋转时将数组的元素向左或向右旋转一个索引,一端的元素可以采用另一端的值。递增数组意味着每个元素将大于或等于其前一个元素,递减数组意味着每个元素将小于或等于前一个元素。 在这个问题中,我们给定一个数组,…

    2025年3月7日
    200
  • 利用HTML5 Page Visibility API实现页面可见性控制

    早些时候,我们的浏览器不具有选项卡式浏览功能,但今天,当您查看所有可用的浏览器时,我们可以看到所有浏览器都提供该功能。作为一名程序员,我通常一次打开 10-15 个选项卡,有时这个数字会超过 25-30 个。 为什么使用此 API? 之前,…

    2025年3月7日
    200
  • 重新构建一个数组

    数组是一个有序的值列表,通常是为了循环遍历数字索引值而创建的,从索引零开始。您需要知道的是,数组是按数字顺序排列的集合,而不是具有与非数字顺序的值关联的属性名称的对象。本质上,数组使用数字作为查找键,而对象则具有用户定义的属性名称。 Jav…

    2025年3月7日
    200
  • 实践演示:从头开始构建您自己的框架

    在本系列的第一部分中,我们讨论了允许您使用构面管理不同行为的组件,以及 Milo 如何管理消息传递。 在本文中,我们将讨论开发浏览器应用程序时的另一个常见问题:模型与视图的连接。我们将揭开 Milo 中双向数据绑定的一些“魔力”,最后,我们…

    2025年3月7日
    200
  • JavaScript中的事件类型:常见的键盘和鼠标事件

    JavaScript 提供了广泛的事件,使您可以与网页上的用户操作进行交互并做出响应。在这些事件中,键盘和鼠标事件是最常用的。在本文中,我们将了解 JavaScript 中不同类型的键盘和鼠标事件,并查看如何使用它们的示例。 键盘事件 当用…

    2025年3月7日
    200

发表回复

登录后才能评论