离散化
当不关心数据的绝对大小,而关心数据的相对大小时,可以对数据进行离散化。例如对一个班级的学生的成绩进行排名,这时我们只关心其相对大小,不关心其真实值。如分数{23,94,135,56,5},对其排名后为{4,2,1,3,5}。
离散化就是用相对值代替其绝对值,它能把稀疏的数据转化为密集分布,解决原数据很大或含有负数,难以称为数组下标的问题。
离散化的步骤如下
- 排序:按需求把原数据从大到小或从小到大排序
- 去重:按需求对排序后的数据去重,有时也不用去重
- 离散化:把离散化的数列从1开始做个分配数值
- 归为:把离散化的每个元素放回原位置
模板代码
void Dis(vector<int> &v) {
vector<int> c(v);
sort(c.begin() + 1, c.end()); //从小到大排序
c.erase(unique(c.begin() + 1, c.end()), c.end()); //是否去重看题目需要
for(int i = 1; i < c.size(); i++) {
v[i] = lower_bound(c.begin() + 1, c.end(), v[i]) - c.begin();
}
}

浙公网安备 33010602011771号