数据结构之数组

简介: 1.数组基础 把数据码成一排进行存放 索引可以有语义;也可以没有语义 数组最大的优点:快速查询 数组最好应用于“所以有语意”的情况 但并非所有有语义的索引都是用于数组


1.数组基础

   把数据码成一排进行存放

image.png

   索引可以有语义;也可以没有语义

   数组最大的优点:快速查询

   数组最好应用于“所以有语意”的情况

   但并非所有有语义的索引都是用于数组

   身份证号

2.操作数组

   1.向数组添加元素

image.png

   2.在数组中查询和修改元素

   3.在数组中搜索和删除元素

3.使用泛型

   让数据结构可以放置“任何”数据类型

   不可使基本数据类型,只能是类对象

   boolean,byte,char,short,int,long,float,double

   每个基本数据类型都有对应的包装类

   Boolean,Byte,Char,Short,Int,Long,Float,Double

4.动态数组

新开辟数组,依次将新创建的数组代替原来的数组

5.简单的时间复杂度分析

   O(1),O(n),O(lgn),O(nlogn),O(n^2)

   大O简单秒杀价:运行时间和输入数据之间的关系,并且忽略常数

image.pngimage.pngimage.pngimage.png

6.均摊复杂度分析和防止复杂度震荡

image.pngimage.pngimage.png

Array类

/**
 * @description:
 * @time:2019/5/29
 */
public class Array<E>{
    private E[] data;
    private int size;
    //构造函数,传入数组的容量capacity构造Array
    public Array(int capacity){
        data =(E[])new Object[capacity];
        size = 0;
    }
    //无参数的构造函数,默认的数组容量capacity=10
    public Array(){
        this(10);
    }
    //获取数组中的元素个数
    public int getSize(){
        return size;
    }
    //获取数组的容量
    public int getCapacity(){
        return data.length;
    }
    //返回数组是否为空
    public boolean isEmpty(){
        return size == 0;
    }
    //向所有元素后新加一个元素
    public void  addLast(E e){
        add(size,e);
    }
    //向所有元素前新加一个元素
    public void  addFirst(E e){
        add(0,e);
    }
    //在第index个位置插入一个新元素e
    public void  add(int index, E e){
        if (index <0 || index > size){
            throw new IllegalArgumentException("AddLast failed. Require index >= 0 and 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 ++;
    }
    //获取index索引位置的元素
    public E get(int index){
        if (index < 0|| index >= size){
            throw new IllegalArgumentException("Get failed. Index is illegal");
        }
        return data[index];
    }
    //修改index所以位置的元素为e
    public void set(int index,E e){
        if (index <0 || index >= size){
            throw new IllegalArgumentException("Set failed. Index is illegal");
        }
        data[index] = e;
    }
    //查找数组中是否有元素e
    public boolean contains(E e){
        for (int i = 0; i < size; i ++){
            if (data[i].equals(e)){
                return true;
            }
        }
        return false;
    }
    //查找数组中元素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--;
        data[size] = null; //loitering objects != memory leak
        if (size == data.length/4 && data.length/2 != 0){
            resize(data.length / 2);}
        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);
        }
    }
    @Override
    public String toString(){
        StringBuilder res = new StringBuilder();
        res.append(String.format("Array:size = %d, capacity = %d\n",size,data.length));
        res.append('[');
        for (int i = 0;i<size;i++){
            res.append(data[i]);
            if(i != size -1)
                res.append(", ");
        }
        res.append(']');
        return res.toString();
    }
    private void resize(int newCapacity) {
        E[] newData = (E[]) new Object[newCapacity];
        for (int i=0;i<size;i++){
            newData[i] = data[i];
        }
        data = newData;
    }
}
相关文章
|
3月前
|
存储 Java 程序员
数据结构之 - 深入了解数组数据结构
数据结构之 - 深入了解数组数据结构
51 6
|
3月前
|
存储 算法 搜索推荐
探索常见数据结构:数组、链表、栈、队列、树和图
探索常见数据结构:数组、链表、栈、队列、树和图
131 64
|
2月前
|
存储 缓存 算法
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式,强调了合理选择数据结构的重要性,并通过案例分析展示了其在实际项目中的应用,旨在帮助读者提升编程能力。
76 5
|
2月前
|
存储 人工智能 算法
数据结构实验之C 语言的函数数组指针结构体知识
本实验旨在复习C语言中的函数、数组、指针、结构体与共用体等核心概念,并通过具体编程任务加深理解。任务包括输出100以内所有素数、逆序排列一维数组、查找二维数组中的鞍点、利用指针输出二维数组元素,以及使用结构体和共用体处理教师与学生信息。每个任务不仅强化了基本语法的应用,还涉及到了算法逻辑的设计与优化。实验结果显示,学生能够有效掌握并运用这些知识完成指定任务。
62 4
|
3月前
|
算法 程序员 索引
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
栈的基本概念、应用场景以及如何使用数组和单链表模拟栈,并展示了如何利用栈和中缀表达式实现一个综合计算器。
58 1
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
|
3月前
|
存储 算法 定位技术
数据结构与算法学习二、稀疏数组与队列,数组模拟队列,模拟环形队列
这篇文章主要介绍了稀疏数组和队列的概念、应用实例以及如何使用数组模拟队列和环形队列的实现方法。
35 0
数据结构与算法学习二、稀疏数组与队列,数组模拟队列,模拟环形队列
|
4月前
|
存储 Java
java数据结构,线性表顺序存储(数组)的实现
文章介绍了Java中线性表顺序存储(数组)的实现。线性表是数据结构的一种,它使用数组来实现。文章详细描述了线性表的基本操作,如增加、查找、删除、修改元素,以及其他操作如遍历、清空、求长度等。同时,提供了完整的Java代码实现,包括MyList接口和MyLinearList实现类。通过main函数的测试代码,展示了如何使用这些方法操作线性表。
|
6月前
|
存储
【数据结构OJ题】轮转数组
力扣题目——轮转数组
50 2
【数据结构OJ题】轮转数组
|
5月前
|
存储 Java 程序员
"揭秘HashMap底层实现:从数组到链表,再到红黑树,掌握高效数据结构的秘密武器!"
【8月更文挑战第21天】HashMap是Java中重要的数据结构,采用数组+链表/红黑树实现,确保高效查询与更新。构造方法初始化数组,默认容量16,负载因子0.75触发扩容。`put`操作通过计算`hashCode`定位元素,利用链表或红黑树处理冲突。`get`和`remove`操作类似地定位并返回或移除元素。JDK 1.8优化了链表转红黑树机制,提升性能。理解这些原理能帮助我们更高效地应用HashMap。
53 0
|
7月前
|
存储 算法 调度
【数据结构与算法】详解循环队列:基于数组实现高效存储与访问
【数据结构与算法】详解循环队列:基于数组实现高效存储与访问