离散化

离散化

通俗的说,离散化是在不改变数据相对大小的条件下,对数据进行相应的缩小。例如:
原数据:1,999,100000,15;处理后:1,3,4,2;

离散化有两种方法:

方法一:

const int N=1e5+7;
int t[N],a[N];
int main()
{
    int n,m;
    cin>>n;
    for(int i=1;i<=n;i++){
       cin>>a[i];
       t[i]=a[i];
    }
    sort(t+1,t+n+1);
    //不重复元素个数
    m=unique(t+1,t+n+1)-t-1;
    for(int i=1;i<=n;i++)
      a[i]=lower_bound(t+1,t+m+1,a[i])-t;
    //离散化后的数组
    for(int i=1;i<=n;i++){
        cout<<a[i]<<" ";
    }  
}

举例:

5
123 55 32 55 66
4 2 1 2 3

函数原型:

unique函数:

     iterator unique(iterator it_1,iterator it_2);

      即”删除”序列中所有相邻的重复元素(只保留一个)。此处的删除,并不是真的删除,而是指重复元素的位置被不重复的元素给占领了

 

lower_bound()算法返回一个非递减序列[first, last)中的第一个大于等于值val的位置。
upper_bound()算法返回一个非递减序列[first, last)中第一个大于val的位置。

方法二:

第二种方式其实就是排序之后,枚举着放回原数组
用一个结构体存下原数和位置,按照原数排序
我结构体里面写了个重载,也可以写一个比较函数
最后离散化后数在 rank[]里面

struct Node {
    int data , id;
    bool operator < (const Node &a) const {
        return data < a.data;
    }
};
Node num[100];
int arank[100], n;
int main(){
    cin>>n;
    for(int i=1; i<=n; i++) {
        cin>>num[i].data;
        num[i].id = i;
    }
    sort(num+1 , num+n+1);
    for(int i=1; i<=n; i++)
        arank[num[i].id] = i;
    for(int i=1; i<=n; i++)
        cout<<arank[i]<<" ";
}

 举例:

5
123 55 32 55 66
5 2 1 3 4

 

因上求缘,果上努力~~~~ 作者:每天卷学习,转载请注明原文链接:https://www.cnblogs.com/BlairGrowing/p/14071056.html

原文地址:https://www.cnblogs.com/BlairGrowing/p/14071056.html