关于离散化呢,之前一直是似懂非懂,搞求不懂的= =。
其实这个东西是很好理解的。
那么假如说我们有3个数:100、1、1000。
如果我们在不会直接调用其值,而只处理之间的一个大致关系的时候看到这些数是不是有点不舒服,所以不如将其排序重组为2、1、3。这样是不是就舒服多了呢。
当然,我这里只是稍微使用一下我好理解的方式提到。
正规说法是:离散化,把无限空间中有限的个体映射到有限的空间中去,以此提高算法的时空效率。通俗的说,离散化是在不改变数据相对大小的条件下,对数据进行相应的缩小。
好,也就说,我们在面临一些随机分布的大型数据的时候,其本身肯定是无法完成被当作下标来使用的,但是呢我们可以由他们彼此之间的相对关系来给出一个数据量较小的连续序列来标榜这个关系,从而代替这些数据加以方便我们处理。
所以平时在线段树中空间开不够而使用离散化的情况是较多的。
具体的实现也是相当容易理解的。
void discretize() { for(int i = 1; i <= n; i++) //首先我们是要将原数组所保存的数据放入一个处理的数组中去方便处理。 { disc[i] = A[i]; } std::sort(disc + 1, disc + 1 + n); //排序是为了给出彼此关系 N = std::unique(disc + 1, disc + 1 + n) - (disc + 1); //去重。因为是利用关系再重新给出一个值替代,所以重复的我们应该不管他。 //那么这里强调一下由于unique处理的时候是将重复数据放在数组的最后面所以我们应该得到的是一个处理之后的数组长度。 for(int i = 1; i <= n; i++) //最后我们再在处理数组中找到原数组值的位置,然后再赋给原数组。 { A[i] = std::lower_bound(disc + 1, disc + 1 + N, A[i]) - disc; } }