离散化

当不关心数据的绝对大小,而关心数据的相对大小时,可以对数据进行离散化。例如对一个班级的学生的成绩进行排名,这时我们只关心其相对大小,不关心其真实值。如分数{23,94,135,56,5},对其排名后为{4,2,1,3,5}。

离散化就是用相对值代替其绝对值,它能把稀疏的数据转化为密集分布,解决原数据很大或含有负数,难以称为数组下标的问题。

离散化的步骤如下

  1. 排序:按需求把原数据从大到小或从小到大排序
  2. 去重:按需求对排序后的数据去重,有时也不用去重
  3. 离散化:把离散化的数列从1开始做个分配数值
  4. 归为:把离散化的每个元素放回原位置

模板代码

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();
    }
}
posted @ 2023-07-11 00:09  wuyoudexian  阅读(43)  评论(0)    收藏  举报