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

    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
  • 相关阅读:
    httpclient_1
    jmeter java请求
    fiddler监听手机
    lr文件的作用?
    配置源
    数据结构--堆
    A + B Problem II 高精度
    最小生成树(kruskal算法)+prim算法
    P3371 【模板】单源最短路径(弱化版)
    P3368 【模板】树状数组 2(实现区间修改&单点查询)
  • 原文地址:https://www.cnblogs.com/2018zxy/p/10104393.html
Copyright © 2011-2022 走看看