首页 »编程综合 » 数学之美系列二:数学的美系列 2十 4:从全球导航到输入法——谈谈动态规划 »正文
数学之美系列二:数学的美系列 2十 4:从全球导航到输入法——谈谈动态规划
来源: 发布时间:星期一, 2010年1月25日 浏览:0次 评论:0
Google、T-Mobile 和 HTC 宣布了第 ![](/icons/44860yi.gif) 款基于开源操作系统 Android ![](/icons/44860de.gif) 3G 手机 ![](/icons/44860dou.gif) 其中 ![](/icons/44860yi.gif) 个重要 ![](/icons/44860de.gif) 功能是利用全球卫星定位系统实现全球导航 ![](/icons/44860dou2.gif) 这个功能在其它手机中早已使用 ![](/icons/44860dou.gif) 并且早在 5 6年前就已经有实现这 ![](/icons/44860yi.gif) 功能 ![](/icons/44860de.gif) 车载设备出售 ![](/icons/44860dou2.gif) 其中 ![](/icons/44860de.gif) 关键技术只有两个:第 ![](/icons/44860yi.gif) 是利用卫星定位;第 2根据用户输入 ![](/icons/44860de.gif) 起终点 ![](/icons/44860dou.gif) 在地图上规划最短路线或者最快路线 ![](/icons/44860dou2.gif) 后者 ![](/icons/44860de.gif) 关键算法是计算机科学图论中 ![](/icons/44860de.gif) 动态规划(Dynamic Programming) ![](/icons/44860de.gif) 算法 ![](/icons/44860dou2.gif) ![](http://CrazyCoder.cn/WebFiles/20101/7768b63a-6c08-460e-a076-458547c20983.jpg) 在图论(请见拙著 ![](/icons/44860smhl.gif) 图论和网络爬虫 ![](/icons/44860smhr.gif) )中 ![](/icons/44860dou.gif) ![](/icons/44860yi.gif) 个抽象 ![](/icons/44860de.gif) 图包括 ![](/icons/44860yi.gif) 些节点和连接他们 ![](/icons/44860de.gif) 弧 ![](/icons/44860dou2.gif) 比如说中国公路网就是 ![](/icons/44860yi.gif) 个很好 ![](/icons/44860de.gif) “图” ![](/icons/44860de.gif) 例子:每个城市 ![](/icons/44860yi.gif) 是个节点 ![](/icons/44860dou.gif) 每 ![](/icons/44860yi.gif) 条公路是 ![](/icons/44860yi.gif) 个弧 ![](/icons/44860dou2.gif) 图 ![](/icons/44860de.gif) 弧可以有权重 ![](/icons/44860dou.gif) 权重对应于地图上 ![](/icons/44860de.gif) 距离或者是行车时间、过路费金额等等 ![](/icons/44860dou2.gif) 图论中很常见 ![](/icons/44860de.gif) ![](/icons/44860yi.gif) 个问题是要找 ![](/icons/44860yi.gif) 个图中给定两个点的间 ![](/icons/44860de.gif) 最短路径( ![](/icons/44860short.gif) est path) ![](/icons/44860dou2.gif) 比如 ![](/icons/44860dou.gif) 我们想找到从北京到广州 ![](/icons/44860de.gif) 最短行车路线或者最快行车路线 ![](/icons/44860dou2.gif) 当然 ![](/icons/44860dou.gif) 最直接 ![](/icons/44860de.gif) 笨办法是把所有可能 ![](/icons/44860de.gif) 路线看 ![](/icons/44860yi.gif) 遍 ![](/icons/44860dou.gif) 然后找到最优 ![](/icons/44860de.gif) ![](/icons/44860dou2.gif) 这种办法只有在节点数是个位数 ![](/icons/44860de.gif) 图中还行得通 ![](/icons/44860dou.gif) 当图 ![](/icons/44860de.gif) 节点数(城市数目)有几十个 ![](/icons/44860de.gif) 时候 ![](/icons/44860dou.gif) 计算 ![](/icons/44860de.gif) 复杂度就已经让人甚至计算机难以接受了 ![](/icons/44860dou.gif) ![](/icons/44860yinwei.gif) 所有可能路径 ![](/icons/44860de.gif) 个数随着节点数 ![](/icons/44860de.gif) 增长而成呈指数增长(或者说几何级数) ![](/icons/44860dou.gif) 也就是说每增加 ![](/icons/44860yi.gif) 个城市 ![](/icons/44860dou.gif) 复杂度要大 ![](/icons/44860yi.gif) 倍 ![](/icons/44860dou2.gif) 显然我们 ![](/icons/44860de.gif) 导航系统中不会用这种笨办法 ![](/icons/44860dou2.gif)
所有 ![](/icons/44860de.gif) 导航系统采用 ![](/icons/44860de.gif) 都是动态规划 ![](/icons/44860de.gif) 办法(Dynamic Programming) ![](/icons/44860dou.gif) 这里面 ![](/icons/44860de.gif) 规划(programming) ![](/icons/44860yi.gif) 词在数学上 ![](/icons/44860de.gif) 含义是“优化” ![](/icons/44860de.gif) 意思 ![](/icons/44860dou.gif) 不是计算机里面编程 ![](/icons/44860de.gif) 意思 ![](/icons/44860dou2.gif) 它 ![](/icons/44860de.gif) 原理其实很简单 ![](/icons/44860dou2.gif) 以上面 ![](/icons/44860de.gif) 问题为例 ![](/icons/44860dou.gif) 当我们要找从北京到广州 ![](/icons/44860de.gif) 最短路线时 ![](/icons/44860dou.gif) 我们先不妨倒过来想这个问题:假如我们找到了所要 ![](/icons/44860de.gif) 最短路线(称为路线 ![](/icons/44860yi.gif) ) ![](/icons/44860dou.gif) 如果它经过郑州 ![](/icons/44860dou.gif) 那么从北京到郑州 ![](/icons/44860de.gif) 这条子路线(比如是北京-> 保定->石家庄->郑州 ![](/icons/44860dou.gif) 称为子路线 ![](/icons/44860yi.gif) ) ![](/icons/44860dou.gif) 必然也是所有从北京到郑州 ![](/icons/44860de.gif) 路线中最短 ![](/icons/44860de.gif) ![](/icons/44860dou2.gif) 否则 ![](/icons/44860de.gif) 话 ![](/icons/44860dou.gif) 我们可以假定还存在从北京到郑州更短 ![](/icons/44860de.gif) 路线(比如北京->济南->徐州->郑州 ![](/icons/44860dou.gif) 称为子路线 2) ![](/icons/44860dou.gif) 那么只要用这第 2条子路线代替第 ![](/icons/44860yi.gif) 条 ![](/icons/44860dou.gif) 我们就可以找到 ![](/icons/44860yi.gif) 条从北京到广州 ![](/icons/44860de.gif) 全程更短 ![](/icons/44860de.gif) 路线(称为路线 2) ![](/icons/44860dou.gif) 这就和我们讲 ![](/icons/44860de.gif) 路线 ![](/icons/44860yi.gif) 是北京到广州最短 ![](/icons/44860de.gif) 路线相矛盾 ![](/icons/44860dou2.gif) 其矛盾 ![](/icons/44860de.gif) 根源在于 ![](/icons/44860dou.gif) 我们假设 ![](/icons/44860de.gif) 子路线 2或者不存在 ![](/icons/44860dou.gif) 或者比子路线 ![](/icons/44860yi.gif) 还来得长 ![](/icons/44860dou2.gif) 在实际实现算法时 ![](/icons/44860dou.gif) 我们又正过来解决这个问题 ![](/icons/44860dou.gif) 也就是说 ![](/icons/44860dou.gif) 要想找到从北京到广州 ![](/icons/44860de.gif) 最短路线 ![](/icons/44860dou.gif) 先要找到从北京到郑州 ![](/icons/44860de.gif) 最短路线 ![](/icons/44860dou2.gif) 当然 ![](/icons/44860dou.gif) 聪明 ![](/icons/44860de.gif) 读者可能已经发现其中 ![](/icons/44860de.gif) ![](/icons/44860yi.gif) 个“漏洞” ![](/icons/44860dou.gif) 就是我们在还没有找到全程最短路线前 ![](/icons/44860dou.gif) 不能肯定它 ![](/icons/44860yi.gif) 定经过郑州 ![](/icons/44860dou2.gif) 不过没有关系 ![](/icons/44860dou.gif) 只要我们在图上横切 ![](/icons/44860yi.gif) 刀 ![](/icons/44860dou.gif) 这 ![](/icons/44860yi.gif) 刀要保证将任何从北京到广州 ![](/icons/44860de.gif) 路 ![](/icons/44860yi.gif) 截 2 ![](/icons/44860dou.gif) 如下图 ![](/icons/44860dou2.gif) ![](http://CrazyCoder.cn/WebFiles/20101/71014936-530b-4c75-b540-f5ffb79ca9f6.jpg) 那么从广州到北京 ![](/icons/44860de.gif) 最短路径必须经过这 ![](/icons/44860yi.gif) 条线上 ![](/icons/44860de.gif) 某个城市(图中蓝色 ![](/icons/44860de.gif) 菱形) ![](/icons/44860dou2.gif) 我们可以先找到从北京出发到这条线上所有城市 ![](/icons/44860de.gif) 最短路径 ![](/icons/44860dou.gif) 最后得到 ![](/icons/44860de.gif) 全程最短路线 ![](/icons/44860yi.gif) 定包括这些局部最短路线中 ![](/icons/44860de.gif) ![](/icons/44860yi.gif) 条 ![](/icons/44860dou.gif) 这样 ![](/icons/44860dou.gif) 我们就可以将 ![](/icons/44860yi.gif) 个“寻找全程最短路线” ![](/icons/44860de.gif) 问题 ![](/icons/44860dou.gif) 分解成 ![](/icons/44860yi.gif) 个个小 ![](/icons/44860de.gif) 寻找局部最短路线 ![](/icons/44860de.gif) 问题 ![](/icons/44860dou2.gif) 只要我们将这条横切线从北京向广州推移 ![](/icons/44860dou.gif) 直到广州为止 ![](/icons/44860dou.gif) 我们 ![](/icons/44860de.gif) 全程最短路线就找到了 ![](/icons/44860dou2.gif) 这便是动态规划 ![](/icons/44860de.gif) 原理 ![](/icons/44860dou2.gif) 采用动态规划可以大大降低最短路径 ![](/icons/44860de.gif) 计算复杂度 ![](/icons/44860dou2.gif) 在我们上面 ![](/icons/44860de.gif) 例子中 ![](/icons/44860dou.gif) 每加入 ![](/icons/44860yi.gif) 条横截线 ![](/icons/44860dou.gif) 线上平均有十个城市 ![](/icons/44860dou.gif) 从广州到北京最多经过十 5个城市 ![](/icons/44860dou.gif) 那么采用动态规划 ![](/icons/44860de.gif) 计算量是 10×10×15 ![](/icons/44860dou.gif) 而采用穷举路径 ![](/icons/44860de.gif) 笨办法是 10 ![](/icons/44860de.gif) 15 次方 ![](/icons/44860dou.gif) 前后差了万亿倍 ![](/icons/44860dou2.gif) 那么动态规划和我们 ![](/icons/44860de.gif) 拼音输入法又有什么关系呢?其实我们可以将汉语输入看成 ![](/icons/44860yi.gif) 个通信问题 ![](/icons/44860dou.gif) 而输入法则是 ![](/icons/44860yi.gif) 个将拼音串到汉字串 ![](/icons/44860de.gif) 转换器 ![](/icons/44860dou2.gif) 每 ![](/icons/44860yi.gif) 个拼音可以对应多个汉字 ![](/icons/44860dou.gif) ![](/icons/44860yi.gif) 个拼音串就可以对应图论中 ![](/icons/44860de.gif) ![](/icons/44860yi.gif) 张图 ![](/icons/44860dou.gif) 如下: ![](http://CrazyCoder.cn/WebFiles/20101/6ef048c3-e15b-4cdc-9962-5b63e5fb60c2.jpg) 其中 ![](/icons/44860dou.gif) Y1,Y2,Y3,……,YN 是使用者输入 ![](/icons/44860de.gif) 拼音串 ![](/icons/44860dou.gif) W11,W12,W13 是第 ![](/icons/44860yi.gif) 个音 Y1 ![](/icons/44860de.gif) 候选汉字 ![](/icons/44860dou.gif) W21,W22,W23,W24 是对应于 Y2 ![](/icons/44860de.gif) 候选汉字 ![](/icons/44860dou.gif) 以此类推 ![](/icons/44860dou2.gif) 从第 ![](/icons/44860yi.gif) 个字到最后 ![](/icons/44860yi.gif) 个字可以组成很多很多句子 ![](/icons/44860dou.gif) 我们 ![](/icons/44860de.gif) 拼音输入法就是要根据上下文找到 ![](/icons/44860yi.gif) 个最优 ![](/icons/44860de.gif) 句子 ![](/icons/44860dou2.gif) 如果我们再将上下文 ![](/icons/44860de.gif) 相关性量化 ![](/icons/44860dou.gif) 作为从前 ![](/icons/44860yi.gif) 个汉字到后 ![](/icons/44860yi.gif) 个汉字 ![](/icons/44860de.gif) 距离 ![](/icons/44860dou.gif) 那么 ![](/icons/44860dou.gif) 寻找给定拼音条件下最合理句子 ![](/icons/44860de.gif) 问题就变成了 ![](/icons/44860yi.gif) 个典型 ![](/icons/44860de.gif) “最短路径”问题 ![](/icons/44860dou.gif) 我们 ![](/icons/44860de.gif) 算法就是动态规划 ![](/icons/44860dou2.gif) 上面这两个例子导航系统和拼音输入法看似没什么关系 ![](/icons/44860dou.gif) 但是其背后 ![](/icons/44860de.gif) 数学模型却是完全 ![](/icons/44860yi.gif) 样 ![](/icons/44860de.gif) ![](/icons/44860dou2.gif) 数学 ![](/icons/44860de.gif) 妙处在于它 ![](/icons/44860de.gif) 每 ![](/icons/44860yi.gif) 个工具都具有相当 ![](/icons/44860de.gif) 普遍性 ![](/icons/44860dou.gif) 在区别 ![](/icons/44860de.gif) 应用中都可以发挥很大 ![](/icons/44860de.gif) 作用 ![](/icons/44860dou2.gif) 我们在下 ![](/icons/44860yi.gif) 个系列将详细介绍专门针对拼音输入法 ![](/icons/44860de.gif) “维特比算法”
相关文章
读者评论
发表评论
|
|