数据结构之数组

简介: 数据结构之数组

什么是数据结构


网络异常,图片无法展示
|


网络异常,图片无法展示
|


二次封装java中的数组


  • 索引没有语意,如何表示没有元素。


  • 如何添加元素?如何删除元素?


数据结构实现


  • size属性的位置就是将要添加元素的位置


public class Array<E> {
//    设置一个int类型的数组
    private E[] arr;
    private int size;
    public Array(int capacity) {
//        arr = new int[capacity];
        arr = (E[]) new Object[capacity];
    }
    public Array() {
        this(10);
    }
//    获取元素实际个数
    public int getSize() {
        return size;
    }
//    获取数组容量
    public int getCapacity() {
        return this.arr.length;
    }
//    判断数组是否为空
    public boolean isEmpty() {
        return size == 0;
    }
//    添加元素。注意size的位置不能出现值的
    public void add(int index, E element) {
//        this.arr[index] = element;
//        size++;
//        1. 先判断填入的元素是否已满
        if(size == arr.length) {
//            throw new Error("add fail, size == arr.length");
//            扩容为原来的2倍
            resize(arr.length * 2);
        }
//        2. 判断填入的元素位置是否越界。这里我们判断越界使用size。不想要稀疏数组。
        if(index > size || index < 0) throw new Error("add fail, index > size || index < 0");
//        3. 开始插入元素,开始向后推移
        for(int i = size - 1; i >= index; i--) {
//            这里刚好利用size位置存入空值的特性。
            arr[i + 1] = arr[i];
        }
//        4. index的位置已无元素,插入元素
        arr[index] = element;
        size++;
    }
//    在最后添加元素
    public void addLast(E element) {
        add(size, element);
    }
//    在最开始添加元素
    public void addFirst(E element) {
        add(0, element);
    }
//    toString
    @Override
    public String toString() {
        StringBuilder res = new StringBuilder();
        res.append(String.format("Array capacity %d, Array size %d\n", arr.length, size));
        res.append("[");
        for(int i = 0; i < size; i++) {
            res.append(arr[i]);
            if(i != size - 1) {
                res.append(",");
            }
        }
        res.append("]");
        return res.toString();
    }
//    获取元素
    public E get(int index) {
        if(index < 0 || index >= size) throw new Error("get fail, index < 0 || index >= size");
        return arr[index];
    }
//    修改元素
    public void set(int index, E element) {
        if(index < 0 || index >= size) throw new Error("get fail, index < 0 || index >= size");
        arr[index] = element;
    }
//    判断是否包含元素
    public boolean contains(E element) {
        for(int i = 0; i < size; i++) {
            if(element == arr[i]) {
                return true;
            }
        }
        return false;
    }
//    查找元素下表
    public int find(E element) {
        for(int i = 0; i < size; i++) {
            if(element == arr[i]) {
                return i;
            }
        }
        return -1;
    }
//    删除元素
    public boolean remove(int index) {
        if(index < 0 || index >= size) {
            throw new Error("delete fail, index < 0 || index >= size");
        }
        for(int i = index; i < size; i++) {
            arr[i] = arr[i + 1];
        }
        size--;
        // 这里为了防止扩容震荡,所以size 等于容积的1/4时,在缩容
        if(size == arr.length / 4 && data.length / 2 != 0) {
//            缩容为原来的一半。
            resize(arr.length / 2);
        }
        return true;
    }
//    删除最后一个元素
    public boolean removeLast() {
        return remove(size - 1);
    }
//    删除第一个元素
    public boolean removeFirst() {
        return remove(0);
    }
//    扩容
    public void resize(int capacity) {
//        1. 先遍历原数组,并取出元素。
        E[] newArr = (E[]) new Object[capacity];
        for(int i = 0; i < size; i++) {
            newArr[i] = arr[i];
        }
        arr = newArr;
        newArr = null;
    }
}


数据结构复杂度分析


基本方法


网络异常,图片无法展示
|


网络异常,图片无法展示
|


网络异常,图片无法展示
|


网络异常,图片无法展示
|


扩容方法


网络异常,图片无法展示
|


网络异常,图片无法展示
|


网络异常,图片无法展示
|


网络异常,图片无法展示
|


网络异常,图片无法展示
|


这里会引起不断地扩容和降容。出现复杂度震荡。所以我们可以改变降容的条件。不让其size = arr.length / 2 时就开始降容。而是size = arr.length / 4。


网络异常,图片无法展示
|



相关文章
|
1月前
|
存储 Java 程序员
数据结构之 - 深入了解数组数据结构
数据结构之 - 深入了解数组数据结构
38 6
|
1月前
|
存储 算法 搜索推荐
探索常见数据结构:数组、链表、栈、队列、树和图
探索常见数据结构:数组、链表、栈、队列、树和图
99 64
|
1月前
|
算法 程序员 索引
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
栈的基本概念、应用场景以及如何使用数组和单链表模拟栈,并展示了如何利用栈和中缀表达式实现一个综合计算器。
30 1
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
|
1月前
|
存储 算法 定位技术
数据结构与算法学习二、稀疏数组与队列,数组模拟队列,模拟环形队列
这篇文章主要介绍了稀疏数组和队列的概念、应用实例以及如何使用数组模拟队列和环形队列的实现方法。
21 0
数据结构与算法学习二、稀疏数组与队列,数组模拟队列,模拟环形队列
|
2月前
|
存储 Java
java数据结构,线性表顺序存储(数组)的实现
文章介绍了Java中线性表顺序存储(数组)的实现。线性表是数据结构的一种,它使用数组来实现。文章详细描述了线性表的基本操作,如增加、查找、删除、修改元素,以及其他操作如遍历、清空、求长度等。同时,提供了完整的Java代码实现,包括MyList接口和MyLinearList实现类。通过main函数的测试代码,展示了如何使用这些方法操作线性表。
|
4月前
|
存储
【数据结构OJ题】轮转数组
力扣题目——轮转数组
43 2
【数据结构OJ题】轮转数组
|
3月前
|
存储 Java 程序员
"揭秘HashMap底层实现:从数组到链表,再到红黑树,掌握高效数据结构的秘密武器!"
【8月更文挑战第21天】HashMap是Java中重要的数据结构,采用数组+链表/红黑树实现,确保高效查询与更新。构造方法初始化数组,默认容量16,负载因子0.75触发扩容。`put`操作通过计算`hashCode`定位元素,利用链表或红黑树处理冲突。`get`和`remove`操作类似地定位并返回或移除元素。JDK 1.8优化了链表转红黑树机制,提升性能。理解这些原理能帮助我们更高效地应用HashMap。
45 0
|
5月前
|
存储 算法 调度
【数据结构与算法】详解循环队列:基于数组实现高效存储与访问
【数据结构与算法】详解循环队列:基于数组实现高效存储与访问
|
5月前
|
存储 JavaScript 前端开发
JavaScript中的数组是核心数据结构,用于存储和操作序列数据
【6月更文挑战第22天】JavaScript中的数组是核心数据结构,用于存储和操作序列数据。创建数组可以使用字面量`[]`或`new Array()`。访问元素通过索引,如`myArray[0]`,修改同样如此。常见方法包括:`push()`添加元素至末尾,`pop()`移除末尾元素,`shift()`移除首元素,`unshift()`添加到开头,`join()`连接为字符串,`slice()`提取子数组,`splice()`进行删除、替换,`indexOf()`查找元素位置,`sort()`排序数组。还有其他如`reverse()`、`concat()`等方法。
131 2
|
5月前
|
算法 索引 Python
数据结构 数组部分小结
数据结构 数组部分小结