今天微信朋友圈有人发了这样一条消息,如下:
对于80%的人来说,玩儿这个游戏的方法就是拿眼睛瞅了,瞅到一个算一个,大部分人都能找到:章,兄,立,早。
细心一点的人能找到:克,十,儿,古。
处女座的应该还能再加上:一,音。
但是,如果你问一个人他找这些字的思路是什么,相信他会这样回答你:这还需要思路吗?看着有这个字就写出来喽。
普通人这么说当然无可厚非,但这种话不应该从一个研究过算法的人嘴里说出来,生活中我们做任何事情,都有应该有一个基本思路,小到整理试卷时候的高效排序方式(据我们老师讲他尝试过,最快的整理方式是归并排序,大多数人应该是遵循插入排序的思想),大到出门旅游时的线路选择(最短路径,最经济路径),算法可以为我们解决生活中的许多问题。
自从有了女儿以来,我一直在观察她从出生到目前(三岁零九个月)的语言形成和行为方式,我不知道有多少人这样做过,如果观察过的人应该可以理解我下面的话:很多时候,人和机器是没有太大区别的,时至今日,我女儿说的每一句话,出现的每一种看似出乎意料的表情和动作,仔细分析后基本都可以在她过往的经历中找到原型。
从研二开始,我对机器学习产生了很大的兴趣,尤其是深度学习,我坚信在未来的30到50年,一定会有比肩人类的人工智能出现,拥有涌现、联想、抽象的能力。
话题扯远了......
下面我们尝试用简单的算法来解决这个小游戏吧:
首先这个问题和以往研究过的某一类问题很像,具有“联想”和“抽象”能力的你一定发现了,没错,那就是字符串匹配算法。
在以往,我们研究过的大多数的匹配都是针对字符串,对于这样“结构化汉字串”(请允许我这么称呼它)而言,无非就是从最基本的笔画开始,依次往后进行组合,然后与字典进行匹配,找到对应的字就输出嘛,如此看来,这与字符串匹配没有什么两样。
那就从“丶”笔画开始喽,字典里有的字:首先找到了立、继续往下,找到音,继续往下,找到章,再往下搜索完所有笔画没有匹配的汉字了
从“一”笔画开始,找到一,然后没有了
以此类推
我们的汉字匹配程序找到了什么字呢?
立,音,章,一,日,早,(二),干,十,古,克,口,兄,儿
还不错嘛~遗憾就是这种算法会破坏字体的结构,比如找到的二,我们可以找到一定的规则来消除这样的错误匹配。
另一个遗憾就是时间复杂度太高啦,找这么简单的结构当然没问题,但是如果有一个超级无聊大变态给你写了一个巨长的字(假设由1亿个基本汉字摞起来)让你找,这个算法恐怕就有点力不从心了。
在字符串匹配领域最高效的当然首推我前文提到的moore教授的算法和KMP三位大神的算法了,可惜在此处有不适用的地方,需要我们进一步思考。
吃饭去也。