原地算法

在計算機科學中 ， 一個原地算法 （ in - place algorithm ， 也稱 “ 就地算法 ” ） 是基本上不需要藉助額外的數據結構就能對輸入的數據進行變換的算法 。 不過 ， 分配少量空間給部分輔助變量是被允許的 。 算法執行過程中 ， 輸入的數據往往會被輸出結果覆蓋 。 原地算法只能通過替換或交換元素的方式來修改原始的輸入 。 不滿足 “ 原地 ” 原則的算法也被稱爲非原地 （ not - in - place ） 算法或異地 （ out - of - place ） 算法 。 原地有多種不同的含義 。 在其最嚴格的形式下 ， 原地算法只允許佔用固定大小的額外空間 ， 其中包含了函數調用和指針佔用的空間 。 然而 ， 這種形式有很大的侷限性 ， 因爲他要求指向長度爲 的數組只能使用 個比特位 。 而更通用的形式認爲 ， 原地意味着算法在更改輸入內容時不需要額外的空間 ， 但是可以在進行這些操作時使用少量的非固定大小的空間 。 通常 ， 這部分空間複雜度爲 ， 不過某些情況下任何滿足 的複雜度也是允許的 。 注意空間複雜度在是否將索引長度納入此額外空間方面也是有多種選擇的 。 常見的考量是將索引的數量或需要的指針數量算到空間複雜度當中的 。 在這篇文章中 ， 我們所指的整體空間複雜度 （ DSPACE ） 將指針長度考慮在內了 。 因此 ， 分析對應的存儲空間佔用會比忽略索引 、 指針長度的方法多一個 因子 。 一個算法既可能會 ， 也可能不會將輸出算入其整體的空間佔用中 。 這是由於原地算法通常會直接使用輸出來覆蓋輸入 ， 因此不需要額外的空間 。 當把輸入寫入到僅允許寫入的內存或流當中時 ， 只考慮算法執行過程中的空間開銷可能更恰當一些 。 在諸如對數空間歸約等理論應用上 ， 更典型的做法往往是將輸出佔用忽略 （ 在這些情況下 ， 更重要的是輸出爲僅允許寫入 ） 。