离散化

Posted santiego

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了离散化相关的知识,希望对你有一定的参考价值。

离散化

使用场景&思路

当需要把一个数据范围很大,但是元素个数较少的集合映射到数组下标上时,因为计算机内存的限制,数组下标不可能完全包含这极大的数据范围,所以我们需要将其(排序后)重新顺序标号。

至于离散后数据的具体值,很多时候我们不需要关心,我们只需要知道他们之间相对的大小(这时可以排序后再离散化);如果非要知道数据的具体值,可以再开个数组,下标对应离散后的编号,里面存具体值。

实现

#include <iostream>
#include <algorithm>
#define MAXN 40000
using namespace std;
int n,a[MAXN],t[MAXN];
int main(){
    cin>>n;
    for(int i=1;i<=n;i++)
        cin>>a[i],t[i]=a[i];
    sort(t+1, t+1+n);
    int len=unique(t+1, t+1+n)-(t+1);
    for(int i=1;i<=n;i++)
        a[i]=lower_bound(t+1, t+1+len, a[i])-t;//从1开始编号
    for(int i=1;i<=n;i++)
        cout<<a[i]<<" ";
    return 0;
}

说明

  • unique()

    去重函数 包含在头文件 algorithm

    将数组所有中重复的元素移至末尾,最终返回的是不含重复元素数组的尾地址

    所以把返回的尾地址和首地址t+1相减就是不含重复元素数组的长度len

  • lower_bound()

    查找函数 包含在头文件 algorithm

    返回第一个大于等于x的元素地址

参考

以上是关于离散化的主要内容,如果未能解决你的问题,请参考以下文章

离散化的思想和它的两种代码与区别

数据离散化

AcWing 2014. 岛(离散化+差分)

Matlab的Simulink连续模型离散化代码自动生成C语言(简明教程)

基本算法——离散化

坐标离散化