离散化学习记录

离散化:就是把无穷大集合中的若干个元素映射为有限集合以便于统计的方法。
例如在很多情况下,问题的范围虽然定义在整数集合Z,但只涉及m个值,并且只与它们的相对顺序有关。
此时我们可以把整数集Z中的这m个数与1~m建立映射关系。如果有一个空间复杂度与范围与Z相关的,离散之后就只与m相关了
具体地说,我们把涉及int范围内的n个整数a[1]~a[n],去重后剩下m个整数,我们把每个整数a[i]用一个1~m之间的整数代替,并且保持大小顺序不变,即如果a[i]小于(或等于、大于)a[j],那么代替a[i]的整数也小于(或等于或大于)代替a[j]的整数
我们先对a数组进行排序去重得到一个有序的a数组,就叫a_new数组,在a_new数组的下标i与数值a_new[i]之间建立映射关系,若要查询整数i(1 <= i <= m)代替的数值,只需直接返回a_new[i],若要查询整数a[i]被哪个1~m之间的整数代替,只需在a_new数组中进行二分查找a[i]的位置即可

基本代码如下:

void query(int x) {//查询x映射为1~m中的哪一个整数 
    return lower_bound(b + 1, b + m + 1, x) - b;
}
void discrete() {//离散化 
    sort(a + 1, a + n + 1);
    for(int i = 1; i <= n; i++)
        if(i == 1 || a[i - 1] != a[i])
            b[++m] = a[i];
}

原文地址:https://www.cnblogs.com/ywjblog/p/8866609.html