1. 笔记
对于一组给定的数据,当我们只关心它们的大小关系,而不关心它们具体数值是多少时(尤其是这些数据都很大的时候),可以考虑将它们离散化。例如,将数组a[]={5e15,1e15,3e15,3e15}离散化为a[]={3,1,2,2}。这样可以一定程度上节省时间、空间开销,同时还得到了数据的序关系。
离散化分三个步骤:排序、去重、编号。
2. 代码*
void discretization(T a[],int n)
将数组a[]
的1-n位离散化,离散化后的a[i]为自然数
/*
备注:
已测试
2018/09/13
*/
template<typename T>
void discretization(T a[],int n)
{
T *b=new T[n+5];for(int i=1;i<=n;++i)b[i]=a[i];
sort(b+1,b+n+1);
int sz=unique(b+1,b+n+1)-b-1;
for(int i=1;i<=n;++i)a[i]=lower_bound(b+1,b+sz+1,a[i])-b;
delete[] b;
}