离散化的认识
离散化,一种常见的数据处理技巧,可以有效的降低时间复杂度,可以做到将一些低效的算法进行改进,甚至拟造出一些不可能的算法,使其速度大为提高。
离散化的基本思想就是将一些巨大的范围内,挑选出要用的值,再进行处理。
离散化的处理
注:对数据进行离散化处理的前提是这些数据只于他们的相对大小有关,而不与其具体数值有关,例如排序等。
进行离散化的处理其实很简单:为所有巨大的数据从小到大进行编号。
例如有6个数:
66666 66 666 666666 6 6666
他们排序后得:6<66<666<6666<66666<666666
所以这六个数分别表示为:5 2 3 6 1 4(即这几个数在排序后所得结果得位置)
利用STL对数据进行离散化处理
思路:利用sort排序,后删除重复元素,引出其代表的值(即标序号)。
设序列a[n]为待进行处理的序列,b[n]为其副本。
sort(sub_a,sub_a+n);
int size=unique(sub_a,sub_a+n)-sub_a;//size为离散化后元素个数
for(i=0;i<n;i++)
a[i]=lower_bound(sub_a,sub_a+size,a[i])-sub_a + 1;//k为b[i]经离散化后对应的值
对于第3步,若离散化后序列为0,1,2,...,size - 1则用lower_bound,从1,2,3,...,size则用upper_bound。其中lower_bound返回第1个不小于b[i]的值的指针,而upper_bound返回第1个大于b[i]的值的指针,当然在这个题中也可以用lower_bound然后再加1得到与upper_bound相同结果,两者都是针对以排好序列。使用STL离散化大大减少了代码量且结构相当清晰。
以上为“数据中的离散化”的内容,如有不足望大家指出,例题日后会专门水一篇文章的!