• 离散化


    1、概念:

    离散化:把无限空间中的有限个体映射到有限空间中去,以此提高算法的时空效率(就是对数据进行压缩)。

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

    2、方法一:STL处理

    用辅助数组记录要离散的数据,排序是要为了后面的二分

    因此,我们要保证相同元素离散后的位置相同,再用二分把元素离散化的数字放回原数组。

    #include<iostream>
    #include<algorithm>
    using namespace std;
    const int maxn = 12000;
    int a[maxn],b[maxn],size,n; 
    //a是离散化后的数组,b是排序数组,size是离散化后数组的大小 
    int main(void)
    {
        int i;
        cin>>n;
        for(i=1;i<=n;i++)
        {
            cin>>b[i];
            a[i]=b[i];
        }
        sort(a+1,a+n+1);
        size=unique(a+1,a+n+1)-a-1;
        for(i=1;i<=size;i++)
        {
            b[i]=lower_bound(a+1,a+size+1,b[i])-a;
        }
        for(i=1;i<=n;i++)
        cout<<b[i]<<" ";
        return 0;
    }
    View Code

    3、方法二:结构体

    建立一个结构体包含数据和起始位置,用结构体记录数据和起始位置

    然后对结构体进行排序,记录原来位置的节点排序后应在的位置。

    #include<iostream>
    #include<algorithm>
    using namespace std;
    const int maxn = 1200;
    struct Node{
        int data,val;
    }cur[maxn];
    bool cmp(Node a,Node b)
    {
        return a.data<b.data;
    }
    int a[maxn];
    int main(void)
    {
        int n,i;
        cin>>n;
        for(i=1;i<=n;i++) cin>>cur[i].data,cur[i].val=i;
        sort(cur+1,cur+n+1,cmp);
        for(i=1;i<=n;i++) a[cur[i].val]=i;
        for(i=1;i<=n;i++) cout<<a[i]<<" ";
        return 0;
    }
    View Code
  • 相关阅读:
    win7系统宽带自动断开怎么解决【系统天地】
    Win10系统修复受损文件教程【系统天地】
    win10如何加快开机速度【系统天地】
    Netty核心概念(5)之Channel
    Netty核心概念(4)之Bootstrap
    漫谈NIO(3)之Netty实现
    漫谈NIO(2)之Java的NIO
    漫谈NIO(1)之计算机IO实现
    机器学习实战(二)决策树
    机器学习实战(一)k-近邻算法
  • 原文地址:https://www.cnblogs.com/2018zxy/p/10104393.html
Copyright © 2020-2023  润新知