三种离散化的方法
① unordered_map
排序,出重,直接mp[原数据类型] = 排名(O(1))
为所欲为。
相对的费空间。
而且我发现没有别人logN的离散化快
速度差了大概6倍,这个O(1)的赋值问题很大啊
总结:O(1)赋值,无限制,但是慢
②对于数据范围不是特别大的,直接开int[数据范围]的数组
如果数据个数也不多,直接开unsigned short可以指向六万多个数据(输出格式%ud)
先排序再去重,复杂度O(N*logN)
总结:O(1)赋值,范围过大映射数组会开不起,但是快
③
int data[N];///辅助数组
void discrete(int *a,int n)
{
for (int i=0;i<n;i++) data[i] = a[i];
sort(data,data+n);
int cnt = unique(data,data+n) - data;
for (int i=0;i<n;i++)
a[i] = lower_bound(data,data+cnt,a[i]) - data;
}
这个方法可以得出与原数组相应的离散化数组,以及可以根据离散化后的数据找到原数据
此处的lowerbound由于去重相当于直接二分找a[i]的位置
另外注意第二个for循环不是到cnt结束,那个cnt其实没什么用
data[1] = 100, data[2] =1321, data[3]=20001
a[1] = 1, a[2] = 3 , a[3] = 2
data[a[1]] = 100, data[a[2]] = 20001,data[a[3]] = 1321
总结:O(logN)赋值,比②浪费一点时间以及实际比①省点时间,以及,为所欲为。
总结的总结:
数据量很小,人又很懒就用第一种
数据范围不大空间充足用第二种
数据范围大开不起映射数组,又怕超时就用第三种
string映射int,不会,用第一种
有错误理解请指出,我只是抱着试试看的心态写的
(说出来你可能不信,五分钟我已经回来改了两次致命错误了了)