吴军的硅谷来信-查找

712 阅读5分钟

addressing编址

  • 人类为了区分东西,会对特定的东西进行描述于区别。
  • 而计算机所有东西都被编了号,而且具有唯一性。 比如:
  • 如丈夫要求老婆帮他拿一下客厅茶几上的白色糖盒。
  • 机器人丈夫要求机器人老婆帮他拿一下 第三那个房间,第六个家具,第九个位置的东西给我。(至于拿过来是墨水还是真的糖盒机器人老婆不管。这时候如果把墨水倒入咖啡里,就是我们常说的crash 宕机的情况。)
  1. 这里不得不说“图灵”牛b,在以前发明的算盘,计算器,还是帕斯卡计算器,都算完一特定的事情就结束了。
  2. 而图灵设计计算机是通过计算实现复杂的功能。

以前大家把计算当作目的,而图灵把计算当作手段,实现一些功能才是目的

图灵机模型

所有的数字都会放在一个个编了号(地址)的格子里。 计算机对数据进行操作时候,显示找到盒子,再取出盒子里面的内容。操作完再放回盒子里。

用一个数学模型吧计算机描述清楚。 比如 用变量x,y,z,把数学公式描述清楚。

  • 1 计算加法的时候 我们一般会直接一步到位,用数字 1+2 = 3,
  • 2 用数学公式就是分两步,(1) x+y = z,先把1和2分别带入x和y(2)在把x+y进行相加

而如何快速在计算机里找到哪些编号,就是计算机一门艺术,也叫做“查找”

查找

  1. 顺序查找:按顺序一个个查找,稳定,比随机乱查靠谱,避免重复。
  2. 二分查找 也就是猜心里想个一个数字,通过多次是否在小于xx提问,比如猜0-1000之间,第一次问500,第二次问250或者750,每次折半提问。数次后就能找到(前提是数据是有序的,而且是静态不变化的)

例子

如果要找全深圳叫李强的而且是在腾讯工作,深大毕业的人找出来。

如下面信息 image.png

顺序查找

这时候李强的信息是无序的,查找需要把整个深圳的人都查一遍。

二分法查找

如果我们按人们排序后呢?

image.png

这时候李强的数据就变得有序,而且会集中在一起。我们只需要用二分查找,几十次就能找到李强。 但是只可能是其中一个,这时候会有三个一样的,还要继续往前或往后把剩下的李强人名相关的单位于毕业学校匹配才能找到。如果李强有上千个,还是要用顺序查找从下往上,和从上往下查找。

如果想提高顺序查找的时间,比如要找到是腾讯工作的李强,则需要copy一遍数据库,再按单位排序,然后取姓名与单位的交集。这也是一件麻烦事。

建立索引

这里忽略了每一条数据其实是有一个唯一编号的,如下图

image.png

这时候,只要另外建立一张索引关系表,把姓名和编号1对多关系维护起来,同理:单位和编号 也一样建立索引表。

image.png

这样,这需要找到李强在1,4,7这三条数据,与单位索引取交集,找到3的这个交集,就是要找到腾讯工作的李强。

谷歌的搜索基于索引

谷歌是如何做到一毫秒查询上百万文档。 谷歌会把网上所有能找到的文档下载后,对每一个词建立索引,如“李强”出现在第101个网页,第3,10,59个位置,第655个网页,30,54,889个位置。这样当用户在搜索“李强”的时候,则能找到所有对应的索引,然后一次性列出来。

  • 谷歌牛b在是对所有词,不区分语言都统一建立索引。
  • 很多小公司可能只索引有用关键词和区分语言,中文一个索引库,英语一个索引库。

windows-vista的失败

vista是一款强调个人本地搜索的操作系统,然而提高搜索效率是有成本的,就是时间换空间。建立本地索引需要占用原有信息的50%的空间。而且每次有数据变化都会触发索引表的变化,大量占用内存的资源。

这是一个本末倒置,操作系统应该是给用户更多的资源取运行自己需要跑的软件。

  • 虽然“搜索”是刚需,但是本地搜索其实不是刚需,而且数据是用户产生的,用户一般都知道在哪里。
  • 如同现在很多创业项目都说,由于手机充电是刚需,所以充电宝是刚需道理一样。

那么谷歌为什么可以花那么大的成本建立索引,那是因为世界上有很多人都在用他的索引,每多一次搜索,边际成本是在递减的,抵消掉建立索引所带来的成本。当然如果没有在谷歌搜索,确实是不划算的。