离散化是指把无限空间中的有限个体映射到有限空间中去。
对于映射<key, value>
,key的数值范围较大而数据个数较少(即无限空间中的有限个体),如果按照key的数值范围开辟数组保存<key, value>
,数组过于稀疏会浪费大量空间;
所以将key离散化,创建两个映射<index, key>
和<index, value>
,分别存储key和value,原映射中匹配的key和value在两个新的映射中index相同;
在用key寻找value时,先用二分查找找到key对应的index,然后根据index找到value。
先创建映射<index, key>
(vector数组a):排序、去重
sort(a.begin(), a.end());
a.erase(unique(a.begin(), a.end()), a.end());
再使用index
作为下标创建映射<index, value>
(遍历一遍<key, value>
用key找到index,然后将value放入index位置得到<index, value>
);
实际使用中更多的是用index
作为下标创建前缀和数组或者树状数组等来解决问题(创建前缀和数组和树状数组的操作详见相关章节)。