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

    离散化

    通俗的说,离散化是在不改变数据相对大小的条件下,对数据进行相应的缩小。例如:
    原数据:1,999,100000,15;处理后:1,3,4,2;

    离散化有两种方法:

    方法一:

    const int N=1e5+7;
    int t[N],a[N];
    int main()
    {
        int n,m;
        cin>>n;
        for(int i=1;i<=n;i++){
           cin>>a[i];
           t[i]=a[i];
        }
        sort(t+1,t+n+1);
        //不重复元素个数
        m=unique(t+1,t+n+1)-t-1;
        for(int i=1;i<=n;i++)
          a[i]=lower_bound(t+1,t+m+1,a[i])-t;
        //离散化后的数组
        for(int i=1;i<=n;i++){
            cout<<a[i]<<" ";
        }  
    }

    举例:

    5
    123 55 32 55 66
    4 2 1 2 3

    函数原型:

    unique函数:

         iterator unique(iterator it_1,iterator it_2);

          即”删除”序列中所有相邻的重复元素(只保留一个)。此处的删除,并不是真的删除,而是指重复元素的位置被不重复的元素给占领了

     

    lower_bound()算法返回一个非递减序列[first, last)中的第一个大于等于值val的位置。
    upper_bound()算法返回一个非递减序列[first, last)中第一个大于val的位置。

    方法二:

    第二种方式其实就是排序之后,枚举着放回原数组
    用一个结构体存下原数和位置,按照原数排序
    我结构体里面写了个重载,也可以写一个比较函数
    最后离散化后数在 rank[]里面

    struct Node {
        int data , id;
        bool operator < (const Node &a) const {
            return data < a.data;
        }
    };
    Node num[100];
    int arank[100], n;
    int main(){
        cin>>n;
        for(int i=1; i<=n; i++) {
            cin>>num[i].data;
            num[i].id = i;
        }
        sort(num+1 , num+n+1);
        for(int i=1; i<=n; i++)
            arank[num[i].id] = i;
        for(int i=1; i<=n; i++)
            cout<<arank[i]<<" ";
    }

     举例:

    5
    123 55 32 55 66
    5 2 1 3 4

     

    因上求缘,果上努力~~~~ 作者:每天卷学习,转载请注明原文链接:https://www.cnblogs.com/BlairGrowing/p/14071056.html

  • 相关阅读:
    leetcode821
    leetcode872
    leetcode700
    leetcode806
    2019-9-2-win10-uwp-右击浮出窗在点击位置
    2019-9-2-win10-uwp-打包第三方字体到应用
    2019-10-18-dotnet-文件读写务必注意事项
    2018-8-10-win10-uwp-如何创建修改保存位图
    2018-8-9-win10-uwp-装机必备应用-含源代码
    2019-11-1-asp-dotnet-core-简单开发P2P中央服务器
  • 原文地址:https://www.cnblogs.com/BlairGrowing/p/14071056.html
Copyright © 2011-2022 走看看