时间复杂度 - Java那些事儿专栏

ArrayList部分一共五篇文章了,而且引入了时间复杂度来分析,强烈建议你们必定要按顺序阅读,本文是第3篇,前两篇文章分别是:算法

一、ArrayList初始化 - Java那些事儿专栏数组

二、ArrayList底层数组扩容原理 - Java那些事儿专栏数据结构


最近看了一下评论区里,你们都急着想要了解HashMap,先不要着急,要完整的了解HashMap的内部实现,咱们还须要一些基础知识,有了这些基础知识,咱们才能更好的理解HashMap,其实咱们已经在不知不觉进入了数据结构的大门,为了之后让你们能更好的理解后续文章,本文咱们先引入时间复杂度这个概念。post

仍是那个Person对象,增长了一个属性年龄3d

建立一个数组,并在数组里放了10个Person对象,老规矩,咱们上图:cdn

假如咱们有这么一个需求,咱们想知道小组里周八的年龄,相信你们都会写代码去找:对象

须要循环取6次从数组里获取Person对象。blog

这时候小明同窗过来讲,哎呀,我知道周八在小组的第5个位置(数组下标5),不用循环,咱们直接找他就是get

不须要循环,1次就取到了Person对象:源码

不管数组中有多少个元素,每次去读取元素和并比较的时间老是相同的,假设这个时间为K,在上面示例中在数组中循环搜索某个用户,咱们循环了6次才搜索到该用户,时间为6*K,在效率上来看,前者比后者的方式快了6倍,但这种说法意义不大,由于在实际中,数组可能有100个元素,而这个“周八”有可能在数组的第1个位置,也有可能在最后一个位置。

在现实中,咱们用来计算时间的长短,通常单位有小时,分钟,秒等,一样咱们也须要一种度量来计算本示例中的算法的效率,在计算机科学中,这种度量方法被称为“大O”表示法

当咱们知道元素的位置,一步到位就能访问到该元素,这个时间为K,时间复杂度用大O表示法标记为O(1),省略了K。而在数组中查找某元素,咱们并不知道这个元素在数组的什么位置,假设数组的长度为n,有可能该元素恰好在数组的下标为0的位置(第一个位置)循环1次就匹配到了,时间复杂度为O(1)。也有可能在数组下标为n-1的位置(最后一个位置)咱们要循环n次才能匹配到该值,时间复杂度为O(n),按照几率计算下来平均是n/2,即平均时间复杂度为O(n/2),但咱们不该该只考虑平均值,咱们要考虑最坏的状况,即假设每次匹配的元素都在数组的最后一位,由于最坏状况是一种运行时间保证,运行时间不会再长了,若是咱们没特别指定,咱们提到的运行时间都是最坏状况的运行时间,即在数组中查找某元素,时间复杂度为O(n);

在长度为n数组中

直接经过下标去访问元素,时间复杂度为O(1)

须要循环查找元素的时候,时间复杂度为O(n)


下一章咱们将分析ArrayList的删除元素的源码,来分析一下ArrayList的时间复杂度,进而了解ArrayList的优势与不足。

上一篇:ArrayList底层数组扩容原理 - Java那些事儿专栏

下一篇:待续

注:本专栏文章首发于公众号:saysayJava。全部示例代码均已上传至公众号,须要请关注下载。

若是喜欢本系列文章,请为我点赞或顺手分享,您的支持是我继续下去的动力,您也能够在评论区留言想了解的内容,有机会本专栏会作讲解,最后别忘了关注一下我。

转载无限欢迎,但请注明「做者」和「原文地址」。转载请在文中保留此段,感谢您对做者版权的尊重。如需商业转载或刊登,请联系做者得到受权。

相关文章
相关标签/搜索