• 离散化


    概念:
    离散化,把无限空间中有限的个体映射到有限的空间中去,以此提高算法的时空效率。
    通俗的说,离散化是在不改变数据相对大小的条件下,对数据进行相应的缩小。例如:
    原数据:1,999,100000,15;处理后:1,3,4,2;
     
    适用范围:
    有些数据本身很大, 自身无法作为数组的下标保存对应的属性。如果这时只是需要这堆数据的相对属性, 那么可以对其进行离散化处理。
    当数据只与它们之间的相对大小有关,而与具体是多少无关时,可以进行离散化。
    例如:
    91054与52143的逆序对个数相同。
     
    利用STL离散化
    思路是:先排序,再删除重复元素,最后就是索引元素离散化后对应的值。
    假定待离散化的序列为a[n],b[n]是序列a[n]的一个副本,则对应以上三步为:
    int n, a[maxn], b[maxn];
    //这里以下标1为序列的起点,一般情况下从0开始也可以
    for(int i = 1;i <= n;i++)
    {
        scanf("%d", &a[i]);
        b[i] = a[i];//b是一个临时数组,用来得到离散化的映射关系
    }
    //下面使用了STL中的sort(排序),unique(去重),lower_bound(查找)函数
    sort(b + 1, b + n + 1);//排序
    int size = unique(b + 1, b + 1 + n) - b - 1;//去重,并获得去重后的长度size
    for(int i = 1;i <= n;i++)
    {
        a[i] = lower_bound(b + 1, b + 1 + size, a[i]) - b;//通过二分查找,快速地把元素和映射对应起来
    }

    第二种方式其实就是排序之后,枚举着放回原数组

    用一个结构体存下原数和位置,按照原数排序

    我结构体里面写了个重载,也可以写一个比较函数

    最后离散化后数在rank【 】 里面

    #include<algorithm>
    struct Node {
        int data , id;
        bool operator < (const Node &a) const {
            return data < a.data;
        }
    };
    Node num[MAXN];
    int rank[MAXN] , n;
    for(int i=1; i<=n; i++) {
        scanf("%d",&num[i].data);
        num[i].id = i;
    }
    sort(num+1 , num+n+1);
    for(int i=1; i<=n; i++)
        rank[num[i].id] = i;
  • 相关阅读:
    常用颜色代码 (30种)
    C++ 调用lib 和 dll的 方法 及 动态库DLL与静态库lib的区别
    如何: 通过HTML文档对象模型访问文档中的ActiveX控件的属性 .
    理解预编译头
    #ifndef用法总结 .
    C++中MessageBox()的详细用法
    如何用Javascript捕获ActiveX对象的事件
    ActiveX控件调用JavaScript函数的方法
    MFC Activex与JavaScript的接口交互
    include包含文件查找的顺序 .
  • 原文地址:https://www.cnblogs.com/young-children/p/11766361.html
Copyright © 2020-2023  润新知