离散化

  • 不少问题需要将数据范围很大的一些数 "缩小" 到 1~n 的范围
  • 例如 a = [ 100 , -5000 , 20 , 9 , 3 ] 可以离散化到 [ 5 , 1 , 4 , 3 , 2 ]
  • 其实也就是把这个数组按照从小到大排后之后的排名
  • 又有一种就是数组中含有多项重复的值 a = [ 19 , 19 , 18 , 20 , 20 , 100 , 5] 可以离散化为 [ 3 , 3 , 2 , 4 , 4 , 4 , 5 , 1 ]
  • 离散化后的数值非常便于用作下标或者统计 ( 比如链表的下标、技术下标、树状数组、线段树等 

 

常用的离散化代码

int a[10000],b[10000],v[10000];
int n,m;
cin>>n;
for (int i = 1; i<=n; i++) {
    cout << a[i];
    v[i]=a[i];
}    
sort(a+1,a+n+1);
m=unique(v+1,v+n+1)-v-1;
for (int i = 1; i<=n; i++)  b[i]=lower_bound(v+1,v+m+1,a[i])-v;
posted @ 2024-01-16 20:18  努力吧少年^-^  阅读(173)  评论(0)    收藏  举报