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; }
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; }