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