当前位置: 首页 > 知识库问答 >
问题:

Scala解释中的Kadane算法

冯风史
2023-03-14

我对学习如何用foldLeft函数在scala中实现Kadane(最大子数组和)算法感兴趣。我在堆栈溢出中运行了这个示例,但我不确定我是否理解该算法的确切功能。这就是算法的样子:

someArray.foldLeft(0 -> 0) {
      case ((maxUpToHere, maxSoFar), n) => val maxEndingHere = 0 max maxUpToHere + n
        maxEndingHere -> (maxEndingHere max maxSoFar)
    }._2

{}中包含的内容是否是需要应用于每个元素的lambda函数?还有,这行maxEndingHere->(maxEndingHere max maxSoFar)到底做什么?为什么括号里的括号用空格隔开?我很感激任何帮助,如果我的问题让人觉得太无知,我很抱歉,但我对Scala是新手

共有1个答案

廉元龙
2023-03-14

首先,您需要了解什么是foldleft。这个函数的含义是通过传递组合操作和初始元素,将集合折叠为单个值:

// Think of applying op(op(op(…), z) from left to right:
def foldLeft[B](z: B)(op: (B, A) ⇒ B): B

现在,让我们看看foldleft中发生了什么。首先,传递0->0。这意味着初始元素的类型b是一个元组(Int,Int),其值为(0,0)

其次,开头的方括号定义了一个函数。在scala中,可以用花括号传递它。因此,该函数需要(B,A)参数。在本例中,B类型是一个元组(Int,Int),而A类型是数组元素的类型,即Int

someArray.foldLeft(0 -> 0) {
  (tuple: (Int, Int), element: Int) => //the body
}
val maxEndingHere = 0 max maxUpToHere + n
maxEndingHere -> (maxEndingHere max maxSoFar)
 类似资料:
  • 我的看法是: 改变符号并在其中找到最大和,与我们计算最大和子数组的方法相同。改变数组中元素的符号使其处于初始状态。 如果algo有任何问题,请帮助我更正。 拐角情况:我知道如果所有元素都是正的就会有问题,我们可以通过做一些预处理来处理这种情况,即如果所有元素都是+Ve,就遍历数组,而不仅仅是从数组返回最小值。 上面提到的算法将工作,并得到DasBlinkenlight的良好支持(解释)。

  • 我必须使用基于最小堆的优先级队列来实现Prim的算法。如果我的图包含顶点A、B、C和D以及下面的邻接列表...[它被排序为(顶点名称,相邻顶点的权重)] 粗图: 优先级队列是什么样子的?我不知道该往里面放什么。我应该把所有东西都放进去吗?我应该只写A、B、C和D。我不知道,我真的很想得到答案。

  • 我检查了用Kadane算法求最大和的连续子数组的解,我不知道为什么我们在代码中需要全局最大值(下面的代码中是global_max)。 下面是用来查找具有最大和的连续子数组的python代码

  • 这是一个链接: https://www.hackerrank.com/challenges/sherlock-and-anagrams/problem?h_l=interview 这是我不同意的部分: 在位置[[[0],[1]],[[0],[2]],[[0],[3]],[[1],[2]],[[1],[3]]有6个形式[k, k]的字谜 和[[2],[3]]。 在位置[[0,1],[1,2]],[[

  • 我在学习Scala playframework教程时遇到了一段令我迷惑不解的代码: 于是我决定调查一下,偶然发现了这个帖子。

  • 主要内容:算术运算符,实例,关系运算符,实例,逻辑运算符,实例,位运算符,实例,赋值运算符,实例一个运算符是一个符号,用于告诉编译器来执行指定的数学运算和逻辑运算。 Scala 含有丰富的内置运算符,包括以下几种类型: 算术运算符 关系运算符 逻辑运算符 位运算符 赋值运算符 接下来我们将为大家详细介绍以上各种运算符的应用。 算术运算符 下表列出了 Scala 支持的算术运算符。 假定变量 A 为 10,B 为 20: 运算符 描述 实例 + 加号 A + B 运算结果为 30 - 减号 A