我在Julia中实现合并排序作为练习,注意到在使用 抄袭! 和传统的价值分配方式 切片 评论位)。谁能解释一下这个区别源于什么?
我在MergeSort中的合并函数
function myMerge(left, right)
l = 1
r = 1
k = length(left) + length(right)
result = zeros(k)
for i in 1:k
if left[l] <= right[r]
result[i] = left[l]
l += 1
if l > length(left)
#result[i+1:end] = right[r:end] # <-------- this is slower and uses more memory
copy!(result, i+1, right, r) # <-------- this is faster
return result
end
else
result[i] = right[r]
r += 1
if r > length(right)
#result[i+1:end] = left[l:end]# <-------- this is slower and uses more memory
copy!(result, i+1, left, l) # <-------- this is faster
return result
end
end
end
return result
end
当然,。 right[r:end]
是分配,因为分片会创建一个副本。 你可以用视图代替。
result[i+1:end] .= @view right[r:end]
从微观优化的角度来说: copy!
(其实你的意思是 copyto!
BTW?)还可以更好一些,因为虽然创建视图是在恒定的时间空间中工作,但还是有一个小的开销,可能无法避免。