zoukankan      html  css  js  c++  java
  • 离散化

     离散化

    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

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

     

  • 相关阅读:
    nrm安装与配置(nrm管理npm源)
    Mac启动MongoDB报错:exception in initAndListen: NonExistentPath: Data directory /data/db not found., terminating
    基本类型(例如:int)数组和ArrayList之间的转化
    sqlite3--sqlite3_prepare
    fgets
    strdup
    openssl-EVP_md5()
    FIPS--Federal Information Processing Standards
    pthread_mutexattr_gettype、pthread_mutexattr_settype、pthread_mutexattr_destroy、pthread_mutexattr_init!
    gethostname&&getdomainname
  • 原文地址:https://www.cnblogs.com/LjwCarrot/p/9048201.html
Copyright © 2011-2022 走看看