建模的思考
来源:互联网 发布:mac最大化窗口的快捷键 编辑:程序博客网 时间:2024/06/05 20:59
前段时间做了个项目,大约目的是要根据用户的位置(经度纬度),找到用户附近的一些有意思的东西给他们。这些有意思的东西是存在后台数据库的,主要也是经度和纬度来表示其位置。拿到这个项目,最开始想到的就是求距离的公式,事实上在网上可以找到很多根据两点的经纬度来计算其距离的公式(球面距离)。但是,问题的瓶颈在于,我们如何快速的从数据库里找到用户的位置周围(比如说1公里)内的所有有意思的东西。经纬度是个2维的东西,我们拿到用户的位置经纬度,如何去写sql语句去数据库里查找呢。数据库里如何建索引呢?根据经纬度显然不行。
于是我们想到,先直接比较经度和纬度,把用户的点周围化一个正方形,而内切圆半径就是1公里(当然,由于纬度不同的地方实际上相同经度差代表的距离并不同,并不是严格意义上的正方形),再进行精细计算,可以满足需求。这样查找的sql语句就类似写成:select * from aTable where lng - lngdb < n and lat - latdb < n; 但这样的查找效率并不乐观,基本上是全表查询(没法建立索引)。
这里的问题根源在于位置是个二维的东西。我们能否把二维的东西转化成一维的东西呢,如果是这样,那么对一维的东西我们就可以排序,可以建索引,可以方便快速的查询。好在网上有这个东西:geohash。它的思想很值得我们学习。我总结起来是:无限逼近思想。因为二维的东西不可能精确的用一维的东西来表示,但我们可以让其约等于。具体的算法我就不再赘述了,google上搜索geohash就可以找到很多介绍和详细的算法描述以及源代码(思路简单但代码不好看懂啊)。这里主要是因为我们并不需要精确的位置,我们也只是要找附近的东西。
结合最近正在阅读的吴军博士的《数学之美》,发现用函数(geohash也可以理解为转经纬度为一个字符串的函数)去近似的模拟一个比较复杂的过程,可以节省大量的费时费空间的过程(比如查找,排序等),虽然可能结果不是100%准确,但是大部分时候,这就够了!! 而一个函数的代价是非常小的(往往只有cpu的运行)。所以,对于一些比较复杂的过程,我们建立一个简单的数学模型,是非常重要的。
- 建模的思考
- 数学建模的一些思考
- 四色原型图进行业务建模的思考
- 对业务建模的思考——为什么要业务建模
- [全程建模]关于最佳实践的思考——谈实事求是
- 针对08年数学建模年D题一个算法的思考
- #听音乐学Java#1【有关对象的思考:对象技术及统一建模语言】
- Houdini学习 —— 基于节点的过程化建模初探及思考
- 领域驱动设计建模思考与实践
- 对思考的思考
- 关于思考的思考
- 关于思考的思考
- 有关思考的思考
- [全程建模]几个建模问题的回答
- 数据仓库建模与数据库建模的比较
- 建模的误区
- 软件建模的困境
- 建模的误区
- Eclipse安装插件支持jQuery智能提示
- Hadoop集群配置
- Linux脚本(shell)编程(二) 基本语法
- 自动备份数据库的脚本
- 我的常用模式
- 建模的思考
- 【字典树】杭电1251 : 统计难题
- 工作流引擎调用业务逻辑
- B树、B-树、B+树、B*树都是什么
- Ogre的粒子
- 通过eclipse工具实现对ws的调用
- Windows7下eclipse字体太小的问题解决
- Linux中运行silverlight 的方法
- centos5.5下实现asterisk1.8_*+RSTP安装及配置过程