【发布时间】:2015-07-13 04:02:55
【问题描述】:
我有一个大小为 n+1 的数组,我希望在其中存储购买 n 项目的最低成本(i^th 索引存储 i^th 项目的成本)。
有m不同的卖家:每个卖家提供物品L到物品R(其中L,R>=1 和L,RC 每个。
为了创建成本最低的数组,我做了以下操作:
for (int i=1; i<=m; i++) {
int L = L of i^th seller
int R = R of i^th seller
int C = selling price of i^th seller
for (int j=L; j<=R; j++) {
if (leastCost[j]==0 || leastCost[j]>C) {
leastCost[j]=C
}
}
构造这个数组是O(n*m),访问这个数组是O(1)。
对于非常大的n 和m 值,是否有更好的方法来构造成本最低的数组?
也许是一种不同的方法,不将其存储在数组和其他东西中,从而降低整体时间复杂度?
【问题讨论】:
-
我不知道你从哪里得到
O(n^2)。我得到 O(n * m)。这是完全不同的。当您考虑实际需要访问(读取)多少元素时,这应该是最佳的。除非有任何额外的信息你必须开始...... -
我更正了。这真的是最优的吗?即使对于非常大的 n 和 m?没有什么可以补充的了。
-
@Aron 太高了?是的,Aron 是对的。您的卖家表有
m卖家和n价格(平均)。所以这是n*m。您需要至少遍历每个元素一次,因此(n*m)是最佳选择(除非您有量子计算机)。 -
可以使用Segment tree,所以创建树的时间复杂度是O(m log n),每次查询都是O(log n)
-
@Gsquare 最好的优化是使用我在我的解决方案中展示的贪婪方法。
标签: arrays algorithm data-structures