• 离散化学习记录


    离散化:就是把无穷大集合中的若干个元素映射为有限集合以便于统计的方法。
    例如在很多情况下,问题的范围虽然定义在整数集合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];
    }

  • 相关阅读:
    Solved:Spring Junit Test NoSuchMethodError
    Stack实现
    CLRS10.2-8练习
    CLRS10.2-7练习
    CLRS10.2-4练习
    CLRS10.1-7练习
    CLRS10.1-6练习
    算法:吸血鬼数字算法
    CLRS最大子数组问题
    VS快捷键
  • 原文地址:https://www.cnblogs.com/ywjblog/p/8866609.html
Copyright © 2020-2023  润新知