离散化

概念:
离散化,把无限空间中有限的个体映射到有限的空间中去,以此提升算法的时空效率。
通俗的说,离散化是在不改变数据相对大小的条件下,对数据进行相应的缩小。例如:
原数据: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【 】 里面spa

#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;
相关文章
相关标签/搜索