定义:
离散化,把无限空间中有限的个体映射到有限的空间中去,以此提高算法的时空效率。
通俗的说,离散化是在不改变数据相对大小的条件下,对数据进行相应的缩小。例如:
原数据:1,999,100000,15;处理后:1,3,4,2;
原数据:{100,200},{20,50000},{1,400};
处理后:{3,4},{2,6},{1,5};
例如有时需要将数据直接作为数组下标,但因为数据太大而无法开数组时,若数据的总量相对较少时,就可以对其进行离散化处理
离散化处理需要用到的STL函数有3个:sort(),unique(),lower_bound()
1.sort() 不再作赘述
2.unique(first, last)用于元素去重
”删除” [first, last) 序列中所有相邻的重复元素(只保留一个)。此处的删除,并不是真的删除,而是指重复元素的位置被不重复的元素给占领了,即不断地把不重复的元素移到前面来
由于它”删除”的是相邻的重复元素,所以在使用unique函数之前,一般都会将目标序列进行排序。
同时unique()会返回 去重后序列中的最后一个元素的下一个元素(相当于去重后序列的ar.end() ),那么就可以算出 去重后序列的长度,即 返回值 - 序列首地址
3.1 下界函数:lower_bound(first , last , v)
找到并返回 非降序列 [first,last) 中第一个大于等于v的元素的地址
3.2 上界函数:lower_bound(first , last , v)
找到并返回 非降序列 [first,last) 中第一个大于v的元素的地址
具体操作:
int n,A[maxn],B[maxn];
for(int i=1;i<=n;i++)
{
//下标从1开始
scanf("%d",&A[i]);
B[i]=A[i]; //将A都存到B中
}
sort(B+1,B+n+1); //先对B进行排序
int m=unique(B+1,B+n+1)-(B+1); //去重,同时返回值-首地址得到去重后序列的长度
//此时 B中的值 离散化的映射就是其 下标
//若要查找A中某个值的映射,可对B利用lower_bound()进行二分查找,如下
for(int i=1;i<=n;i++)
A[i]=lower_bound(B+1,B+m+1,A[i])-B; //得到A[i]在B中的下标,即为其映射