数组的离散化

来源:互联网 发布:东方时尚网络授课 编辑:程序博客网 时间:2024/05/16 16:08

我们在处理数组问题时,如需要求逆序数,然而数据给的又特别大,此时我们就可以用数组的离散处理来解决了。

当数的范围比较大时需要进行离散化,即先排个序,再重新编号。a[] = {10000000, 10, 2000, 20, 300},那么离散化后a[] = {5,

1, 4, 2, 3}

附上代码:


#include<cstdio>#include <iostream>#include<cstring>#include<algorithm>using namespace std;const int MAXN=500000+1000;int c[MAXN];struct node{    int v;    int index;    bool operator <(const node& b)const    {        return v<b.v;    }}nodes[MAXN];int b[MAXN];//将初始数组重新赋值后 相对大小不变的新数组int main(){        int n;        cin>>n;        for(int i=1;i<=n;i++)        {            scanf("%d",&nodes[i].v);            nodes[i].index=i;        }        sort(nodes+1,nodes+n+1);        memset(b,0,sizeof(b));        b[nodes[1].index]=1;        for(int i=2;i<=n;i++)        {            if(nodes[i].v==nodes[i-1].v)                b[ nodes[i].index ]=b[ nodes[i-1].index ];            else                b[ nodes[i].index ]=i;        }                     for(int i=1;i<=n;i++)        cout<<b[i]<<endl;}

数据测试结果:




下面在介绍一种更简单的用STL来处理的离散化,这里要运用到lower_bound()函数,

代码:

#include <iostream>#include <algorithm>using namespace std;const int maxn=15;int main(){int n,i;int a[maxn],b[maxn],c[maxn];cin>>n;for(i=1;i<=n;i++){cin>>a[i];b[i]=a[i];    }    sort(b+1,b+1+n);    for(i=1;i<=n;i++)    {    c[i]=lower_bound(b+1,b+n+1,a[i])-b;}for(i=1;i<=n;i++)cout<<c[i]<<endl;    system("pause");return 0;}


原创粉丝点击