对坐标点的离散化

很多时候会遇到一类题, 这类题点的个数很少 , 但是每个点的数据特别大 , 这时基本有两种想法 。

1 . 用map 处理 , map 是一个关联容器 , 可以实现元素的一对一 , 用map 后 , 你就可以实现对数据的桶排了。

2 . 对数据离散化处理

  先是点的离散化 例如 只有 3 个数据 , 9 20 33 他们的关系就可以映射成 1 2 3

  怎么处理呢 ?

    在两个数组中存原有数据, 对第一数组进行排序, 用的时候 用第二个数组 中的数在第一个数组中二分搜索下下标位置,即为映射好的数据。

  区间的映射怎么解决呢?

    用结构体去存区间的每个点,在将所有的点存在一个数组中,同样的方法对其操作。但是这样会有一个弊端,例如 1 - 10  1 - 4  6 - 8 三段区间映射的话,会被映射成 1 - 5   1 - 2   3 - 4  这样看映射后的区间 是都连起来的 , 但实际呢 ? 并不是这样的,因此可以这样解决这个问题 。

    在将所有的点存入数组后, 对数组进行排序后,相邻的两点间如果他们之间的差大于 1 就在他们之间任意插入一个他们之间的元素 。

  代码实现 :

  

// 数组插入新的元素
for(int i = k - 1; i >= 1; i--){
    if (pre[i] != pre[i-1]+1) pre[k++] = pre[i-1]+1;
}

另外 还有一步是对数组中的元素去重

// 数组元素去重
int k = 1;
for(int i = 1; i < n; i++){
    if (pre[i] != pre[i-1]) pre[k++] = pre[i];
}

        

东北日出西边雨 道是无情却有情
原文地址:https://www.cnblogs.com/ccut-ry/p/7645782.html