给定一个地点,用矩阵表示,每个条目表示该区域内的汽车数量。我们的任务是在矩阵的一个条目上放置一个汽油泵,以便我们选择的块可以提供最小的旅行成本。
我找到了一个需要O(n^4)
时间的解决方案,我们计算每个条目的整个过程。
你能告诉我这个问题的其他好方法吗?
给定一个地点,用矩阵表示,每个条目表示该区域内的汽车数量。我们的任务是在矩阵的一个条目上放置一个汽油泵,以便我们选择的块可以提供最小的旅行成本。
我找到了一个需要O(n^4)
时间的解决方案,我们计算每个条目的整个过程。
你能告诉我这个问题的其他好方法吗?
如果我正确理解了您的问题,那么您的成本函数就像 Haile 在他/她的评论中描述的那样,那么有一个简单的解决方案,因为您可以简化为一维问题。
请注意,在曼哈顿度量中,汽车必须经过的列距离只是与行距离相加,因此我们可以分别最小化它们。
因此,我们将问题简化为一维。为了弄清楚发生了什么,我不得不将其转换为一个连续的问题。因此,假设我有一个密度函数 p(x),(假设它在紧凑的支持下是连续的,这样数学就可以工作了)。然后成本函数由下式给出
将其分成两半以消除 mod 符号并进行区分(这是您需要假设 p(x) 表现良好的地方),您得到
现在,x0 的最佳位置将是使该导数为零的位置。但请注意,这是分布的中位数。
对于原始问题的离散设置,相同的论点有效。基本上你可以取一个离散导数,即 E(k+1)-E(k)。如果您为位置 n 的汽车数量写 a[n],则成本函数拆分为
假设我没有犯愚蠢的错误,离散导数结果为
因此解决方案将再次处于中位数(如果您最终为半整数,则四舍五入)。要了解为什么这是正确的,请注意如果 k 是一个很大的负数,那么这个导数肯定是负数(因此将 k 增加 1 会降低成本)。现在,随着 k 的增加,导数慢慢增加。在某个时候,它会第一次变得积极。一旦 k+1 大于中位数,就会发生这种情况。之后,它将保持正数,因此要选择的正确 k 是小于或等于中位数的最大 k。
最初的问题是二维的,所以你需要运行两次,每个轴一次。
我将用一个实际的例子来扩展鲁珀特的答案(即如何计算他所说的中间行和列)。
正如他所说,您可以分别找到泵的最佳行和最佳列。如何?
让我们考虑以下问题的实例:
3 2 7
1 8 9
7 2 2
我们开始添加矩阵的所有行
3 2 7 -> 12
1 8 9 -> 18
7 2 2 -> 11
现在如果我们把泵放在第一排,总的垂直成本是
11*2 + 18*1 + 12*0 = 30
由于第 3 排的 11 辆汽车必须行驶 2 个垂直单位,第 2 排的 18 辆汽车必须行驶 1 个垂直单位,而第 1 排的汽车不必垂直行驶。我们必须计算所有行的总垂直旅行成本。
pump in 1st row -> cost 30 = 11*2 + 18*1 + 12*0
pump in 2nd row -> cost 23 = 11*1 + 18*0 + 12*1
pump in 3rd row -> cost 42 = 11*0 + 18*1 + 12*2
所以泵的最佳行是第 2 行。
我们在 O(n^2) 中计算了这个,因为我们在对n行中的所有n辆汽车求和时进行了O(n^2) 求和,而在计算总数时我们进行了 O(n^2) 求和和乘法泵的每个可能行的垂直成本。
我们对每列中的汽车求和:
3 2 7
1 8 9
7 2 2
_______
11 12 18
现在:
pump in 1st col -> cost 48 = 11*0 + 12*1 + 18*2
pump in 2nd col -> cost 29 = 11*1 + 12*0 + 18*1
pump in 3rd col -> cost 34 = 11*2 + 12*1 + 18*0
所以泵的最佳柱是 2nd。
在 O(n^2) 步骤中,我们发现我们必须将泵放在 [2][2]中。