• 链表02--[虚拟头结点&&链表数组复杂度分析]


    1.虚拟头结点

     1.1虚拟借点-node方法

     

    /**
         * 获取index位置对应的节点对象
         * @param index
         * @return
         */
        private Node<E> node(int index) {
            rangeCheck(index);
            
            Node<E> node = first.next;
            for (int i = 0; i < index; i++) {
                node = node.next;
            }
            return node;
        }
    View Code

    1.2虚拟节点-添加、删除

     

    @Override
        public void add(int index, E element) {
            rangeCheckForAdd(index);
            
            Node<E> prev = index == 0 ? first : node(index - 1);
            prev.next = new Node<>(element, prev.next);
    
            size++;
        }
    
        @Override
        public E remove(int index) {
            rangeCheck(index);
            
            Node<E> prev = index == 0 ? first : node(index - 1);
            Node<E> node = prev.next;
            prev.next = node.next;
                
            size--;
            return node.element;
        }
    View Code

    2.复杂度分析

    数组   

    数组的特点随机访问/随机存取(读取和修改)特别快

    index*4+数组首地址

    时间复杂度为o(1)

    数组删除和添加的时间复杂度

    O(n) 这个n不一定就是参数 而是数据规模

    最好O(1)

    最坏O(n)

    平均O(n)

    链表的随机访问/随机存取(读取和修改)的时间复杂度

    最好O(1)

    最坏O(n)

    平均O(n)

    链表

    链表删除和添加的时间复杂度

    最好O(1)

    最坏O(n)

    平均O(n)

    链表的特点就是节省存储空间

     注意

    有些资料说 链表的添加删除操作时间复杂度是O(1) 指的是添加删除那一瞬间操作

    不像数组一样需要把数据往后挪动

    但是整体的时间复杂度仍然是O(n)

    2.1数组的随机访问

     2.2动态数组、链表复杂度分析

     2.3动态数组add(E element)复杂度分析

    注意

    之前是 1+2+3+4+5+6+7+.....+n/n ==O(o)

    现在是1+1+1+1+1+1+1+......+n/n==O(1)

     2.4动态数组的缩容

    注意

    出现复杂度震荡 就是当

    扩容倍数和缩容时机只要不要相乘等于1就不会出现复杂度震荡

     

  • 相关阅读:
    类和对象
    数组
    随笔3
    设计把所有的奇数移动到所有偶数前面的算法
    选择排序
    队列的链式存储结构
    循环队列
    一起玩算法(把所有相同的数字后移)
    判断序列B是否是序列A的连续子序列
    power bi创建切片器导航
  • 原文地址:https://www.cnblogs.com/ggnbnb/p/12171091.html
Copyright © 2020-2023  润新知