码迷,mamicode.com
首页 > 其他好文 > 详细

数据离散化处理

时间:2019-08-07 09:23:17      阅读:406      评论:0      收藏:0      [点我收藏+]

标签:一个   cin   include   方法   函数   pre   sort   using   iostream   

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

 

数据离散化处理

标签:一个   cin   include   方法   函数   pre   sort   using   iostream   

原文地址:https://www.cnblogs.com/Asika3912333/p/11313002.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!