本人为初学者,此文为学习的一些总结,如有不当之处,还请多多包涵。
要说起学习数据结构的意义,不得不先说一下,CPU,内存,磁盘(硬盘或固态硬盘)。
首先,CPU中的存储空间很小,基本可以忽略不计,(造价太贵),其次是内存(造价也很贵),再其次是磁盘(硬盘一般很大,因为造价最便宜)。数据在磁盘中为链式存储,在内存中既有链式存储,又有顺序存储。
每个磁盘有两个机械臂,在其两侧,每次读取时,就开始转圈读取,笔记本一般是5400r/分钟,台式一般是7200r/分钟,服务器一般是10000r/分钟。磁盘的材料好像是硅,硅分正负电极,在读取时,分别对应二进制中的0和1。
如果CPU直接从磁盘中读取的话,消耗的时间是巨大的,这也是内存存在的意义,先将数据从磁盘转到内存,再从内存转移到CPU,因为将数据从磁盘到内存比从磁盘到CPU要快很多。
每个磁盘在格式化时都需要指定分配单元块的大小,在存储时,不满一个单元块的占一个单独的单元块。为什么电脑用很久之后会很卡? 就是因为,随着时间的推移,刚开始的数据的存储都是紧挨着的,随着删除等的操作,出现了很多的琐碎的空间,正是因为这些琐碎的空间,使得比较大的数据无法连续的存储,在调用的时候,就比较消耗时间。这些操作称为IO操作(输入输出的操作)。
默认为4kb,一般大的数据单元格需要设定大一些,小的数据应该设定的小一些(让不然浪费的空间会很多)。
地址连续的存储和地址不连续的存储都有各自的优势和劣势,有没有一个比较好的能够涵盖这两个呢? 这就是顺序二叉树!该结点的左侧都比它小,右侧都比它大。(或者反过来)
增删改查四种操作中:
增操作,每一层只需要比较一次,依次比较,添加到合适的位置,其算法复杂度O(log(n))级别。
删除操作,只需要找到该结点左子树中的最大值(最右侧)或者其右子树中的最小值(最左侧)来代替该结点即可,算法复杂度也为O(log(n))级别。
改操作,就是删除操作和增操作的结合,先将该数删了,再增加一个数,算法复杂度为O(log(n))级别。
查操作就很直接,直接比较,找到为止,算法复杂度也为O(log(n))级别。
栈有何用?
例如一个简单的程序如下:
int i,j;
{
int x,y;
{
int z;
}
}
其如何实现的呢?
先将i,j入栈,再将x,y入栈,再将z入栈,第一个括号结束,z出栈,第二个括号结束,x,y出栈,最后i,j出栈。
学数据结构的意义:
主要是针对内存来说的,用来优化内存。以及在处理大数据的时候可以让计算机以更高的效率来运行。