数据结构之数组

简介: 数据结构之数组

什么是数据结构


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


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


二次封装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。


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



相关文章
【数据结构】数组、双链表代码实现
【数据结构】数组、双链表代码实现
|
22天前
|
算法 测试技术 C++
【数据结构】【双堆】【滑动窗口】3013. 将数组分成最小总代价的子数组 II
【数据结构】【双堆】【滑动窗口】3013. 将数组分成最小总代价的子数组 II
|
22天前
|
数据处理 C语言 C++
数据结构第四弹---数组相关OJ题
数据结构第四弹---数组相关OJ题
|
22天前
|
搜索推荐 算法 测试技术
数据结构排序——计数排序和排序总结(附上912. 排序数组讲解)
数据结构排序——计数排序和排序总结(附上912. 排序数组讲解)
32 0
|
22天前
|
存储 算法 Java
数据结构之数组
数据结构之数组
41 0
|
15天前
|
存储 算法
【数据结构与算法 | 基础篇】[数组专题]力扣88
【数据结构与算法 | 基础篇】[数组专题]力扣88
|
17天前
|
存储 算法
数据结构与算法②(复杂度相关OJ)(六道数组OJ题)(下)
数据结构与算法②(复杂度相关OJ)(六道数组OJ题)
20 0
|
17天前
|
存储 算法 C语言
数据结构与算法②(复杂度相关OJ)(六道数组OJ题)(上)
数据结构与算法②(复杂度相关OJ)(六道数组OJ题)
34 2
|
22天前
|
存储 算法 Java
数据结构与算法 数组和链表
数据结构与算法 数组和链表
14 0
|
22天前
|
存储 索引
深入浅出数据结构之数组
深入浅出数据结构之数组