Java学习笔记:2022年1月11日

摘要:这篇笔记主要讲解了一些数据在计算机中的存在方式相关的知识点,并由此延伸出了数据在计算机中的操作以及一些数据结构的知识。

@

1.数据在计算机中的存在方式

​ 我们在使用电脑时,总是处理一些这样那样的信息,比如表格文件,word文件之类的,我们还会浏览一些网站,我们从浏览器中获取来的信息也属于计算机中的信息,我们在玩游戏时,也必须下载游戏才行,这些东西都属于计算机中的信息,那么,计算机中的这些信息是以怎样的方式存在于计算机中的呢?接下来我们来进行探究。

1.硬盘中的信息

​ 在计算机中,最为重要的部分莫过于CPU,内存以及硬盘,当然承载他们的主板也非常重要,不过主板不参与存储和处理信息,主板只参与了信息传递,除此之外,你可能会说:显卡也很重要啊,没有显卡我们怎么van♂游戏?实际上,显卡并不是不可或缺的东西,在早期的计算机中是不存在显示适配器的,也就是说早期计算机中没有显卡,显卡概念实际上和游戏的出现密不可分,在早期计算机中基本上没有游戏,只有一些简单的字符点阵,这些点阵使用CPU进行处理发送也是完全没有问题的,CPU可以绘制简单的点阵。然而随着游戏的出现,计算机游戏逐步由简单的井字棋变为了有画面的游戏,显卡便开始力不从心了,人们这才开始设计图形运算方面的适配器,可以说显卡是CPU的一个外挂加持设备,它确实也参与了数据的处理,但是它只处理图形以及图像信息,更多的逻辑计算还是靠CPU的。同时很多人也都认为GPU不过是CPU的一个加持设备,二者完全可以融合,比如现在的很多CPU中都有核显,也就是集成显卡,在CPU的小电路板上集成GPU,实际上就体现了这种思想。

​ 因此从根本意义上出发,我们认为计算机中最重要部分为CPU,内存,硬盘。因此我们首先来认识硬盘以及硬盘的构造。

1.硬盘以及硬盘的构造

​ 硬盘并不属于计算机系统,而是属于外部输入设备,只不过如今的硬盘做的太和计算机相融合了,做的太方便了,以至于让我们认为它属于计算机的一部分,实际上它是一个外部输入设备,它的地位和早期的打孔纸带以及磁带是完全没有两样的,它的功能就是存放计算机需要处理的数据,然后往计算机中注入这些数据并让CPU不断的处理。

​ 目前为止硬盘分为两种:机械硬盘和固态硬盘,固态硬盘是近几年新出现的硬盘,它的存储机制类似于内存,同样是由存储颗粒构成的,这些存储颗粒也是集成电路的产物,只不过它的内部和内存存在一些本质上的不同,导致它速度稍微慢一点,但是也可以断电存储。由于我并不了解固态硬盘的存储原理,同时这篇笔记并不针对固态硬盘,因此在这里不再进行详细说明,只会简单提到固态硬盘的大概特性。在此我们主要学习的是机械硬盘。

​ 实际上如今应用面最广的硬盘还是机械硬盘,虽然机械硬盘构造上更容易坏,且存取速度更慢,可是一些大公司们在进行数据存储时,首选仍然是机械硬盘,最根本的原因就是便宜,同时机械硬盘较固态硬盘来说更支持高并发,同时机械硬盘的寿命更长,固态硬盘存在读写次数上限,因此在主要面向存储的公司中,很少使用到固态硬盘作为存储介质,同时机械硬盘的单位存储空间价格更低,固态硬盘的单盘价格随着容量的增大可谓是指数级上升,但是机械硬盘的价格确实比较平稳,因此大部分企业仍然会选择机械硬盘,因为企业需求和个人需求不同,它们主要是有存储需求以及价格需求。我们的个人计算机如果不需要大容量,且不追求高并发以及频繁存取时,固态硬盘是我们玩游戏的好伙伴(或者追求电脑的开机速度以及流畅度)。

​ 硬盘的构造以及存储原理和光盘息息相关,而光盘的存储原理则来源于早期的唱片,我们可以发现现在的密纹黑胶和光盘看起来有着很相似的地方,就是表面上的奇异反光,他们上边往往会有乘中子星放射状的对称反光,如:

​ 以及:

​ 这是一种光学现象,这种现象的原理在黑胶上更明显一点,产生这种反光的原因实际上是因为上边一圈一圈的轨道,它们之中存储的信息,便是存在上边一圈一圈的轨道上边的,由于光盘上边的轨道更加紧密,因此看上去也更平滑好看一些。

​ 在光盘中,信息是存在于以下这样一圈一圈的圆形轨道上边的:

​ 在VCD或者DVD中进行解析时,内部会有一个发射光的传感器照射上边的轨道,在光盘的轨道上进行了很细小的刻蚀并造成了表面的崎岖不平的表面,当激光照射这些表面的时候,就会有不同的反射情况,不同的反射情况被反馈给传感器后,传感器就会把它这种物理信号转变为数字信号,至此信息转化为数字信息,进入电视机系统,具体原理如下:

​ 磁盘的存储模式和光盘像的很,只不过磁盘是可读写的,光盘一旦刻录,便无法进行修改,而磁盘不一样,磁盘将表面的存储单元由崎岖不平的洞变成了磁颗粒,一排排的磁颗粒形成了一圈一圈的磁道,分布在磁盘的表面,这样排布好之后,还会在磁盘上加上一层氧化膜封装,这样可以延长磁盘的寿命,只要不发生严重的刮擦,磁盘就可以一直使用。磁道上边的磁颗粒分为南北两极,并且可以旋转,当有一个磁体和他正对着时,就会由于同性相斥异性相吸的原理发生旋转,如图:

​ 当一个磁颗粒的磁极排列情况会受到这样的影响而发生变化,这样一来,它们的总体排布也就发生了变化,而我们发现每个磁颗粒的状态无外乎两种,N极在上或者是S极在上,因此我们便可以使用二进制来在磁盘上进行信息存储。

​ 对磁盘进行信息存取的原理是磁生电和电生磁,磁盘的结构是这样的:

​ 确确实实的存在一个影响磁颗粒的极性的存在,这个存在我们称之为磁头,磁头是一个精密的可通电的电磁铁,原理基于电磁感应线圈,只要通上特定方向的电流,它就可以产生特定方向的磁性。在计算机中我们使用高低电平进行传输,高低电平信号进入磁盘系统后,就会被一个电路转化成不同方向的电流,这个电流会施加到磁头上,让磁头对着磁颗粒的那一面产生相应即磁极,这样一来就会影响到磁颗粒,改变磁颗粒的状态,这时只要让磁头的极性快速变化,并且让磁盘的盘片进行高速旋转,我们就可以完成对于磁盘的信息存取了。

​ 而取数据的原理则是磁生电,在取数据时,磁头不通电,而是通过磁盘旋转的方式,让它切割磁颗粒的磁感线,当导电物体切割磁感线时,就会磁生电,磁头的线圈上就会由于磁头的磁极不同而在切割磁感线时产生方向不同的电流,这个电流会被磁盘上的电路检测到并转化为高低电平信号并输送给计算机系统,这样一来系统就完成从硬盘中读取信息。

​ 这就是机械硬盘的真实构造,其中圆形的看上去很光滑的部分就是磁盘,它通常是由很多个单片磁盘叠加起来的,且它的外表面都可以存取,它是一个双面的构造,上边我自己画的示意图只是它的一个表面。

2.用户眼中的硬盘存储和真实的硬盘存储

​ 我们已经知道了硬盘的信息存储原理,现在让我们从用户角度来探究硬盘存储,并分析硬盘存储中的真实情况和我们认为的情况的不同。在我们的计算机中,硬盘是这样的:

​ 其中蓝色的是已使用的区域,白色的是未被使用的区域,当蓝色变红色,说明你的硬盘空间快没有了,但是我们根据上文中的磁盘存储原理的角度来想,这个磁盘有真正意义的空过吗?答案是没有,因为我们并没有往硬盘里真实的塞东西,这也是为什么我们往硬盘里存了那么多照片可硬盘的重量却一点没变的原因,我们只不过是修改了盘面上磁颗粒的状态,在我们没有动硬盘时,磁颗粒也有着自己的状态,它没有随着我们的修改而具备了其他意义,它所干的事情只不过是改了一下自身的状态,它们的意义是人为的赋予的,人类指定了二进制解析文件的规则,按照相关规则解析它们的状态排列,我们才能得到有用的信息,如果这个规则不存在,它们的排列则也是完全没有意义的,这个规则不是硬盘赋予的,而是计算机系统或者说是人类赋予的,因此它们并没有因为信息的输入而变满,而是因为信息的输入,它们的排列对人类有了存在的意义。

简而言之,硬盘实际上没有真正意义上的空过,他们每时每刻都是满的,他们每时每刻都有着自己的状态,只不过是有的区域对人类有意义,有的区域对人类没意义,对人类有意义的区域就是被使用的蓝色区域,对人类没意义的区域便是白色的空置区域,我们人类可以使用计算机来为空置区域输入我们想要的排列,在此之前空置区域也有着自己的排列,并且这些排列按照人类的解码规则可能也可以解释出来,只不过它没有被权限保护,它可以被任意的覆盖。当我们往空置区域进行数据输入时,实际上就是将这些磁颗粒的原始排列状况改变为我们需要的排列状况,我们赋予它们意义。

​ 因此我们得出结论:在我们眼里,磁盘是有空白空间和已使用空间的,实际上,硬盘的所用空间都已经被使用,它一直是一个满的状态,只不过有些区域被我们赋予意义并加上了权限保护,这些区域不得被随意更改,这些对人类有意义的区域便是蓝色的使用区。

​ 所以磁盘存储在进行存储时,实际上是直接把一块没有权限保护的区域的原磁颗粒排布方式改成了我们当下输入的排布方式,并且在主引导扇区中加上了它的存在信息,系统通过检索主引导扇区就可以知道在硬盘上哪一块地址被使用,哪一块没被使用,进而保护这块区域并且可以让用户访问这块区域的信息,这块信息的存在与否,就取决于位于主引导扇区中的检索目录中,当主引导扇区中的检索目录中删除了对这块内存的标记,这块内存即宣告释放,它的保护机制随即取消,它就变得可以被其他信息覆盖了,只要检索目录中没有取消对这一块内存的标记,那么系统就会对这块内存进行保护,它就不会被占用。所以删除操作并不是真的将某个信息从硬盘上抹去,而是删除了它的索引,失去了索引的数据便会被系统遗弃,标记为空白区域,在下次的信息存取中可能会被覆盖。

而这也意味着:你认为的删除并不是真的删除,数据可能仍然保存在那个地方,只不过系统中不再将其标记为有价值的信息,这会导致我们删除的数据仍然有可能存在于磁盘中,通过某种手段仍然可以将其进行导出并解析为有效数据,这就是删除信息恢复操作。被删除的数据只是失去了保护和标记,它的磁颗粒排布状态没有改变,因为计算机没有额外的时间去让磁头抹除那一块区域,因此它有可能在一段时间内保持原状不变,使用某种软件可以将其重新读取出来,之前某位明星因为修电脑导致照片泄漏,就是因为磁盘的这种存取机制,他尽管在用户视角进行了图片删除,可是在硬盘的角度上来看,这些信息仍然存在,因此给别人可乘之机,我们在修电脑时,或者卖二手电脑时一定要注意这种情况,要么看着维修人员操作,要么拆除硬盘,在卖自己的二手电脑时,可以对磁盘进行一次修改内存单元的格式化,或者更稳妥的,我们可以用一些正经的文件把整个硬盘填满一次,这样一来即使有人想进行数据恢复,看见的也只是正经文件。

​ 如我的计算机D盘几乎完全被考研视频填满,如果有人恢复我的数据,只会赞叹,这家伙真是好学啊!

2.内存中的信息
1.内存的存储机制

​ 关于内存的存储机制,实现原理实际上是电容,内存的整体结构是一个网状的设计,每一个电容都是一个节点,电容是存在两种状态的,即存储电能和无电能。在内存中,将电容作为内存的存储电源,每一个电容的状态都代表一位,当存储电能时,被理解为1,不存储电能时,被理解为0。在通电情况下,向内存中输入一串高低电平,通过电路可以将这个高低电平转化为一个地址,这个地址会对应一连串的电容,输入之后,在内存的输出电路上就会得到这一串电容的是否存储电能的信息,这就是内存中存储的信息。而使用标志位,可以改变内存的模式,可以将内存改变为存储模式,这是向相应的地址中输入电平,就可以将这一串电平存进电容,进而达到存储的目的。

​ 由于内存的存取全部是电路上的电流行为,因此比磁盘的器件行为快的多,这就是内存更加迅速的原因。

2.内存在计算机系统中的地位

​ 内存和硬盘不同,它属于计算机系统,它被称为存储器,说它是存储器,它并不能进行永久性存储,它只是一个暂存器,因为电容的放电加电行为需要电量供应,因此内存的存取效果只有在通电的时候才可以发生,一旦断电,所有电容会放电,内存中的信息会全部消失,因此一旦断电,内存中的数据就不能保存了,它是一种暂存器,和磁盘不一样。

​ 那计算机中为什么会有内存呢?在早期的计算机中也是没有内存的,早期的计算机实际上就是一个CPU,人们直接使用纸带和它交流,直到后来发明了磁带机,CPU的吞吐量还是上不去,这是为什么呢?这是因为人类太慢了,而CPU太快了,CPU处理信息的能力是非常快速的,它也是一个纯电路元件,人类的操作速度远远跟不上它,因此人类发明了存储器,存储器实际上就是一个和CPU交互的缓冲区,我们向计算机中输入数据时,可以先输入进这个缓冲区,CPU直接从缓冲区中读取数据,这样一来关于程序的调度执行就不再归人类管了,而人类也就不再用人为操作的方式更换当前运行的程序了,人们只要把事先写好的大量程序写进硬盘,然后硬盘直接向内存中注入数据,内存向CPU注入数据,内存在向硬盘请求数据时,会先请求很多,以至于CPU很难在很短的时间内运行完,这样CPU就基本不会频繁的向硬盘这种低俗存储请求数据了,它只需和内存这种同为电子元器件的告诉存储打交道即可,这样一来CPU的吞吐量就会得到提升,而系统运行的整体速度也就变得更快了。

​ 在冯诺依曼体系的计算机中,内存由于其暂存性,导致它不能成为像硬盘一样的外部存储设备,只能作为一个计算机内部结构,即外部和CPU的缓冲区而存在,被称为存储器。

3.内存中的信息

​ 内存中的信息和硬盘中的信息从性质上讲没有区别,就是直接将硬盘中的数据直接复制过来的。CPU在进行数据请求的时候首先会向内存进行数据请求,如果内存中没有的话,内存就会向硬盘发出请求,这是硬盘就会将需要的数据发送过来,CPU这样一来就可以进行从内存中的数据读取了。可见内存中的信息实际上大部分是直接从硬盘中copy来的,当然,内存作为存储器,还要接受来自CPU的输出,因此内存中也存在大量CPU输出的数据,这些数据是CPU运行硬盘中的数据的到的,它们和硬盘中的数据不同,我们可以将这些数据保存下来存入硬盘。关于内存以及内存的原理,以及CPU的数据请求机制属于计算机组成原理和操作系统的知识,这些知识我在以后的学习中会再次详尽的学习,因此在这里只是简写,不再赘述。

2.数据结构

​ 数据结构是什么?数据结构指的是我们在将现实生活中的信息虚拟化的时候,在计算机中的存储结及逻辑结构,严格的说还有他们的相关操作。我们可以简要理解为:信息在计算机中的存在方式。当然在这里我并不是在着重研究数据结构这门学科,在之后的学习中我会更加深入的研究数据结构,在此我只是简要记一些在Java中需要使用到的数据结构知识。

​ Java中同样存在各种各样的数据结构,只不过我们在实现时没在C语言中实现时那么不方便了,很多数据结构都为我们进行了封装,甚至于一些算法也为我们进行了封装,比如Array中的sort方法,它将快速排序进行了封装。接下来就是在Java中需要了解到的一些关于数据结构的知识。

1.数组与链表

​ 如果我们足够仔细认真的话我们会发现:在Java虚拟机中的很多列表结构都是使用的数组,如栈区中的线程栈,字符串的底层等。实际上,在我们的操作系统中,很多列表结构也都是使用数组实现的,在有些人的头脑认知中,数组是比链表低级的一种数据结构,因为数组简单,实则不然,数组虽然简单,但在系统中使用它也有简单的道理:快。

​ 实际上在我们的系统中乃至于Java的虚拟机系统中,大部分列表结构的操作都是读和改,而非插入操作,因此数组就显现出了得天独厚的优势:存储密度高,随机存取导致的存取速度快,特别是在内存中运行的一些结构,由于内存的速度要求越快越好,因此很多列表类型的数据在内存中都是使用的顺序存储。乃至于链表。是的没错,在内存中,链表的单个元素有时是连续放置的,当内存中空间足够时,即使是链表,每个元素也会顺序放置,因为内存要求速度快,它要求数据能够顺序存储就顺序存储,当然了,当前内存空间不够时,链表可以在其他区域开辟空间,这是它比数组灵活的地方。同时我们需要注意,可以在分散内存空间中存储的不只有链表这个结构,还存在其他的结构可以在内存中进行分散存储。内存中的信息偏向于使用顺序存储,这是因为内存中的操作多时查询,而非增删,因此内存会牺牲真实使用率来“浪费的”多多使用顺序存储,这是牺牲利用率提升效率的一种方法。

​ 和内存中不同,硬盘尽管也提供查询的功能,但是硬盘更加偏向于数据的存储,因此空间利用率高是硬盘的一个重要指标,所以在硬盘存储中,通常是使用见缝插针的链式存储,一个文件在硬盘中可能被分布在了多个扇区进行存储,每一个存储块都存有下一个存储块的地址,顺序的进行检索,就可以获取到整个文件了。

2.算法的复杂度

​ 算法的复杂度在《数据结构》中是一个重要的知识点,同时也是衡量一个程序是否优秀的重要指标。算法的复杂度分为空间复杂度和时间复杂度。顾名思义,空间复杂度指的是一个程序在运行起来之后占用的内存空间,时间复杂度则是一个程序完成任务所需要的时间,一般大厂家都会优先考虑时间复杂度,因为目前大环境是硬件性能过剩,空间复杂度基本上很少考虑,扩充内存是一件很容易的事情,相比之下可能影响到千万人体验的时间复杂度就成为了一个重要指标。

​ 时间复杂度通常使用O(数量级)的方式表示,数量级是什么呢?在考量一段代码的时间复杂度时,我们经常默认其运行一次消耗一秒或者一微秒,由于不同的计算机这个单位并不相同,我们索性就将这个程序运行一次称之为1,记为一次也不是不可以,然后我们会探究这个程序到底会运行几次,最终程序运行的次数便是一个程序的时间复杂度。如下面代码

for(int i = 0; i < 10; i++){
printf("虎哥,你带我去沈阳吧!");
}

​ 这个程序会运行10次,那么它的时间复杂度是不是就是O(10)呢?答案是不是,O后边括号中的数组是数量级,所谓数量级指的是次数的级别,如果说一个程序执行一次就可以结束,那么它的级别就是1,也就是1次,而如果一个程序需要执行多次才能结束,那么这个程序执行的次数,就和我们标定的执行次数相关,简而言之,上边的程序之所以执行10次就能结束,是因为我们给i的上限定了数值,这种数值一般是人为确定的,有时也根据数据体量大小而定,我们为了取最坏情况,往往会假定这个数值是未知的,因此对于在这里,我们定一阶循环的时间复杂度是n,n指的就是循环的上线次数。因此这个程序的时间复杂度我们可以认为是O(n)级别的时间复杂度。

​ 随着循环阶数的升高,还会出现O(n2),O(n3)级别的时间复杂度,我们需要注意的是这种时间复杂度非常大,会导致程序运行的严重卡慢,我们尽量避免时间复杂度上升到这个级别,也就是说在我们的程序中应该避免使用高阶循环。

​ 当我们使用数组进行随机存取时,由于数组特性,时间复杂度是O(1),这是程序一次就能够执行完,这个时间复杂度是一个非常奢侈的时间复杂度,我们很少能够在一个复杂的程序中达到这个复杂度,比较现实一点的低复杂度标杆是logn级别的时间复杂度,也就是O(logn)。当我们使用数组结构进行排序时,能够达到的最优时间复杂度是O(nlogn),对数组来说这似乎已经是极限了,然而我们仍然有办法降低这个时间复杂度,这时我们需要引入一个新结构,那就是

3.重要的树形结构

​ 在树中存在一些比较重要的树结构,他们分别为:排序二叉树平衡二叉树红黑树。灵活的使用这些树状结构,就可以提升我们的排序效率。在之后的笔记中,我会学习到八大排序算法,其中就有使用到排序二叉树的算法。

3.笔记原文

	数据结构 数据在内存当中如何存储
算法 解决问题的方法
计算机中最重要的部分:CPU,内存,磁盘。
内存和磁盘是如何存储的?固态硬盘也是磁盘的一种。互联网大厂通常使用机械硬盘,机械硬盘便宜,同时更加支持高并发。因此我们以机械硬盘即磁盘为例。
光盘表面是不光滑的,上边有一圈一圈的磁道,在磁道上边有一个叫磁颗粒的东西
一般在这些磁颗粒上边有一层氧化薄膜,刮破就会导致磁颗粒发生影响,光盘多放几次变卡的原因就是氧化薄膜破了。 磁盘读取数据就是因为有一个磁头,原理就是磁生电电生磁,在磁头上缠绕一个线圈,通过电流的流向控制来控制磁头的磁极,然后进而影响磁颗粒的磁极,进而以磁极来表示01,表示信息。这里在磁片上加一层好的氧化薄膜,就可以一直进行读取了,寿命就会变长。
在计算机中,数据是用二进制来表示的,我们在计算机中键入的数据实际上都是用二进制来存储的,我们用磁极来表示01,进而存储二进制数据。
我们如何读取数据呢?当磁头不通电时,让磁头切割磁感线,切割不同的磁颗粒时会产生不同方向的电流,进而通过电路映射成高低电平。
一个java程序跑起来在内存中的存储和以文件态存储在磁盘中是完全不同的。在磁盘中,我们存储的是文件类型,在内存中,则是需要按照java的规则来分配空间进行存储。也就是说在二者之中同一文件的形态是完全不同的。
内存的原理是电容:电容可以类比电池,其作用就是暂存电能。
在内存中最小的存储单位是电容。电容存储数据的一个前提就是首先要通电,这里的具体原理见计算机组成原理。用内存进行存取非常快,但是需要通电。在内存中,存储单元中有电就认为是1,没电就代表是0。不过这里的具体原理还是见计算机组成原理。
内存中存储的是临时性数据,而磁盘中存储的是永久性数据,一旦断电,内存中的电容就会自动放电,里边也就没有数据存储了,磁盘中断电后,磁颗粒仍然拥有磁性,因此是永久性的。磁盘尽管可以永久性存储数据,但是磁盘慢得很,它里边是通过机械机关实现的,而内存是直接用电路进行读取的,自然快得很。磁盘平均转半圈才能找到数据,同时磁头也要运动,一共的时间平均是5ms,这个速度比CPU慢的多得多,大概差25000000倍。内存则只需通过电流来获取信号,比机械机关快得多,内存存取大概是20nm,这就可以使CPU利用率提升到1%。打开游戏软件时需要加载,这个过程就是从磁盘中加载到内存当中。 数据结构
数组的本质是一块连续的内存空间。数组在内存中真实的存储环境。在内存中,有一个一个的小的比特点,实际上就是电容,数组的数据信息就是这样罗列在内存中。
数组的特点:数组中的数据是连续的,数组一旦定义,空间大小不能改变,数组只能存储相同类型的数据类型。数据可以通过下标进行访问。这些特点形成的原因是什么?数组的定义就是在内存中拿出一块连续的地址空间进行存储。
数组是如何通过下标进行访问的?
因为数组只能存储相同的数据类型,这使得数组中每一个元素占用的地址大小都是相等的。这样一来,我们只要掌握首地址,然后加下标乘以数据大小,获得相应数据的首地址,然后截取后边的相应的位数,进行存取识别。数组的定义是连续空间,因此其难以扩容,因此它不能在原地址进行扩容,因此数组的大小是不能改变的。想要扩容只能另换地址。数组的逻辑地址和物理地址都是联系的且必须连续。
数组叫做地址连续性存储。数组的本质就是用连续的地址存储。
当当前地址不满足连续存储时,我们要考虑地址不连续的存储,这就是链表,当然地址不连续时不光只有链表,这个需要注意。不够链表的真实结构并不一定是非连续的,这个很随机。链表中会存一个数据域和一个指针域,指针域指向下一位。当以查询为优先时,最好用数组,连续性的空间会让存取非常快。
内存最主要的作用是给CPU提供数据,磁盘的最主要的作用是做数据的存储。二者的共性是,二者需要进行大量的查询操作,大部分情况下他们做的是数据的查询工作。
而内存既然要为CPU提供资源,就要有非常快的存取速度,要求所有存在于内存当中的数据必须连续存储。乃至于链表,在内存中也是连续的。
在磁盘中有删除数据和添加数据两种重要操作。磁盘更倾向于链式存储数据,因为它经常进行删除数据和添加数据,用连续空间代价很大,因此磁盘中的基本存储方式,是链式的,磁盘中是没有数组的,它是存储文件的,但是它的存储方式是链式的,是离散的。 算法的时间复杂度:我们实现一个功能的方法,实际上就是算法。数据结构只能在内存中显现,而不会在磁盘中显现。
评价算法的标准有时间复杂度和空间复杂度。算法好坏的评价标准首先就是时间复杂度和空间复杂度,以时间复杂度为胜,我们主要会着重考虑时间复杂度。
互联网大厂更少考虑空间复杂度,因为他们不缺空间。
时间复杂度----->1.确定问题规模 n 如:有一个数组,用for循环来遍历 n次 从算法角度上讲,不会从大小上去考虑问题规模,而是会从数量级,从规模上进行考虑,我们一般用n来表示规模。
循环减半logn
O(1)是最小的时间复杂度,是最快的,只需要执行一次,就是O(1)级别的时间复杂度
对于有序数组来说,有一个折半搜索。折半搜索是一个logn级别的时间复杂度,这里我还是自己看书吧
k层n的循环是n的k次方,这些其实就是数据结构基础了。
以上三种是简单情况,复杂情况根据算法执行情况确定,基本上就是这样了。 链表只有O(n)级别的时间复杂度让他选择,
我们追求的复杂度是logn级别的,O(1)级别是一个奢侈的时间复杂度的,我们能够得到的最快的就是logn级别的。链表是无论如何也达不到logn的。
数组排序中最优的时间复杂度是O(nlogn),即使这样,我们的时间复杂度还是可以到logn的
想要降低时间复杂度,需要构造出一个新的结构:树
排序二叉树:一个节点可以分为左右两个子节点,左边节点值一定比当前节点的值小,右边节点值一定比当前节点值大。
平衡二叉树 在排序二叉树的基础之上,要求一个节点左右两边的子树的深度差不能超过1
如果超过1之后,存在四种旋转方式达到平衡:RR LL LR RL
平衡二叉树要严格把搜索时间限制在logn。
平衡二叉树的缺点是太耗费资源了,每次进行平衡调整都需要消耗系统资源。
内存最优数据结构:红黑树,红黑树非常重要非常难。
红黑树是在2-3-4树上边发展而来的。
2树:只能分出两个叉的树,
3树:能分出三个叉的树,一个节点上有两个元素
4树:能分出四个叉的树
这里我有点疑惑
234树的特点:每一个叶子节点都有相同的深度。
在234树的基础之上把它变成一个二叉树,就是红黑树
红黑树每个节点不是红色就是黑色,234树是B树的一种,是一个4节B树
红黑树:根节点是黑色的节点,每个叶子结点都是黑色的
如果一个节点是红色的那么它的子节点必须是黑色的
从一个节点到该节点上的所有子孙节点的路径上都拥有相同深度的黑色节点数目。
带数值的节点都不会作为叶子结点存在,他们都会有一个null的叶子结点。
在红黑树中没有一条路径比其他路径长两倍多

Java学习笔记:2022年1月11日的更多相关文章

  1. 2022年5月11日,NBMiner发布了41.3版本,在内核中加入了100%LHR解锁器,从此NVIDIA的显卡再无锁卡一说

           2022年5月11日,NBMiner发布NBMiner_41.3版本,主要提升了稳定性.         2022年5月8日,NBMiner发布NBMiner_41.0版本,在最新的内核 ...

  2. 路冉的JavaScript学习笔记-2015年1月23日

    1.JavaScript的数据类型 A.原始类型:包含数值.字符串.布尔值.空值(null)和未定义值(undefined). Js原始类型均为不可改变类型.对不可变类型调用任何自带方法都不会改变原始 ...

  3. 路冉的JavaScript学习笔记-2015年2月5日

    1.为Js原始值创建临时对象,并进行属性引用 var s="text"; s.len=4;//这里Js调用new String(s)的方法创建了一个临时对象,用来属性引用 cons ...

  4. 【视频】k8s套娃开发调试dapr应用 - 在6月11日【开源云原生开发者日】上的演示

    这篇博客是在2022年6月11日的[开源云原生]大会上的演讲中的演示部分.k8s集群套娃(嵌套)是指在一个k8s的pod中运行另外一个k8s集群,这想法看上去很疯狂,实际上非常实用. k8s集群套娃( ...

  5. 《Java学习笔记(第8版)》学习指导

    <Java学习笔记(第8版)>学习指导 目录 图书简况 学习指导 第一章 Java平台概论 第二章 从JDK到IDE 第三章 基础语法 第四章 认识对象 第五章 对象封装 第六章 继承与多 ...

  6. 20145330第九周《Java学习笔记》

    20145330第九周<Java学习笔记> 第十六章 整合数据库 JDBC入门 数据库本身是个独立运行的应用程序 撰写应用程序是利用通信协议对数据库进行指令交换,以进行数据的增删查找 JD ...

  7. java学习笔记之日期日历类

    java学习笔记之日期日历 Date日期类概述: 表示特定的瞬间,精确到毫秒 Date类的构造方法: 1.空参数构造方法 Date date = new Date(); 获取到当前操作系统中的时间和日 ...

  8. 20155234 2610-2017-2第九周《Java学习笔记》学习总结

    20155234第九周<Java学习笔记>学习总结 教材学习内容总结 数据库本身是个独立运行的应用程序 撰写应用程序是利用通信协议对数据库进行指令交换,以进行数据的增删查找 JDBC(Ja ...

  9. Java学习笔记(七)——获取类中方法的信息,java的LinkedList

    [前面的话] 在实际项目中学习知识总是最快和最有效的,既能够较好的掌握知识,又能够做出点东西,还是简单的知识总结,最近一直在总结笔记,写的东西还是比较水,希望慢慢可以写出一些干货. 学习过程中的小知识 ...

  10. 20145230《java学习笔记》第七周学习总结

    20145230 <Java程序设计>第7周学习总结 教材学习内容 Lambda语法概览 我们在许多地方都会有按字符串长度排序的需求,如果在同一个方法内,我们可以使用一个byName局部变 ...

随机推荐

  1. Python学习笔记----操作字符串

    1.字符串相加.列表相加.列表和字符串不能混着使用 #序列相加 a="hello" b="python" c=a+b print("字符串相加的结果& ...

  2. 25.自定义mixin和基类

    很多时候业务需求并不是几个简单的mixin就可以满足,需要我们自定义mixin # get_object源码中字段查询源代码 filter_kwargs = {self.lookup_field: s ...

  3. 【保姆教程】RuoYi-Radius搭建实现portal认证

    [保姆教程]RuoYi-Radius搭建实现portal认证 一.简介 以若依后台管理框架V4.6.0做为基础框架,实现了ToughRADIUS大部分功能,支持标准RADIUS协议(RFC 2865, ...

  4. vue 祖先组件操作后代组件方法

    前言:最近写代码遇到一问题:祖先级别的组件怎么操作孙子的儿子的组件方法(是不是已经绕晕了),在网上搜了半天都是父子传参,父子操作,晕晕乎乎的想起了bus(事件总线), 原理就是:是在vue原型上挂载( ...

  5. CSS基础知识筑基

    01.CSS 简介 CSS 指层叠样式表 (Cascading Style Sheets),对HTML网页内容进行统一外观样式设计和管理,给网页进行各种装饰,让她变得美观,是HTML的化妆师.(Cas ...

  6. Golang 和 Python 随机生成N位字符串

    Golang: func RandomString(n int) string { var letters = []byte("ABCDEFGHIGKLMNOPQRSTUVWXYZabcde ...

  7. Elasticsearch Analyzer 内置分词器

    Elasticsearch Analyzer 内置分词器 篇主要介绍一下 Elasticsearch中 Analyzer 分词器的构成 和一些Es中内置的分词器 以及如何使用它们 前置知识 es 提供 ...

  8. JIRA操作之JQL

    搜索功能 Jira的搜索功能非常强大,有专用的搜索语言JQL(Jira Query Language).Jira的Python库是基于JQL语法搜索的,返回的是搜索到的问题列表. jira.searc ...

  9. 工作中,本人常用到的unzip、zip命令

    1. 命令安装 1.1 zip安装 yum install zip 1.2 unzip安装 yum install unzip 2. 常用命令 2.1 常用zip命令 2.1.1 压缩文件 zip x ...

  10. 一个基于角色的访问控制(RBAC)的简单示例

    关于"基于角色的访问控制"是什么,本文不再赘述,如果不明白,请自行查阅资料了解. 本文参考用户·角色·权限·表的设计的思想设计. 本文用到的技术有Spring Boot.Sprin ...