• 数据结构与算法之美06


    个人学习笔记总结,详见数据结构与算法之美(度娘)

    线性表:

    非线性表:

    数组

    1、存储结构:链式存储,前驱后继关联

    2、操作:

    crud(前后索引关联,涉及最优最糟问题)

    特点:非常低效

    查询操作:

    了解其存储方式,即查询就是通过数组下标进行。

    插入操作:

    假设数组的长度为n,现在,如果我们需要将一个数据插入到数组中的第k个位置。为了把第k个位置腾出来,给新来的数据,我们需要将第k~n这部分的元素都顺序地往后挪一位。那插入操作的时间复杂度是多少呢?

    如果在数组的末尾插入元素,那就不需要移动数据了,这时的(最优)时间复杂度为O(1)。但如果在数组的开头插入元素,那所有的数据都需要依次往后移动一位,所以最坏时间复杂度是O(n)。因为我们在每个位置插入元素的概率是一样的,所以平均情况时间复杂度为(1+2+.n)/n=O(n)。

    如果数组中的数据是有序的,我们在某个位置插入一个新的元素时,就必须按照刚才的方法搬移k之后的数据。但是,如果数组中存储的数据并没有任何规律,数组只是被当作一个存储数据的集合。在这种情况下,如果要将某个数组插入到第k个位置,为了避免大规模的数据搬移,我们还有一个简单的办法就是,直接将第k位的数据搬移到数组元素的最后,把新的元素直接放入第k个位置。

    例:

    假设数组a[10]中存储了如下5个元素:a,b,c,d,e。我们现在需要将元素X插入到第3个位置。我们只需要将c放入到a[5],将a[2]赋值为X即可。最后,数组中的元素如下:a,b,x,d,e,c。

    删除操作:

    跟插入数据类似,如果我们要删除第k个位置的数据,为了内存的连续性,也需要搬移数据,不然中间就会出现空洞,内存就不连续了。 和插入类似,如果删除数组末尾的数据,则最好情况时间复杂度为O(1);如果删除开头的数据,则最坏情况时间复杂度为O(n);平均情况时间复杂度也为O(n)。

    实际上,在某些特殊场景下,我们并不一定非得追求数组中数据的连续性。如果我们将多次删除操作集中在一起执行,删除的效率是不是会提高很多呢? 例:

    数组a[1]中存储了8个元素:a,b,c,d,e,f,g,h。现在,我们要依次删除a,b,c三个元素。

    为了避免d,e,f,g,h这几个数据会被搬移三次,我们可以先记录下已经删除的数据。每次的删除操作并不是真正地搬移数据,只是记录数据已经被删除。当数组没有更多空间存储数据时,我们再触发执行一次真正的删除操作,这样就大大减少了删除操作导致的数据搬移。

    访问数组越界问题:

    即访问数组以外的资源;

    容器能否完全替代数组?

    针对数组类型,很多语言都提供了容器类,比如Java中的Arraylist、C++STL中的ector。在项目开发中,什么时候适合用数组,什么时候适合用容器呢? ArrayList与数组相比,有哪些优势呢? ArrayList的优势就是可以将很多数组操作的细节封装起来。比如前面提到的数组插入、删除数据时需要搬移其他数据等。另外,它还有一个优势,就是支持动态扩容。 数组本身在定义的时候需要预先指定大小,因为需要分配连续的内存空间。如果我们申请了大小为10的组,当第11个数据需要存储到数组中时,我们就需要重新分配一块更大的空间,将原来的数据复制过去,然后再将新的数据插入。

    注意 因为扩容操作涉及内存申请和数据搬移,是比较耗时的。所以,如果事先能确定需要存储的数据大小,最好在创建ArrayList的时候事先指定数据大小。

    例:

    ArrayList<User> users = new ArrayList(10000);
    for (int i = 0; i < 10000; ++i) {
      users.add(xxx);
    }

    1.Java Arraylist无法存储基本类型,比如int、long,需要封装为Integer、Long类,而Autoboxing、Unboxing则有一定的性能消耗,所以如果特别关注性能,或者希望使用基本类型,就可以选用数组。 2.如果数据大小事先已知,并且对数据的操作非常简单,用不到ArrayList提供的大部分方法,也可以直接使用数组。 3.还有一个是我个人的喜好,当要表示多维数组时,用数组往往会更加直观。比如Object array;而用容器的话则需要这样定义:ArrayList<ArrayList>array。

    数组下标问题:

  • 相关阅读:
    【IoT】IDEA 编译出错 Error running xxx : Command line is too long.Shorten command line
    【可视化】地震剖面道数据可视化绘制思路
    【IoT】使用MQTTBox.exe发送消息到Thingsboard3.3.3上
    【IoT】thingsboard3.3.3测试,使用nodemqtt发送消息
    【IoT】thingsboard3.3.3编译问题解决
    【Postgres】Postgres12帮助手册
    【IoT】发布启动thingsboard3.3.3
    【前端开发】Webpack mars3dvue2electron打包问题
    【可视化】地震数据体Segy文件inline、xline道数据计算获取
    【IoT】thingsboard3.3.3运行启动
  • 原文地址:https://www.cnblogs.com/fenqinearl/p/10901480.html
Copyright © 2020-2023  润新知