数据离散化是一个非常重要的思想。
为什么要离散化?
当以权值为下标的时候,有时候值太大,存不下。 所以把要离散化的每一个数组里面的数映射到另一个值小一点的数组里面去。
打
个
比
方
,
某
个
题
目
告
诉
你
有
1
0
4
个
数
,
每
个
数
大
小
不
超
过
2
40
,
要
你
对
这
些
数
进
行
操
作
,
你
开
l
o
n
g
l
o
n
g
存
不
下
,
开
i
n
t
又
会
溢
出
,
那
怎
么
办
呢
?
离
散
化
!
打个比方,某个题目告诉你有10^4个数,每个数大小不超过2^{40},要你对这些数进行操作, 你开long long 存不下,开int 又会溢出,那怎么办呢?离散化!
打个比方,某个题目告诉你有104个数,每个数大小不超过240,要你对这些数进行操作,你开longlong存不下,开int又会溢出,那怎么办呢?离散化!
我们来看一下定义:离散化,把无限空间中有限的个体映射到有限的空间中去,以此提高算法的时空效率。
通俗的说,离散化是在不改变数据相对大小的条件下,对数据进行相应的缩小。
例如:
原数据:12,9999,9000900,150;处理后:1,3,4,2;
原数据:{100,200},{20,50000},{1,400};处理后:{3,4},{2,6},{1,5};
但是离散化仅适用于只关注元素之间的大小关系而不关注元素本身的值!
// 离散化
void discrete() {
sort(a + 1, a + n + 1);
for (int i = 1; i <= n; i++) // 也可用STL中的unique函数
if (i == 1 || a[i] != a[i - 1])
b[++m] = a[i];
}
// 离散化后,查询x映射为哪个1~m之间的整数
void query(int x) {
return lower_bound(b + 1, b + m + 1, x) - b;
}