数据的范围非常大或者其中含有负数,但数据本身的个数并不是很多(远小于数据范围)。
在这种情况下,如果每个数据元素的具体值并不重要,重要的是他们之间的大小关系的话,我们可以先对这些数据进行离散化,使数据中的最大值尽可能小且保证所有数据都是正数。
常用离散化方式有两种
//1.用数组离散
for(int i=1;i<=n;i++){
cin>>a[i].val;
a[i].id = i;
}
sort(a+1,a+1+n);
for(int i=1;i<=n;i++)
b[a[i].id] = i; //将a[i]数组映射成更小的值,b[i]就是a[i]对应的rank值
//2.用STL+二分离散化
for(int i=1;i<=n;i++){
cin>>a[i];
b[i] = a[i];
}
sort(b+1,b+1+n);
int len = unique(b+1,b+1+n)-b-1; //len就是去重之后的数组长度,unique用法可以去网上看看,用法简单
for(int i=1;i<=n;i++)
a[i] = lower_bound(b+1,b+1+len,a[i])-b; //a[i]就是直接离散化出来的数组