原地算法

✍ dations ◷ 2025-10-10 03:27:39 #算法

在计算机科学中,一个原地算法(in-place algorithm)基本上不需要额外辅助的数据结构,然而,允许少量额外的辅助变量来转换数据的算法。当算法运行时,输入的数据通常会被要输出的部分覆盖掉。不是原地算法有时候称为非原地(not-in-place)或不得其所(out-of-place)。

一个算法有时候会错误地被称为原地算法,只因为它用它的输出数据会覆盖掉它的输入数据。事实上这条件既不充分(在快速排序案例中所展示的)也非必要;输出数据的空间可能是固定的,或如果以输出为流数据而言,也甚至是可能无法被数清楚的。另一方面来看,有时候要决定一个算法是不是原地,而数它的输出空间可能是比较可行的,像是底下的第一个的reverse示例;如此使得它更难去严格地定义原地算法。在理论上的应用像是log-space reduction,更是典型的总是忽略输出的空间(在这些状况,更重要的是输出为)。


假设我们想要将拥有个项目的数组反过来。一个最简单作这件事的方式是这样:

 function reverse(a)     allocate b     for i from 0 to n         b = a     return b

不幸地,这样需要O()的空间来创建数组,且配置存储器通常是一件缓慢的运算。如果我们不再需要,我们可使用这个原地算法,用它自己反转的内容来覆盖掉:

 function reverse-in-place(a)     for i from 0 to floor(n/2)         swap(a, a)

在其他的例子,有数个排序算法会原地重新排放数组内容成为排序过的顺序,包含:

快速排序通常被描述为一个原地算法,但是事实上并不是。大部分的实现需要O(log )的空间来支持它的分治法(divide-and-conquer)递归。

大部分选择算法也是原地,虽然在找到最后结果的过程中,有某些相当地重新排列输入数组,但却是固定大小的结果。

在计算复杂性理论中,原地算法包含使用O(1)空间复杂度的所有算法,DSPACE(1)类型。这个类型是非常有限的,它与正则语言1相等。事实上,它甚至不包含上面所列的任何示例。

因为这个原因,我们也考虑在L的算法,这类型的问题需要O(log )额外的空间,来成为原地。虽然这个似乎与我们先前的定义矛盾,但是我们必须认为在抽象的世界,输入的数据可以是任意巨大的。在一部真实的电脑,指针(pointer)仅需要一个小的固定数量空间,因为物理内存的数量是固定的,但是一般上一个大小为的数列需要O(log )比特来作为它的索引(index)。

结果是否意指快速排序是原地的?其实一点也不—技术上来说,它需要O(log2 )空间,因为它的O(log )堆栈帧架(stack frames)每一个都含有一个固定数量的指针(每一个大小为O(log ))。

辨别拥有L的原地算法拥有某些有趣的含意;举例来说,它意指存在一个(相当地复杂)原地算法,决定在一个无向图(undirected graph)中的任两个节点(nodes)之间是否存在一条路径(path),这是一个需要O()个额外的空间,使用典型的算法像是深度优先搜索(depth-first search)(每个节点有个走访的比特)的问题。有些问题像是决定一个图形是否为二分图(bipartite graph)或测试两个图形使否有相同数量的连通分支,接着针对这些问题产出原地算法。参考SL有更多的信息。

在很多情况,借由使用随机化算法(randomized algorithms),一个算法的空间需求可以被极度地裁减掉。举个示例,我们希望知道一个有个顶点(vertices)的图形中的两个顶点是否位于图中同一个连接组件(connected component)。没有已知简单、决定性的(deterministic)、原地算法来决定这件事,但是如果我们简单地由一个顶点开始,且运行大约203步的随机走路(random walk),那我们会偶遇到其他顶点来提供它不是在同一个组件(component)中的机会是非常地高。类似地,对于质数测试(primality test)有简单的随机化原地算法像是米勒-拉宾检验,也有简单原地随机化整数分解算法像是Pollard's rho算法。参考RL和BPL有对这个现象更多的讨论。

函数程序设计(functional programming)语言经常不鼓励或不支持会覆盖数据的原地算法,因为这是副作用的一种类型;反之,他们只允许创建新的数据。然而,好的函数语言编译器(compiler)在当一个与已存在之非常相似的对象被创建时,都经常会识别出来,然后旧的就会被丢弃掉,而且会最把这最优化为一个简单的"引擎盖之下"转换。

基本上,有可能小心地建构原地算法而不会更动数据(除非数据已不会再被使用),但是在实际上这却很少见到。参考纯函数数据结构(purely functional data structure)。

Maciej Liśkiewicz and Rüdiger Reischuk. The Complexity World below Logarithmic Space. , pp.64-78. 1994.

Omer Reingold. Undirected ST-connectivity in Log-Space. Electronic Colloquium on Computational Complexity. No. 94.

1. Liśkiewicz and Reischuk, pg.3, Theorem 2.

2. Reingold.

相关

  • 何杰金氏病霍奇金氏淋巴瘤(英语:Hodgkin's lymphoma)又称霍奇金氏病、何杰金氏病,或何杰金氏淋巴瘤,为淋巴瘤的一型,是一种淋巴细胞的癌变,症状包含发烧、夜间盗汗(英语:Night sweats),以及体重减
  • 深圳市第二人民医院深圳市第二人民医院,(本地简称为“市二医院”)现在又称深圳大学第一附属医院。原名深圳市红十字会医院,前身为华强集团改制前的企业医院,年长的深圳居民有称其为华强医院。目前的
  • 2019冠状病毒病日本国内病例 (2020年3月中旬) 除特别注明外,本文所有时间均以东九区时间(UTC+9)为准。3月11日,公布再多3宗死亡个案,死亡个案增至15宗。其中2人在爱知县名古屋市,均为80余岁男性,一人有心脏病及糖尿病,因心肌梗
  • 让-亨利·法布尔让-亨利·卡西米尔·法布尔(法语:Jean-Henri Casimir Fabre,1823年12月22日-1915年10月11日),法国博物学家、昆虫学家、科普作家,以《昆虫学回忆录》(Souvenirs entomologiques,或译
  • 昭慈皇后昭慈皇后(?-1246年)名脱列哥那(蒙古语:.mw-parser-output .font-mong{font-family:"Menk Hawang Tig","Menk Qagan Tig","Menk Garqag Tig","Menk Har_a Tig","Menk Scnin Tig","
  • 乔治亚州立体育馆乔治亚州立体育馆是位于佐治亚州亚特兰大市的大学橄榄球体育场。截至2017赛季,该体育场是佐治亚州立大学黑豹足球队的主场,取代了从2010年开始到2016年一直作为主场的乔治亚巨
  • 威廉·埃夫里尔·哈里曼威廉·埃夫里尔·哈里曼(英语:William Averell Harriman,1891年11月15日-1986年7月26日),美国商人、外交家、政治家,美国民主党人,曾任美国驻苏联大使(1943年-1946年)、美国驻英国大使(1
  • 英尺磅英尺磅(英语:foot-pound),也称磅英尺(英语:pound-foot,符号为lbf⋅ft),是一个用来测量力矩的伪矢量英制单位,等于1磅力作用在1英尺的力臂上所产生的力矩,也就是1磅力在1英尺的半径上产
  • 大气层巨兽大气层巨兽(英语:Atmospheric beast),又称大气层动物(Atmospheric animal),是指假想中栖息于行星大气层中的生物。在美国天文学家、科幻作家卡尔·萨根的《宇宙(英语:Cosmos (Carl Sa
  • 短叶罗汉松短叶罗汉松(学名: var. )为罗汉松科罗汉松属罗汉松的变种。分布在原产日本以及中国大陆的江西、云南、江苏、陕西、湖北、贵州、广东、广西、湖南、四川、福建、浙江等地,目前已