有时候,我们需要使用数组下标来维护某些数据结构(例如并查集),但如果数据范围太大我们开不了这么大的数组,这时候,我们就要将数据进行离散化。
例如数据{99844531,75331434,87433476,67542347}我们可以根据相对大小关系67542347<75331434<87433476<99844531来开一个新数组编号,二分查找在新数组里的编号。如b[1]=67542347,b[2]=75331434,b[3]=87433476,b[4]=99844531。当我们要查找99844531这个数据的时候,就能在b中找到它的编号为4,就可以用4来代表这个数据啦。
根据这种查找方法,我们要对元素进行去重,即去除重复元素。
其中我们需要用到两种函数:
unique函数:不断将不重复元素占据前面重复元素的位置(相邻的重复元素),返回的是不重复序列的最后一个元素的下一个元素的地址。
lower_bound:从数组的起始位置到结束位置(左闭右开)二分查找第一个大于或等于传入的参数的元素,返回的是该元素的地址,减去数组起始位置就得到该元素的下标。
没找到则返回end。
附上代码:
1 #include<iostream> 2 #include<algorithm> 3 using namespace std; 4 int n; 5 int a[];//需离散化的数据 6 int b[];//储存离散化后的 7 int main(){ 8 for(int i=1;i<=n;++i){ 9 cin>>a[i];b[i]=a[i]; 10 } 11 sort(b+1,b+1+n);//对数据排序,因为unique函数“除去”的是相邻重复元素 12 int m=unique(b+1,b+n+1)-b-1;//去除相邻重复元素,返回无重复元素的长度m 13 int x=lower_bound(b+1,b+m+1,a[1])-b;//假设要查找的数据是a[1],x为a[1]在数组b中的位置即下标 14 return 0; 15 }
原文地址:https://www.cnblogs.com/Asika3912333/p/11313002.html
时间: 2024-10-18 04:40:34