离散化的总结

三种离散化的方法

① 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,不会,用第一种

有错误理解请指出,我只是抱着试试看的心态写的

(说出来你可能不信,五分钟我已经回来改了两次致命错误了了)

猜你喜欢

转载自blog.csdn.net/weixin_43768644/article/details/94465682
今日推荐