离散化
1、在处理数据的时候存在一些数据值很大,无法将其作为数组下标记录该值的属性,如果这时只需要着堆数据的相对属性,那么可以对该数值进行离散化
例如:
存在5个数:123445678 1234567 123456 12345 1234 因为无法开大小为123456789的数组,我们可以将其离散化
排序:1234 12345 123456 1234567 12345678
将其表示为1 2 3 4 5
用数组a1 a2 a3 a4 a5记录他们的属性
2、使用STL进行离散化
思想:1、拷贝原数组
2、将拷贝的原数组进行排序 (sort)
3、对拷贝数组去重,记录不重复元素及其个数(unique)
4、利用lower_bound()进行离散化
代码:
#include<bits/stdc++.h> using namespace std; int a[100]; //原数组 int temp[100]; //拷贝数组 int main() { int n; scanf("%d",&n); //输入数组的元素 for(int i=1;i<=n;i++) { scanf("%d",&a[i]); temp[i]=a[i]; //拷贝 } sort(temp+1,temp+1+n); //将拷贝数组排序 int size=unique(temp+1,temp+1+n)-temp-1; //去重,size为去重后数组的元素个数 for(int i=1;i<=n;i++) a[i]=lower_bound(temp+1,temp+1+size,a[i])-temp; //离散化 for(int i=1;i<=n;i++) printf("%d ",a[i]); //离散后的值不改变其相对顺序 return 0; }
STL函数:unique
用时需要#include<iostrem>头文件
unique 的作用是“去掉”容器中相邻元素的重复元素,这里所说的“去掉”并不是真正把重复元素删除,它实质上是一个伪去除,是把重复的元素移到后面去了,然后依然保存到了原数组中,然后返回去重后最后一个元素的地址。
因为unique去除的是相邻元素的重复元素,所以使用之前需要排序。
sort, unique和erase的联合使用,可以将一个有重复元素的数组的重复元素去除,从而转化成一个无重复元素的有序数组。
end_unnique = unique(result.begin(), result.end());
result.erase(end_unique, result.end());
由于 end_unique返回去重后最后一个元素的位置,而重复的元素都被移动到后面去了,所以要将从去重后最后一个元素的地址 到 原数组最后一个地址 这些地址中的元素去掉,从而得到无重复元素的数组。
STL函数:lower_bound和upper_bound
upper_bound 和lower_bound工作原理是二分查找
用时需要#include<algorithm>头文件
作用:
lower_bound的返回值减去数组的地址就是
要查找的元素在数组中的位置。
lower_bound(first,last,val) 返回一非递减序列(first,last)中第一个大于等于val的地址
upper_bound(first,last,val) 返回一非递减序列(first,last)中第一个大于val的地址
例
#include<iostream> #include<algorithm> using namespace std; int main() { int a[5]={1,2,3,3,4}; int loc=lower_bound(a,a+5,3)-a; //loc的值为数组中第一个大于等于3的元素的位置 及第一个3的位置 cout<<loc<<endl; int locc=upper_bound(a,a+5,3)-a; //locc的值为数组中第一个大于3的元素的位置 及4的位置 cout<<locc<<endl; return 0; }
学习地址:https://www.cnblogs.com/huangzzz/p/8516314.html
渣渣的求学之路,如文章有错误,欢迎指出~谢谢大家!