我对学习如何用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是新手
首先,您需要了解什么是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