人造神:数据结构 Data Structure

VII.ChariotVII.Chariot

数据结构可以简单地理解为计算机思考整体(Entity)的方法。例如,一个整数可以被看作是一个整体,一个包含10个单元的数组也可以被看作是一个整体。数据结构之所以与数据产生了不同,就是因为它有自己的结构,以及对结构的特定要求。产生这种结构化的数据肯定不是偶然的,而是服务于某种目的,拥有特定结构的数据,就能被特定的算法顺利地处理。例如一个学生数据单位,包含学生的编号,名字,性别,联系方式等内容。这个结构必须是固定的,或者说,在这个程序的范围之内它得是固定的,如果缺少某些数据,可以用缺省数据或者空来填补,如果缺少,那就是另外一个数据结构了。同时,程序里有一个打印的函数,将会引用学生的编号,名字,性别,联系方式等内容,与数据结构里的东西一一对应,函数就能正常运转。

数据结构的不同会造成体积的变化,使用方式的不同。如果对比一下关系型数据库和半结构化数据库就能明白。关系型数据库就是relational database,是类似与表格的结构,表格有表头和内容,每一条内容称作一行。半结构型数据库就是semi-structured database. 跟json文件,xml文件看起来一样。简单地来说,他也有数据单位,它与关系型数据库的数据单位的不同就是,每个数据单位里包含了表头。

关系型数据库和半结构化数据库内容可以互相转化,如下:

Name Department

Jack Sales

Mike Market

以上这个是关系型数据库,跟excel表格一样。

{ Name = “Jack”

Department = “Sales”

}

{Name = “Mike”

Department = “Market”

}

或者是

<member>

<Name>Jack</Name>

<Department>Sales</Department>

</member>

上面这种就是半结构型数据库,每一组信息都标明了“信息的信息”,这么一种结构。关系型数据库是可以直接转化为半结构化数据库的,但是半结构化数据库转化为关系型数据库的时候可能会出现Normalization的问题。 这种结构上的不一样,看起来只是浪费时间,而且对于人类来说,很明显关系型数据库的表格结构更适合人类阅读,而且半结构型数据库似乎体积会比前者大一倍多!上一篇我们说过,计算机学的一个分支HID,是为了让计算机更懂人类,跟人类能无缝衔接。那么数据结构的优化,更像是让人类更懂计算机,人类更明白什么才是计算机比较喜欢的互动模式。对于计算机来说,半结构化数据库是更加高效的模式。

当我们在谷歌搜索框输入关键字的时候,会立刻出现预测结构。这时候谷歌是在一个非常庞大的数据库里寻求预测结构的,关系型数据库完成这样的查找需要非常长的时间,而半结构化数据库可以在瞬间完成,你每输入一个字母,它都会更新预测,每一次更新就是一次查找,十分惊人的效率。这就是数据结构的改变产生的实质性效应。

在选择数据结构上,很明显会依照数据到底是给人看还是给电脑看来进行选择,适时地进行转换。这种做法很明显就是基于高度成熟的计算机学的理论。

谈过了计算机,我们再谈谈人脑。有一个烂大街的比喻,说计算机磁盘就是人类的记忆功能。说的也是没错。人的记忆其实也是有数据结构可言的。例如,许多记忆方法都是活用了数据结构的理论,例如历史悠久的罗马房间记忆法。房间是我们潜意识记得最熟的地方。闭上眼睛就能还原出房间里各种家具的摆放顺序和位置。你可以假象自己站在门口或者是中间,以某个家具为起步,顺时针或者逆时针方向报出这些东西的顺序,这样就产生了一个序列。接着,用编故事的方法做链接。。这也是个烂大街的方法。利用联想来把这些东西与需要记忆的东西链接起来,尽量利用视觉想象的形式。这种方法记住的顺序很难忘记,信息记录基本上能准确无误。但是也没什么人每天用就是 了。

基于这个方法,有了数字记忆法,星座记忆法,原理都是差不多的。不管是星座顺序还是数字顺序,他们都是一种序列型的数据,星座和房间物件具有较强的视觉印象,所以能进行较强的连接。人脑的整体记忆,就是一个网状结构,非要类比的话,可以看作是一个超级强化版,无头无尾的链表。

以单向链表为例,每个链表单位包含信息本体,下一个节点的地址这两个数据,算法只需要获取头节点,就能顺藤摸瓜把整个链表摸一遍。循环链表跟这个类似,唯一不同就是尾节点指向的下一个节点是头节点。而双向链表就是每个节点除了包含下一个节点的地址,也包含上一个节点的地址。算法能够往前找,也能往后找。而人脑的记忆链表就更加复杂,每个节点可能包含七八个联系节点。从不同的方向来到这个节点,也会影响到哪些节点可见,哪些节点不可见。

编程中,常用的数据结构有这么几类:第一类是简单数据结构,例如一个整型数据,一个字符数据;第二类是复合数据结构,好几个整型连在一起,好几个字符连在一起,就成了字符串。数组是可以多维的,所以用阵列描述比较合理。三维空间只能容纳三维数组,更高维的只能用坐标的形式来体现了。如果给数组加一个方向限制,就有了栈和队列,栈是先进后出,队列是先进先出。更复杂的数据结构还有散列表,图,堆等等。

图还算是比较好描述,就是一个点连一个点,我们的手机地图,里面就使用了图的数据结构。建筑物就是节点,街道就是节点之间的连线,连线可以有数值,方向性,就对应了地图道路的长度和方向性。计算路线的时候,就是在通过算法在合理的前提下,计算两个点的最短距离。树也是图的一种,类似于族谱或者树的结构,由一个根节点发散出子节点,上面这个图是树的一种,叫做二叉树,因为它每个节点都只能有最多两个子节点。这种结构在计算机中的应用是十分广泛的。

从面向对象程序的角度来说,数据结构的整体性意义变得更加抽象,函数加上数据,封装成一个对象,对象跟对象又可以封装成更大的对象。就俨然形成了层次分明的结构。例如java程序项目的源文件结构就是 project->package->java file->objects->function and data。结构与层次,对于计算机来说,是意义重大的。

当计算机观察人类的行为的时候,它会如何勾勒这个庞大而复杂的系统呢?人类从计算机里找自己的影子,计算机也会这么做吗?例如,它可能会说,人脑里最初有原始的精神,然后派生出对身份的认识,然后产生了价值观,信念,规则。这三者封装起来成为了决策系统的一部分。这三者与态度结合,封装出了人的个性。个性与记忆加起来就构成了基本完整的人。用计算机语言去尝试描述人脑的运作方式,实在是非常刺激的。当然实际情况比我举的这个例子要复杂无数倍。例如,可能要把天气,星象计算进去,而星相对于人脑的影响模式,又是一套新的算法。整个叠加起来,我们会发现这套系统的复杂程度完全不是现代计算机可以承载的。

深度学习,是用计算能力和数据量堆上去,做出模仿的效果,但是我估计,如果要模拟强人工智能,模拟度达到70%就已经超级负载了。如果是通过从数据结构和算法开始,心理学与计算机联姻,或许可以打造出100%模拟的效果,而且运算效能可控,一套服务器能演算出7岁小孩的智能,1000套服务器能演算出15岁的智能。类似这样的效果。

文章被以下专栏收录
还没有评论
推荐阅读