原地算法(in-place algorithm)


原地算法(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)遞歸


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM