算法复杂度:时间复杂度、空间复杂度,比如O(1)、O(n)

算法复杂度:分为 时间复杂度空间复杂度

前言:经常出现问集合,比如问ArrayList,其get(int index)方法,add(E e)方法,add(int index, Eelement)方法,remove(int index)方法,时间复杂度分别是多少?再比如问LinkedList,其get(int index)方法,add(E e)方法,add(int index, E element)方法,remove(int index)方法,时间复杂度分别是多少?
看过我上2个文章写的Java中数据结构Java中集合文章的小伙伴就会知道,ArrayList和LinkedList的区别,是这两个集合的底层数据结构不一样。前者底层数据结构是数组,后者底层数据结构是双向循环链表。所以,这两个集合的查找、增、删等方法,效率不一样,也就是时间复杂度不一样。【记得请看我另外两个文章】

一. 算法复杂度含义:

  • 时间复杂度是度量算法执行时间的长短;同时也是一个函数,它定量描述了该算法的运行时间。
  • 空间复杂度是指算法所需存储空间的大小。
    (所以针对集合的查询方法,经常会问时间复杂度是多少这些问题。)

二. 举例:

  1. 举例时间复杂度:
    用通俗的话来描述,我们假设n=1所需的时间为1秒。那么当n=10000时。
    O(1)的算法需要1秒执行完毕。
    O(n)的算法需要10000秒 ≈ 2.7小时 执行完毕。
    O(n2)的算法需要100000000秒 ≈ 3.17年 执行完毕。
    O(n!)的算法需要XXXXXXXX(系统的计算器已经算不出来了)。
    可见算法的时间复杂度影响有多大。
    所以例子中的O(1)和O(n)差了2.7小时,区别显而易见。
  2. 时间复杂度,O(1)和O(n)区别:
    O(1)复杂度是与输入数据无关,O(n)是与输入数据成正比。
    对于程序A,for(int i=0;i<1000;i++),当输入任意的n时循环次数均为1000,复杂度为O(1);
    对于程序B,for(int i=0;i<n;i++),当输入任意的n时循环次数为n,复杂度为O(n)。
  3. 空间复杂度,略~~~~~~

三.常见集合,其方法的时间复杂度

  1. ArrayList各方法的时间复杂度:【底层是数组,查询方法效率高】
    get(int index)方法
    获取指定索引位置的元素,时间复杂度为O(1)。

    add(E e)方法
    添加元素到末尾,平均时间复杂度为O(1)。
    add(int index, E element)方法
    添加元素到指定位置,平均时间复杂度为O(n)。
    remove(int index)方法
    删除指定索引位置的元素,时间复杂度为O(n)。
    remove(Object o)方法
    删除指定元素值的元素,时间复杂度为O(n)。
  2. LinkedList各方法的时间复杂度:【底层是链表,增删方法效率高】
    get(int index)方法
    获取指定索引位置的元素,时间复杂度为O(n)。
    add(E e)方法
    添加元素到末尾,平均时间复杂度为O(1)。

    add(int index, E element)方法
    添加元素到指定位置,平均时间复杂度为O(n)。
    remove(int index)方法
    删除指定索引位置的元素,时间复杂度为O(1)。
    remove(Object o)方法
    删除指定元素值的元素,时间复杂度为O(1)。

四.详解常见集合,其方法的时间复杂度

  • Arraylist:底层数据结构是动态数组,
    根据下标随机访问数组元素的效率高,向数组尾部添加元素的效率高;
    但是,向数组中指定位置添加数据以及删除数组中的数据效率低,因为需要移动数组,会进行大量的数组移动复制操作,而数组复制时,最终将调用System.arraycopy()方法。(delete方法,例如最坏的情况是删除第一个数组元素,则需要将第2至第n个数组元素各向前移动一位。)
    而之所以称为动态数组,是因为Arraylist在数组元素超过其容量后,Arraylist可以进行扩容(针对JDK1.8, 数组扩容后的容量是扩容前的1.5倍)。
  • Linkedlist:底层数据结构是双向链表(JDK1.7 之后取消了循环),
    数据添加删除效率高,只需要改变指针指向即可;
    但是访问数据的效率低,需要对链表进行遍历。
    Linkedlist集合,每次插入add()都是移动指针,和 ArrayList 的拷贝移动数组 来说效率要高上不少。

五.总结

  • ArrayList查询,修改都根据索引效率高.因为LinkedList要移动指针。
  • LinkedList插入,删除都是移动指针效率很高.因为ArrayList要复制移动数据。

六.参考链接

  1. https://www.cnblogs.com/hengzhou/p/9896535.html
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值