数据离散化处理

定义:

离散化,把无限空间中有限的个体映射到有限的空间中去,以此提高算法的时空效率。

通俗的说,离散化是在不改变数据相对大小的条件下,对数据进行相应的缩小。例如:

原数据:1,999,100000,15;处理后:1,3,4,2;

原数据:{100,200},{20,50000},{1,400};

处理后:{3,4},{2,6},{1,5};

例如有时需要将数据直接作为数组下标,但因为数据太大而无法开数组时,若数据的总量相对较少时,就可以对其进行离散化处理



离散化处理需要用到的STL函数有3个:sort(),unique(),lower_bound()

1.sort() 不再作赘述


2.unique(first, last)用于元素去重

”删除” [first, last) 序列中所有相邻的重复元素(只保留一个)。此处的删除,并不是真的删除,而是指重复元素的位置被不重复的元素给占领了,即不断地把不重复的元素移到前面来

由于它”删除”的是相邻的重复元素,所以在使用unique函数之前,一般都会将目标序列进行排序

同时unique()会返回 去重后序列中的最后一个元素的下一个元素(相当于去重后序列的ar.end() ),那么就可以算出 去重后序列的长度,即 返回值 - 序列首地址


3.1 下界函数:lower_bound(first , last , v)
找到并返回 非降序列 [first,last) 中第一个大于等于v的元素的地址

3.2 上界函数:lower_bound(first , last , v)
找到并返回 非降序列 [first,last) 中第一个大于v的元素的地址


具体操作:

	int n,A[maxn],B[maxn];
    for(int i=1;i<=n;i++)
    {
        //下标从1开始
        scanf("%d",&A[i]);
        B[i]=A[i];      //将A都存到B中
    }
    sort(B+1,B+n+1);    //先对B进行排序
    int m=unique(B+1,B+n+1)-(B+1);      //去重,同时返回值-首地址得到去重后序列的长度
    //此时 B中的值 离散化的映射就是其 下标
	//若要查找A中某个值的映射,可对B利用lower_bound()进行二分查找,如下
    for(int i=1;i<=n;i++)
        A[i]=lower_bound(B+1,B+m+1,A[i])-B;       //得到A[i]在B中的下标,即为其映射
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值