每个线性时间算法都是流算法吗?


14

关于反计数的这个问题上,我发现了一篇论文,证明了所有(精确)流算法的空间复杂度下限。我声称这个界限扩展到了所有线性时间算法。通常来说,线性时间算法可以随意跳动(随机访问),而流式算法则不能随意跳动;它必须按顺序调查元素。我可以执行多次,但只能连续多次(对于线性运行时)。

因此我的问题是:

是否可以将每个线性时间算法表示为不断通过的流算法?

随机访问似乎阻止了(简单的)构造证明是肯定的答案,但是我也未能提出反例。

根据机器型号,在运行时,随机访问甚至可能不是问题。我会对这些模型的答案感兴趣:

  • 图灵机,平面输入
  • RAM,作为​​数组输入
  • RAM,作为​​链接列表输入

正如您在答案中看到的那样,“流算法”通常意味着很小(polylog空间)。但考虑到您的动机,我认为的问题应该是:使用工作空间的单词的每个线性时间算法都可以转换为使用O s )个单词空间的流算法。因此反例将是一个问题,可以使用具有随机访问权的o n 空间来解决,而任何恒定通过流算法都需要Ω n 空间。没有答案给出了这样的例子sØsØñΩñ
Sasho Nikolov

@SashoNikolov:实际上,整个太空问题都是切线的。我的问题主要是关于运行时。如果答案是“是”,则本文证明的下限(关于空间复杂度)将适用于所有线性时间算法。下限是在空间上是偶然的,但问题本身并不是焦点。
拉斐尔

我不明白。使线性时间算法成为具有无限空间的“单程流”很简单。您的问题只有在“可以将线性时间随机访问算法做成恒定通过流,同时大约保留复杂性度量 ” 的形式时才有意义。因此,您应该选择一种复杂性衡量标准,这没有任何意义。μ
Sasho Nikolov

@SashoNikolov:我不知道“流算法”有这样的定义问题。考虑到它们显示了流式算法的线性空间下限,我假设空间不是定义的核心。但是我想您可以将其转换为“没有流算法...”。但是,该定义又如何呢:“流算法是一次给输入(列出)一个元素一次的算法。对于每个新元素,它都可以在执行计算。 ,则必须在额外的o n 次后输出答案。” ØñØñ
拉斐尔

@SashoNikolov:这将从概念中排除“复制输入并执行任何操作”算法,但将其限制为时间。这是否适合通常所说的课程?如果不是这样,我认为“流”无法在时间或空间复杂性方面定义有用。这是一种策略,很像贪婪或分而治之。Øñ2
拉斐尔

Answers:


15

为了使流算法有意义,它们必须使用比输入本身少得多的工作空间。例如,如果您允许与输入相同的工作空间,则可以将任何算法简单地表述为“单遍流式算法”,该算法首先将输入单次复制到工作空间中,然后仅使用工作空间。

我认为在讨论流算法时,通常将工作空间限制为输入大​​小最多为多对数。在此假设下,根据Munro和Paterson [MP80]的结果,中位数选择不具有O(1)-pass流算法:用于N个元素的中位数选择的任何P- pass流算法都必须存储Ω(N 1 / P)元素。另一方面,中位数选择具有众所周知的确定性线性时间算法[BFPRT73]。

[BFPRT73] Manuel Blum,Robert W. Floyd,Vaughan Pratt,Ronald L. Rivest和Robert E. Tarjan。选择的时间范围。 计算机与系统科学学报,1973年8月,7(4):448–461。DOI10.1016 / S0022-0000(73)80033-9

[MP80] J. Ian Munro和Mike S. Paterson。选择和排序的存储空间有限。 理论计算机科学,1980年11月12(3):315–323。DOI10.1016 / 0304-3975(80)90061-4


6

在流模型中,只允许在扫描输入时存储常数或多对数的额外数据。如果您考虑
遵循分而治之范式的线性时间算法,则需要存储更多信息和/或应该遍历数据的次数与递归深度相同。

一个示例是DC3算法,用于构造文本T后缀数组(在RAM模型中为数组)。为了构造一个后缀数组,您可以将字符分组为三元组,以便获得带有新超级字符的文本。您可以偏移的做到这一点0 1 2,这导致了三个新的文本牛逼1牛逼2牛逼3。有趣的是,可以计算后缀数组,如果你有后缀数组Ť 1Ť 2以线性时间。因此算法需要Ť01个2Ť1个Ť2Ť3Ť1个Ť2

t(n)=t(2/3n)+O(n)

时间。此递归可清楚地求解为。我不知道如何将其转换为流算法。t(n)=O(n)

另一个众所周知的例子是经典的线性时间选择算法。


这是另一个可能的例子。构建一个堆需要O(n),并在内部使用基于分治法的heapify()子例程。
马西莫卡法罗

但这不是证明,对吗?您只是在说天真的模拟是行不通的。但是有时会有令人惊讶的算法
Sasho Nikolov

@SashoNikolov:我的意思是说我不认为DC3算法是流算法,因为它需要大量的工作内存。也许您可以将算法修改为流算法,但是结果将不是DC3。我还没有讨论过是否存在用于后缀数组构造的流算法。这将是一个完全不同的问题。O(n)
A.Schulz

“我看不到如何将其转换为流式算法”,使我相信您在说的是“该算法未经修改就无法流式传输”之外的其他内容
Sasho Nikolov 2012年

4

P

  • R(P)P
  • S(P)P

R(P)S(P)

n[1,n1]O(logn)O(1)ω(logn)

O(1/log2n)ps=Ω(n)psO(log2n)


1

即使在“流算法”的最简单定义中(一种在源中进行每次增量迭代后,都可以立即获知结果的下一个增量部分的算法),我也可以想到一些线性算法,它们不会这样行事。哈希算法是一个很大的算法;FNV-1a与源中的字节数呈线性关系,但是直到完整源被处理后,我们才知道最终哈希的任何部分。

RadixSort aka BucketSort是O(N)(技术上是O(NlogM),其中M是N个项目中的最大值,被认为是很小的),并且必须完整运行以确保任何单个项目都位于其最终位置。

简单来说,要成为“流式”算法,算法必须具有以下两个属性,这两个属性都不明确地具有时间限制:

  • 比O(N)的空间复杂度好(等效地表示,不必知道整个源,也不必存储整个结果)
  • O(N)I / O关系(算法产生与其输入成线性比例的输出)

因此,流式传输算法的主要类别是执行“投影”(将一个输入增量转换为X> 0输出)的算法。


O(logn)ω(1)

logN也很好;关键是该算法不需要一次了解整个输入或输出。
KeithS 2012年

Ω(n)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.