数据结构 线性结构篇——动态数组和时间复杂度分析(2)

简介: 数据结构 线性结构篇——动态数组和时间复杂度分析

屏幕快照 2022-05-10 下午2.23.01.png

测试代码:


public static void main(String[] args) {
        ArrayPlus<Integer> arr = new ArrayPlus<>();
        for (int i = 12; i < 16; i++)
            arr.addLast(i);
        System.out.println(arr);
        arr.add(1,100);
        System.out.println(arr);
    }

返回结果:

Array:Size = 4,capacity = 10
[12,13,14,15]
Array:Size = 5,capacity = 10
[12,100,13,14,15]


2.2 数组删除元素

屏幕快照 2022-05-10 下午2.23.40.png


实现代码:

  //查找数组中元素e所在的索引,如果不存在元素e,则返回-1
    public int find(E e){
        for (int i = 0; i < size; i++) {
            if(data[i].equals(e))
                return i;
        }
        return -1;
    }
 //从数组中删除index位置的元素,返回删除的元素
    public E remove(int index){
        if(index < 0 || index >= size)
            throw new IllegalArgumentException("remove failed . Index is illegal.");
        E ret = data[index];
        for (int i = index+1 ; i < size; i++)
                data[i - 1] = data[i];
        size--;
        // loitering objects != memory leak
        data[size] = null;//如果一旦使用新的元素,添加新的对象就会覆盖掉
        return ret;
    }
    //从数组中删除第一个位置的元素,返回删除的元素
    public E removeFirst(){
        return remove(0);
    }
    //从数组中删除最后一个位置的元素,返回删除的元素
    public E removeLast(){
        return remove(size-1);
    }
    //从数组中删除元素e
    public void removeElement(E e){
        int index = find(e);
        if(index != -1)
            remove(index);
    }

测试:

import com.bj.array.ArrayPlus;
public class Main2 {
    public static void main(String[] args) {
        ArrayPlus<Integer> arr = new ArrayPlus<>();
        for (int i = 12; i < 16; i++)
            arr.addLast(i);
        System.out.println(arr);
        arr.add(1,100);
        System.out.println(arr);
        arr.remove(1);
        System.out.println(arr);
    }
}

返回示例:

Array:Size = 4,capacity = 10
[12,13,14,15]
Array:Size = 5,capacity = 10
[12,100,13,14,15]
Array:Size = 4,capacity = 10
[12,13,14,15]


我们看到结果已经把索引为1的删除了,到这里我们已经完成了一大半了,还有一小点也是最重要的,就是当我们添加数据超过了我们的初始容量大小的时候,就会报错,初始容量,无法添加超过的数据,那么我们应该怎么操作呢?其实很简单,我们只需要给我们数组类,添加一个扩容的方法即可,当我们元素的个数等于数组长度的时候,我们就进行扩容,我们称之为 动态数组。

2.3 动态数组

屏幕快照 2022-05-10 下午2.24.37.png

实现代码:

 //在第Index个位置插入一个新元素e
    public void add(int index,E e){
        if(index < 0 || index > size)
            throw new IllegalArgumentException("Add failed . Require index < 0 || index > size.");
        if(size == data.length)
            resize(2 * data.length);
        for (int i = size - 1; i >= index ; i--)
            data[i+1] = data[i];
        data[index]  = e;
        size++;
    }
    private void resize(int newCapacity) {
        E[] newData = (E[])new Object[newCapacity];
        for (int i = 0; i < size; i++)
            newData[i] = data[i];
        data = newData;
    }

动态数组测试:

import com.bj.array.ArrayPlus;
public class Main2 {
    public static void main(String[] args) {
        ArrayPlus<Integer> arr = new ArrayPlus<>();
        for (int i = 0; i < 10; i++)
            arr.addLast(i);
        System.out.println(arr);
        arr.add(1,100);
        System.out.println(arr);
        for (int i = 0; i < 6; i++)
            arr.remove(i);
        arr.removeLast();
        System.out.println(arr);
    }
}
Array:Size = 10,capacity = 10
[0,1,2,3,4,5,6,7,8,9]
Array:Size = 11,capacity = 20
[0,100,1,2,3,4,5,6,7,8,9]
Array:Size = 4,capacity = 10
[100,2,4,6]

从结果中我们可以看到,当我们数组元素超过初始容量大小时,自动扩容到初始容量的 两倍 也就是20,当我们数组长度小于1/4的时候,为什么是1/4的时候而不是1/2的时候呢,下面我们会做详细介绍。当我们数组长度小于1/4的时候,会自动缩回到初始10的容量,不会去占据大量的内存空间。

目录
相关文章
|
3月前
|
并行计算 算法 测试技术
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
99 1
|
3月前
|
存储 搜索推荐 算法
【数据结构】树型结构详解 + 堆的实现(c语言)(附源码)
本文介绍了树和二叉树的基本概念及结构,重点讲解了堆这一重要的数据结构。堆是一种特殊的完全二叉树,常用于实现优先队列和高效的排序算法(如堆排序)。文章详细描述了堆的性质、存储方式及其实现方法,包括插入、删除和取堆顶数据等操作的具体实现。通过这些内容,读者可以全面了解堆的原理和应用。
149 16
|
4月前
|
机器学习/深度学习 存储 缓存
数据结构与算法学习十:排序算法介绍、时间频度、时间复杂度、常用时间复杂度介绍
文章主要介绍了排序算法的分类、时间复杂度的概念和计算方法,以及常见的时间复杂度级别,并简单提及了空间复杂度。
77 1
数据结构与算法学习十:排序算法介绍、时间频度、时间复杂度、常用时间复杂度介绍
|
5月前
|
存储 Java
java数据结构,线性表链式存储(单链表)的实现
文章讲解了单链表的基本概念和Java实现,包括头指针、尾节点和节点结构。提供了实现代码,包括数据结构、接口定义和具体实现类。通过测试代码演示了单链表的基本操作,如添加、删除、更新和查找元素,并总结了操作的时间复杂度。
java数据结构,线性表链式存储(单链表)的实现
|
4月前
|
存储 编译器 C++
【初阶数据结构】掌握二叉树遍历技巧与信息求解:深入解析四种遍历方法及树的结构与统计分析
【初阶数据结构】掌握二叉树遍历技巧与信息求解:深入解析四种遍历方法及树的结构与统计分析
|
5月前
|
机器学习/深度学习 算法 Java
[算法与数据结构] 谈谈线性查找法~
该文章详细介绍了线性查找法的基本概念与实现方法,通过Java代码示例解释了如何在一个数组中查找特定元素,并分析了该算法的时间复杂度。
|
4月前
|
算法
[数据结构] -- 时间复杂度和空间复杂度
[数据结构] -- 时间复杂度和空间复杂度
36 0
|
4月前
探索顺序结构:栈的实现方式
探索顺序结构:栈的实现方式
|
5月前
|
存储 算法 C语言
数据结构基础详解(C语言): 二叉树的遍历_线索二叉树_树的存储结构_树与森林详解
本文从二叉树遍历入手,详细介绍了先序、中序和后序遍历方法,并探讨了如何构建二叉树及线索二叉树的概念。接着,文章讲解了树和森林的存储结构,特别是如何将树与森林转换为二叉树形式,以便利用二叉树的遍历方法。最后,讨论了树和森林的遍历算法,包括先根、后根和层次遍历。通过这些内容,读者可以全面了解二叉树及其相关概念。
|
4月前
|
存储 算法
【数据结构】二叉树——顺序结构——堆及其实现
【数据结构】二叉树——顺序结构——堆及其实现