[常用技巧] 数据离散化入门介绍

离散化是程序设计中一个非常常用的技巧,它可以有效地降低时间复杂度。其基本思想就是在众多可能的情况中“只考虑我需要用到的值”。下面用几个例子说明,如何运用离散化改进一个低效的,甚至根本不可能实现的算法。

先看UVA10173
[ http://acm.uva.es/p/v101/10173.html ]

题目意思很简单,给定平面上n个点的坐标,求能够覆盖这些点的最小的矩形面积。

这里写图片描述

由于不知道这个矩形到底有倾斜多少度,所以先从倾斜0度的矩形开始考虑:要使覆盖这些点的矩形面积最小,那么这个矩形的每一条边上必定都存在至少一个点。转换成代码就是:对于所有的点坐标进行查找,选出其中x最小,y最小,x最大,y最大的值,所围成的矩形就是当前倾角为0°时的最小面积。

然而这只考虑当倾角为0°时的情况,想要求出所有可能的情况,当然是很自然地想到,枚举所有矩形可能的倾角,对于每一个倾角,都能计算出最小的矩形面积,最后取其中的最小值。

这个算法是否是正确的呢?且不说是否正确,它从理论上甚至根本不可能实现。矩形的倾角是一个实数,它有无数种可能,你永远不可能枚举出每一种可能的情况。也就是说,这个倾角是一个连续的变量,“连续”自然是无法枚举倾角的根本原因。我们需要一种方法,把这个连续的变量变成一个一个的值,也就是“离散”的变量。这个过程就是我们所说的离散化。

经过思考可以证明,最小面

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值