我正在寻找一个执行 Heapify 的函数,但似乎没有直接来自 C++ STL 的高效函数。
CLRS教材中定义的heapify函数会取入一个元素位置i,假设i的左右子树都是堆,并使以i为根的树成为堆,复杂度为log(n)。
给定 [first, last) 中的堆,我想删除第一个元素,用另一个元素替换它,并维护堆属性。为此,我们只需要调用一次heapify(first),向下遍历一次堆,复杂度为log(n)。
STL有pop_heap和push_heap函数,首先调用pop_heap和push_heap就可以达到目的,但是pop_heap维护了heap属性,push_heap也维护了heap属性,这就推断在堆中进行了两次遍历。尽管整体复杂度仍然是log(n),但效率并不高。删除第一个元素后,我们不需要维护堆属性。
除了编写自己的 heapify 函数之外,还有什么好主意吗?
对于GPU上的经典缩减算法,如果向量的大小是2的幂,它就能完美地工作.如果不是这样的话怎么办?在某些时候,我们将不得不找到奇数个元素的总和.处理这个问题的最佳方法是什么?
我来自C ++世界,是Scala的新手,这种行为看起来很不寻常。
class G1[A]( val a : A) {
//val c:A = new A //This gives compile error
def fcn1(b: A): Unit = {
//val aobj = new A // This gives compile error
println(a.getClass.getSimpleName)
println(b.getClass.getSimpleName)
}
}
def fcnWithTP[A](): Unit = {
//val a = new A // This gives compile error
//println(a.getClass.getSimpleName)
}
Run Code Online (Sandbox Code Playgroud)
我无法使用函数主体或类主体中的类中的类型参数来创建对象。我只能在function参数中使用它。
这是什么原因呢?这是因为类型删除吗?在运行时,该函数不知道实际的A类型是什么,因此它无法创建该类型的对象吗?
一般规则是什么?这是否意味着类型参数根本不能出现在函数主体或类定义中?如果它们确实可以出现,那么例子是什么?
pandas使用numpy datetime64类型中的时间序列索引。
有没有什么有效的方法来构造datetime64对象?
我在文档上看到的唯一方法是来自 astring或来自 pythondatetime对象。
如果我有大量时间戳(百万),以纪元时间(从 1970-01-01 开始的秒数)或纳秒纪元时间(从 1970-01-01 开始的 ns 数)表示,是否有将整数转换为的快速方法numpy datetime64?
在内部numpy.datetime64也用整数表示。
我不想将纪元时间转换为字符串或 python datetime 对象然后转换为numpy.datetime64,因为它对于大量数据来说效率太低。
Scala中纯函数的精确定义是什么?纯函数在 wiki https://en.wikipedia.org/wiki/Pure_function上有一个定义。我认为这个定义是针对纯函数式编程语言的。
然而,我认为在类方法和闭包的上下文中它会变得复杂。
class Ave(val a: Int, val b: Int) {
def ave = (a+b)/2
}
Run Code Online (Sandbox Code Playgroud)
ave 是纯函数吗?我认为是的,因为它没有副作用,并且仅取决于类的不可变状态。但这实际上违反了 wiki 上的纯函数定义,即纯函数通常不应访问非局部变量。
关于关闭的类似问题:
def fcn(a:Int, b: Int): Unit = {
def ave = (a+b) / 2
}
Run Code Online (Sandbox Code Playgroud)
对我来说,这两个 ave 都是纯函数,相当于“val”(统一访问原则)。
但如何严格论证呢?此外,如果 a 和 b 字段是可变的,则 ave 不再是纯函数式的。
class Ave2(var a: Int, var b: Int) {
def ave = (a+b)/2 // Not pure functional
}
Run Code Online (Sandbox Code Playgroud)
纯函数的另一个定义来自《Scala 中的函数编程》一书:
如果对于所有程序 p,p 中出现的所有 e 都可以被 e 的求值结果替换而不影响 p 的含义,则表达式 e 是引用透明的。如果表达式 f(x) 对于所有引用透明的 …
BST中元素的后继元素是由顺序遍历确定的排序顺序中元素的后继元素.在CLRS的算法教科书(麻省理工学院出版社的算法导论)中介绍了当每个节点都有指向其父节点的指针时找到后继者.
在这里找到后继者的想法是 - 如果节点的右子树x是非空的,则后继子是右子树中x的最小元素.否则,后继者是x其左子女也是其祖先的最低祖先x(假设节点是其自身的祖先).
我们可以在不使用指向父节点的指针的情况下找到后继者吗?
有时我们的树节点没有这个指针.我挣扎了几个小时,但无法写出正确的代码.
我在Python中有以下语句,其中ori是一个字符串
[ori[ori.rfind(' ') + 1:], ori[:ori.rfind(' ')]]
我们可以看到ori.rfind('')被调用两次,解释器是否足够聪明,只能评估一次函数?
我们可以做到以下几点:
s = ori.rfind(' ')
return [ori[s+1:], ori[:s]]
但这使用两条线.我打算在字符串列表的列表理解中使用此语句,并希望此函数是一行.
在这种情况下,解释器实际上更容易弄清楚,因为字符串是不可变的.我的猜测也许是翻译可以很聪明,以避免重新评估.一般来说,如果对象是不可变的,那么解释器是否足够聪明?