所以我正在研究一个算法问题,而且对于正确答案看起来应该是什么感到困惑。我有一个答案,但如果有人能给我反馈/指导,我会非常感激。
问题:
Casc Merge is a recursive algorithm: Assume there
are n sorted lists, each of size m. Recursively
Casc Merge the first n − 1 lists and then
Merge the last list (of size m) into the sorted list A (which is of size (n-1)m).
1)Write down code for it
这是我到目前为止所想到的。看起来好像我正走在正确的轨道上,但就像我说我不知道的那样。我试过谷歌搜索并没有得到太多的帮助
proc Cas(A, L, c)
if c == n then
Merge(A, L[c-1], L[c])
end if
else
Merge(A, Casc(A, L, c), Casc=(A, L, c+1))
end else
end proc
再次,提前感谢您对psuedocode的任何建议/反馈。
假设合并进行m + n - 1次比较
S(n) = { 1 if c = 1
S(n-1) + m - 1 otherwise
}
答案 0 :(得分:0)
我觉得你很亲密。但是,当您将c==n
和L[c-1]
合并到L[c]
时,看起来您可能会在A
基础情况附近进行合并的“双重预订”,但是在之前的通话中,您已经在执行L[c-1]
与L[c]
的合并。
如果您在定义方面考虑递归算法,可以使用稍微简化的逻辑来编写它:
procedure Cascade(List A, List[] L, int c)
// base case (1-based indexing)
if (c == 1) then
Merge(A, L[c], {}) // merge the empty list with L[c] into A
else
// use the recursive definition
Merge(A, L[c], Cascade(A, L, c-1)) // merge L[c] with L[c-1]
end if
end procedure
您可以调用以下程序:Cascade({}, L, n)
你可以像这样工作:
n = 3
L = {{1 2 3} {3 2 1} {4 5 6}}
A = {}
First call to Merge yields:
Merge(A, {4 5 6}, Cascade({}, {{1 2 3} {3 2 1} {4 5 6}}, 2))
Then:
n = 2
Merge(A, {3 2 1}, Cascade({}, {{1 2 3} {3 2 1} {4 5 6}}, 1))
Then:
n = 1 (base case)
Merge(A, {1 2 3}, {})
Trickling back up the chain (actual merge results not shown for clarity):
A = {1 2 3}
A = {1 2 3 3 2 1}
A = {1 2 3 3 2 1 4 5 6} // merged list (the actual implementation would have sorted these...)
你已经完成了!希望这可以帮助你...
编辑:基于评论中充实的讨论,以下是使用返回来传递数据而不是就地修改的示例。
procedure Cascade(List[] L, int c)
// base case (1-based indexing)
if (c == 1) then
A = Merge(L[c], {}) // merge the empty list with L[c] into A
else
// use the recursive definition
A = Merge(L[c], Cascade(L, c-1)) // merge L[c] with L[c-1]
end if
Return A // return the newly merged list
end procedure