【发布时间】:2014-09-28 01:16:47
【问题描述】:
我正在自学书"Introduction to Algorithms" by Cormen et alli. 在他们的书中,他们使用伪代码,假设数组是通过指针(通过引用)传递的。这与 R 不同(对象通过值传递),所以我在尝试尽可能接近地翻译它们的伪代码时遇到了一些困难,尤其是在涉及递归时。大多数时候,我必须以不同的方式实现。
例如,使用合并排序算法,他们定义了合并函数(我认为我已经正确翻译了)和递归合并排序函数(直接翻译到 R 不起作用)。
伪代码中的合并函数如下: A 是一个数组,p、q 和 r 是数组的索引,使得 p
Merge(A, p, q, r)
n1 = q - p + 1
n2 = r - q
let L[1...n1+1] and R[1...n2+1] be new arrays
for i = 1 to n1
L[i] = A[p+i-1]
for j = 1 to n2
R[j] = A[q+j]
L[n1+1] = infinite
R[n2+1] = infinite
i=1
j=1
for k = p to r
if L[i] <= R[j]
A[j] = L[i]
i = i + 1
else
A[k] = R[j]
j = j + 1
我已将其翻译为 R:
Merge <- function(a, p, q, r){
n1 <- q - p + 1
n2 <- r - q
L <- numeric(n1+1)
R <- numeric(n2+1)
for(i in 1:n1){
L[i] <- a[p+i-1]
}
for(j in 1:n2){
R[j] <- a[q+j]
}
L[n1+1] <- Inf
R[n2+1] <- Inf
i=1
j=1
for(k in p:r){
if(L[i] <= R[j]){
a[k] <- L[i]
i <- i +1
}else{
a[k] <- R[j]
j <- j+1
}
}
a
}
而且它似乎工作正常。
Merge(c(1,3,5, 2,4,6), 1, 3, 6)
[1] 1 2 3 4 5 6
现在MergeSort函数的伪代码定义如下:
MergeSort(A, p, r)
if p < r
q = (p+r)/2
MergeSort(A, p, q)
MergeSort(A, q+1, r)
Merge(A, p, q, r)
这假设 A 是通过引用传递的,并且每个更改对每个递归调用都是可见的,这在 R 中是不正确的。
那么,给定上面定义的Merge 函数,你将如何在R 中实现MergeSort 函数以获得正确的结果? (如果可能,并且更可取,但不是必需的,有点类似于伪代码)
【问题讨论】:
-
试试 envir = .GlobalEnv
-
envir = .GlobalEnv 将使您的变量在每个递归调用中可见。但是,我不确定如何使用它来解决您的问题。查看此内容并搜索其他示例:stackoverflow.com/questions/22412620/…
标签: r algorithm sorting recursion mergesort