离散化就是把无限空间中有限的个体映射到有限的空间中去,以此提高算法的时间和空间的效率。
通俗来说,离散化就是在不改变数据相对大小的条件下,对数据进行相应的缩小。
例如:
原数据:1, 999, 100000, 15;处理后:1, 3, 4, 2
原数据:[100, 200], [20, 50000], [1, 400];处理后:[3, 4], [2, 6], [1, 5]
离散化本质上可以看成是特殊的哈希,其保证在哈希以后仍然保持原来的全/偏序关系,用于解决:影响最终结果的只有元素之间的相对大小关系这一类问题。
离散化的步骤:
1、先将所有需要离散化的数据放到一个数组中,因为有重复元素,因此需要去重;
2、计算出数组中每个值a[i]离散化后的值是多少:二分。
离散化数组的方法:
//数组下标范围是【1,n】
//len为离散化后数组的有效长度
sort(a+1,a+n+1);
//离散化整个数组的同时,求出离散化后本质不同数的个数。
//unique();将数组a删除相邻的重复值,并返回a数组的尾部地址。
len=unique(a+1,a+n+1)-a-1;
//二分查找出某个数组元素的值在离散化之后的位置
lower_bound(a+1,a+len+1,x)-a; //查询x离散化后对应的编号
离散化vector的方法:
vector<int> a; //待离散化的值
sort(a.begin(),a.end());
a.erase(unique(a.begin(),a.end()),a.end()); //去除重复元素
//二分求x对应的离散化的值,查找a中第一个>=x的位置(左边界)
lower_bound(a.begin(),a.end(),x)-a.begin(); //查询x离散化后对应的编号