作业介绍

离散化,把无限空间中有限的个体映射到有限的空间中去,以此提高算法的时空效率。

通俗的说,离散化是在不改变数据相对大小的条件下,对数据进行相应的缩小。

离散化是程序设计中一个常用的技巧,它可以有效的降低[时间复杂度]。其基本思想就是在众多可能的情况中,只考虑需要用的值,就是用数字的相对值替代它们的绝对值。离散化是一种数据处理的技巧,它把分布广而稀疏的数据转换为密集分布,从而能够让算法更快速、更省空间地处理。离散化可以改进一个低效的算法,甚至实现根本不可能实现的算法。

有些数据本身很大, 自身无法作为数组的下标保存对应的属性。如果这时只是需要这堆数据的相对属性, 那么可以对其进行离散化处理。当数据只与它们之间的相对大小有关,而与具体是多少无关时,可以进行离散化。

离散化:分保序和不保序两种

保序:就是先把所有数排序,再映射为其下标的过程。可以用sort, unique,lower_bound函数实现。

不保序:就是所有数按出现顺序映射为不重复数的过程。可以用map容器实现。

vector<int> alls; // 存储所有待离散化的值
sort(alls.begin(), alls.end()); // 将所有值排序
alls.erase(unique(alls.begin(), alls.end()), alls.end());   
//unique返回的是去掉重复元素后的序列的最后一个元素的下一个元素位置。
// 去掉重复元素

// 二分求出x对应的离散化的值
int find(int x) // 找到第一个大于等于x的位置
{
    int l = 0, r = alls.size() - 1;
    while (l < r)
    {
        int mid = l + r >> 1;
        if (alls[mid] >= x) r = mid;
        else l = mid + 1;
    }
    return r + 1; // 映射到1, 2, ...n
}

题目

认领作业后才可以查看作业内容。
状态
正在进行…
题目
10
开始时间
2025-1-9 0:00
截止时间
3333-5-1 23:59
可延期
24 小时