在很多情况下,问题的范围虽然定义在整数集合$Z$,但是只涉及其中$m$个有限数值,并且与数值的绝对大小无关(只把这些数值作为代表,或只与它们的相对顺序有关)。此时,我们就可以把整数集合$Z$中的这$m$个整数与$1~m$建立映射关系。
通俗来讲,就是把无限空间中有限的个体映射到有限的空间中去,以此提高算法的时空效率。
算法流程
-
预处理
-
先将无序数组排序。
-
去重。
-
二分查找
知识拓展
模板
//离散化预处理
inline void discrete()
{
//排序
sort(a + 1,a + n + 1);
//去重
for(int i = 1;i <= n;++i)
{
if(i == 1 || a[i] != a[i-1])
b[++m] = a[i];
}
}
//二分查找 x映射为那个1~m之间的整数
inline int query(int x)
{
return lower_bound(b + 1,b + m + 1,x) - b;
}
查找是为什么要 - b?
通过返回的地址减去起始地址begin,得到找到数字在数组中的下标
++m是m从0开始吗
自己运行一下这个程序你就懂了。
有错误,或者不懂的可以在评论区提出。