『ACM-算法-离散化』信息竞赛进阶指南--离散化

数据离散化是一个非常重要的思想。

为什么要离散化?

当以权值为下标的时候,有时候值太大,存不下。 所以把要离散化的每一个数组里面的数映射到另一个值小一点的数组里面去。

打 个 比 方 , 某 个 题 目 告 诉 你 有 1 0 4 个 数 , 每 个 数 大 小 不 超 过 2 40 , 要 你 对 这 些 数 进 行 操 作 , 你 开 l o n g l o n g 存 不 下 , 开 i n t 又 会 溢 出 , 那 怎 么 办 呢 ? 离 散 化 ! 打个比方,某个题目告诉你有10^4个数,每个数大小不超过2^{40},要你对这些数进行操作, 你开long long 存不下,开int 又会溢出,那怎么办呢?离散化! 104240longlongint
我们来看一下定义:离散化,把无限空间中有限的个体映射到有限的空间中去,以此提高算法的时空效率。

通俗的说,离散化是在不改变数据相对大小的条件下,对数据进行相应的缩小。
例如:

原数据: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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值