数据离散化
数据得离散化是重要的算法思想。(如果每个数据元素的具体值并不重要,重要的是他们之间的大小关系的话,我们可以先对这些数据进行离散化,使数据中的最大值尽可能小且保证所有数据都是正数)
当以权值为下标的时候,有时候值太大,存不下。 所以把要离散化的每一个数组里面的数映射到另一个值小一点的数组里面去。
打个比方,某个题目告诉你有10^4个数,每个数大小不超过10^10,要你对这些数进行操作,那么肯定不能直接开10^10大小的数组,但是10^4的范围就完全没问题。
例子:原数据:1,999,100000,15;处理后:1,3,4,2
三个离散化的关键函数:
sort()的作用:排序。
unique()的作用:“去掉”容器中相邻元素的重复元素(不一定要求数组有序),它会把重复的元素添加到容器末尾(所以数组大小并没有改变),而返回值是去重之后的尾地址;
lower_bound()的作用:在first和last中的前闭后开区间进行二分查找,返回大于或等于val的第一个元素位置。如果所有元素都小于val,则返回尾后指针的地址。
该离散化方法时间复杂度O(nlogn)
1、排序(sort)
2、去重(unique)
3、索引(lower_bound)
1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 using namespace std; 5 int lsh[1000], lshcopy[1000], x[1000]; // lsh[n]是所求的离散化的数组 6 int main() 7 { 8 // 输入 9 int n; 10 cin >> n; 11 for (int i = 0; i < n; i++) 12 { 13 cin >> x[i]; 14 lshcopy[i] = x[i]; 15 } 16 // 离散化的三大步骤 17 sort(x, x + n); // 第一步排序 18 int size = unique(x, x + n) - x; // 第二步unique函数去重 19 for (int i = 0; i < n; i++) // 第三步lower_bound函数索引 20 { 21 lsh[i] = lower_bound(x, x + size, lshcopy[i]) - x;// 即lsh[i]为lshcopy[i]离散化后对应的值 22 cout << lsh[i] << " "; 23 } 24 return 0; 25 }
记住,而且要熟练掌握(算法比赛中常用的技巧!!!)