离散化

1、概念:

离散化:把无限空间中的有限个体映射到有限空间中去,以此提高算法的时空效率(就是对数据进行压缩)。

eg:原数据:1,999,100000,15;处理后:1,3,4,2;

 

2、方法一:STL处理

用辅助数组记录要离散的数据,排序是要为了后面的二分

因此,我们要保证相同元素离散后的位置相同,再用二分把元素离散化的数字放回原数组。

#include<iostream>
#include<algorithm>
using namespace std;
const int maxn = 12000;
int a[maxn],b[maxn],size,n; 
//a是离散化后的数组,b是排序数组,size是离散化后数组的大小 
int main(void)
{
    int i;
    cin>>n;
    for(i=1;i<=n;i++)
    {
        cin>>b[i];
        a[i]=b[i];
    }
    sort(a+1,a+n+1);
    size=unique(a+1,a+n+1)-a-1;
    for(i=1;i<=size;i++)
    {
        b[i]=lower_bound(a+1,a+size+1,b[i])-a;
    }
    for(i=1;i<=n;i++)
    cout<<b[i]<<" ";
    return 0;
}
View Code

 

3、方法二:结构体

建立一个结构体包含数据和起始位置,用结构体记录数据和起始位置

然后对结构体进行排序,记录原来位置的节点排序后应在的位置。

#include<iostream>
#include<algorithm>
using namespace std;
const int maxn = 1200;
struct Node{
    int data,val;
}cur[maxn];
bool cmp(Node a,Node b)
{
    return a.data<b.data;
}
int a[maxn];
int main(void)
{
    int n,i;
    cin>>n;
    for(i=1;i<=n;i++) cin>>cur[i].data,cur[i].val=i;
    sort(cur+1,cur+n+1,cmp);
    for(i=1;i<=n;i++) a[cur[i].val]=i;
    for(i=1;i<=n;i++) cout<<a[i]<<" ";
    return 0;
}
View Code

 

posted @ 2018-12-11 19:12  麟阁  阅读(149)  评论(0编辑  收藏  举报