离散化
Posted young-children
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了离散化相关的知识,希望对你有一定的参考价值。
概念:
离散化,把无限空间中有限的个体映射到有限的空间中去,以此提高算法的时空效率。
通俗的说,离散化是在不改变数据相对大小的条件下,对数据进行相应的缩小。例如:
原数据:1,999,100000,15;处理后:1,3,4,2;
适用范围:
有些数据本身很大, 自身无法作为数组的下标保存对应的属性。如果这时只是需要这堆数据的相对属性, 那么可以对其进行离散化处理。
当数据只与它们之间的相对大小有关,而与具体是多少无关时,可以进行离散化。
例如:
91054与52143的逆序对个数相同。
利用STL离散化
思路是:先排序,再删除重复元素,最后就是索引元素离散化后对应的值。
假定待离散化的序列为a[n],b[n]是序列a[n]的一个副本,则对应以上三步为:
sort(sub_a,sub_a+n); int size=unique(sub_a,sub_a+n)-sub_a;//size为离散化后元素个数 for(i=0;i<n;i++) a[i]=lower_bound(sub_a,sub_a+size,a[i])-sub_a + 1;//k为b[i]经离散化后对应的值
第二种方式其实就是排序之后,枚举着放回原数组
用一个结构体存下原数和位置,按照原数排序
我结构体里面写了个重载,也可以写一个比较函数
最后离散化后数在rank[] rank[]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;
以上是关于离散化的主要内容,如果未能解决你的问题,请参考以下文章