数据离散化处理

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

数据离散化处理的相关文章

数据离散化

对于一组只关心相对大小而与实际值无关的数据,适用于离散化. 将每个数据x的值修改为x在数组a[]中从小到大排序的名次. 这样离散化,缩小了数据之间的间隔,但又不改变其相对于其他数据的大小关系. 可以减少数据的时空复杂度. for(i=1;i<=n;i++){scanf("%d",&a[i]);b[i]=a[i];}//b为a的副本 sort(b+1,b+n+1); int size=unique(b+1,b+n+1)-b; for(i=1;i<=n;i++) ran

hihoCoder #1079 : 离散化 (线段树,数据离散化)

题意:有一块宣传栏,高一定,给出长度,再给出多张海报的张贴位置,问还能见到几张海报(哪怕有一点被看到)?假设海报的高于宣传栏同高. 思路:问题转成“给出x轴上长为L的一条线段,再用n条线段进行覆盖上去,最后还能看到及条线”.长度是0~L,即长度是L,进行离散化的时候,应该用1~L,每个数字表示一个单位长.还有就是按照提示所给的信息实现即可.步骤如下: (1)保存n个数据,做成pair,并将所有出现过的数字在另外找地方排序,去掉重复的,再将数据紧缩化处理,那么大小在1~max.再将紧缩化的数据与原

数据离散化 ( 以及 stl 中的 unique( ) 的用法 )+ bzoj3289:Mato的文件管理

http://blog.csdn.net/gokou_ruri/article/details/7723378 ↑惯例Mark大神的博客 bzoj3289:Mato的文件管理 线段树求逆序对+莫队,但是数据量50000却没有给出范围,既然求逆序对,那么我们关注的只是数据之间的相对大小,此时我们可以把这50000个数据进行简化...嗯看大神的博客就明白了不需要多解释什么了..   下面是博客中未授权截取的大神的代码板子....不过都是自己看应该也没什么吧..... sort(sub_a,sub_a

特征处理之数据离散化

二元转换BinarizerBinarizer是将连续型变量根据某个阈值,转换成二元的分类变量.小于该阈值的转换为0,大于该阈值的转换为1. 要求输入列必须是double,int都会报错.如下:输入的是0.1,0.8,0.2连续型变量,要以0.5为阈值来转换成二元变量(0,1). 打印结果: Binarizer output with Threshold = 0.5 +---+-------+-----------------+ | id|feature|binarized_feature| +-

数据离散化-分箱

  变量的延申和筛选-连续变量离散化-特征筛选 WOE编码(最优分箱) WOE一般在0.1~3之间波动,IV值做得特征筛选的操作 一般保留>0.03的特征 IV值体现的时X和Y之间的显著性进行筛选 1.逐列分箱并获得IV值 # 运行自定义函数所在文件 对自定义分箱文件要自己理解 %run smob.py # y进行0,1互换 train_data['SeriousDlqin2yrs'] = -(train_data.SeriousDlqin2yrs-1) #因为与自定义函数中的标签0 1设定正好

《数据挖掘概念与技术》--第三章 数据预处理

一.数据预处理 1.数据如果能够满足其应用的要求,那么他是高质量的. 数据质量涉及许多因素:准确性.完整性.一致性.时效性.可信性.可解释性. 2.数据预处理的主要任务:数据清洗.数据集成.数据规约.数据变换. 二.数据清理:试图填充缺失值,光滑噪声.识别利群点.纠正数据中的不一致. 1.缺失值的处理: 1)忽略元组:缺少类标号时通常这么做.但是忽略的元组其他属性也不能用,即便是有用的. 2)人工填写:该方法很费事费时,数据集很大.缺失值很多时可能行不通. 3)使用一个全局常量填充缺失值:将缺失

数据预处理技术

数据预处理技术数据清理:空缺值处理.格式标准化.异常数据清除.错误纠正.重复数据的清除数据集成:将多个数据源中的数据结合起来并统一存储,建立数据仓库的过程实际上就是数据集成.数据变换:平滑.聚集.规范化.最小 最大规范化等数据归约:维归(删除不相关的属性(维)).数据压缩(PCA,LDA,SVD.小波变换).数值归约(回归和对数线形模型.线形回归.对数线形模型.直方图)数据离散化和概念分层 1.数据清理:格式标准化.异常数据清除.错误纠正.重复数据的清除通过填写空缺值,平滑噪声数据,识别删除孤立

POJ 2528 Mayor&#39;s posters 离散化和线段树题解

本题就是要往墙上贴海报,问最后有多少可见的海报. 其实本题的难点并不是线段树,而是离散化. 因为数据很大,直接按原始数据计算那么就会爆内存和时间的. 故此需要把数据离散化. 比如有海报1 6   7 9   20 100  5 1000的原始数据,直接计算需要1-1000的内存,离散化之后只需要8内存,因为只有4组数据8个数. 本题更进一步高级一点的离散化就是需要把不相邻的两个数据插入一个数值,表示有空白的地方,不是所有海报都覆盖到的. 比如上面的数据要离散为:1 2  5 6  7 8 9 1

World is Exploding 树状数组+离散化

Given a sequence A with length n,count how many quadruple (a,b,c,d) satisfies: a≠b≠c≠d,1≤a<b≤n,1≤c<d≤n,Aa<Ab,Ac>Ada≠b≠c≠d,1≤a<b≤n,1≤c<d≤n,Aa<Ab,Ac>Ad. InputThe input consists of multiple test cases. Each test case begin with an int