【发布时间】:2021-11-27 21:50:52
【问题描述】:
我正在努力解决一个分而治之的问题,因为我无法完全理解它。
假设我们有一些数组X[1:n]。我们如何找到最小前缀数组X[1:k],其中1 ≤ k ≤ n 和前缀被定义为X[1]×X[2]×...×X[n] 的实数数组?
到目前为止,我的方法是:
function min_prefix(array[1:n],n)
begin
if array.length == 1 then
return n, array[0], array[0]
endif
integer best_k, real b_total, total = min_prefix([1:n-1],n-1)
new_total = total*array[n]
if new_total < b_total then
return n, new_total, new_total
endif
return best_k, b_total, new_total
end
我不认为这是一个有效的分而治之的解决方案,因为我仍然需要遍历数组中的每个元素。
编辑:
我能想到的最好的例子:
考虑数组{-1,2,2,2},最小前缀为k=3,因为当所有元素相乘时,结果答案为-6。
但是,如果我们再考虑数组{-1,2,-2,2},那么最小前缀将是k=1,因为k[0]*k[1] = -2 乘以第三个元素只会使数字更大。
【问题讨论】:
-
一定要“分而治之”吗?对于未排序的数组,我认为不可能在少于线性的时间内得到答案。
-
@Aivean 是的,它必须分而治之:/
-
@don'ttalkjustcode 修复了混淆并添加了示例
-
好,虽然你的例子有一些错误,例如
k[0]是双重错误,我认为应该是X[1]。 -
而且“前缀产品”似乎是正确的术语。
标签: arrays algorithm divide-and-conquer