离散化

 离散化

1、在处理数据的时候存在一些数据值很大,无法将其作为数组下标记录该值的属性,如果这时只需要着堆数据的相对属性,那么可以对该数值进行离散化

例如:

存在5个数:123445678 1234567 123456 12345 1234 因为无法开大小为123456789的数组,我们可以将其离散化

排序:1234  12345  123456  1234567  12345678

将其表示为1      2      3      4     5

用数组a1    a2    a3    a4   a5记录他们的属性

 2、使用STL进行离散化

思想:1、拷贝原数组

          2、将拷贝的原数组进行排序  (sort

    3、对拷贝数组去重,记录不重复元素及其个数(unique

    4、利用lower_bound()进行离散化

代码:

#include<bits/stdc++.h>
using namespace std;
int a[100];                    //原数组
int temp[100];                 //拷贝数组 
int main()
{
    int n;
    scanf("%d",&n);            //输入数组的元素 
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&a[i]);            
        temp[i]=a[i];        //拷贝 
    }
    sort(temp+1,temp+1+n);    //将拷贝数组排序 
    int size=unique(temp+1,temp+1+n)-temp-1;            //去重,size为去重后数组的元素个数 
    for(int i=1;i<=n;i++)    
        a[i]=lower_bound(temp+1,temp+1+size,a[i])-temp;            //离散化 
    for(int i=1;i<=n;i++)
        printf("%d ",a[i]);                    //离散后的值不改变其相对顺序
    return 0;
}

 

STL函数:unique

用时需要#include<iostrem>头文件

unique 的作用是去掉容器中相邻元素的重复元素,这里所说的去掉并不是真正把重复元素删除,它实质上是一个伪去除,是把重复的元素移到后面去了,然后依然保存到了原数组中,然后返回去重后最后一个元素的地址。 
因为unique去除的是相邻元素的重复元素,所以使用之前需要排序。

sort, uniqueerase的联合使用,可以将一个有重复元素的数组的重复元素去除,从而转化成一个无重复元素的有序数组。

end_unnique = unique(result.begin(), result.end());
result.erase(end_unique, result.end());

由于 end_unique返回去重后最后一个元素的位置,而重复的元素都被移动到后面去了,所以要将从去重后最后一个元素的地址 到 原数组最后一个地址 这些地址中的元素去掉,从而得到无重复元素的数组。

 

STL函数:lower_boundupper_bound

 upper_bound lower_bound工作原理是二分查找

用时需要#include<algorithm>头文件

 作用:

 lower_bound的返回值减去数组的地址就是

 要查找的元素在数组中的位置。

 lower_bound(first,last,val)  返回一非递减序列(first,last)中第一个大于等于val的地址

upper_bound(first,last,val)  返回一非递减序列(first,last)中第一个大于val的地址

#include<iostream>
#include<algorithm> 
using namespace std;
int main()
{
    int a[5]={1,2,3,3,4};
    int loc=lower_bound(a,a+5,3)-a;                //loc的值为数组中第一个大于等于3的元素的位置  及第一个3的位置 
    cout<<loc<<endl;
    int locc=upper_bound(a,a+5,3)-a;            //locc的值为数组中第一个大于3的元素的位置  及4的位置 
    cout<<locc<<endl;
    return 0;
}

 学习地址:https://www.cnblogs.com/huangzzz/p/8516314.html

渣渣的求学之路,如文章有错误,欢迎指出~谢谢大家!

 

 

 

posted @ 2018-05-16 21:12  _Carrot  阅读(330)  评论(0编辑  收藏  举报