数据离散化处理
Posted asika3912333
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据离散化处理相关的知识,希望对你有一定的参考价值。
有时候,我们需要使用数组下标来维护某些数据结构(例如并查集),但如果数据范围太大我们开不了这么大的数组,这时候,我们就要将数据进行离散化。
例如数据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
以上是关于数据离散化处理的主要内容,如果未能解决你的问题,请参考以下文章