离散化
离散化
使用场景&思路
当需要把一个数据范围很大,但是元素个数较少的集合映射到数组下标上时,因为计算机内存的限制,数组下标不可能完全包含这极大的数据范围,所以我们需要将其(排序后)重新顺序标号。
至于离散后数据的具体值,很多时候我们不需要关心,我们只需要知道他们之间相对的大小(这时可以排序后再离散化);如果非要知道数据的具体值,可以再开个数组,下标对应离散后的编号,里面存具体值。
实现
#include <iostream>
#include <algorithm>
#define MAXN 40000
using namespace std;
int n,a[MAXN],t[MAXN];
int main(){
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i],t[i]=a[i];
sort(t+1, t+1+n);
int len=unique(t+1, t+1+n)-(t+1);
for(int i=1;i<=n;i++)
a[i]=lower_bound(t+1, t+1+len, a[i])-t;//从1开始编号
for(int i=1;i<=n;i++)
cout<<a[i]<<" ";
return 0;
}
说明
-
unique()
去重函数 包含在头文件 algorithm
将数组所有中重复的元素移至末尾,最终返回的是不含重复元素数组的尾地址
所以把返回的尾地址和首地址
t+1
相减就是不含重复元素数组的长度len
-
lower_bound()
查找函数 包含在头文件 algorithm
返回第一个大于等于x的元素地址