建模的思考

        前段时间做了个项目,大约目的是要根据用户的位置(经度纬度),找到用户附近的一些有意思的东西给他们。这些有意思的东西是存在后台数据库的,主要也是经度和纬度来表示其位置。拿到这个项目,最开始想到的就是求距离的公式,事实上在网上可以找到很多根据两点的经纬度来计算其距离的公式(球面距离)。但是,问题的瓶颈在于,我们如何快速的从数据库里找到用户的位置周围(比如说1公里)内的所有有意思的东西。经纬度是个2维的东西,我们拿到用户的位置经纬度,如何去写sql语句去数据库里查找呢。数据库里如何建索引呢?根据经纬度显然不行。

      于是我们想到,先直接比较经度和纬度,把用户的点周围化一个正方形,而内切圆半径就是1公里(当然,由于纬度不同的地方实际上相同经度差代表的距离并不同,并不是严格意义上的正方形),再进行精细计算,可以满足需求。这样查找的sql语句就类似写成:select * from aTable where lng - lngdb < n and lat - latdb < n; 但这样的查找效率并不乐观,基本上是全表查询(没法建立索引)。

     这里的问题根源在于位置是个二维的东西。我们能否把二维的东西转化成一维的东西呢,如果是这样,那么对一维的东西我们就可以排序,可以建索引,可以方便快速的查询。好在网上有这个东西:geohash。它的思想很值得我们学习。我总结起来是:无限逼近思想。因为二维的东西不可能精确的用一维的东西来表示,但我们可以让其约等于。具体的算法我就不再赘述了,google上搜索geohash就可以找到很多介绍和详细的算法描述以及源代码(思路简单但代码不好看懂啊)。这里主要是因为我们并不需要精确的位置,我们也只是要找附近的东西。

    结合最近正在阅读的吴军博士的《数学之美》,发现用函数(geohash也可以理解为转经纬度为一个字符串的函数)去近似的模拟一个比较复杂的过程,可以节省大量的费时费空间的过程(比如查找,排序等),虽然可能结果不是100%准确,但是大部分时候,这就够了!! 而一个函数的代价是非常小的(往往只有cpu的运行)。所以,对于一些比较复杂的过程,我们建立一个简单的数学模型,是非常重要的。

你可能感兴趣的:(建模的思考)