原地算法(in-place algorithm)
在計算機科學中,一個原地算法(in-place algorithm)基本上不需要額外輔助的數據結構,然而,允許少量額外的輔助變量來轉換數據的算法。當算法運行時,輸入的數據通常會被要輸出的部分覆蓋掉。不是原地算法有時候稱為非原地(not-in-place)或不得其所(out-of-place)。
假設我們有n個元素的數組,此時需要我們將數組逆轉。其實正常來說我們第一反應肯定會我在創建一個空數組來進行存儲,然后在新數組中的最小下標指向原數組的最大下標。這樣我們的新數組就會產生垃圾
vector<int> ReseverArray(vector<int>&v){
int n = v.size();
int len = n -1;
vector<int>newV(n);
for(int i=0;i<n;++i){
newV[i] = v[len--];
}
return newV;
}
我們不由然想到如何通過數組本身實現逆轉(即不利於額外空間實現)
vector<int> ReseverArray(vector<int>&v){
int n = v.size();
for(int i = 0;i<n/2;++i){
swap(v[i],v[n-i-1]);
}
return v;
}
這種在只在現有的數組里面進行操作,不在額外的開辟空間,就是一種原地算法了。
快速排序通常被描述為一個原地算法,但是事實上並不是。大部分的實現需要O(log n)的空間來支持它的分治法(divide-and-conquer)遞歸。