离散化的总结
作者:互联网
很多题目如果 数据的大小范围很大,但是数量很少,如果按照数据的大小来排序,那么数组就会开的非常大,这样内存就会爆掉,这时候就要用离散化。
( ps:all 总结 来自y总。)
离散化分为两种:
1、需要保持原来的序列顺序的(大的数离散化后的数也大,小的小)
这时候要用 排序 判重 二分
2、不需要保持原来的序列顺序( 最大的数离散化后也有可能排第一位)
这时候只需要使用 map 哈希表
第一种 保序离散化的 代码:
1 //设sx[N]为离散化数组,cnt为离散化的数量 2 3 int get(LL x)//二分法求离散化后数的位置下标 4 { 5 int l=1,r=cnt; 6 while(l<r) 7 { 8 int mid=l+r>>1; 9 if(sx[mid]>=x)r=mid; 10 else l=mid+1; 11 } 12 return l; 13 } 14 15 for(int i=1;i<=n;i++)//离散化存储 16 { 17 sx[++cnt]=a[i]; 18 } 19 20 sort(sx+1,sx+1+cnt);//离散化排序 21 cnt=unique(sx+1,sx+1+cnt)-sx-1;//离散化去重
第二种 不保序离散化的 代码:
1 unordered_map<int,int> S;//哈希表离散化 2 int cnt=0//离散化数量 3 4 int get(int x) 5 { 6 if(!S.count(x))S[x]=++cnt; 7 return S[x]; 8 }
end!!!
标签:总结,map,cnt,int,mid,化后,离散 来源: https://www.cnblogs.com/qinmo/p/16035798.html