下图中的三个绳圈套在一起,没有哪一个绳圈能从中分离出来。不过,真正有趣的是,如果去掉其中任意一个绳圈,那么其他所有的绳圈都全部散开了。如果 n 个绳圈套在一起,并且任意去掉其中一个绳圈都会同时解开其他所有套着的绳圈,我们就把它叫做 n-component Brunnian link 。
你能想出一个 n = 4 的 Brunnian link 吗? n = 5 呢? n 可以任意大吗?
下图中的三个绳圈套在一起,没有哪一个绳圈能从中分离出来。不过,真正有趣的是,如果去掉其中任意一个绳圈,那么其他所有的绳圈都全部散开了。如果 n 个绳圈套在一起,并且任意去掉其中一个绳圈都会同时解开其他所有套着的绳圈,我们就把它叫做 n-component Brunnian link 。
你能想出一个 n = 4 的 Brunnian link 吗? n = 5 呢? n 可以任意大吗?
今年上半年,我在人人网实习了一段时间,期间得到了很多宝贵的数据,并做了一些还算有意义的事情,在这里和大家一块儿分享。感谢人人网提供的数据与工作环境,感谢赵继承博士、詹卫东老师的支持和建议。在这项工作中,我得到了很多与众人交流的机会,特别感谢 OpenParty 、 TEDxBeijing 提供的平台。本文已发表在了《程序员》杂志,分上下两部分刊于 2012 年 7 月刊和 8 月刊,在此感谢卢鸫翔编辑的辛勤工作。由于众所周知的原因,《程序员》刊出的文章被和谐过(看到后面大家就自动地知道被和谐的内容是什么了),因而我决定把完整版发在 Blog 上,同时与更多的人一同分享。对此感兴趣的朋友可以给我发邮件继续交流。好了,开始说正文吧。
作为中文系应用语言学专业的学生以及一名数学 Geek ,我非常热衷于用计算的方法去分析汉语资料。汉语是一种独特而神奇的语言。对汉语资料进行自然语言处理时,我们会遇到很多其他语言不会有的困难,比如分词——汉语的词与词之间没有空格,那计算机怎么才知道,“已结婚的和尚未结婚的青年都要实行计划生育”究竟说的是“已/结婚/的/和/尚未/结婚/的/青年”,还是“已/结婚/的/和尚/未/结婚/的/青年”呢?这就是所谓的分词歧义难题。不过,现在很多语言模型已经能比较漂亮地解决这一问题了。但在中文分词领域里,还有一个比分词歧义更令人头疼的东西——未登录词。中文没有首字母大写,专名号也被取消了,这叫计算机如何辨认人名地名之类的东西?更惨的则是机构名、品牌名、专业名词、缩略语、网络新词等等,它们的产生机制似乎完全无规律可寻。最近十年来,中文分词领域都在集中攻克这一难关。自动发现新词成为了关键的环节。
挖掘新词的传统方法是,先对文本进行分词,然后猜测未能成功匹配的剩余片段就是新词。这似乎陷入了一个怪圈:分词的准确性本身就依赖于词库的完整性,如果词库中根本没有新词,我们又怎么能信任分词结果呢?此时,一种大胆的想法是,首先不依赖于任何已有的词库,仅仅根据词的共同特征,将一段大规模语料中可能成词的文本片段全部提取出来,不管它是新词还是旧词。然后,再把所有抽出来的词和已有词库进行比较,不就能找出新词了吗?有了抽词算法后,我们还能以词为单位做更多有趣的数据挖掘工作。这里,我所选用的语料是人人网 2011 年 12 月前半个月部分用户的状态。非常感谢人人网提供这份极具价值的网络语料。
有一道非常经典的智力问题:假设有两个一模一样的硬币 A 和硬币 B ,如果让硬币 B 不动,让硬币 A 贴着硬币 B 旋转一周,那么硬币 A 自身旋转了多少周?一个常见的错误答案是“显然也是一周啊”,而实际上正确的答案是两周,如下图所示。我们有很多方法来解释这种现象,其中最传统的说法便是“公转了一周,自转了一周”。硬币 A 的运动是由两部分合成的,公转一周(想像一个人绕着地球走了一圈),以及自转一周(想像一个轮子在地面上滚动了一周)。想像你是站在硬币 B 中心处的一个小人儿,看着硬币 A 贴着你脚下的硬币转动一圈。如果在此过程中,你始终面向硬币 A ,那么在你看来,硬币 A 似乎就是在长为 2πr 的平地上滚了一圈。而实际上,在观察硬币 A 的过程中,你自己也原地转了 360 度,因此从外面的人看来,硬币实际上转了两周。
写了这篇文章后,我习惯性地开始用正多边形逼近的思路去分析一些与圆有关的一般性结论。在准备一份初中几何问题的材料时,我突然想到了上述问题的一个简单而漂亮的解释方法。
考虑一个传统的猜数游戏。 A 、 B 两名玩家事先约定一个正整数 N ,然后 A 在心里想一个不超过 N 的正整数 x , B 则需要通过向 A 提问来猜出 A 心里想的数。 B 的问题只有唯一的格式:先列出一些数,然后问 A “x 是否在这些数里”, A 则需要如实回答“是”或者“否”。显然, B 是保证能猜到 x 的,只需要依次询问“x 是否等于 1 ”,“x 是否等于 2 ”即可。由于 B 可以精心选出满足某种特征的所有数,询问 x 是否在这些数里,因而 B 还可以做得更好。例如当 N = 16 时, B 第一次可以问“x 是否小于等于 8 ”,或者等价地,“x 是否属于 {1, 2, 3, 4, 5, 6, 7, 8} ”;接下来,根据 A 的回复继续细问“x 是否小于等于 4 ”或者“x 是否小于等于 12 ”,以此类推。另一种方法则是询问“x 的二进制表达的第一位是否是 1”,“x 的二进制表达的第二位是否是 1”,以此类推,从而获得 x 的二进制表达的所有数位,便能推出 x 来。
现在,有意思的问题来了。假设 A 可以偶尔说谎(但保证不会连续说谎两次),那么 B 还能通过询问猜出 A 所想的数吗?如果愿意的话, B 可以询问任意多次。
从同事那里借来了一本单墫教授主编的《初等数论》奥数书,看到很多精彩的问题,在这里做个笔记,与大家一同分享。不少问题和答案都有过重新叙述,个别问题有所改动。
问题:找出所有使得 2n – 1 能被 7 整除的正整数 n 。
答案:由于 2n 的二进制表达为 1000…00 (n 个 0),因此 2n – 1 的二进制表达为 111…11 (n 个 1)。而 7 的二进制表达是 111 ,要想让它整除 n 个 1 ,显然 n 必须是也只能是 3 的倍数。