前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >算法之旅(2)——朴素的存取

算法之旅(2)——朴素的存取

作者头像
刀刀老高
发布2018-04-11 10:40:13
5930
发布2018-04-11 10:40:13
举报
文章被收录于专栏:奇点大数据

上次我们说到算法最基本的处理规则和算法在计算机底层所藉由的工作方式。这次我们来说说计算机中最简单的算法,最朴素的数据存取。

也许有的朋友觉得这种问题太底层,简直没有办法直接把算法转换成大米饭或者房子,但是我还是要说,我们要想深刻理解算法还是要从其处理数据的本质开始看才会有更多思路。

小时候我们可能都学过珠算,即便没有在课堂上学过至少也见过。

每个档位都是一个十进制的计数器,而且有一套天生做加减法的珠算口诀“三下五去二”,“六上一去五进一”——这其实就是珠算中最小的算法单位了。这种珠算口诀的出现是必须由算盘作为搭配承载的,也就是说,这种单档位进退位规则是由于算盘构造而出现的。那计算机中有没有档位呢?有的,上次我们已经说过,就是寄存器的各种逻辑门。

我们把单位放大一点去看——因为从信息论下界的角度来看,1bit的东西在二进制当中只能表示两个不同的信息含义,如果要想表示3或4个,那就需要2bit。8个bit称为一个byte,叫做一个字节,能够表示最多256个不同的信息含义,也是我们平时在高级语言中能够处理的最小单位(不过现在高级语言也很强大的,有很多可以处理底层数据的类也允许你直接对一个bit单位进行操作)。

以内存为例,大量的byte单位连续在一起,就像我们平时看的书橱。

每个小格子都是一个byte,存放着我们要处理的数据。不过别忘了,在内存里,这种小格子有几百万上千万个可不算稀奇。

为了管理这些小格子,我们都要给他们编上序号,在WIN98最盛行的时候我们会不时看到自己的电脑因为各种原因蓝屏。

蓝屏后屏幕会出现这种信息,中间会给出这种0x0000008E的信息,这就是内存地址信息。使用这种16进制来表示内存的地址主要是为了简洁一些,0x0000008E表示第142个内存byte的位置,而0xC0000005则表示第3221225477个byte的内存位置。可以想象一下,0x00000000到0xFFFFFFFF这4294967296个(32位系统寻址的最大单位上限)中,就是有4294967296个连续的小格子来“自由”放置数据。那剩下的发挥空间,都是程序员的。

如果你想存一个数字到一个地方去,那就“MOV 寄存器地址 内存地址”。

如果你想从一个地方把数字取出来,那就“MOV 内存地址 寄存器地址”。

如果你想把内存地址1和内存地址2的数据做加法,那就麻烦点,不过也能很快搞定“MOV 内存地址1 寄存器地址1”,“MOV 内存地址2,寄存器地址2”,“ADD 寄存器地址1, 寄存器地址2”,这样最后寄存器地址1中的值就是内存地址1和内存地址2的加和值了。

计算机每天在做的事情其实只不过是数据写入、数据查找、数据计算,不管数据来源是磁盘、网络、键盘,也不管你是在写作、看电影,还是打游戏,无一例外。

最快的写入方式其实就是直接在已经分配过的内存最后的位置直接写,这样可以在避免覆盖已有数据的安全条件下做写入,这种写入效率一定是最高的,因为除了要记录和移动指向分配地址尾部的内存指针没有任何其它的冗余动作。但是再回来找的时候就麻烦了,具体某个数据的地址在哪里?要每个存储单元挨着查找过去才能找到我们要的数据,具体的效率我们在后面的分享中会量化给出来。

最快的查找读取方式,毫无疑问是直接指定一个地址,因为这同样是没有任何冗余动作就能命中所要数据的方式。但是其实这种方式在我们使用高级语言编程的过程中几乎是没有机会碰到的,因为内存地址对于人来说太难管理,只好让编译器帮我们做一次翻译。关于查找的算法,在后面的分享中同样会把每种算法的效率量化给出来。

计算机中的读和写,算法效率高不高,最底层的实现方式都已经给出来了,这就是计算机自己的珠算口诀。一切算法的实现最终落实下来都是用这样的方式组合而成,自然成本估计也就是用成本叠加的方式去计算。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2016-06-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 奇点 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档