YOLO813

三本书的一些学习笔记

    最近粗略的看完了三本书,分别是《计算机是怎样跑起来的》,《半小时漫画计算机》,《响应式Web设计 HTML5和CSS3实战》,大有收获!大佬们的境界实在是难以望其项背,在我看来难以理解的TCP,计算机内存、硬盘、CPU等概念,大佬们信手拈来,将抽象的概念解释的通俗易懂,以下为文章内的一些精彩片段(时间原因,只记录了一小部分)。

    TCP为什么通过三次握手来建立一个连接?作用就是双方都能明确自己和对方的收、发能力是正常的。


    Linux下的一切皆文件!尽管屏幕、打印机、键盘、鼠标这些设备各不相同,但有一个共同点就是可以向它们写点东西或者读点东西,屏幕=》输出点阵图像,打印机=》输出字符到纸张,键盘=》读取其字符,鼠标=》读取其位置数据,而当一个东西可读可写,那么和文件也就无异了。   


    终于明白为什么都说高级语言运行慢,首先理解一下高级语言的定义(并非我最开始理解的那种高级):易于识别和记忆的字符来作为关键字,更接近人类的思维方式,编写容易读写性好,开发效率更高。从硬件的角度来说,因为计算机的硬件只能识别“断开”和“闭合”两种物理状态,也就是0和1,是的没错,计算机看着功能那么多,其实在底层都是由0和1组成,机器语言这种低级语言(还有汇编语言)因为无需翻译,机器可以直接运行,效率当然很高,但是这也意味着开发效率贼低(毕竟谁都不想只用0和1来敲代码!)。


    使用编程技巧提升程序执行速度!例如判断99999937是不是素数,最直接的方法就是用待判定的数除以比它小的所有正整数,但这将非常耗时,如果加入一点技巧,改成用待判定的数除以比它的1/2小的所有数,这将节省一半的时间!

    算法技巧中还存在一个著名的技巧叫做“哨兵”,这个技巧一般用在线性搜索(从若干数据中查找目标数据)等算法中,从头到尾,依次比对,直至找到目标数据。例如,有100个箱子,分别贴上1-100的序号,箱内装有任意数字的纸条,现在我们要从这些箱子里面找出写着我们需要数字的纸条,如果按照常规方法来写程序,从第一个箱子开始检查箱内纸条,每检查一个纸条后再检查箱子的编号(检查箱子的编号是为了防止循环溢出,毕竟只有100个箱子),这个过程看起来没有问题,但实际上多了不必要的处理-每次都要检查箱子编号是否到达100;而如果换一种方法,添加一个101号箱子,箱内的纸条放有我们需要的数字(哨兵),程序运行,找到要找的数据之后,如果该箱子编号没有到达101号则意味着找到了实际的数据;如果该箱子编号为101,则意味着找到的是哨兵,没有找到实际的数据,减少了检查箱号的步骤,执行时间自然也就缩短了。