很衰的一天,各种意料之外的问题,但都挡不住我每日一更的步伐
内存的逻辑结构大致分为以下几种:
数组
栈与队列
链表
二叉树
以上,数组,栈,链表是我这章要说明的
在学习前需要了解的两个问题:
1.内存的一次存入仅能放8bit大的空间,那么我们想要存入32bit的内存怎么办呢?
2.什么样的操作是更适合(更快)我们内存呢?
学习前需要明白的两个术语:
char=1byte
int=4byte
我们上一章说过,内存就好比一栋楼房,每一层存着相应的数据,但内存的物理条件仅能限制我们每一层存入1char的数据,那么我们要想在一层中存入1int的数据怎么办呢?下面介绍一个原始的方法:
这就是我们原始方法大致存储int数据的方法,可以注意看下面的四层被去掉了,这样每一层可存放1char,四个加起来正好可以存储Int数据,虽然表示是这么表示,但是楼层不是真的被去掉了,但是访问除会提示错误,这种方法固然可以存放大于1char的值,但是我们的操作速度会非常慢,具体怎么个慢法,请看下面这张图:
我们可以通过图片可知,程序每储存一个数都会进行一次寻址,将数据放到寻到的地址空间内,在我们读写数据过程中cpu是不断在运算的,这样一来就大大增加了我们储存数据的速度,那么如何才能加快读写的速度呢?
我在前几章说过,cpu在做累加时的运算速度是最快的
根据这一概念,工程师们引入了一个数组的概念:
既然累加是最快的运算,那么我们就将所需的空间打包起来,让最开始的地址作为此数组的地址,这样一来,我们存入的数据只需要找到此数组的地址,就可以直接对此数组空间进行读取操作,这样无疑大大缩短了我们的读写时间,但是,我们删除数据的话,层与层间的顺序就会断开,这样cpu又无法进行累加运算了,我们还需要将下面的层向上位移,所以说,数组虽然读写很快,但删除却很慢
在数组的基础上,工程师们又研究了一个便于数据记录的栈:
栈这个概念比较抽象,栈用来记录查询和回溯,列入:在10:05分储存数据5,10:05分储存数据8,10:30分储存10......
栈有一个原则——FILO(first in last out)既第一个进入的最后一个出来,听起来很绕?我们看下图,最先存入的5被放到了最下面,我们栈的存出规则是从下往上存的
除了栈之外,他们还将数组进行了变形:
这是一个队列,就好似我们排队一样,从下往上写入
这些结构都有一个问题,他们都是数组结构的,数组的删除是非常慢的,为了解决这一问题,我们引入链表这一概念:
我们可以看到,存入的层内多加了一层,里面存储着下一个要查的地址,这样,在我们cpu的运算当中,就可以快速的查找到下一个数据,删除的话也不会影响cpu的运算速度,链表这一概念完美的解决了数组删除过慢的弱点
未完待续......