R 相当于 Python 的 heapq.heapify()?
R equivalent of Python's heapq.heapify()?
标题都说了。我正在寻找 Python 的 heapq.heapify()
的 R 等价物。我找不到它,但我希望它存在于某个地方。
heapq
是堆 queue 实现模块,其成员函数 heapify
接受 object 和 returns 堆 returns 的列表作为输入=24=] 包含对那些 object 作为堆成员的引用。
编辑:我不能使用 rPython 在 R 中调用 Python 代码,因为最终脚本将成为 Shiny 应用程序的一部分(它几乎不能与 rPython 一起使用,并且无论如何都不允许导入模块)。
我通过移植发现的 Matlab 代码创建了这个 heapify
R 函数 here(这比从 Python 移植更容易,因为与 R 一样,Matlab 使用 1 索引基线)。
只需将一个未排序的向量传递给函数,并指定您要实现min-heapify
还是max-heapify
。我与Python的heapq.heapify()
(默认为min-heapify
)进行了比较,结果是一样的。
heapify = function(input_vector, min){
# below is the maxheapify algorithm
# minheapify = maxheapify with sign change at the beginning and at the end
if (min==TRUE){input_vector = - input_vector}
count = length(input_vector)
start = floor(count/2)
while (start >= 1){
root = start
theEnd = count
while ((root * 2) <= theEnd){
child = root * 2
if ((child + 1 <= theEnd) & (input_vector[child] < input_vector[child+1])){
child = child + 1
}
if (input_vector[root] < input_vector[child]){
temp = input_vector[root]
input_vector[root] = input_vector[child]
input_vector[child] = temp
root = child
} else {
break
}
}
start = start - 1
}
if (min==TRUE){input_vector = - input_vector}
output = list(heap=input_vector)
}
示例:
在 R 中:
heapify(c(30,1,1,0,3,3,3,2,14,25,3,10,4,3),min=TRUE)$heap
[1] 0 1 1 2 3 3 3 30 14 25 3 10 4 3
在Python中:
test = [30,1,1,0,3,3,3,2,14,25,3,10,4,3]
heapq.heapify(test)
test
Out: [0, 1, 1, 2, 3, 3, 3, 30, 14, 25, 3, 10, 4, 3]
标题都说了。我正在寻找 Python 的 heapq.heapify()
的 R 等价物。我找不到它,但我希望它存在于某个地方。
heapq
是堆 queue 实现模块,其成员函数 heapify
接受 object 和 returns 堆 returns 的列表作为输入=24=] 包含对那些 object 作为堆成员的引用。
编辑:我不能使用 rPython 在 R 中调用 Python 代码,因为最终脚本将成为 Shiny 应用程序的一部分(它几乎不能与 rPython 一起使用,并且无论如何都不允许导入模块)。
我通过移植发现的 Matlab 代码创建了这个 heapify
R 函数 here(这比从 Python 移植更容易,因为与 R 一样,Matlab 使用 1 索引基线)。
只需将一个未排序的向量传递给函数,并指定您要实现min-heapify
还是max-heapify
。我与Python的heapq.heapify()
(默认为min-heapify
)进行了比较,结果是一样的。
heapify = function(input_vector, min){
# below is the maxheapify algorithm
# minheapify = maxheapify with sign change at the beginning and at the end
if (min==TRUE){input_vector = - input_vector}
count = length(input_vector)
start = floor(count/2)
while (start >= 1){
root = start
theEnd = count
while ((root * 2) <= theEnd){
child = root * 2
if ((child + 1 <= theEnd) & (input_vector[child] < input_vector[child+1])){
child = child + 1
}
if (input_vector[root] < input_vector[child]){
temp = input_vector[root]
input_vector[root] = input_vector[child]
input_vector[child] = temp
root = child
} else {
break
}
}
start = start - 1
}
if (min==TRUE){input_vector = - input_vector}
output = list(heap=input_vector)
}
示例:
在 R 中:
heapify(c(30,1,1,0,3,3,3,2,14,25,3,10,4,3),min=TRUE)$heap
[1] 0 1 1 2 3 3 3 30 14 25 3 10 4 3
在Python中:
test = [30,1,1,0,3,3,3,2,14,25,3,10,4,3]
heapq.heapify(test)
test
Out: [0, 1, 1, 2, 3, 3, 3, 30, 14, 25, 3, 10, 4, 3]