很多题目如果 数据的大小范围很大,但是数量很少,如果按照数据的大小来排序,那么数组就会开的非常大,这样内存就会爆掉,这时候就要用离散化。
( 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
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。