离散化

Posted hkttg

tags:

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

什么是离散化?

离散化,把无限空间中有限的个体映射到有限的空间中去,以此提高算法的时空效率。
通俗的说,离散化是在不改变数据相对大小的条件下,对数据进行相应的缩小。例如:
原数据:1,999,100000,15;处理后:1,3,4,2;
原数据:{100,200},{20,50000},{1,400};
处理后:{3,4},{2,6},{1,5};
以上来自百度百科

为什么要用离散化?

有些数据本身很大, 自身无法作为数组的下标保存对应的属性。

如果这时只是需要这堆数据的相对属性, 那么可以对其进行离散化处理。

当数据只与它们之间的相对大小有关,而与具体是多少无关时,可以进行离散化。

以上还是来自百度百科

STL实现简介

sort():排序。。。没啥好说的。。。

unique():unique()是C++标准库函数里面的函数,其功能是去除相邻的重复元素(只保留一个),所以使用前需要对数组进行排序

上面的一个使用中已经给出该函数的一个使用方法,对于长度为n数组a,unique(a,a+n) - a返回的是去重后的数组长度

那它是怎么实现去重的呢?删除?

不是,它并没有将重复的元素删除,而是把重复的元素放到了数组的最后面

比如:1 4 2 6 5 7 2 4 7 1

sort后:1 1 2 2 4 4 5 6 7 7

unique后:1 2 4 5 6 7 1 2 4 7

lower_bound():很实用的函数。在一个左闭右开有序区间里进行二分查找,需要查找的值由第三个参数给出。

lower_bound返回的是被查序列中第一个大于等于查找值的指针,也就是返回指向被查值>=查找值的最小指针。

 code:

//先%一波ruotian大佬 

#include<cstdio>
#include<algorithm>

using namespace std;

int a[1005],n; //需要离散化的数组
int c[1005],tot; //c[i]是a[i]的副本 

int main() {
    scanf("%d", &n);
    for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
    for (int i = 1; i <= n; i++) c[i] = a[i];
    sort(c + 1, c + n + 1);
    tot = unique(c + 1, c + n + 1) - (c + 1); //unique去重 
    for (int i = 1; i <= n; i++) a[i] = lower_bound(c + 1, c + tot + 1, a[i]) - c; //lower_bound二分找位置 
    for (int i = 1; i <= n; i++) printf("%d\n", a[i]);
    return 0;
}

 

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

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

数据离散化

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

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

基本算法——离散化

坐标离散化