大忙人系列-程序猿在想什么 (一上) 禁止套娃

突然收到小破站的专栏爆肝邀请,想着好玩就写点什么东西吧。不过强调日更而不是字数,那就别怪人断章狗了。
一. 套娃?
看到套娃,估计很多人会想到循环或者递归吧。虽然这些破玩意儿之后估计会写,不过这一次和这俩玩意儿并没有太大的关系。这一次的主题是——
计算机中的计算机
二. 从人力资源机器说起

大家好,我是狗蛋,今天来到了一家号称提高效率、人人都有用的公司。工作的内容很简单,只需要按照墙上贴的指令一个一个执行就可以了。如果一整年都能顺利完成任务,那么第二年就可以坐电梯上到上一层,执行更难的任务。只是,有的时候墙上贴的指令会有错,照做后会被旁边这一层的小老板怒斥一顿;有的时候明明搬运的结果没有错,小老板却还是很生气,并且专门调了一匹会出错的数据过来。
总而言之,虽然很忙碌,但是可以放空脑袋。这公司里的人各个都是人才,说话如乱码,手指只有3根,老板还没有嘴,也不知道他是用什么说的话。总而言之,我挺喜欢这里的。只是,当我完成了万里挑一的人才能办成的排序题以后,公司告诉我被解雇了,还没有赔偿金。当我坐电梯下楼的时候,看到每一层早已由机器接管。而公司外面,也早已物是人非,开始了人机大战。
三排序或许麻烦,斐波那契或许恼人,质数或许令人发狂,但是最能诠释本质的,或许是拾荒者链条和最后一关的排序了吧。
何为链表?
链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。 相比于线性表顺序结构,操作复杂。由于不必须按顺序存储,链表在插入的时候可以达到O(1)的复杂度,比另一种线性表顺序表快得多,但是查找一个节点或者访问特定编号的节点则需要O(n)的时间,而线性表和顺序表相应的时间复杂度分别是O(logn)和O(1)。
使用链表结构可以克服数组链表需要预先知道数据大小的缺点,链表结构可以充分利用计算机内存空间,实现灵活的内存动态管理。但是链表失去了数组随机读取的优点,同时链表由于增加了结点的指针域,空间开销比较大。链表最明显的好处就是,常规数组排列关联项目的方式可能不同于这些数据项目在记忆体或磁盘上顺序,数据的存取往往要在不同的排列顺序中转换。链表允许插入和移除表上任意位置上的节点,但是不允许随机存取。链表有很多种不同的类型:单向链表,双向链表以及循环链表。链表可以在多种编程语言中实现。像Lisp和Scheme这样的语言的内建数据类型中就包含了链表的存取和操作。程序语言或面向对象语言,如C,C++和Java依靠易变工具来生成链表。
——百度百科
果然是写给看得懂的人看的。
说到链表,不得不提的肯定是指针,或者索引,自然而然的就需要数组(广义)了。每次这样提到数组,都会自然而然地联想到图灵完备。
玩过游戏的人自然知道,即使就那么几个简单的指令,但是却已经能实现游戏里所有提出的问题了。实际上,游戏内的虚拟机已经是图灵完备的,也就是说你电脑上能做的任何东西上面的狗蛋都做的到(前提是你hack了游戏给了无限的内存空间并且你等得起)。讲图灵完备的各种贴子、资料也不少这里就不扯了。
图灵完备的东西不少,除了人力资源机器外,像什么brainf**k啊红石啊生命游戏啊兰顿蚂蚁啊都是完备的。这些就留得以后说了。唯一看起来好像很厉害却不完备的也有,比如某cmd,其实核心也就是在“访存”这一点上。
那么,这些东西是如何对应的就是另一个话题了。想起之前作死,在最后一关使用了基于链表的插入排序,最后内存大小还刚好够用,也是奇迹。要是内存再多一点,老子还可以上**!.jpg
如果有足够的空间,我可以在内存里开辟一块栈,从小到大从大到小皆可,这样,就有局部变量可以存在里面了。
如果有栈,我可以在里面存若干个标签,只要实现一个简单(但是如老太婆裹脚布一样)的switch,就能任意跳转,也就实现了函数的功能。
如果有了函数的功能,那么面向对象还会远吗?
Jump If Negative真是一个好东西.jpg!!!
有的人嘲讽,恁们程序猿一个二个,上班时间写代码,下班时间还写代码哈。
但是这些人并不知道,用这些东西瞎整电脑是多么的爽。只是,头有点凉。
<= To be continued