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

posted @ 2020-04-02 16:50  RioTian  阅读(1739)  评论(0编辑  收藏  举报