离散化的总结

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

(  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!!!

 

posted @   秦末  阅读(37)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
1 博文导航目录
点击右上角即可分享
微信分享提示