批量数组操作比顺序操作更快吗?

时间:2013-04-25 10:10:54

标签: arrays vector language-agnostic arraylist time-complexity

说我得到一个数组,以及一个名为replace的函数:

void replace(from, to, items[])

其职责是使用[from, to)中的元素替换items范围内的数组元素。
我假设预先知道数组的最大大小,所以我可以确保数组永远不会溢出。

我的问题是,如果给出一个替换列表(例如(from, to, items)形式的元素),我是否有可能获得更快时间的最终结果数组复杂性比顺序执行每个操作?

换句话说,预先知道操作顺序是否有任何优势,或者它是否比逐个给出每个操作(根据渐近时间复杂度)更好?

注意:似乎这个问题令人困惑;我做意图暗示替换给定范围的元素数量与该范围的大小相同!它可能会更少或更多,导致转移,问题的关键是要问是否事先知道它们可以避免额外的工作,如在最坏的情况下转移。

2 个答案:

答案 0 :(得分:1)

我认为这可能不是您所发现的,但使用Rope可以缩短时间复杂度。它提供了像concat这样的字符串操作,而没有“移动”实际数组。 (不需要是一串char。可以使用任意类型的元素作为字母表)

根据维基百科(...因为我还没有使用它),Rope是一个破碎的二进制树碎片串。一根绳子代表长串连接所有碎片串。 你的replace()函数可以用绳子上的Split()和Concat()来实现, 这两个操作只需要O(log(n))时间。在这里,我把n作为绳子所代表的长弦的长度。

要获得正常数组,可以使用Report()操作在O(n)时间内转换绳索。

所以答案是:有一种算法比顺序应用字符串操作更快。

  • 将给定数组转换为绳索
  • 将每个替换作业应用于绳索上。每个操作都在O(log(n))中运行,并且不复制实际的数组项。
  • 将处理过的绳索转换为真实数组(这会导致所有项目的副本)。
  • 归还。

答案 1 :(得分:0)

它总是线性的,低至memcpy的水平。加速它的唯一方法是空间的交易时间 - 覆盖数组下标运算符,以便fromto之间的元素指向items中的元素而不是原始数组,这是在任何情况下都不是一个好的解决方案。