• 学习数据结构Day2


    之前学习过了数组的静态实现方法,同时将数组的所有有可能实现的方法都统一实现了一遍,之后支持了泛型的相关

    概念,接下来就是如何对数组进行扩容的操作也就是实现动态数组。

    private void resize(int newcapacity){
            E[] newdata = (E[]) new Object[newcapacity];
            for (int i = 0; i < newcapacity; i++) {
                newdata[i] = data[i];
            }
            data = newdata;
        }

    在此处,我们写了一个关于resize的操作,其原理就是对就数组容量的扩容,扩容其原来的二倍。

    同理,我们还可以进行对删除操作的优化,如果删完数据后,数组的容量有一半多是不用的空间,我们就可以进行删

    掉一半的操作。

      public E remove(int index) {
            if (index < 0 || index > size) {
                throw new IllegalArgumentException("require index >= 0 and index > size!");
            }
            E ret = data[index];
            for (int i = index + 1; i < size; i++) {
                data[i - 1] = data[i];
            }
            size--;
            data[size] = null;  // loitering Objects != memory leak
            if(size == data.length / 2){
                resize(data.length/2);
            }
            return ret;
        }

    注意代码的第11,12行 进行了优化。

    至此,我们就把数组的动态的实现整理完毕了。

    接下来,我简单的描述一下时间复杂度的分析。

    O(1) O(n) O(lgn) O(nlogn) O(n^2)

    大O是描述的算法运行时间和输入数据之间的关系。

    O(n)中 n表示的是元素的个数  算法和n呈线性关系。

    那么O(n^2)则表示的是 成二次方的关系。

    针对于不同的算法,我们需要针对不同的变量进行变量控制,来确定这个算法是否是最快的。

    image.png

    同理,删除操作也是相应的时间复杂度。

    在看完时间复杂度之后,我们引入一个resize的时间复杂度分析。

    对于添加的时间复杂度分析,我们可以看到,resize的时间复杂度分析是O(n),那么我们按最坏时间复杂度分析,

    我们就将添加的时间复杂度算为O(n),但是并不是每次添加元素我们都要resize的 ,所以假设capacity = n,n+1次

    addLast,触发resize,总共进行2n+1次基本操作平均,每次addLast操作,进行两次基本操作。这样均摊计算,时间复

    杂度是O(1)的!,同理removeLast()的时间复杂度也是O(1)的,但是,如果我们综合去看待这个方法时,就会出现问

    题。在填满数据后,我调用addLast()方法时,需要扩容,紧接着我又调用removeLast()方法,又开始缩容,一直这

    样下去,时间复杂度一直是O(n),这样就产生了时间复杂度震荡。出现的原因是:removeLast()时,过于着急,我们

    可以让他懒惰一些,也就是说可以在等到size  ==  capacity/4时,才将capacity减半。

    image.png

    这样,我们自己写完的动态数组就完成了!

  • 相关阅读:
    关于this指向思考
    (转) 那些无用的人----《人类简史》读后感
    常见数组&字符串API及其应用场景总结
    每当十一过了,总让我想起新年快了
    JavaScript笔记之数组 keyword(存储和释放&堆栈 & 按值 引用)
    关于Switch结构利用
    ios GCD同步异步
    IOS 实现TXT文本自动识别编码的方法
    iOS开发网络篇之文件下载、大文件下载、断点下载
    ios 自定义NSError
  • 原文地址:https://www.cnblogs.com/xiaobaoa/p/11921908.html
Copyright © 2020-2023  润新知