机器智能的本质——分类与组合
计算机虽然最初是用于科学计算的,但是很快他处理的对象就涵盖了世界上的所有东西,有具体的,比如人,动物和物品,也有抽象的,比如加法,函数等。对于这些东西,无论是抽象的还是具体的,大部分操作其实不是计算,而是分类,组织,查找和重组。因此很多应用科学将实际问题变成了信息处理的分类,组织,查找和重组,而计算机的算法再把这些信息处理问题变为计算问题。显然,这里有两个桥梁,我们这次就围绕这两个桥梁展开。
计算机虽然最初是用于科学计算的,但是很快他处理的对象就涵盖了世界上的所有东西,有具体的,比如人,动物和物品,也有抽象的,比如加法,函数等。对于这些东西,无论是抽象的还是具体的,大部分操作其实不是计算,而是分类,组织,查找和重组。因此很多应用科学将实际问题变成了信息处理的分类,组织,查找和重组,而计算机的算法再把这些信息处理问题变为计算问题。显然,这里有两个桥梁,我们这次就围绕这两个桥梁展开。
用一句话来讲计算机的功能,就是传输,存储和处理信息。要完成这样的任务,就要对信息本身进行编码,对信息要传送的目的地编码,对存储信息的物理单元编码。因此,有效的编码既是计算机科学的基础,也是掌握这门科学的钥匙。
这篇博客的题目和写作动机都来自于吴军博士的《计算之魂》,我只是在此梳理下自己的理解,同时这篇文章所讲内容就像书中引言所讲的那种,偏向于“道”的层次,有种学生时期做题到一定程度之后,慢慢有了一定的比较玄的所谓的题感的意思。吴军博士在书中将这种感觉称为一个程序员对计算的“品味”,对于已经站在门槛上有了感觉但是说不清的程序员来讲,会有种醍醐灌顶的感觉。
博客篇幅有限,先梳理下计算的本质与如何提高算法性能。
最近看到了两个题目,有一定的相似性,就一起总结下。一道题目是合并n个有序的数组/链表,另一道题目是寻找两个有序数组中所有数字的中位数。
第一个题目,有多种思路,一种是不断从n个数组中取出一个数组,进行合并两个数组的操作,基础操作是合并两个数组。
第二个题目,最简单的思路也是合并两个数组之后取中位数,不过还可以通过二分法的方式优化,最后再说。
最近看到了一个编程大赛是用程序去走迷宫,其中提到了一种比较有趣的方式,叫做洪水填充算法,它模拟的是在假设我们在一个迷宫的入口注水,如果有出口,水必定会从出口流出的这个过程,听起来比较有趣,于是看了一下其算法思想。
为了保证数据的可靠,我们一般会对数据醉一次主从复制,最近我也进行了一点实践,踩了几个坑,在这里总结下。
我们在搭建自己的服务的时候,同时会用到一些第三方服务的api,这些api可能会有速率的限制,这个时候,我们就需要控制我们的发送请求的速率,有很多种方法,比如我们直接计算出来每秒最多请求几次,然后做一些精细化的控制,当然我们也有比较简单粗暴但是行之有效的方法,就是等一会儿再请求,这就是指数回退算法。
最近重新看《程序员的个人财富课》,其中讲到了程序员的能力可以用在很多方面,比如可以算一下如何买房最划算,并给了一个简单的房贷计算器的算法,我对这个算法进行了一定的扩展,直接上源码。
如果感兴趣想要体验,可以关注公众号后台回复房贷计算器,又一个将数据可视化后的demo。