其他分享
首页 > 其他分享> > 离散化的总结

离散化的总结

作者:互联网

很多题目如果 数据的大小范围很大,但是数量很少,如果按照数据的大小来排序,那么数组就会开的非常大,这样内存就会爆掉,这时候就要用离散化。

(  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