【数据结构与算法】3、虚拟头节点、动态数组的缩容、动态数组和单链表的复杂度、数组的随机访问

简介: 【数据结构与算法】3、虚拟头节点、动态数组的缩容、动态数组和单链表的复杂度、数组的随机访问


一、虚拟头节点

🌼 为了让代码更加精简,统一所有节点的处理逻辑,可以在最前面增加一个虚拟的头节点(不存储数据)

修改 node(int) 方法:

/**
     * 返回 index 位置的节点
     */
    private Node<E> node(int index) {
        rangeCheck(index);
        // 从虚拟头节点的下一个节点开始寻找
        Node<E> moveNode = first.next;
        for (int i = 0; i < index; i++) {
            moveNode = moveNode.next;
        }
        return moveNode;
    }

修改添加和删除方法:

@Override
    public void add(int index, E element) {
        rangeCheck4Add(index);
        // 拿到【index - 1】位置的节点
        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;
    }

二、数组的随机访问

🎉数组的随机访问速度非常快

🎉elements[n] 的效率与 n 是多少无关

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

🎉 这里的链表是单链表

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

🎉 扩容操作不是每次都会发生

  • 什么情况下适合使用均摊复杂度?
    🎉经过连续的多次复杂度比较低的情况后,出现个别复杂度比较高的情况

五、动态数组的缩容

🎁 如果内存使用比较紧张,动态数组有比较多的剩余空间,可以考虑进行缩容操作

🎁 比如剩余空间占总容量的一半时,就进行缩容(size 大于总容量的一半的时候进行缩容)

🎁 缩容操作在动态数组的删除方法中进行

private void trim() {
       int oldCapacity = elements.length;
       int halfCapacity = oldCapacity >> 1;
       // size 大于总容量的一半, 总容量小于等于默认容量的时候不缩容
       if (size >= halfCapacity || oldCapacity <= DEFAULT_CAPACITY) return;
       E[] newElements = (E[]) new Object[halfCapacity];
       for (int i = 0; i < size; i++) {
           newElements[i] = elements[i];
       }
       elements = newElements;
       System.out.println(oldCapacity + "缩容为" + halfCapacity);
   }

🎁 如果扩容倍数、缩容时机设计不得当,有可能会导致复杂度震荡

相关文章
|
11月前
|
存储 机器学习/深度学习 编解码
双选择性信道下正交啁啾分复用(OCDM)的低复杂度均衡算法研究——论文阅读
本文提出统一相位正交啁啾分复用(UP-OCDM)方案,利用循环矩阵特性设计两种低复杂度均衡算法:基于带状近似的LDL^H分解和基于BEM的迭代LSQR,将复杂度由$O(N^3)$降至$O(NQ^2)$或$O(iNM\log N)$,在双选择性信道下显著提升高频谱效率与抗多普勒性能。
570 0
双选择性信道下正交啁啾分复用(OCDM)的低复杂度均衡算法研究——论文阅读
|
存储 人工智能 算法
C 408—《数据结构》算法题基础篇—数组(通俗易懂)
408考研——《数据结构》算法题基础篇之数组。(408算法题的入门)
1108 23
|
存储 监控 算法
关于员工上网监控系统中 PHP 关联数组算法的学术解析
在当代企业管理中,员工上网监控系统是维护信息安全和提升工作效率的关键工具。PHP 中的关联数组凭借其灵活的键值对存储方式,在记录员工网络活动、管理访问规则及分析上网行为等方面发挥重要作用。通过关联数组,系统能高效记录每位员工的上网历史,设定网站访问权限,并统计不同类型的网站访问频率,帮助企业洞察员工上网模式,发现潜在问题并采取相应管理措施,从而保障信息安全和提高工作效率。
301 7
|
缓存 算法 搜索推荐
Java中的算法优化与复杂度分析
在Java开发中,理解和优化算法的时间复杂度和空间复杂度是提升程序性能的关键。通过合理选择数据结构、避免重复计算、应用分治法等策略,可以显著提高算法效率。在实际开发中,应该根据具体需求和场景,选择合适的优化方法,从而编写出高效、可靠的代码。
363 6
|
算法 程序员 索引
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
栈的基本概念、应用场景以及如何使用数组和单链表模拟栈,并展示了如何利用栈和中缀表达式实现一个综合计算器。
445 1
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
|
存储 缓存 算法
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式,强调了合理选择数据结构的重要性,并通过案例分析展示了其在实际项目中的应用,旨在帮助读者提升编程能力。
660 5
|
存储 人工智能 算法
数据结构实验之C 语言的函数数组指针结构体知识
本实验旨在复习C语言中的函数、数组、指针、结构体与共用体等核心概念,并通过具体编程任务加深理解。任务包括输出100以内所有素数、逆序排列一维数组、查找二维数组中的鞍点、利用指针输出二维数组元素,以及使用结构体和共用体处理教师与学生信息。每个任务不仅强化了基本语法的应用,还涉及到了算法逻辑的设计与优化。实验结果显示,学生能够有效掌握并运用这些知识完成指定任务。
490 4
|
存储 算法 定位技术
数据结构与算法学习二、稀疏数组与队列,数组模拟队列,模拟环形队列
这篇文章主要介绍了稀疏数组和队列的概念、应用实例以及如何使用数组模拟队列和环形队列的实现方法。
311 0
数据结构与算法学习二、稀疏数组与队列,数组模拟队列,模拟环形队列
|
移动开发 算法 前端开发
前端常用算法全解:特征梳理、复杂度比较、分类解读与示例展示
前端常用算法全解:特征梳理、复杂度比较、分类解读与示例展示
594 0
|
存储 算法
非递归实现后序遍历时,如何避免栈溢出?
后序遍历的递归实现和非递归实现各有优缺点,在实际应用中需要根据具体的问题需求、二叉树的特点以及性能和空间的限制等因素来选择合适的实现方式。
502 59

热门文章

最新文章