作业介绍
离散化,把无限空间中有限的个体映射到有限的空间中去,以此提高算法的时空效率。
通俗的说,离散化是在不改变数据相对大小的条件下,对数据进行相应的缩小。
离散化是程序设计中一个常用的技巧,它可以有效的降低[时间复杂度]。其基本思想就是在众多可能的情况中,只考虑需要用的值,就是用数字的相对值替代它们的绝对值。离散化是一种数据处理的技巧,它把分布广而稀疏的数据转换为密集分布,从而能够让算法更快速、更省空间地处理。离散化可以改进一个低效的算法,甚至实现根本不可能实现的算法。
有些数据本身很大, 自身无法作为数组的下标保存对应的属性。如果这时只是需要这堆数据的相对属性, 那么可以对其进行离散化处理。当数据只与它们之间的相对大小有关,而与具体是多少无关时,可以进行离散化。
离散化:分保序和不保序两种
保序:就是先把所有数排序,再映射为其下标的过程。可以用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 小时