什么是离散化?
离散化,把无限空间中有限的个体映射到有限的空间中去,以此提高算法的时空效率。
通俗的说,离散化是在不改变数据相对大小的条件下,对数据进行相应的缩小。例如:
原数据: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; }