【发布时间】:2015-12-14 20:28:54
【问题描述】:
假设我有一个整数列表:
2, 1, 3, 1, 4, 2, 5, 3, 2
我希望能够在i 位置插入一个新整数。所以假设i 是 4,我想插入数字 7。结果将是:
2, 1, 3, 7, 1, 4, 2, 5, 3, 2
插入后,我想根据i 及以下位置的数字接收一些信息。例如,第一个 i 数字的总和。在这种情况下,它将是2 + 1 + 3 + 7 = 13。
我希望能够一遍又一遍地重复这个过程。
我用 C++ 编写了一个使用 std::list 的程序。以下是将n 的位置i 插入List 然后返回i 第一个数字的总和:
- 比较最后一个插入位置
k和i。如果它更低,则为每个j: k < j < i计算sum[j],如下所示:sum[j] = sum[j-1] + List[j]- O(n) - 找到位置
i- O(n) - 在
i位置插入n,存储k = i- O(1) - 计算并返回
sum[i] = sum[i-1] + n- O(1)
这是否可以更有效地完成,也许使用不同的数据结构?在 O(logn) 中可能吗?如果是那怎么办?
【问题讨论】:
-
乍一看,这听起来像是 Binary Indexed Tree 的工作
-
n元素的总和将花费 O(n),但使用std::vector<int>会更快。对于std::vector<int>,找到该位置是O(1)。你可以用它换取 O(n)。在您的短名单上使用std::vector<int>会快很多。在大型数据集上,这将取决于您需要转移多少,但向量在其操作中就在后面。 -
只是想提一下,位置 4 实际上是 1 所在的位置,因为数组中的位置从 0 开始计数
标签: c++ algorithm performance data-structures