教育的本质不是将篮子填满,而是将灯点亮。

简单性和模块化是软件工程的基石;分布式和容错性是互联网的生命。 —— 蒂姆·博纳斯·李

Virture is like a rich stone,best plain set.(美德如同宝石,在朴素的映衬下最显华丽) —— 培根

爱是一念之差,最幸福的不过是,你曾经的呼唤,而我恰有过应答。 —— 朝小诚《黑白》

技术分为术和道2种。具体的做事方法是术,做事的原理和原则是道。很多具体的技术很快就会从独门绝技到普及,再到落伍,追求术的人一辈子很辛苦,只有掌握了道才能够做到游刃有余。追求“术”的人多半抱有侥幸心理,想走捷径,但真正做好一件事没有捷径,需要一万小时的专业训练和努力,也就是“一万小时定律”。

中国古代的阴阳学说可以看做是二进制的雏形。

数据库索引和布尔代数息息相关。

网络爬虫一般的步骤是“下载-索引-排序”,其中广度优先遍历用得比较多。

完全随机的高斯白噪声是很难消除的。

文字语言 VS 数字和信息

信息的冗余是信息安全的保障。信息的作用在于消除不确定度。

阿拉伯数字的发明人其实是古印度人,阿拉伯人其实是二道贩子。

从象形文字到拼音文字是一个飞跃,因为人们在描述物体的外表到抽象的概念,同时不自觉采用了对信息的编码。常用字笔画少,生僻字笔画多,完全符合信息论中的最短编码原理,省材料省时间。

在通信时如果信道较宽,就可以直接传输;如果信道较窄就需要在通信前尽可能压缩,在接收端进行解压。将日常白话写成精简的文言文本质上是压缩。

犹太学者在抄写《圣经》的时候采用了校验码机制。将每一个字母映射为一个数字。将每一行的数字加起来得到一个奇怪的数字,就是这一行的校验码,同理可以得出每一列的校验码。如果某一行的校验码有差别就知道该行有错,再次判断每一列的校验码,即可快速定位。

自然语言处理——从规则到统计

图灵测试:让人和机器进行交流,如果人无法判断自己交流的对象是人还是计算机,就说明机器具有了智能。

莱特兄弟发明飞机依靠的是空气动力学而不是仿生学。今天的机器翻译和语音识别并不是计算机理解了自然语言,他们全部依靠的是统计学。

程序设计语言是上下文无关文法,而自然语言是上下文有关文法。

隐含马尔科夫模型

雅格布森通信6要素:信源、信道、信息、接受者、上下文和编码。

马尔马夫模型指的是随机过程中的每个状态都只和它前面的一个状态有关。例如:明天的天气只和今天的天气有关而和昨天的无关。这种假设未必正确,但是在不少的棘手的问题上都得到了近似解。该模型首先应用于通信领域,继而推广到语音和语言处理,也是机器学习的主要工具。机器学习依靠一个训练算法(鲍姆-卡尔其算法)和使用时的解码算法(维特比算法)。

通信的度量和所用

信息熵

主要用来评价信息量。一条信息的信息量和它的不确定性有着直接的关系。例如如果我们对某件事一无所知就需要了解大量的信息。变量的不确定性越大,熵越大。同样字数的书,所含信息量可能相差很多。如果一本书重复内容多,它的信息量就小,冗余度就大。汉语的冗余度相对较小,这也暗示了“汉语是最简单的语言”。几乎所有的自然语言处理信息和信号处理的应用都是一个消除不确定性的过程。

Google PageRank算法

如果一个网页被其他许多网页所链接,说明它受到承认和信赖,那么它的排名就高。类似于明主表决,网页排名高的网站共享的链接权重大。该算法的核心是矩阵相乘,利用稀疏矩阵进行化简,使用MapReduce(本质上是分治)并行计算工具进行计算。

信息指纹和网络爬虫

在网络爬虫中为了防止重复下载同一url需要将其放到hash表中。但是以字符串的形式存储浪费空间(哈希表的存储效率一般只有50%),查找也耗时(网址一般很长)。我们可以将这些url映射为128比特的二进制,我们只需要16个字节存储一个网址,同时这个整数的查找效率远远高于字符串。

从判定集合相等问题到YouTube视频反盗版

判定集合相同一般有以下的几种做法:

  1. 一一比较,O(N^2)
  2. 排序比较,O(NlgN)
  3. 哈希表,O(N),但需要额外存储空间
  4. 分别计算每个元素的指纹并相加(我们可以联想到java中的hashCode方法)

将以上的算法4稍加改动就可以用来判断文章是否抄袭——将文章切分成小段,找出关键词集合,计算指纹,根据时间先后就可以找出原创和抄袭的文章。YouTube的视频反盗版也是提取关键帧(视频中绝大多数是过渡帧),对关键帧进行指纹。

图论和欧拉七桥

每个顶点和它连接的边称为。如果一个图能够从一个顶点出发,每条边不重复走一遍然后回到这个顶点,那么这一顶点的度必为偶数。

我们可以这样证明以上结论:如果能够遍历图的每条边各一次。那么对于每个顶点进入和离开顶点的次数是相同的,因此对于每个顶点有多少条进入的边就有多少条出去的边。每个顶点相连边的数量成对出现,即:每个顶点的度都是偶数。

新闻分离和余弦定理

金融类的新闻中股票、利息、债券、银行等词出现的几率较高;而二氧化碳、宇宙、诗歌、木匠、诺贝尔等词出现的较少。如果两个新闻属于同一类,他们的特征向量在某几个维度的值比较大,而其他维度的值比较小。

余弦定理:

1
a^2 = b^2 + c^2 - 2bcCosA

证明可以使用向量法。勾股定理其实是夹角为π/2时的余弦定理。向量的夹角为0表示两条新闻完全相同。余弦定理也可以用来处理聚类问题

VCD分解

  • View,视觉
  • Controller,控制
  • Data,数据

解决问题的两大必要条件:首先要有好的思路,如果方向不对,再怎么努力也无法到达目的地;同时,扎实的基础、毅力、效率也非常重要,否则只能是空中楼阁、纸上谈兵。– 金出武雄《像外行一样思考,像专家一样实践》

跳出现有的成功往往是最困难的。像外行一样自由发散地想出创意、以专业人士的方法去付诸实现,这种思路是非常必要的。

辗转相除法是现代密码学RSA算法的基础。

编辑器中常见的撤销和重试可以使用使用stack这种数据结构来保存。

白名单应用是众多二分查找算法的用例之一。

怪诞心理学

1.女性的征友广告如果让男性来写往往会带来更多的回应,但是男性的征友广告如果换成女性来写就不会有这种效果。
2.蒙娜丽莎的微笑之所以那么什么是达芬奇出色的画法所致。如果你看着她的眼睛,她的笑容就会非常明显,而且非常迷人。如果看她的嘴唇,微笑就消失了。
3.有些看起来很诡异的体验,例如感觉到有神秘的东西存在,事实上都是风吹过打开的窗户时产生的低频声波所致。
4.夏季出生的人比冬季出生的人更幸运一些,出生时的温度差异让夏季出生的人更乐观积极,而且更容易把握身边的机会。
5.鉴别谎言的最佳方法是取聆听而不是去观看。说谎者通常说的话不多,不会给出太多的细节,而且使用表示“我”的单词I的频率远远低于说真话的人。
6.真心的笑容和虚假的笑容之间的差异都写在了人的眼睛上;当人们露出真心的笑容时,眼睛周围的皮肤会形成皱纹;当人们假笑时,眼睛周围的皮肤就依然是平平的。

等价关系

等价关系是一种二元关系,满足自反性(x等价x自身)、对称性(若x等价y,则y等价x)和传递性(x等价y,y等价z,则x等价z)。

仅仅用一个整数实现存储年月日

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Date {
/**
* 这种实现的正确性基于日的范围位于0~31,月的值位于0~15,年的值为正
* 512 / 32 = 16
*/
constructor(year,month,day){
this.value = year * 512 + month * 32 + day
}
get year(){
return this.value / 512 | 0
}
get month(){
return (this.value / 32 | 0) % 16
}
get day(){
return this.value % 32
}
toString(){
return [this.year,this.month,this.day].join('-')
}
}

判断回环变位

如果字符串s中的字符循环移动位置之后可以得到另一个字符串t,那么s就被称为t的回环变位(sircular rotation),例如:ACTGACG就是TGACGAC的回环变位,反之亦然。判断这个条件在基因组序列的研究中非常重要。下面的实现仅仅用了一行代码。

1
2
3
var isCircularRotation = function(str1,str2){
return str1.length === str2.length && str1.repeat(2).indexOf(str2) != -1
}

上面的循环等价于2倍的思想非常重要,一个典型的应用就是前端开发中的无缝滚动通常将需要循环播放的图片实体设置为2倍大小,外边使用1倍大小的容器包裹,多余的部分隐藏。

递归的应用

字符串反转

1
2
3
4
5
6
7
8
9
10
// 自底向上反转字符串
var mystery = function(str){
var N = str.length
if (N <= 1) return str

var mid = N >>> 1
var a = str.slice(0,mid)
var b = str.slice(mid,N)
return mystery(b) + mystery(a)
}

以上是分治法的简单应用。将一个长的字符串分为2个部分,后边的字符加上前面的字符组成新的字符串。如果将最后的return条件改为mystery(a) + mystery(b)则返回的是字符串本身。

Mac电脑中的数学

Mac的桌面窗口一开始就被乔布斯要求设计成圆角,而计算机画圆形图案涉及到平方根计算,当时的 CPU(摩托罗拉68000微处理器)并不支持平方根计算。为此,阿特金森研究出一个加法运算来代替平方根运算的算法:一组奇数序列相加可以得到一组完全平方数序列(如,1+3=4,1+3+5=9,等等)。等差数列求和。1 + 3 + 5 + … + 2*n - 1 = n^2。

微波炉与ISM频段

1945年,美国雷神公司一位工程师在研究微波雷达的时候,无意中发现 2.4GHz 频段的电磁波会使得口袋中的巧克力融化,从而发现了微波的热效应,发明了微波炉。

大量实验测量表明,2.450GHz 频率电磁波能很好的使得水分子等极性分子跟随电磁波发生振荡,从而在宏观上表现为食物被加热。

之后 2.4GHz 逐渐成为了各国通用的「ISM频段」之一,大量的工业、科研、医学、家用无线设备的工作频率都在这一频段,包括我们常见的蓝牙设备(2.402GHz - 2.480GHz)。

由此可见:

  1. 在雨天等潮湿环境下,Wi-Fi 信号会因为被水分子吸收而变差;
  2. 很多无线设备在 2.4GHz 频段下工作,导致 Wi-Fi 信号很容易被干扰。

斐波那契数列

斐波那契数列和我们的物理世界有着千丝万缕的联系。

  • 爬楼梯

抗锯齿原理

图像显示的锯齿是每一个像素非黑即白渲染,显示器中的一个个像素可以看成是一个个的小正方形,小正方形的边缘是无法表现出平滑的效果的,响应的就会产生锯齿感。抗锯齿就是在边缘的位置使用不同深度的颜色或者利用透明度这样的概念,使得边缘的渲染效果不是“非黑即白”的,而是存在灰度的,人眼在视觉上看上去在边缘的地方相对平滑。

抗锯齿原理.png

双缓冲

画布上物体的运动需要这样表现:计算出物体新出现的位置->清空画布->重新渲染画布。这个过程中画布会被清空,从而造成屏幕闪烁。双缓存是对应显示屏幕的画布有2块,第一块画布的物体显示在屏幕上的时候,我们的计算以及绘制发生在第二块画布上,第二块画布绘制好之后将第二块画布投影到屏幕上,从而可以放心大胆地清空第一块画布,采用这种方式我们不会在屏幕上看到画布清空的瞬间。

双缓冲.png

蒙特卡洛算法

统计学中的一种方法,是一种模拟。是二战期间为了解决原子弹研制过程中裂变物质中子随机扩散问题,美国数学家冯诺依曼和乌拉姆等提出的一种统计方法,代号:蒙特卡洛。之所以取这个代号,是因为蒙特卡洛位于摩纳哥,是当时非常著名的一个赌城,而随机模拟的方法和赌博的关系非常大。

种一棵树最好的时间是十年前,而后是现在。
东隅已逝,桑榆非晚。 ——王勃《滕王阁序》