数据离散化处理

有时候,我们需要使用数组下标来维护某些数据结构(例如并查集),但如果数据范围太大我们开不了这么大的数组,这时候,我们就要将数据进行离散化。
例如数据{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 }

 

posted @ 2019-08-07 08:38  Asika391  阅读(310)  评论(0编辑  收藏  举报