离散化
通俗的说,离散化是在不改变数据相对大小的条件下,对数据进行相应的缩小。例如:
原数据: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