`

数学之美 二十四 从全球导航到输入法——谈谈动态规划

阅读更多
今年九月二十三日,Google、T-Mobile 和 HTC 宣布了第一款基于开源操作系统 Android 的 3G 手机,其中一个重要的功能是利用全球卫星定位系统实现全球导航。这个功能在其它手机中早已使用,并且早在五六年前就已经有实现这一功能的车载设备出售。其中的关键技术只有两个:第一是利用卫星定位;第二根据用户输入的起终点,在地图上规划最短路线或者最快路线。后者的关键算法是计算机科学图论中的动态规划(Dynamic Programming)的算法。
   


在图论(请见拙著《图论和网络爬虫》)中,一个抽象的图包括一些节点和连接他们的弧。比如说中国公路网就是一个很好的“图”的例子:每个城市一是个节点,每一条公路是一个弧。图的弧可以有权重,权重对应于地图上的距离或者是行车时间、过路费金额等等。图论中很常见的一个问题是要找一个图中给定两个点之间的最短路径(shortest path)。比如,我们想找到从北京到广州的最短行车路线或者最快行车路线。当然,最直接的笨办法是把所有可能的路线看一遍,然后找到最优的。这种办法只有在节点数是个位数的图中还行得通,当图的节点数(城市数目)有几十个的时候,计算的复杂度就已经让人甚至计算机难以接受了,因为所有可能路径的个数随着节点数的增长而成呈指数增长(或者说几何级数),也就是说每增加一个城市,复杂度要大一倍。显然我们的导航系统中不会用这种笨办法。

所有的导航系统采用的都是动态规划的办法(Dynamic Programming),这里面的规划(programming)一词在数学上的含义是“优化”的意思,不是计算机里面编程的意思。它的原理其实很简单。以上面的问题为例,当我们要找从北京到广州的最短路线时,我们先不妨倒过来想这个问题:假如我们找到了所要的最短路线(称为路线一),如果它经过郑州,那么从北京到郑州的这条子路线(比如是北京-> 保定->石家庄->郑州,称为子路线一),必然也是所有从北京到郑州的路线中最短的。否则的话,我们可以假定还存在从北京到郑州更短的路线(比如北京->济南->徐州->郑州,称为子路线二),那么只要用这第二条子路线代替第一条,我们就可以找到一条从北京到广州的全程更短的路线(称为路线二),这就和我们讲的路线一是北京到广州最短的路线相矛盾。其矛盾的根源在于,我们假设的子路线二或者不存在,或者比子路线一还来得长。

在实际实现算法时,我们又正过来解决这个问题,也就是说,要想找到从北京到广州的最短路线,先要找到从北京到郑州的最短路线。当然,聪明的读者可能已经发现其中的一个“漏洞”,就是我们在还没有找到全程最短路线前,不能肯定它一定经过郑州。不过没有关系,只要我们在图上横切一刀,这一刀要保证将任何从北京到广州的路一截二,如下图。
   


那么从广州到北京的最短路径必须经过这一条线上的某个城市(图中蓝色的菱形)。我们可以先找到从北京出发到这条线上所有城市的最短路径,最后得到的全程最短路线一定包括这些局部最短路线中的一条,这样,我们就可以将一个“寻找全程最短路线”的问题,分解成一个个小的寻找局部最短路线的问题。只要我们将这条横切线从北京向广州推移,直到广州为止,我们的全程最短路线就找到了。这便是动态规划的原理。采用动态规划可以大大降低最短路径的计算复杂度。在我们上面的例子中,每加入一条横截线,线上平均有十个城市,从广州到北京最多经过十五个城市,那么采用动态规划的计算量是 10×10×15,而采用穷举路径的笨办法是 10 的 15 次方,前后差了万亿倍。

那么动态规划和我们的拼音输入法又有什么关系呢?其实我们可以将汉语输入看成一个通信问题,而输入法则是一个将拼音串到汉字串的转换器。每一个拼音可以对应多个汉字,一个拼音串就可以对应图论中的一张图,如下:
   


其中,Y1,Y2,Y3,……,YN 是使用者输入的拼音串,W11,W12,W13 是第一个音 Y1 的候选汉字,W21,W22,W23,W24 是对应于 Y2 的候选汉字,以此类推。从第一个字到最后一个字可以组成很多很多句子,我们的拼音输入法就是要根据上下文找到一个最优的句子。如果我们再将上下文的相关性量化,作为从前一个汉字到后一个汉字的距离,那么,寻找给定拼音条件下最合理句子的问题就变成了一个典型的“最短路径”问题,我们的算法就是动态规划。

上面这两个例子导航系统和拼音输入法看似没什么关系,但是其背后的数学模型却是完全一样的。数学的妙处在于它的每一个工具都具有相当的普遍性,在不同的应用中都可以发挥很大的作用。

我们在下一个系列将详细介绍专门针对拼音输入法的“维特比算法”。
分享到:
评论

相关推荐

    黑莓输入法——点讯

    《黑莓输入法——点讯》 在移动通信领域,黑莓手机因其高效的企业级电子邮件服务和独特的全键盘设计而备受赞誉。然而,对于许多用户来说,原生的黑莓输入法在速度和便捷性上可能无法满足他们的需求。这时,第三方...

    T9输入法——vs2008

    【T9输入法——VS2008】是一款在Visual Studio 2008环境下开发的T9输入法实现,它允许用户通过简单的数字键操作输入汉字,特别适合于手机和其他小型设备上使用。T9输入法的核心在于其高效的文本预测和自动补全功能,...

    输入法——搜狗拼音输入法

    搜狗拼音输入法是一款在中国广泛使用的汉字输入法,它以其智能拼音输入技术、丰富的词汇库和用户友好的界面而受到用户的喜爱。最新版的搜狗拼音输入法在原有基础上进行了多方面的优化和升级,旨在提供更高效、准确的...

    繁体输入法——绿色版

    你喜欢繁体字吗?那么请你试试这一款最新软件吧,很好用的。

    简单易用的智能输入法——H3智能输入法

    完美破解,无需注册码,安装时选择手动即可。适合不会打字的朋友。

    最好用的五笔输入法——小鸭五笔

    小鸭五笔是一款备受好评的五笔输入法,它以其高效、简洁的特性深受用户喜爱。在中文输入法领域,五笔输入法以其快速的录入速度和精准的字词匹配,一直占据着重要的地位,尤其是对于熟悉五笔字根的人来说,小鸭五笔...

    源码——Qt输入法面板.zip

    总之,"源码——Qt输入法面板.zip"是一个全面展示Qt输入法实现的项目,涵盖了从基础的GUI编程到复杂的数据处理和内核移植等多个方面的技术知识。通过学习和研究这个项目,开发者可以提升在Qt环境下开发嵌入式输入法...

    linux下中文输入法——fcitx-3.2.051108.rpm

    亲测可用,系统是redhat Linux 5,配置方法网上找相关博客,很详细。

    搜狗拼音输入法6.2.0安装包

    与传统输入法不同,搜狗输入法是第一款为互联网而生的输入法——它通过搜索引擎技术,将互联网变成了一个巨大的“活”词库。网民们不仅仅只是词库的使用者,同时也是词库的生产者。搜狗输入法的出现,使用户的输入...

    极速五笔——开源输入法

    【极速五笔——开源输入法】是一款以快速、高效为特点的中文输入法软件,它以开源的形式提供给用户,鼓励社区参与开发和优化。开源意味着源代码对公众开放,任何人都可以查看、学习、修改并分发代码,这使得极速五笔...

    windows 8 美式键盘输入法 注册表

    找回 windows 8 美式键盘输入法。运行注册表即可。

    自然语言课程设计——简单汉字输入法java实现

    5. **动态规划算法**:为了实现输入法的联想功能,可能会使用到动态规划算法,如Dijkstra算法或者A*搜索算法,以找到最可能的候选词。 6. **用户界面设计**:Java提供了Swing或JavaFX库用于构建用户界面。输入法的...

    安卓Android源码——类似搜狗输入法源码.zip

    在本资源中,我们主要探讨的是一个基于安卓(Android)平台的输入法源码,它类似于知名的搜狗输入法。这个源码可以帮助开发者深入了解如何在Android操作系统上构建自定义的输入法应用,以及掌握相关的核心技术和实现...

    Android源码——类似搜狗输入法android源码.zip

    "Android源码——类似搜狗输入法android源码.zip" 这个标题揭示了我们即将探讨的主题,即一个与搜狗输入法相仿的Android应用程序的源代码。搜狗输入法是一款流行的手机输入法,以其智能预测、便捷切换和丰富的表情...

    PB 切换输入法的动态库

    PB 切换输入法的动态库PB 切换输入法的动态库PB 切换输入法的动态库

    安卓Android源码——注释过的谷歌输入法PinyinIME源码.zip

    这份源码资源,"安卓Android源码——注释过的谷歌输入法PinyinIME源码.zip",包含了解析和注释过的谷歌输入法PinyinIME的源代码,对于开发者来说,它是一个宝贵的教育资源,可以深入理解输入法应用的内部工作原理...

    QQ二笔输入法,qq输入法挂纯净二笔词库

    二笔输入法是基于二笔画编码的一种高效汉字输入方式,它以汉字的基本笔画——横、竖、撇、捺、折为依据进行编码,通过组合这些基本笔画来输入汉字。QQ输入法在原有的基础上,提供了更加纯净的二笔词库,旨在提升用户...

    极点二笔输入法7.15

    极点二笔输入法7.15,二笔爱好者,五笔困难者的福音

    Android源码——输入法手势程序源码.zip

    本压缩包“Android源码——输入法手势程序源码.zip”包含了一个实现手势输入功能的Android应用源代码,以及可能的示例图片资源。下面我们将深入探讨相关的Android开发知识点。 首先,我们要理解Android输入法的工作...

Global site tag (gtag.js) - Google Analytics