离散化

来源:互联网 发布:org.apache.tiles 编辑:程序博客网 时间:2024/04/29 13:19

原来一直不懂的东西呢…
后来发现也没什么,只要是专心去学习是可以搞明白的
百度百科的解释非常全面
离散化是将无限空间中有限的个体映射到有限的空间中去
具体来说就是,你需要一堆数据的相对大小,而不是绝对大小,就可以用离散化,把数据范围很大,但是数据数量很少的几个数放到一个小数组里,并且是一种映射关系

形象点,就是一个范围很大很大的数组里只有几个数,那剩下那些没有写入数据的内存不都浪费掉了吗?
这时候用离散化处理出那几个数,放到一个小数组里,就可以省时间省空间

实现

用两个元素的结构体,保存数值val和读入的次序order
读完啦之后,依据val进行排序,由于用结构体保存了order,排序后val和order依然一一对应

struct Node{int val, int order;}node[maxn];

这时候开一个for循环和一个r数组,从1到n循环这些数字,把for循环次序赋值给这些val原来的位置,这样就没有改变原数列中的次序关系

for(int i=1; i<=n; i++)    r[node[i].order] = i;